verilog 如何处理需要在两个always 中赋值的变量(ZT)求解

2024-12-22 21:09:17
推荐回答(1个)
回答1:

在一个以上的always块中对同一个变量赋值容易产生竞争冒险,且不能综合。 但是如果一个变量的值必须与两个always事件相关联,且两个事件不可能放在一个always块中(如同一时钟上升沿与下降沿,或者是两个不同时钟进行触发的),那么应该用什么方法来处理这个变量呢?一旦遇到这个问题。verilog中的解决方法是两个变一个。一个always块只对一个变量赋值。最后将其用组合逻辑将其变为一个信号。 举例: always @ (posedge clk or negedge rst) if (!rst) cnt1 <= #1 3'd0; else if (cnt1==4) cnt1 <= #1 3'd0; else cnt1 <= #1 cnt1+1; //--注意这是两个不同时钟沿触发的always 模块 --zhengjw 2012.7.16 always @ (negedge clk or negedge rst) if (!rst) cnt2 <= #1 4'd0; else if (cnt2==5) cnt2 <= #1 4'd0; else cnt2 <= #1 cnt2 +1; always @ (cnt1 or cnt2 ) //--组合逻辑 if (cnt1==2) ckout = 1'b1;else if (cnt2==4) ckout = 1'b0;else ckout = 1'b1; // logic part to combine the two cnt to one output 你看到了。前两个是定义了两个不同沿触发的时序电路就是计数器。最后一个组合逻辑来将两个做成一个使能信号。 这个做法可以做出不同沿触发的时序使能信号。但是这么做出的一个信号强烈建议不作为高质量时钟输出。由于编写程序风格。所以做为时钟可能延迟以及抖动都不能作为高质量时钟的设计。