zoukankan      html  css  js  c++  java
  • (转帖) 如何將值delay n個clock? (SOC) (Verilog)

    来源:http://www.cnblogs.com/oomusou/archive/2009/06/15/verilog_dly_n_clk.html

     1 /* 
     2 (C) OOMusou 2009 http://oomusou.cnblogs.com
     3 
     4 Filename    : delay_3t.v
     5 Compiler    : NC-Verilog 5.4
     6 Description : delay 3t method 1
     7 Release     : 06/15/2009 1.0
     8 */
     9 
    10 module delay_3t (
    11   clk,
    12   rst_n,
    13   d,
    14   q
    15 );
    16 
    17 input  clk;
    18 input  rst_n;
    19 input  d;
    20 output q;
    21 
    22 reg d_dly_1t;
    23 reg d_dly_2t;
    24 reg d_dly_3t;
    25 
    26 assign q = d_dly_3t;
    27 
    28 always@(posedge clk or negedge rst_n) begin
    29   if (!rst_n) begin
    30     d_dly_1t <= 0;
    31     d_dly_2t <= 0;
    32     d_dly_3t <= 0;
    33   end
    34   else begin
    35     d_dly_1t <= d;
    36     d_dly_2t <= d_dly_1t;
    37     d_dly_3t <= d_dly_2t;
    38   end
    39 end
    40 
    41 endmodule
    View Code
     1 /* 
     2 (C) OOMusou 2009 http://oomusou.cnblogs.com
     3 
     4 Filename    : delay_3t.v
     5 Compiler    : NC-Verilog 5.4
     6 Description : delay 3t method 2
     7 Release     : 06/15/2009 1.0
     8 */
     9 
    10 module delay_3t (
    11   clk,
    12   rst_n,
    13   d,
    14   q
    15 );
    16 
    17 input  clk;
    18 input  rst_n;
    19 input  d;
    20 output q;
    21 
    22 reg d_dly_1t;
    23 reg d_dly_2t;
    24 reg d_dly_3t;
    25 
    26 assign q = d_dly_3t;
    27 
    28 always@(posedge clk or negedge rst_n) begin
    29   if (!rst_n)
    30     {d_dly_3t, d_dly_2t, d_dly_1t}  <= 0;
    31   else
    32     {d_dly_3t, d_dly_2t, d_dly_1t} <= {d_dly_2t, d_dly_1t, d};
    33 end
    34 
    35 endmodule
    View Code
     1 /* 
     2 (C) OOMusou 2009 http://oomusou.cnblogs.com
     3 
     4 Filename    : delay_nt.v
     5 Compiler    : NC-Verilog 5.4
     6 Description : delay 3t method 3
     7 Release     : 06/15/2009 1.0
     8 */
     9 
    10 module delay_nt (
    11   clk,
    12   rst_n,
    13   d,
    14   q
    15 );
    16 
    17 parameter n = 1;
    18 
    19 input  clk;
    20 input  rst_n;
    21 input  d;
    22 output q;
    23 
    24 reg [n-1:0] r;
    25 
    26 assign q = r[n-1];
    27 
    28 integer i;
    29 
    30 always@(posedge clk or negedge rst_n) begin
    31   if (!rst_n) 
    32     r <= 0;
    33   else begin
    34     for(i=0; i<n-1; i=i+1)
    35       r[i+1] <= r[i];
    36       
    37     r[0] <= d;
    38   end
    39 end
    40 
    41 endmodule
    View Code
     1 /* 
     2 (C) OOMusou 2009 http://oomusou.cnblogs.com
     3 
     4 Filename    : delay_nt.v
     5 Compiler    : NC-Verilog 5.4
     6 Description : delay 3t method 4
     7 Release     : 06/15/2009 1.0
     8 */
     9 
    10 module delay_nt (
    11   clk,
    12   rst_n,
    13   d,
    14   q
    15 );
    16 
    17 parameter n = 3;
    18 
    19 input  clk;
    20 input  rst_n;
    21 input  d;
    22 output q;
    23 
    24 reg [n-1:0] r;
    25 
    26 assign q = r[n-1];
    27 
    28 always@(posedge clk or negedge rst_n) begin
    29   if (!rst_n) 
    30     r <= 0;
    31   else
    32     r <= {r, d};  
    33 end
    34 
    35 endmodule
    View Code

    {}写法是Verilog的独门绝技,这样就不再需要for,这也是为什么Verilog宁愿从C语言抢走{}换来begin, end,因为{}这种合并的写法非常的好用。Testbench与模拟波型图也与Method 1与Method 2一样,再次省略。这种写法使用了parameter,无论要delay几个clk,只需修改n即可,而且与Quartus II优化后的硬件一样,我们再次将编译过的RTL Viewer打开做验证。

    Conclusion
    这4种写法最后合出来的硬件都一样,表示现在的合成器都够聪明,差别只是在哪种coding style较好,将来比较好维护。另外也是开开眼界,若将来阅读其他人的code,马上就知道对方想表达的意思。

  • 相关阅读:
    快速排序法的C#实现
    SQL语句执行效率及分析(note)
    如何在C#中运行数学表达式字符串
    TSQL删除重复数据,保留一条
    C#对象序列化XML时报错:反射类型XXX时出错
    c#如何扩展类型的内置方法
    把数字转换成阿拉伯数字大写的程序
    使用C#格式化字符串
    Silverlight中自己定义实现的双击方法
    原来是这样:C#中new一个对象时,发生了什么事?
  • 原文地址:https://www.cnblogs.com/zlh840/p/3460833.html
Copyright © 2011-2022 走看看