假设有两个寄存器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的输入。
这跟环形移位寄存器的原理一样。