Verilog非阻塞赋值的妙用

假设有两个寄存器SR和SR2,现在要交换这两个寄存器的数据。在C语言中,需要定义一个临时变量SR_temp来实现:

SR_temp =  SR;
SR = SR2;
SR2 = SR_temp;

但在Verilog中,利用其非阻塞的赋值方式,可以在一个时钟周期内完成两个寄存器数据的交换。请看下面这段代码:

 1 module Dtest
 2 (
 3     input clk, enable, reset,
 4     input sr_in,
 5     output sr_out
 6 );
 7 
 8     // Declare the shift register
 9     reg  sr;
10     reg sr2;
11     
12 
13     // Shift everything over, load the incoming bit
14     always @ (posedge clk or posedge reset)
15     begin
16         if (reset == 1'b1)
17         begin
18             // Load N zeros 
19             sr <= 1'b0;
20             sr2 <= 1'b0;
21         end
22         else if (enable == 1'b1)
23         begin
24             sr <= sr_in;
25         end
26         else
27         begin
28             sr <= sr2;
29             sr2 <= sr;            
30         end
31     end
32 
33     // Catch the outgoing bit
34     assign sr_out = sr2;
35 
36 endmodule

我们可以看到,在28、29行中,两个寄存器的值相互赋值给对方,但由于是非阻塞方式,因此在下一个时钟周期的开始时,赋值方能实现。
这样就可以直接交换两个寄存的数据了。

在Quartus II 综合的结果如图所示。可以看到,综合工具为这两个寄存器生成了一个D触发器,而且,SR2的输出在enable选择器的控制下直接作为SR的输入。

这跟环形移位寄存器的原理一样。

原文地址:https://www.cnblogs.com/xiangtailiang/p/2718663.html