• 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的输入。

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

  • 相关阅读:
    MySQL
    LeetCode
    数据结构
    我的编程幻想曲,更新中
    快速排序
    C与C++的区别
    必须要使用列表初始化的几种情况
    析构中delete this
    指向自身类型的成员指针的初始化,this不属于类对象的一部分
    构造函数
  • 原文地址:https://www.cnblogs.com/xiangtailiang/p/2718663.html
Copyright © 2020-2023  润新知