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正确输出。
求大师指点! 多谢多谢
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
严重同意!
其实从一开始我就已经看出来楼主以前是做偏软的事情。
因为你的这个接口,其实是很普通的一个local bus问题。
正确的处理方式是:
1,在CPLD内部,自己用一个高频的时钟,“找到WE的下降沿”(因为你用的代码是always @(negedge cpu_WE),然后用这个下沿确认信号采样DATA_CPU_BUS信号。
2,而至于你后面的IO_12_OUT信号的驱动,通常做法是先把数据输出到local bus上,然后再驱动读使能信号,让CPU采样总线数据。
你后面的代码,表明CPLD驱动bus的条件是:
(PA7_DIR_0_TO_CPLD == 0) && (PA6_SD_0_data == 1) & cpu_WE
我感觉有点不正确。
因为如果这样,cpu_WE的这个信号,高电平就表示CPU读数据,低电平表示CPU写数据。你可以看看你的CPU手册,是不是这样的?
一周热门 更多>