zoukankan      html  css  js  c++  java
  • 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的输入。

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

  • 相关阅读:
    Prometheus实现微信邮件钉钉报警
    产品需求文档和原型
    各类数据集
    redis与mysql数据同步
    hadoop hbase hive spark对应版本
    Redis集群的搭建
    mysql数据库数据与redis同步
    企业级Zabbix监控实战(一)
    mysql实现高可用架构之MHA
    04-爬取单个英雄联盟英雄的符文图片
  • 原文地址:https://www.cnblogs.com/xiangtailiang/p/2718663.html
Copyright © 2011-2022 走看看