1. 程式人生 > >跨時鐘域處理所用到的同步器

跨時鐘域處理所用到的同步器

本知識來自《Verilog程式設計藝術》作者:魏家明 一書

同步器基本上分為三種:電平同步、邊沿檢測和脈衝檢測

電平同步:

簡單的電平同步有兩個觸發器串聯而成,中間沒有其他組合電路。這種設計可以保證後面觸發器使用前面觸發器的輸出時,前面觸發器已經退出亞穩態,並且輸出已經穩定。設計中要注意將兩個觸發器放得儘可能近,以確保二者之間有最小的時鐘偏差。

為了使同步能正常進行,從原時鐘域傳來的訊號應先通過原時鐘域上的一個觸發器,然後直接進入同步器的第一級觸發器中(不能經過兩個時鐘域間的任何組合邏輯)。這一要求非常重要,因為同步器的第一級觸發器對組合邏輯所產生的毛刺非常敏感。如果一個足夠長的毛刺正好滿足建立/保持時間的要求,那麼同步器的第一級觸發器將會將其放行,就給新時鐘域的後續邏輯送出一個虛假訊號。

脈衝同步:

脈衝同步檢測同步器的輸入訊號是一個單時鐘寬度脈衝,它觸發原時鐘域中的一個翻轉電路。每當翻轉電路接收到一個脈衝時,它就會在高、低電平間進行轉換,然後通過電平同步器輸出的訊號到達異或門的一個輸入端,而這個輸出的訊號再經過一個時鐘週期的延遲進入異或門的另一端,翻轉電路每轉換一次狀態,這個同步器的輸出端就產生一個單時鐘寬度的脈衝。

脈衝同步的基本功能是從某個時鐘域取出一個單時鐘寬脈衝,然後在新的時鐘域中建立另一個單時鐘寬度的脈衝。脈衝同步的限制,即輸入脈衝之間的最小間隔必須等於兩個同步器時鐘週期。如果輸入脈衝相互過近,則新時鐘域中的輸出脈衝也緊密相鄰,結果是輸出脈衝寬度比一個時鐘週期寬。當輸入脈衝時鐘大於兩個同步器時鐘週期時,這個問題更加嚴重。這種情況下,如果輸入脈衝相鄰太近,則同步器就不能檢測到每個脈衝。

同步多位資料:

有時候需要將多位資料從一個時鐘域傳送到另一個時鐘域,然後再使用。此時不能使用多位電平同步器直接同步多位資料,然後就直接使用這些位的同步結果,因為這樣根本就起不到同步作用,這些多位資料在新時鐘域裡可能不是在同一個時鐘沿更改的。我們也不能使用脈衝同步器同步多位控制位,因為同步後的多位控制位可能根本就是錯亂的。

同步多位資料應該按照下面的步驟進行:

1、確保in_data在傳送期間不會發生改變,所以儘量採用暫存器輸出。

2、使用脈衝檢測同步器,傳送in_clk域的脈衝in_pulse到out_clk域的out_pulse,通知多位資料in_data已準備好。

3、在out_clk域檢測到out_pulse之後,才把in_data直接鎖存到out_data中。