在萧大哥的博客里看到这篇博客,用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. BHASKER的Verilog 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;