跨時鐘域訊號處理

2022-09-09 07:45:09 字數 4210 閱讀 8722

一、場景描述:

某訊號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模組設計

1

module

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、例項化

1

cross_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,大於快速時鐘域...