FPGA中信号的延迟

在萧大哥的博客里看到这篇博客,用VHDL写过这个,在实际的项目中经常需要将特定的信号延迟,这个是Verilog的学习下了。。。。(http://www.cnblogs.com/oomusou/archive/2009/06/15/verilog_dly_n_clk.html)

 

 

Abstract
在實務上為了與其他信號同步,常會故意delay幾個clk。

Introduction
使用環境:NC-Verilog 5.4 + Debussy 5.4 + Quartus II 9.0

為什麼需要將值delay n的clk呢?比如說我想運算A+B,目前這個clk A已經到了,但B必須delay 3個clk之後才會到,為了運算A+B,勢必使用shift register將A delay 3個clk之後,才能與B同步,所以希望先做出delay 3個clk的功能,進而實作出delay n個clk。

 

 

delay_nt.v / Verilog

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
既然要做個通用的shift register,很直覺的會想到用for,這種寫法在很多書上都曾看過,就我印象中,在J. BHASKERVerilog HDL Primer吳戈Verilog HDL與數字系統設計簡明教程這兩本書都用這種寫法。
将其转为VHDL版:
 /*
 Filename    : VS_delay.vhd
 Description : delay 20t
 Release     : 05/15/2010 1.0
 */

LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY VS_delay IS
    PORT(VS_in,CLK_IN:IN STD_LOGIC;
                               VS:OUT STD_LOGIC);
END VS_delay;
ARCHITECTURE rtl OF VS_delay IS
 
COMPONENT dff
   PORT(d,clk:IN STD_LOGIC;
                 q:OUT STD_LOGIC);
END COMPONENT;
SIGNAL z:STD_LOGIC_VECTOR(0 TO 19);
BEGIN
    z(0)<=VS_in;
       g1:FOR i IN 0 TO 19 GENERATE
       dffx:dff PORT MAP(z(i),CLK_IN,z(i+1));
       END GENERATE;
    VS<=z(20);
END rtl;

你可能感兴趣的:(FPGA中信号的延迟)