一个变量在两个进程中的使用问题

2020-02-04 10:28发布

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正确输出。
求大师指点!  多谢多谢
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
8条回答
waiter
1楼-- · 2020-02-05 11:38
玄德 发表于 2016-7-8 11:20
另外,虽然不同进程涉及到同一个变量,
但“读”操作肯定没问题,又不是在两个进程“写”同一个变量。

严重同意!
其实从一开始我就已经看出来楼主以前是做偏软的事情。
因为你的这个接口,其实是很普通的一个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手册,是不是这样的?
nethopper
2楼-- · 2020-02-05 12:56
 精彩回答 2  元偷偷看……

一周热门 更多>