verilog中阻塞的理解与例子

本文通过一个基于阻塞赋值的多级触发器级联实例,探讨了Verilog中阻塞赋值的问题。在初始代码中,由于阻塞赋值的特性,导致实际只综合出一个寄存器,而非预期的三个。为解决这个问题,文章提出通过改变always块内赋值语句的顺序,使得每个寄存器在赋值前保持旧值,从而实现预期的延迟效果。
摘要由CSDN通过智能技术生成

下面给出一个基于阻塞赋值和非阻塞赋值的多级触发器级联实例,要求将输
入数据延迟 3 个时钟周期再输出,并给出对应的 RTL 级结构图和仿真结果。
(1)基于 D触发器的阻塞赋值语句代码如下:
module pipeb1 (q3, d, clk);
output [7:0] q3;
input [7:0] d;                                       
input clk;
reg [7:0] q3, q2, q1;
always @(posedge clk) begin
q1 = d;
q2 = q1;
q3 = q2;
end
endmodule
上述代码综合后能得到所期望的逻辑电路吗? 答案是否定的, 根据阻塞赋值语句的执行
过程可以得到执行后的结果是 q1 = d;q2 = d。实际只会综合出一个寄存器,如图 8-33 所示,
并列出下面的警告信息,而不是所期望的三个。其中的主要原因就是采用了阻塞赋值,首先
将 d 的值赋给 q1,再将q1 的值赋给q2,依次到q3,但是 q1、q2、q3 的值在赋值前其数值
已经全部被修改为当前时刻的 d 值,因此上述语句等效于 q3=d,这和图 8-33 所示的 RTL 结
构是一致的。

 

 

(2) 如何才能得到所需要的电路呢?如果把 always  块中的两个赋值语句的次序颠倒后

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值