**:
fpga
跨時鐘域訊號
非同步時鐘
上次提出了乙個處於非同步時鐘域的mcu與fpga直接通訊的實現方式,其實在這之前,特權同學想列舉乙個非同步時鐘域**現的很典型的問題。也就是要用乙個反例來說明沒有足夠重視非同步通訊會給整個設計帶來什麼樣的危害。
特權同學要舉的這個反例是真真切切的在某個專案上發生過的,很具有代表性。它不僅會涉及使用組合邏輯和時序邏輯在非同步通訊中的優劣、而且能把亞穩態的危害活生生的展現在你面前。
從這個模組要實現的功能說起吧,如圖1所示,實現的功能其實很簡單的,就是乙個頻率計,只不過fpga除了脈衝採集進行計數外,還要響應cpu的控制。
圖1 功能模組
cpu的控制匯流排是指乙個片選訊號和乙個讀選通訊號,當二者都有效時,fpga需要對cpu的位址匯流排進行解碼,然後把取樣脈衝值送到cpu的資料匯流排上。
圖2 cpu讀時序
對於這樣「簡單」的功能,不少人可能會給出類似下面的以組合邏輯為主的實現方式:
input clk;
input rst_n;
input pulse;
input cs_n;
input rd_n;
input[3:0] addr_bus;
output reg[15:0] data_bus;
reg[15:0] counter;
always @(posedge pulse or negedge rst_n)
if(!rst_n) counter <= 16'd0;
else if(pulse) counter <= counter+1'b1;
wire dsp_cs = cs_n & rd_n;
always @(dsp_cs or addr_bus)
if(dsp_cs) data_bus <= 16'hzzzz;
else begin
case(addr_bus)
4'h0: data_bus <= counter;
4'h1: ……;
default: ;
endcase
end咋一看,可能你會覺得這個**也沒什麼問題,功能似乎都實現了。而且你會覺得這個**簡潔,也不需要耗費多少邏輯就能實現。但是,對於這種時鐘滿天飛的設計,存在著諸多亞穩態危害爆發的可能。脈衝訊號和由cpu控制匯流排產生的選通訊號是來自兩個非同步時鐘域的訊號。它們作為內部的時鐘訊號時,乙個寫暫存器counter,乙個讀暫存器counter。那麼,很明顯的,存在著發生衝突的可能。換句話說,如果暫存器正處於改變狀態(被寫)時被讀取了,問題就隨著而來,如圖3所示。
圖3 資料衝突
脈衝訊號pulse和cpu讀選通訊號cpu_cs是非同步訊號,pulse什麼時候出現上公升沿和cpu_cs什麼時候出現下降沿是不可控的。所以,如果它們很不幸的一起觸發了,那麼,結果可想而知。計數器counter[15:0]正在加一,這個自增的過程還在進行中,cpu資料匯流排data_bus[15:0]來讀取counter[15:0],那麼到底讀取的值是自增之前的值還是自增之後的值呢?或者是其它的值呢?
所示,它是乙個計數器的近似模型。當計數器自增一的時候,如果最低位為0,那麼自增的結果只會使最低位翻轉;當最低位為1,那麼自增一的後果除了使最低位翻轉,還有可能使其它任何位翻轉,比如4』b1111自增一的後果會使4個位都翻轉。由於每個位之間從發生翻轉到翻轉完成都需要經過一段邏輯延時和走線延時,對於乙個16位的計數器,要想使這16位暫存器的翻轉時間一致,那是不可能做到的。所以,對於之前的設計**現了如圖3的衝突時,被讀取的脈衝值很可能是完全錯誤的。
圖4 計數器模型
上面的**是最典型的組合邏輯實現方式,是很不可行的。也許很多朋友會提出異議,也許還會提出很多類似的組合邏輯方案。但是,如果沒有同步設計的思想,不把這兩個非同步時鐘域的訊號同步到乙個時鐘域裡進行處理,衝突的問題在無法得到有效解決的。
那麼,這個設計該如果同步呢?實現的方案其實上一次提到fpga與mcu通訊的博文裡已經給出了答案。它的設計思想可以如圖5所示。圖5先是使用脈衝檢測法把脈衝訊號與系統時鐘訊號clk同步,然後依然使用脈衝檢測法得到乙個系統時鐘寬度的使能脈衝作為資料鎖存訊號,也將cpu的控制訊號和系統時鐘訊號clk同步了。如此處理後,兩個非同步時鐘域的訊號就不存在任何讀寫衝突的情況了。
圖5 同步處理
這裡提出來的解決方案就是使用了脈衝檢測法進行同步,還有一些其它的同步方式,譬如專用握手訊號同步、非同步fifo等等。
FPGA單位元訊號跨時鐘域處理
詳細的原理解釋 單位元訊號跨時鐘域問題詳解 輸入 singal in,來自10mhz慢速時鐘域的單位元訊號 輸出 singal out,輸出100mhz快速時鐘域的單位元訊號 10mhz 100ns 100mhz 10ns 因為慢速時鐘域的最簡訊號長度為1個時鐘時鐘週期即 100ns,大於快速時鐘域...
跨時鐘域訊號處理
一 場景描述 某訊號signal需要在不同的時鐘域進行處理,需要同步到的不同的時鐘域繼續使用。舉例說明 某定時器timer包含兩個時鐘域bus clk和tmr clk。狀態暫存器sts和控制暫存器ctrl定義如下。暫存器讀寫訪問採用bus clk時鐘,timer功能採用tmr clk時鐘,當發生溢位...
FPGA跨時鐘域處理方法FIFO
1 本節目錄 2 本節引言 3 fpga簡介 4 fpga跨時鐘域處理方法fifo 5 結束語。不積跬步,無以至千里 不積小流,無以成江海。就是說 不積累一步半步的行程,就沒有辦法達到千里之遠 不積累細小的流水,就沒有辦法匯成江河大海。fpga field programmable gate arr...