|
我在用CPLD给44B0扩展IO
连接8条数据线、6条地址线、和一个nGCS4线。 另外还有nWe, nOe,nReset, nWait线
想通过EPM7128S来给44b0扩展IO口
仿真里面也看到输出是对的,可是下载到CPLD之后,在ARM里面往对应扩展口写数据,写完的数据在示波器只保持一下就没了
实际上待输出的数据都保存在对应的寄存器里,按道理应该是不会变的
仿真是对的,就是下载到CPLD后, 在ARM往CPLD对应输出口输出数据不成功, 在ADS单步调试,发现对应口有输出,只是输出只是一瞬间。 难道是ARM数据总线上数据保持时间不够? 可是我已经把bankconx 寄存器设置成保持最久的状态,所以我在考虑是不是可以用ARM的nWait信号线延长写周期的时间。。。。
我是在ADS单步执行的,用示波器查看CPLD的输出口,在ADS执行到写1到输出口的语句时,输出口变高,但是执行下一步之后,输出口就变低了。
下面是我的代码。
//该处地址的格式: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,
poweron,
JDQPORT,// JDQPORT2,
extenddata_cs1,extenddata_cs2,
extenddata_oe,extenddata_dir,
led,
U22port1,U22port2
);
input nGCS4;
reg nGCS4_reg;
input nWe;
input nOe;
input poweron;
output[1:0] nWait;
reg[1:0] nWait_reg;
input nReset;
reg nReset_reg;
reg reset_flg; //用于标志刚刚从复位状态回来,以设置输出的初值
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[1:0] extenddata_cs1;
output[1:0] extenddata_cs2;
output extenddata_oe;
output[2:0] extenddata_dir;
reg[1:0] extenddata_cs1_reg;
reg[1:0] extenddata_cs2_reg;
reg extenddata_oe_reg;
reg[2:0] extenddata_dir_reg;
//====================
// U22控制口
//====================
output [7:0] U22port1,U22port2;
reg [7:0] U22port1_reg,U22port2_reg;
//只要nReset电平变化,则设置状态标志,方便是否复位输出口
//只要该引脚为低电平,则给各输出的reg设置初始值
//当该引脚为高电品时,在nWE, nOE那里的 if(nReset_reg==0)不成立,从而不会给各输出的reg设置初始值
always @( nReset)
begin
nReset_reg=nReset;
/*
JDQPORT_reg=8'hff;
extenddata_dir_reg=1'b1;
led_reg=2'b11;
U22oe1_reg=1'b1;
U22oe2_reg=1'b1;
U22dir1_reg=1'b1;
U22dir2_reg=1'b1;
U22port1_reg=8'hff;
U22port2_reg=8'hff;
exint2_reg=1'b1; //exint3,exint4,
exint3_reg=1'b1;
exint4_reg=1'b1;
nWait_reg=2'b11; */
end
//在系统地址总线变化的时候,确定是否选中了CPLD所对应的相关接口地址
always @(nGCS4 or MCU_addr)
begin
case({nGCS4,MCU_addr})
`JDQaddr:
begin
addr_sel=`JDQ_rw;
end
`Ledaddr:
begin
addr_sel=`Led_rw;
end
default:
begin
addr_sel=`no_rw;
end
endcase
end
always @( nWe or nOe or nReset )
begin
//如果上电输入口为posedge,并且此时复位口为低电平,则初始化各寄存器
if(!nReset)
begin
JDQPORT_reg<=8'b1111_1111;
extenddata_dir_reg<=1'b11;
extenddata_oe_reg<=1'b1;
led_reg<=2'b11;
exint2_reg<=1'b1; //exint3,exint4,
exint3_reg<=1'b1;
exint4_reg<=1'b1;
nWait_reg<=2'b11;
end
//总线写周期
if(!nWe)
begin
case(addr_sel)
`JDQ_rw: //继电器写
begin
JDQPORT_reg<=MCU_data;
end
`Led_rw: //发光管
begin
led_reg<=MCU_data[1:0];
end
default:
begin
end
endcase
end
end
assign JDQPORT=JDQPORT_reg;
assign extenddata_oe=1'b1;
assign extenddata_dir=1'b11;
assign extenddata_cs1=2'b11;
assign extenddata_cs2=2'b11;
// 如果CPLD不需要往数据总线上传数据的时候,
//assign MCU_data=((nOe==1'b0)&& ((addr_sel==`U22port1_rw)||(addr_sel==`U22port2_rw)))? MCU_data_reg:8'hz ;
assign led=led_reg;
assign exint2=1'b1; //exint3,exint4,
assign exint3=1'b1;
assign exint4=1'b1;
assign nWait=2'b11;
assign U22port1=8'b0000_0000;
assign U22port2=8'b1111_1111;
endmodule |
|