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