[CPLD] epm7128s做 arm芯片的外部扩展-附程序

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

本版积分规则

8

主题

8

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部