單bit訊號
慢時鐘到快時鐘,兩級觸發器同步。
快時鐘到慢時鐘,如果是下面第乙個圖,clkb可以取樣到signal_a_in,但是如果只有單脈衝,如第二個圖所示,怎不能確保取樣到signal_a_in。
這個時候可以展寬signal_a_in,至少為clkb的乙個時鐘週期寬度。通常處理方法是使用反饋機制將輸入訊號展寬。
//在clka下,生成展寬訊號signal_a
always @(posedge clka oe negedge rst_n) begin
if(rst_n ==
1'b0)
signal_a <=
1'b0;
else
if(pulse_ina ==
1'b1)
signal_a <=
1'b1;
else
if(signal_a_r[1]
==1'b1)
signal_a <=
1'b0;
else
signal_a <= signal_a;
end//在clka下採集signal_b[1],生成signal_a_r[1]用於反饋拉低signal_a
always @(posedge clka or negedge rst_n) begin
if(rst_n ==
1'b0)
signal_a_r <=
2'b00;
else
signal_a_r <=
[signal_a_r[0]
,signal_b_r[1]
];end
多bit訊號採用非同步fifo,非同步fifo的設計見非同步fifo的設計
握手協議
握手協議非同步訊號處理行為波形圖大致如下所示
訊號d_in所處時鐘域是clk_in,且d_in只有1t的寬度,想要傳送到clk_out時鐘域(clk_out和clk_in不相關)
因為clk_out和clk_in相位關係不確定,時鐘週期大小關係不確定,它無法保證一定能取樣到d_in;
因此需要把d_in展寬,產生d_req訊號;
d_req訊號一直拉高,經過clk_out時鐘域兩級dff同步器後,得到d_req_sync;
取d_req_sync上公升沿1t,即可得到傳送到clk_out時鐘域的d_out。
此時,d_in從clk_in傳送到ckk_out的任務就算是結束了。
但對於handshake電路來說,任務還沒有結束,因為d_req一直是高電平。
因此,需要把d_req_sync訊號再用兩級dff同步器,傳回clk_in時鐘域,得到d_ack訊號;
當clk_in看到d_ack拉高後,就可以把d_req訊號拉低,到這裡乙個handshake電路行為才算是結束了。
always @(posedge clk_in or negedge rst_n) begin
if(rst_n ==
1'b0)
d_req <=
1'b0;
else
if(d_in ==
1'b1)
d_req <=
1'b1;
else
if(d_ack ==
1'b1)
d_req <=
1'b0;
end
此種方法要保證時鐘週期要保證clka時鐘域連續兩個單週期脈衝訊號的間隔要大於握手協議所需的延遲。
握手協議速度慢,相對於兩級dff占用更多的暫存器。
dmux電路
將sel訊號做非同步處理,然後輸出多位元資料。
FPGA基礎知識14 跨時鐘域處理 非同步時鐘
需求說明 ic設計基礎 內容 第一部分 fpga跨時鐘域的處理方法 第二部分 基於fpga的跨時鐘域訊號處理 專用握手訊號 來自 時間的詩 原文 在乙個 fpga 系統設計中,經常需要處理多個時鐘 比如fpga作為乙個 橋連線幾個不同的ic。不同的時鐘域有不同的時鐘頻率和時鐘相位。如何處理好多個時鐘...
FPGA跨時鐘域處理方法FIFO
1 本節目錄 2 本節引言 3 fpga簡介 4 fpga跨時鐘域處理方法fifo 5 結束語。不積跬步,無以至千里 不積小流,無以成江海。就是說 不積累一步半步的行程,就沒有辦法達到千里之遠 不積累細小的流水,就沒有辦法匯成江河大海。fpga field programmable gate arr...
FPGA單位元訊號跨時鐘域處理
詳細的原理解釋 單位元訊號跨時鐘域問題詳解 輸入 singal in,來自10mhz慢速時鐘域的單位元訊號 輸出 singal out,輸出100mhz快速時鐘域的單位元訊號 10mhz 100ns 100mhz 10ns 因為慢速時鐘域的最簡訊號長度為1個時鐘時鐘週期即 100ns,大於快速時鐘域...