基于阻塞赋值和非阻塞赋值的多级触发器级联实例

下面给出一个基于阻塞赋值和非阻塞赋值的多级触发器级联实例,要求将输入数据延迟 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 块中的两个赋值语句的次序颠倒后再进行分析:先把 q2 的值赋于 q3、再把 q1 的值赋于 q2,最后把 d 赋于q1。这样在先赋值再修改,可以使得 q2,q3 的值都不再是 d 的当前值。修改后的代码如下所列。
module pipeb2 (q3, d, clk);
output [7:0] q3;
input [7:0] d;
input clk;
reg [7:0] q3, q2, q1;
always @(posedge clk)
begin
q3 = q2;
q2 = q1;
q1 = d;
end
endmodule
原文标题:fpga学习:verilog中阻塞的理解与例子
文章出处:【微信公众号:fpga设计论坛】欢迎添加关注!文章转载请注明出处。


高通弯道超车!骁龙8 Gen4性能绝了:要超越苹果M2芯片
马自达将于2020年推出首款电动汽车
大唐电信计划将电信科研院的债务转让给大唐半导体
基于verilog CIC滤波器的四倍插值的FPGA实现方案
氧传感器坏了还能开吗
基于阻塞赋值和非阻塞赋值的多级触发器级联实例
华为荣耀9手机来袭,你会继续坚持小米6吗?
上汽从北京出发 借名爵EZS将电动车技术和品牌推向全球
中国三大运营商无5G购机补贴,主要用于5G网络的建设
一文带您全面了解步进电机
圣邦微电子推出逐次逼近模数转换器GM5200Q
差压式流量计的特点有哪些
电力线载波通信的外围电路设计
三洋化成工业公司计划将于2021年全面投产全树脂电池
实现自动驾驶集成传感器的6大关键点
ROHM的车载LED技术应用
移动网络多场景应用对基站设备的需求分析
有方科技出席物联网产业发展研讨会
晶科电子期盼已久的智能制造车间就要正式投产了
飞利浦SPK7214有线鼠标京东商城供不应求