module timer_2016(
gclk, //全局时钟
cpu_WE, //CPU的写使能引脚
PA7_DIR_0_TO_CPLD, //方向控制引脚,0:总线由CPU到CPLD,1:总线由CPLD到CPU,
PA6_SD_0_data, //数据状态控制引脚,0:总线传输数据,1:总线传输状态
PA5_reset, //复位
DATA_CPU_BUS, //与CPU相连的总线
IO_12_OUT, //与IO相连的总线
);
//端口方向说明
input gclk;
input cpu_WE;
input PA7_DIR_0_TO_CPLD;
input PA6_SD_0_data;
input PA5_reset;
inout reg [11:0] DATA_CPU_BUS;
output reg [11:0] IO_12_OUT;
reg [11:0] dk_status_data;
//CPU下传数据或状态
always @(negedge cpu_WE or posedge PA5_reset) //进程A
begin
if(PA5_reset)
begin
i = 0;
dk_status_data <= 0;
end
else if((PA7_DIR_0_TO_CPLD == 0) && (PA7_DIR_0_TO_CPLD == 1))
begin
dk_status_data <= DATA_CPU_BUS;
end
end
always @(posedge gclk or posedge PA5_reset) //进程B
begin
if(PA5_reset)
begin
j = 0;
end
else if((PA7_DIR_0_TO_CPLD == 0) && (PA6_SD_0_data == 1))
begin //设置断口输出状态
IO_12_OUT <= dk_status_data;
end
end
endmodule
最近做一个产品,ARM(stm32f103)与CPLD 并口通讯,CPLD的时钟信号gclk为16M有源晶振,
ARM的总线接在CPLD上,且使用了ARM的写信号cpu_WE,ARM的PA7_DIR_0_TO_CPLD,PA7_DIR_0_TO_CPLD引脚
控制CPLD工作在不同的状态。DATA_CPU_BUS 是ARM的数据总线,IO_12_OUT是CPLD的输出IO口,
代码如上,现在一个问题是,在进程A中,ARM把数据写给CPLD一个变量dk_status_data,希望在进程B中该变量
赋值给CPLD的IO_12_OUT,以实现,ARM把数据给CPLD,CPLD进行数据输出。通过程序下载,测试发现,无论ARM在总线上
写入0xfff,还是写入0,CPLD均输出0xfff。请问为何啊 !急等,
而如果CPLD程序改为:
always @(negedge cpu_WE or posedge PA5_reset) //进程A
begin
if(PA5_reset)
begin
i = 0;
dk_status_data <= 0;
end
else if((PA7_DIR_0_TO_CPLD == 0) && (PA7_DIR_0_TO_CPLD == 1))
begin
dk_status_data <= DATA_CPU_BUS;
IO_12_OUT <= dk_status_data;
end
end
就能达到效果,既是ARM在总线上写入不同数据,CPLD均能实现IO_12_OUT正确输出。
求大师指点! 多谢多谢
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
老大,你两种写法中,赋值语句:
IO_12_OUT <= dk_status_data;
的条件都不同啊。
第一种写法是: if((PA7_DIR_0_TO_CPLD == 0) && (PA7_DIR_0_TO_CPLD == 1))
第二种写法是: if((PA7_DIR_0_TO_CPLD == 0) && (PA6_SD_0_data == 1))
你说你第二种写法能够实现你要的功能,那么问题就应该出在 PA7_DIR_0_TO_CPLD、PA6_SD_0_data这两个信号的电平上。
你把cpu_WE、PA7_DIR_0_TO_CPLD、PA6_SD_0_data这三个信号的波形一量,原因应该就非常清楚了。
现在问题貌似解决了,就是把第一种写法的第二个进程改为:
always @(posedge gclk or posedge PA5_reset)
begin
if(PA5_reset)
begin
j = 0;
IO_12_OUT <= 0;
end
else if((PA7_DIR_0_TO_CPLD == 0) && (PA6_SD_0_data == 1))
begin //设置断口输出状态
if(cpu_WE)
begin
IO_12_OUT <= dk_status_data;
end
end
end
关键处在cpu_WE上,这样写的目的是,一个进程赋值 一个进程输出,且通过cpu_WE人为的把它们分开,问题虽然解决了 感觉心里还是不是很踏实 ,请前辈对指点有没有更好的解释。
((PA7_DIR_0_TO_CPLD == 0) && (PA7_DIR_0_TO_CPLD == 1))
我没看花眼吧?!
这条件能成立?
换个样子:
PA7_DIR_0_TO_CPLD == 0
PA7_DIR_0_TO_CPLD == 1
另外,虽然不同进程涉及到同一个变量,
但“读”操作肯定没问题,又不是在两个进程“写”同一个变量。
使用WE的边沿,这是异步逻辑,也容易出问题。
应当把逻辑重新理一理,
程序应当整体重写。
第一次写CPLD程序 以前是做嵌入式C的 确实有一些不是很适应 我的QQ是 1376381 希望能够认识尊驾。
一周热门 更多>