一、場景描述:
某訊號signal需要在不同的時鐘域進行處理,需要同步到的不同的時鐘域繼續使用。
舉例說明:某定時器timer包含兩個時鐘域bus_clk和tmr_clk。狀態暫存器sts和控制暫存器ctrl定義如下。暫存器讀寫訪問採用bus_clk時鐘,timer功能採用tmr_clk時鐘,當發生溢位時置位溢位標誌,即set_tof=1,set_tof屬於tmr_clk時鐘域,通過對暫存器相應位寫1清零清除溢位標誌,即clr_tof=1,clr_tof屬於bus_clk時鐘域。經過跨時鐘域處理之後,需要產生兩個訊號tof和tof_async,tof為暫存器標誌位供使用者訪問屬於bus_clk時鐘域,tof_async用於產生非同步中斷屬於tmr_clk時鐘域,兩個訊號tof和tof_async屬於不同的時鐘域。
name
stsoffset
0x00
bit31
3029
2827
2625
2423
2221
2019
1817
16read
write
reset00
0000
0000
0000
00bit15
1413
1211109
8765
4321
0read
tofwrite
w1creset00
0000
0000
0000
00tof:計數器溢位標誌,通過寫1清零。
name
ctrl
offset
0x04
bit31
3029
2827
2625
2423
2221
2019
1817
16read
write
reset00
0000
0000
0000
00bit15
1413
1211109
8765
4321
0read
ieen
write
reset00
0000
0000
0000
00ie:溢位中斷使能。
en:timer計數使能。
二、**實現:
1、cross_clk_domain模組設計
1module
cross_clk_domain(23
output
wire
signal1, // for clk1 domain
4output
wire
signal2, // for clk2 domain56
input
wire
set_signal_condition, // siganl set condition in clk1 domain
7input
wire
clk1,
8input
wire
rstn1,910
input
wire
clr_signal_condition, // signal clr condition in clk2 domain
11input
wire
clk2,
12input
wire
rstn2
13);
1415
regset_signal;
16reg
set_signal_d;
17reg
set_signal_dd;
18reg
clr_signal;
19reg
clr_signal_d;
20reg
clr_signal_dd;
2122
always @(posedge clk1 or
negedge rstn1)begin
23if(!rstn1)begin
24 set_signal <= 1
'b0;
25end
26else
if(clr_signal_dd)begin
27 set_signal <= 1
'b0;
28end
29else
if(set_signal_condition)begin
30 set_signal <= 1
'b1;
31end
32end
3334
always @(posedge clk2 or
negedge rstn2)begin
35if(!rstn2)begin
36 set_signal_d <= 1
'b0;
37 set_signal_dd <= 1
'b0;
38end
39else
begin
40 set_signal_d <=set_signal;
41 set_signal_dd <=set_signal_d;
42end
43end
4445
always @(posedge clk2 or
negedge rstn2)begin
46if(!rstn2)begin
47 clr_signal <= 1
'b0;
48end
49else
if(~set_signal_dd )begin
50 clr_signal <= 1
'b0;
51end
52else
if(clr_signal_condition)begin
53 clr_signal <= 1
'b1;
54end
55end
5657
always @(posedge clk1 or
negedge rstn1)begin
58if(!rstn1)begin
59 clr_signal_d <= 1
'b0;
60 clr_signal_dd <= 1
'b0;
61end
62else
begin
63 clr_signal_d <=clr_signal;
64 clr_signal_dd <=clr_signal_d ;
65end
66end
6768
assign signal1 = set_flag; // signal1 in clk1 domain
69assign signal2 = set_flag_dd; // signal2 in clk2 domain
7071
endmodule
2、例項化
1cross_clk_domain cross_clk_domain_inst(
2signal1(tof_async),
3signal2(tof),45
set_signal_condition(set_tof),
6clk1(tmr_clk),
7 rstn1(tmr_clk_rstn), //
asynchronous reset and synchronous release89
clr_signal_condition (clr_tof),
10clk2(bus_clk),
11rstn2(bus_clk_rstn)
12 );
注:tmr_clk_rstn和bus_clk_rstn兩個復位訊號不屬於同一復位訊號,否則會存在亞穩態問題(後期會詳細**這個問題),一般頂層埠只提供乙個復位訊號bus_clk_rstn,這裡的tmr_clk_rstn需要做非同步復位同步釋放處理。
跨時鐘域處理
需要做的事情 使能訊號txe to eth由時鐘122.88m時鐘輸出 另一使能訊號vde dv由25m時鐘輸出,計算兩個使能訊號之間的時間間隔,即兩個訊號上公升沿之間的時鐘計數。由於兩個訊號屬於不同的時鐘域,因此要先進行跨時鐘域處理,這裡對vde dv進行處理 在122.88m時鐘下將vde dv...
跨時鐘域處理
討論 今天華為面試題 非同步fifo讀時鐘是寫時鐘的100倍,或者寫是讀的100倍會出現什麼問題?今天華為面試題 非同步fifo讀時鐘是寫時鐘的100倍,或者寫是讀的100倍會出現什麼問題?答得 如果是瞬態資料中間有足夠間隔,則不會出現問題。如果是連續資料,則很快輸出空滿標誌位。面試官不滿意,請教下...
FPGA單位元訊號跨時鐘域處理
詳細的原理解釋 單位元訊號跨時鐘域問題詳解 輸入 singal in,來自10mhz慢速時鐘域的單位元訊號 輸出 singal out,輸出100mhz快速時鐘域的單位元訊號 10mhz 100ns 100mhz 10ns 因為慢速時鐘域的最簡訊號長度為1個時鐘時鐘週期即 100ns,大於快速時鐘域...