求助!!关于verilog 里非阻塞赋值的理解偏差的问题!!
非阻塞赋值(如b <= a)书上讲解如下:1、在语句块中,上面语句所赋的变量值不能立即就为下面的语句所用;
2、块结束后才能完成这次操作,而所赋的变量值是上一次赋值得到的;
3、在编写可综合德尔时序逻辑模块时,这是最常用的赋值方法
而在我实际运用中,可能是理解偏差,总是有些疑问,如下面的例子
exp1
always @(posedge clk)
begin
b <= a;
c<= b;
end
always 块中用了非阻塞赋值方式,定义了两个reg型信号b和c,clk信号的上升沿到来时,b就等于a,c就等于b,这里用到了两个触发器。如若在此clk之前,a为1,b为0;经此clk到来后,b被赋值1,c等于b,但这个b是此clk到来前的b,为0,也就是在语句块中,上一条语句所赋的值不能立即被下面的语句所用,实际上就是先计算更新RHS的值,在此语句块结束后才更新LHS的值。。这些都能理解但是后面的一段代码我就有点理解上的问题了
exp2
always @(posedge clk or negedge rst_n)
if (!rst_n)begin
num < = 4'd0;
state<= A;
end
else begin
num <= num + 1 ;
case (state)
A: begin
语句1;
end
B: begin
语句2;
end
C: begin
语句3;
end
endcase
end
首先复位后,num为0,state = A;
当来一个clk时,执行else 后面的begin..... end语句块
问题是,我觉得来第一个clk时,首先更新RHS的num+1;但在此clk中语句块中num的值仍应该为0,所以因为state=A,所以执行语句1时,num的值应为0,,!!
然而在实践中时发现在A中,num 是为1?!!
很不解,望高手指导!!!! 理解没错啊。是别的问题吧? 数字电路里面有两种电路: 组合逻辑\时序逻辑,把这两个搞清楚了,基本就差不多了; 不用理解,我做VHDL,设计中根本没用阻塞非阻塞概念 理解没问题,把你的代码其他关于num的语句给一下。 在clk上升沿的这一刻,num就变成1了。而不是等什么语句块执行完才更新和变化的。
页:
[1]