FPGA基礎知識14 跨時鐘域處理 非同步時鐘

2021-07-14 15:27:16 字數 3959 閱讀 7433

需求說明:ic設計基礎

內容       :第一部分 fpga跨時鐘域的處理方法

第二部分 基於fpga的跨時鐘域訊號處理——專用握手訊號

來自       :時間的詩

原文:在乙個

fpga

系統設計中,經常需要處理多個時鐘**,比如fpga作為乙個**橋連線幾個不同的ic。不同的時鐘域有不同的時鐘頻率和時鐘相位。如何處理好多個時鐘訊號在fpga內部的關係,讓資料以及相關的控制訊號在不同的時鐘域之間準確的傳遞就是乙個比較困難的問題。在這種情況下,建立與保持時間就顯得尤為重要。理論上完美的訊號應該是矩形的,上公升和下降時間為0,在低速率系統中,上公升下降時間確實可以忽略不計,但在高速系統中,這個時間不能忽略。在數字系統中0和1的判決在於電壓,高於乙個電壓值表示為1,低於乙個電壓值表示為0,在這兩個電壓之間存在乙個中間不確定狀態的值,當跨時鐘域的時候,新的時鐘域時鐘取樣時間恰好落在這個區間內,就可能發生錯誤,這就是數字系統中最需要避免的亞穩態。如何避免呢?

最好的辦法是採用fifo,讀寫時鐘分別是兩個時鐘域的時鐘,通過fifo的滿空狀態,以及讀寫使能,控制好輸入輸出的流量。

還有一種辦法就是使用雙鎖存器的辦法,即乙個訊號從a時鐘域進入另乙個時鐘域b的時候,先用b時鐘對輸入訊號連續鎖存2次,然後再在b時鐘域中使用,可以有效消除亞穩態,不過需要注意的是假如a時鐘頻率低於b時鐘頻率的時候,出現資料被插值,即一組資料,本來是10個位元組依次傳遞過來,但到達b時鐘域後,因為b時鐘較快,而資料變化速率依然是a時鐘頻率決定,於是資料可能會出現被多次取樣,造成不被期望產生的插值,變成十幾個乃至幾十個資料。當a時鐘頻率高於b時鐘頻率的時候,可能會出現訊號漏採的問題。所以採用fifo是更穩妥的辦法,當然fifo也有一定的侷限性,所以需要靈活的使用這兩種辦法,以達到最佳效果。

原文:

在邏輯設計領域,只涉及單個時鐘域的設計並不多。尤其對於一些複雜的應用,fpga

往往需要和多個時鐘域的訊號進行通訊。非同步時鐘域所涉及的兩個時鐘之間可能存在相位差,也可能沒有任何頻率關係,即通常所說的不同頻不同相。

圖1是乙個跨時鐘域的非同步通訊例項,傳送域和接收域的時鐘分別是clk_a和clk_b。這兩個時鐘頻率不同,並且存在一定的相位差。對於接收時鐘域而言,來自傳送時鐘域的訊號data_a2b有可能在任何時刻變化。

圖1 跨時鐘域通訊

對於上述的非同步時鐘域通訊,設計者需要做特殊的處理以確保資料可靠的傳輸。由於兩個非同步時鐘域的頻率關係不確定,觸發器之間的建立時間和保持時間要求也無法得到保證。如果出現建立時間或者保持時間違規,接收域將會取樣到處於亞穩態資料,那麼後果可想而知。

如何有效的進行跨時鐘域的訊號傳輸呢?最基本的思想是同步,在這個基礎上設計者可以利用各種協議約定進行通訊。單向控制訊號檢測方式(前面提到過的脈衝訊號檢測方法,這裡為了和握手方式相區別,所以如此稱呼)、握手協議的方式或者借助儲存器的方式都是比較常用的處理手段。

本文將重點介紹握手方式進行非同步時鐘域的通訊。

圖2是乙個基本的握手通訊方式。所謂握手,意即通訊雙方使用了專用控制訊號進行狀態指示。這個控制訊號既有傳送域給接收域的,也有接收域給傳送域的,有別於前面的單向控制訊號檢測方式。

圖2 握手通訊原理

