用Verilog实现流水移位寄存器,你需要了解这4种描述方法(一)

我们用了3篇文章,分别讨论了Verilog HDL里面的“非阻塞赋值”和“阻塞赋值”。用实例分析了如果在一个always块内等式右边的表达式或者变量,是另一个always块内等式左边的表达式或者变量,仿真器在同一个时间(同一个时钟的边沿)内同时执行两个等式,这就会导致竞争产生。并且我们详细分析了在同一个always块里面,如果混合使用“非阻塞赋值”和“阻塞赋值”,所可能出现的结果,并且给出了建议的编码方式。

今天我给大家分享4种流水移位寄存器的建模方式,并通过代码来比较,这四种方式的优劣。

用Verilog实现流水移位寄存器,你需要了解这4种描述方法(一)

流水移位寄存器

在数字电路设计过程中,流水移位寄存器是非常常用的一种电路结构。电路结构如下图所示:

用Verilog实现流水移位寄存器,你需要了解这4种描述方法(一)

图一 流水移位寄存器

data_in在clk上升沿,进入第一个REG的D端口,输出为q_ff,进入第二个REG的D端口,输出为q_2ff,进入进入第三个REG的D端口,输出为q_3ff。q_ff、q_2ff、q_3ff数据呈现出流水线特点。

下面我开始用4种方式对上面的电路进行描述,并且比较使用“非阻塞赋值”和“阻塞赋值”对电路的影响。

用Verilog实现流水移位寄存器,你需要了解这4种描述方法(一)

第一种描述方式,用“阻塞赋值”描述

使用“阻塞赋值”进行描述。

reg q_ff,q_2ff,q_3ff;

always@(posedge clk) begin

q_ff = data_in;

q_2ff = q_ff;

q_3ff = q_2ff;

end

以上的描述的结果是错误的。因为是“阻塞赋值”,所以data_in将覆盖掉中间REG的输出,直接在CLK的上升沿,将data_in赋给了第三个REG的输出q_3ff上面。具体的电路如下图所示:

用Verilog实现流水移位寄存器,你需要了解这4种描述方法(一)

图二 实际的综合结果

毫无疑问,这种结果是不符合我们的设计要求的。

第二种描述方式,用“阻塞赋值”描述

我们仍然采用“阻塞赋值”进行描述,但是不同的是,我们调整描述语句的顺序,集体的RTL描述如下所示:

reg q_ff,q_2ff,q_3ff;

always@(posedge clk) begin

q_3ff = q_2ff;

q_2ff = q_ff;

q_ff = data_in;

end

上面的Verilog HDL描述中,我们重新排布了RTL的描述顺序,经过仿真验证,功能符合预期。并且综合结果显示,网表是shift register,所以结果正确。

用Verilog实现流水移位寄存器,你需要了解这4种描述方法(一)

小结

今天的内容,我们继续探讨了“非阻塞赋值”和“阻塞赋值”对电路的影响。并且以流水移位寄存器为目标,比较了4种描述方式中的前两种。通过比较我们发现,使用“阻塞赋值”去给移位寄存器建模,虽然在注意描述语句顺序的前提之下,可以得到正确的结果,但是如果稍不注意,就可能出错,所以不提倡使用。另外,后面2种描述方式,将在后面的文章中继续呈现,希望大家继续关注。

另外,我的专栏《15节课教你搞懂Verilog HDL》已经正式上线,主要讲解Verilog HDL语言,以及RTL代码和数字电路的映射关系,欢迎大家订阅。

展开阅读全文

页面更新:2024-03-08

标签:流水   等式   赋值   移位寄存器   表达式   建模   变量   端口   语句   顺序   电路   正确   结构   代码   方式   方法   科技

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号

Top