最近用Altera 的 epm7128s做 arm芯片的外部扩展,输入有地址add21-16, nGCS4, 数据线 data7-0, 控制线 nWe, nOe等。现在仿真出来JDQPORT输出不正常。 由于我手上只有夏宇闻的一本书,也许犯了不少错误? 希望能在这里得到指点。谁有用verilog HDL 语言编写的类似的MCU IO扩展的例子?<br /><br /><br /><br />//该处地址的格式:nGCS4+MCU_addr[5:0] 一共7位<br /><br />`define JDQaddr 7'b001_0000 //继电器控制地址1<br />`define U22port1addr 7'b001_0100 //开关量输入口1<br />`define U22port2addr 7'b001_0101 //开关量输入口2<br />`define ExtendDatabusaddr1 7'b001_0110 //AD变换接口1<br />`define ExtendDatabusaddr2 7'b001_0111 //AD变换接口2<br />`define Ledaddr 7'b001_1000 //发光管地址<br /><br /><br /><br />`define no_rw 3'h0<br />`define JDQ_rw 3'h1 //定义总线状态标志<br />`define U22port1_rw 3'h2 //开关量输入<br />`define U22port2_rw 3'h3<br />`define ExtendDatabus1_rw 3'h4<br />`define ExtendDatabus2_rw 3'h5<br />`define Led_rw 3'h6<br /><br />module IOextend1(nGCS4,MCU_data,MCU_addr,<br /> exint2,exint3,exint4,<br /> nWe,nOe,nWait,nReset,<br /> JDQPORT,// JDQPORT2,<br /> extenddata_cs1,extenddata_cs2,<br /> extenddata_oe,extenddata_dir,<br /> led<br /> <br /> );<br /> <br /> input nGCS4;<br /> reg nGCS4_reg;<br /> <br /> input nWe;<br /> input nOe;<br /> //reg nWe_reg,nOe_reg;<br /> input nWait;<br /> input nReset;<br /> input[5:0] MCU_addr;<br /> inout[7:0] MCU_data;<br /> reg[6:0] MCUaddr_reg;<br /> reg[7:0] MCU_data_reg;<br /> <br /> reg[3:0] addr_sel; //定义总线状态寄存器<br /> <br /> output exint2;<br /> output exint3;<br /> output exint4;<br /> reg exint2_reg;<br /> reg exint3_reg;<br /> reg exint4_reg;<br /> <br /> output[1:0] led;<br /> reg[1:0] led_reg;<br /> <br /> //====================<br /> // 继电器控制<br /> //====================<br /> output[7:0] JDQPORT;<br /> reg [7:0] JDQPORT_reg;<br /> <br /> <br /> <br /> //====================<br /> // AD控制口<br /> //====================<br /><br /> output extenddata_cs1;<br /> output extenddata_cs2;<br /> output extenddata_oe;<br /> output extenddata_dir;<br /> reg extenddata_cs1_reg;<br /> reg extenddata_cs2_reg;<br /> reg extenddata_oe_reg;<br /> reg extenddata_dir_reg;<br /> <br /> <br /> <br /><br />//在系统地址总线变化的时候,确定是否选中了CPLD所对应的相关接口地址<br /><br />always @(nGCS4 or MCU_addr)<br />begin<br /> <br /><br /> MCUaddr_reg={nGCS4,MCU_addr};<br /> <br /> extenddata_cs1_reg=1'b1;<br /> extenddata_cs2_reg=1'b1;<br /> extenddata_oe_reg=1'b1; //只要地址发生变化,则16245芯片U9就置于高阻态,然后在接下去的步骤里面再对应地设置其工作状态<br /><br /><br /> if(MCUaddr_reg==`JDQaddr) addr_sel=`JDQ_rw;<br /> else if (MCUaddr_reg==`Ledaddr) addr_sel=`Led_rw;<br /> else if (MCUaddr_reg==`ExtendDatabusaddr1) <br /> begin<br /> addr_sel=`ExtendDatabus1_rw;<br /> extenddata_oe_reg=1'b0;<br /> extenddata_cs1_reg=1'b0;<br /> end<br /> else if (MCUaddr_reg==`ExtendDatabusaddr2) <br /> begin<br /> addr_sel=`ExtendDatabus2_rw;<br /> extenddata_oe_reg=1'b0;<br /> extenddata_cs2_reg=1'b0;<br /> end<br /><br />// if(nGCS4==0) addr_sel=`JDQ_rw;<br /> else addr_sel=`no_rw;<br /> <br />end<br /><br />///////////////////////<br />// Mar.26, 2007<br />///////////////////////<br />// 把 nWe, nOE放在一起<br />always @(negedge nWe or negedge nOe)<br />begin<br /> <br /> if (nWe==0) //如果是在写总线周期<br /> begin<br /> if(addr_sel==`JDQ_rw) //继电器写<br /> JDQPORT_reg=MCU_data;<br /> <br /> //如果是写扩展数据总线1,则把16245的 OE使能, 并且让DIR为1,数据从A port 到B port // <br />// else if ((addr_sel==`ExtendDatabus1_rw) or (addr_sel==`ExtendDatabus2_rw))<br />// extenddata_dir_reg=1; <br /> <br /> extenddata_dir_reg=1; <br /> end<br /> <br /> <br /> if (nOe==0)<br /> begin<br /><br /> //如果是读取第1个AD芯片的值<br /> if ((addr_sel==`ExtendDatabus1_rw) || (addr_sel==`ExtendDatabus2_rw))<br /> extenddata_dir_reg=0; <br /> <br /> else <br /> begin <br /> extenddata_dir_reg=1; <br /> <br /> end<br /><br /> end <br />end<br /><br /><br />assign JDQPORT=JDQPORT_reg;<br />assign extenddata_oe=extenddata_oe_reg;<br />assign extenddata_dir=extenddata_dir_reg; <br />assign extenddata_cs1=extenddata_cs1_reg;<br />assign extenddata_cs2=extenddata_cs2_reg;<br /><br />// 如果CPLD不需要往数据总线上传数据的时候,<br />assign MCU_data=((nOe==1'b1)||(addr_sel==`no_rw))?8'hz : MCU_data_reg;<br /><br />//assign led=led_reg;<br /><br />//assign U22oe1=1;<br />//assign U22oe2=1;<br />//assign U22dir1=1;<br />//assign U22dir2=1;<br /><br />//assign U22port1=8'b0000_0000;<br />//assign U22port2=8'b0000_0000;<br /><br />//assign exint2=1'b1; //exint3,exint4,<br />//assign exint3=1'b1;<br />//assign exint4=1'b1;<br /><br /><br />endmodule |
|