使用握手協議方式處理跨時鐘域資料傳輸,只需要對雙方的握手訊號(req和ack)分別使用脈衝檢測方法進行同步。在具體實現中,假設req、ack、data匯流排在初始化時都處於無效狀態,傳送域先把資料放入匯流排,隨後傳送有效的req訊號給接收域。接收域在檢測到有效的req訊號後鎖存資料匯流排,然後回送乙個有效的ack訊號表示讀取完成應答。傳送域在檢測到有效ack訊號後撤銷當前的req訊號,接收域在檢測到req撤銷後也相應撤銷ack訊號,此時完成一次正常握手通訊。此後,傳送域可以繼續開始下一次握手通訊,如此迴圈。該方式能夠使接收到的資料穩定可靠,有效的避免了亞穩態的出現,但控制訊號握手檢測會消耗通訊雙方較多的時間。以上所述的通訊流程如圖3所示。

圖3 握手通訊流程

下面通過乙個簡單的工程**及其**測試進一步加深大家對基本握手協議的認識。

module handshack(

clk,rst_n,

req,datain,ack,dataout

);input clk; //50mhz系統時鐘

input rst_n; //低電平復位訊號

input req; //請求訊號,高電平有效

input[7:0] datain; //輸入資料

output ack; //應答訊號,高電平有效

output[7:0] dataout;//輸出資料,主要用於觀察是否和輸入一致

//--------------------------------------

//req上公升沿檢測

reg reqr1,reqr2,reqr3;

always @(posedge clk or negedge rst_n)

if(!rst_n) begin

reqr1 <= 1'b1;

reqr2 <= 1'b1;

reqr3 <= 1'b1;

endelse begin

reqr1 <= req;

reqr2 <= reqr1;

reqr3 <= reqr2;

end//pos_req2比pos_req1延後乙個時鐘週期,確保資料被穩定鎖存

wire pos_req1 = reqr1 & ~reqr2; //req上公升沿標誌位,高有效乙個時鐘週期

wire pos_req2 = reqr2 & ~reqr3; //req上公升沿標誌位,高有效乙個時鐘週期

//--------------------------------------

//資料鎖存

reg[7:0] dataoutr;

always @(posedge clk or negedge rst_n)

if(!rst_n) dataoutr <= 8'h00;

else if(pos_req1) dataoutr <= datain; //檢測到req有效後鎖存輸入資料

assign dataout = dataoutr;

//--------------------------------------

//產生應答訊號ack

reg ackr;

always @(posedge clk or negedge rst_n)

if(!rst_n) ackr <= 1'b0;

else if(pos_req2) ackr <= 1'b1;

else if(!req) ackr <= 1'b0;

assign ack = ackr;

endmodule

該例項的verilog**模擬了握手通訊的接收域,其**波形如圖4所示。在傳送域請求訊號(req)有效的若干個時鐘週期後,先是資料(datain)被有效鎖存了(dataout),然後接收域的應答訊號(ack)也處於有效狀態,此後傳送域撤銷請求訊號,接收域也跟著撤銷了應答訊號,由此完成一次通訊。

圖4 握手通訊**波形

FPGA知識點 跨時鐘域處理

單bit訊號 慢時鐘到快時鐘,兩級觸發器同步。快時鐘到慢時鐘,如果是下面第乙個圖,clkb可以取樣到signal a in,但是如果只有單脈衝,如第二個圖所示,怎不能確保取樣到signal a in。這個時候可以展寬signal a in,至少為clkb的乙個時鐘週期寬度。通常處理方法是使用反饋機制...

跨域基礎知識總結

瀏覽器出於安全方面的考慮,只允許與本域下的接 互。不同源的客戶端指令碼在沒有明確授權的情況下,不能讀寫對方的資源。本域指的是 需要注意的是 對於當前頁面來說頁面存放的 js 檔案的域不重要,重要的是載入該 js 頁面所在什麼域 跨域的幾種方法 html 中 script 標籤可以載入其他域下的js,...

FPGA跨時鐘域處理方法FIFO

1 本節目錄 2 本節引言 3 fpga簡介 4 fpga跨時鐘域處理方法fifo 5 結束語。不積跬步,無以至千里 不積小流,無以成江海。就是說 不積累一步半步的行程,就沒有辦法達到千里之遠 不積累細小的流水,就沒有辦法匯成江河大海。fpga field programmable gate arr...