如何將值delay n個clock? (SOC) (Verilog)

来源:互联网 发布:java虚拟机 周志明 编辑:程序博客网 时间:2024/06/03 17:30

转自: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   q15 );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) begin29   if (!rst_n) begin30     d_dly_1t <= 0;31     d_dly_2t <= 0;32     d_dly_3t <= 0;33   end34   else begin35     d_dly_1t <= d;36     d_dly_2t <= d_dly_1t;37     d_dly_3t <= d_dly_2t;38   end39 end40 41 endmodule
复制代码
复制代码
 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   q15 );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) begin29   if (!rst_n)30     {d_dly_3t, d_dly_2t, d_dly_1t}  <= 0;31   else32     {d_dly_3t, d_dly_2t, d_dly_1t} <= {d_dly_2t, d_dly_1t, d};33 end34 35 endmodule
复制代码
复制代码
 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   q15 );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) begin31   if (!rst_n) 32     r <= 0;33   else begin34     for(i=0; i<n-1; i=i+1)35       r[i+1] <= r[i];36       37     r[0] <= d;38   end39 end40 41 endmodule
复制代码
复制代码
 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   q15 );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) begin29   if (!rst_n) 30     r <= 0;31   else32     r <= {r, d};  33 end34 35 endmodule
复制代码

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

 

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

0 0
原创粉丝点击