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

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-04 11:52
本帖最后由 waiter 于 2016-7-8 00:04 编辑

老大,你两种写法中,赋值语句:
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这三个信号的波形一量,原因应该就非常清楚了。
zhsiqi2003
2楼-- · 2020-02-04 15:41
抱歉,两种写法所有的条件数据均是 if((PA7_DIR_0_TO_CPLD == 0) && (PA6_SD_0_data == 1))  ,问题不变。
现在问题貌似解决了,就是把第一种写法的第二个进程改为:
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人为的把它们分开,问题虽然解决了 感觉心里还是不是很踏实 ,请前辈对指点有没有更好的解释。
cspmggmp
3楼-- · 2020-02-04 20:28
 精彩回答 2  元偷偷看……
玄德
4楼-- · 2020-02-05 01:51

((PA7_DIR_0_TO_CPLD == 0) && (PA7_DIR_0_TO_CPLD == 1))
我没看花眼吧?!
这条件能成立?

换个样子:
PA7_DIR_0_TO_CPLD == 0
PA7_DIR_0_TO_CPLD == 1


玄德
5楼-- · 2020-02-05 07:39

另外,虽然不同进程涉及到同一个变量,
但“读”操作肯定没问题,又不是在两个进程“写”同一个变量。

使用WE的边沿,这是异步逻辑,也容易出问题。

应当把逻辑重新理一理,
程序应当整体重写。



zhsiqi2003
6楼-- · 2020-02-05 10:44
玄德 发表于 2016-7-8 11:20
另外,虽然不同进程涉及到同一个变量,
但“读”操作肯定没问题,又不是在两个进程“写”同一个变量。

第一次写CPLD程序 以前是做嵌入式C的 确实有一些不是很适应 我的QQ是 1376381  希望能够认识尊驾。

一周热门 更多>