FPGA中阻塞赋值与非阻塞赋值原理实验

实验目的:掌握阻塞赋值与非阻塞赋值的区别

1.实验原理:

在Verilog HDL语言中,信号有两种赋值方式:非阻塞赋值和阻塞赋值;

其中有两个要点:

1.在描述组合逻辑的always块中用阻塞赋值,则综合成组合逻辑的电路结构;
2.在描述时序逻辑的always块中用非阻塞赋值,则综合成时序逻辑的电路结构。

以下缩写词定义:
RHS-赋值等号右边的表达式或变量。
LHS-赋值等号左边的表达式或变量。

IEEE Verilong标准定义了有些语句有确定的执行时间,有些语句没有确定的执行时间。
如果有两条或两条以上语句准备在同一时刻执行,但由于语句的排列顺序不同,却产生了不同的输出结果,这就造成了Verilog模块冒险和竞争现象的原因。为了避免这一现象,需理清阻塞赋值和非阻塞赋值之间的区别。

(1)非阻塞赋值:

非阻塞赋值操作符为"<=",非阻塞与阻塞赋值最大的区别就是非阻塞赋值允许其他的Verilog语句同时进行操作,非阻塞的操作过程可以看作两个步骤:

(1)在赋值开始时刻,计算非阻塞赋值RHS表达式;
(2)在赋值结束时刻,更新非阻塞赋值LHS表达式;

非阻塞赋值操作只能用于对寄存器类型变量进行赋值,因此只能用在“initial”块和“always”块等过程块中,且非阻塞赋值不允许用于连续赋值。

特点:

(1)在语句块中,语句所赋值的变量值不能立即就为下面的语句所用;
(2)块结束后才能完成这次赋值操作,而所赋的变量值是上一次赋值得到的;
(3)在编写可综合的时序逻辑模块时,这是最常用的赋值方法。

(2)阻塞赋值:

阻塞赋值的操作符为“=”,该种赋值方式在执行时只有一个步骤,即计算RHS并更新LHS,此时不能允许有来自任何其他Verilog语句干扰,所谓阻塞的概念是指在同一个always块中,其后面的赋值语句从概念上(即使不设定延迟)是在前一句赋值语句结束后再开始赋值的。

如果在一个过程块中阻塞赋值的RHS变量正好是另一个过程块中阻塞赋值的LHS变量,这两个过程块又用同一个时钟沿触发,这时阻塞赋值操作就会出现问题,即如果阻塞顺序安排的不好,就会出现竞争,若这两个阻塞赋值操作用同一个时钟沿触发,则执行的顺序是无法确定的。

特点:

(1)赋值语句完成后,块才结束;
(2)b的值在赋值语句执行完后立刻改变。
(3)在时序逻辑中使用时,可能会产生意想不到的结果。

通俗一点讲就是阻塞赋值,操作符为“ =”, “阻塞”是指在进程语句( initial 和 always)中,当前的赋值语句阻断了其后的语句,也就是说后面的语句必须等到当前的赋值语句执行完毕才能执行。而且阻塞赋值可以看成是一步完成的,即:计算等号右边的值并同时赋给左边变量。非阻塞赋值,操作符为“ <=”, “非阻塞”是指在进程语句( initial 和 always)中,当前的赋值语句不会阻断其后的语句。

2.实验步骤

注:实验步骤注重不同赋值方式的对比区别和实现方法,以及如何体现在RTL视角电路及仿真信号结果的不同展示。

步骤一:使用阻塞赋值描述全加器,具体实现如下图
在这里插入图片描述
上述1,2实现的是在阻塞赋值中赋值语句顺序不一致,从而来确定赋值语句执行是顺序执行的,而不是所谓并行语句执行,具体分析在RTL逻辑电路中查看两者之间的不同。

在这里插入图片描述
首先我们可以看出在把阻塞赋值的两条语句顺序颠倒一下,再次综合可以得到上图所示的两个逻辑电路。可以看出调整顺序后与不调整时生成的逻辑电路不一致。现结合实验原理给出详细解释,

当执行 out = d + c 时, d 的数据此时并不是更新后 a+b 的数据,而是上一个 Clk 上升沿到来时 d 的数据,这也就解释了为何还有一个 D 触发器的存在。

通俗的讲阻塞, out 这条语句阻塞了 d 这条语句执行。对比1的逻辑,由于 d 这条语句在 out的前面,虽然使用了阻塞赋值但是相当于 out=a+b+c。

步骤二:使用非阻塞赋值描述全加器,同理依然是再次交换语句执行顺序实现对比,具体实现如下图
在这里插入图片描述
在这里插入图片描述
使用非阻塞方式时,再次交换语句执行顺序,综合后实现的逻辑电路上图所示,两者之间并无差距,因此交换语句的前后顺序并不会对最终生成的逻辑电路有实际影响。

步骤三:建立仿真文件,观察赋值波形,具体测试代码文件如下
在这里插入图片描述
设置好仿真脚本后,首先进行非阻塞赋值方式的功能仿真,可以看到下图所示的波形文件,可以看出在复位信号置高之前输出为 0。
在这里插入图片描述
直观看上去没有问题,现在放大细节可以看出,如下图所示,变化在第一个时钟上升沿之后,因此第一个时钟沿检测不到,下一个时钟检测到 110 直接赋值计算,但由于在第一个上升沿 out 的值依旧为 10, 设计虽然采用非阻塞赋值方式, 且此刻 d 值已经更新为 1,但是实际电路中总会存在延迟,这个时钟沿时刻 out 已经采样不到当前 d 的值,继续保持数值 0,因此在第三个上升沿判断出此时值为10,

在这里插入图片描述
为了更好的解释这种现象,现进行时序仿真,如下图所示,可以很明显看出这一现象。
在这里插入图片描述
将out改为另一种非阻塞赋值方式时,再对比RTL视角及仿真有何不同?
在这里插入图片描述
在这里插入图片描述

本节实验对比了 Verilog 语法中阻塞赋值和非阻塞赋值的区别。 通过证明非阻塞赋值多种赋值顺序生成电路的唯一性,与阻塞赋值多种赋值顺序生成电路的不确定性,来展示使用非阻塞赋值对设计可预测性的重要意义。 在今后的设计中会经常用到两种赋值方式,请多加思考其中区别及意义。

在今后的设计中,掌握以下六个原则,可解决在综合后仿真中出现绝大多数的冒险竞争问题。

1) 时序电路建模时,用非阻塞赋值;

2) 锁存器电路建模时,用非阻塞赋值;

3) 用 always 块建立组合逻辑模型时,用阻塞赋值;

4) 在同一个 always 块中建立时序和组合逻辑电路时,用非阻塞赋值;

5) 在同一个 always 块中不要既用非阻塞赋值又用阻塞赋值;

6) 不要在一个以上的 always 块中为同一个变量赋值。

书籍推荐:《Verilog数字系统设计(夏宇闻)》

  • 5
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值