描述逻辑、分析阻塞赋值和非阻塞赋值的电路差别、仿真波形差异、并说明原因
时间: 2023-12-25 21:06:22 浏览: 90
逻辑
阻塞赋值和非阻塞赋值是在 Verilog 等硬件描述语言中用于给寄存器或线路赋值的两种方法。在逻辑电路中,阻塞赋值和非阻塞赋值之间的差异在于它们如何处理同时发生的多个赋值。
分析
阻塞赋值是一种顺序赋值,即它按顺序执行语句,并将结果立即写入变量。因此,如果有多个阻塞赋值同时执行,则只有最后一个赋值会生效。这意味着前面的赋值将被覆盖,而且可能会导致意外的结果。
非阻塞赋值是一种并发赋值,即它将所有赋值语句同时计算,并在时钟周期结束时一次性写入变量。因此,如果有多个非阻塞赋值同时执行,则所有赋值都将生效,而且不会相互影响。
阻塞赋值的仿真波形通常会显示出更多的冲突和抖动,因为它们的执行方式是顺序的,而且可能会导致多个赋值之间的竞争条件。非阻塞赋值的仿真波形通常会更加平滑,因为它们的执行方式是并发的,并且不会有竞争条件的问题。
原因
这种差异的原因在于它们如何处理赋值语句的顺序和时序。阻塞赋值的执行方式类似于一组命令,需要按照特定的顺序依次执行,而非阻塞赋值的执行方式类似于一组事件,可以同时发生而不会相互影响。因此,非阻塞赋值通常更适合用于处理时序和并发性较高的电路。
相关问题
阻塞赋值和非阻塞赋值这两种仿真波形的区别
阻塞赋值和非阻塞赋值是Verilog中两种不同的赋值方式,它们在仿真中的行为有所不同。
阻塞赋值(Blocking Assignment):用“=”进行赋值,它会立即将右侧的值赋给左侧变量,并且会等待右侧的语句执行完毕之后再执行下一条语句。
非阻塞赋值(Non-Blocking Assignment):用“<=”进行赋值,它会在一个时间片内完成所有的赋值,然后在下一个时间片开始时,将所有赋值的结果同步到左侧的变量上。
在仿真波形上,阻塞赋值和非阻塞赋值的区别是非常明显的。例如,下面是一个简单的Verilog代码:
```verilog
module test;
reg [1:0] a, b, c;
always @(a, b)
begin
c = a + b;
a <= c;
b <= a;
end
endmodule
```
在这个代码中,a、b、c都是寄存器类型的变量。在always块中,首先使用阻塞赋值将a和b相加的结果赋值给c,然后使用非阻塞赋值将c的值赋给a,将a的值赋给b。这个模块的作用是计算斐波那契数列。
下面是使用ModelSim仿真器得到的波形图:
![blocking-vs-non-blocking](https://img-blog.csdnimg.cn/20210328095710462.png)
从图中可以看出,使用阻塞赋值时,c、a、b的值是依次计算出来的,而使用非阻塞赋值时,c、a、b的值是同时计算出来的。这就是阻塞赋值和非阻塞赋值的区别。
阻塞赋值和非阻塞赋值电路有什么区别
阻塞赋值和非阻塞赋值是在硬件描述语言 (HDL) 中用于进行时序逻辑建模的两种赋值方式。
区别如下:
1. 阻塞赋值(blocking assignment):阻塞赋值使用等号(=)进行赋值,赋值语句会按照顺序执行,并且当前语句执行完毕之后才会执行下一条语句。这意味着阻塞赋值会按照代码的顺序进行赋值操作。
2. 非阻塞赋值(non-blocking assignment):非阻塞赋值使用双等号(<=)进行赋值,赋值语句在同一时间步骤中并行执行,不会受到代码的顺序影响。这意味着非阻塞赋值会在该时间步骤结束之前,将右侧表达式的值存储在左侧的变量中。
因此,阻塞赋值和非阻塞赋值的主要区别在于执行顺序和并行性。
阅读全文