硬件架構的藝術(二)

處理多個時鐘

單時鐘域

單時鐘域
易於實現,並且更少產生於亞穩態、建立與保持時間違背方面的問題。

多時鐘域

多時鐘設計具有問題:

  1. 建立時間和保持時間的違背
  2. 亞穩態
    多時鐘域

多時鐘設計的處理技術

通用的準則有時鐘命名法和分模塊設計

時鐘命名法

例如:系統時鐘可以命名爲sys_clk,發送時鐘可以命名爲tx_clk,接收時鐘可以命名爲rx_clk,這樣可以在腳本中使用通配符來對所有時鐘進行操作。同樣,屬於同一個時鐘域的信號,在命名時使用同樣的前綴。

分模塊設計

分模塊設計:

  • 每個模塊在單個時鐘下工作
  • 在信號跨時鐘域傳輸時,使用同步器模塊,使進入某個時鐘域內的模塊信號,與該模塊時鐘保持同步
  • 同步器模塊規模儘可能小
    設計劃分

跨時鐘域

跨異步時鐘域的傳輸可以分爲兩類:

  • 控制信號的傳輸
  • 數據信號的傳輸

控制信號傳輸:
爲減少亞穩態的影響,設計者最常用的方式是使用多級同步器,即兩個或多個觸發器串聯起來組成的同步電路(使用兩級同步電路就足以避免亞穩態的出現,只有在時鐘頻率非常高的設計中才要求使用三級同步器電路)
雙級同步電路
數據信號傳輸:
握手信號和異步FIFO

跨同步時鐘域問題

同頻零相位差時鐘

唯一要求:保證STA(靜態時序分析)通過,如果這一條件滿足,就不會出現亞穩態問題和數據丟失或不一致問題。

同頻恆定相位差時鐘

同頻恆定相位當數據從clk1 傳輸至clk2 時,由於更小的建立時間/保持時間餘量,對於組合邏輯的延時約束都會變得更緊,如果組合邏輯的延時能夠保證滿足採樣沿處建立時間和保持時間的要求,數據就可以正確傳輸,並且沒有亞穩態產生(不需要同步器)
一般會創建這種情況以滿足時序的要求(通過在發射邊沿和捕獲邊沿加入偏移)

非同頻、可變相位差時鐘

整數倍頻率時鐘

兩個時鐘的有效邊沿的相位差是可變的,這兩個時鐘的有效邊沿的最小相位差始終等於其中較快的那個時鐘的時間週期
(以下的圖,數據是由快時鐘到慢時鐘,可能會出現數據丟失,所以必須要將源數據保持至少一個目標時鐘週期,可以使用一個簡單的FSM實現)
含內部倍頻的時鐘clk1的頻率是時鐘clk2的三倍。clk2捕獲數據的時間可能是T、2T或3T,取決於數據是在clk1哪一個邊沿發送出來,所以應滿足任意路徑的最差延遲都應在時鐘邊沿相位差爲T時滿足建立時間的要求。
由於至少都有較快時鐘的一個完整的週期用來傳輸數據,所以通常可以保證滿足建立時間和保持時間的要求,基本不會存在亞穩態或數據不一致的問題,也就無需使用同步器。

非整數倍頻率時鐘

由於一個時鐘的頻率是另一個時鐘的非整數倍,所以有效邊沿的相位差是可變的。此時兩時鐘之間的最小相位差足以使亞穩態發生(取決於實際的頻率倍數和設計工藝)。

  1. 在源時鐘和目的時鐘有效沿之間有足夠大的相位差,所以不會有亞穩態。
    例如,clk1和clk2分別是clk=30ns的三分頻與二分頻,即clk1的週期是15ns,clk2的週期是10ns。這兩個時鐘的最小相位差爲2.5ns,對於滿足建立時間和保持時間足夠了。由於相位差很小,避免在跨越兩個時鐘的未知使用任何組合邏輯,必須要使用同步器。
    避免亞穩態
  2. 源時鐘和目的時鐘有效沿非常接近,導致產生亞穩態問題。
    一旦有時鐘邊沿接近這種情況出現,下一個時鐘週期就會留出足夠大的時間冗餘,使得數據的捕獲不會出現違背建立時間或保持時間的要求。
    例如,時鐘clk1和clk2的週期分別爲10ns和7ns,之間的最小相位差是0.5ns。必須要用同步器。
    間歇性聚集的時鐘沿
  3. 兩個時鐘的時鐘沿在許多連續的週期中都非常接近

在這種情況下時鐘的相位差差異很小,並且連續存在幾個週期。除了變化的相位差異和週期性重複現象,其餘都與異步時鐘很相似。
clk1=10ns,clk2=9ns
在前兩個週期中可能違背建立時間(源時鐘在目的時鐘之前),而在後兩個時鐘週期中可能會違背保持時間(目的時鐘在源時鐘之前)(除了亞穩態問題,數據從慢時鐘域傳遞至快時鐘域也可能丟失)。
連續聚集幾個週期的時鐘沿爲了不丟失數據,數據需要保持穩定至少兩個目的時鐘週期,既適用於從快到慢的傳輸,也適用於從慢到快的傳輸。

握手信號方法

使用握手信號是最古老的在不同域之間傳輸數據的方式。
握手信號握手信號時域圖
(1)發送端將數據放到數據總線上併發送(xreq)信號,表示有效數據已經發送接受端的數據總線上,途中xreq->yreq1即將xreq同步至yclk時鐘。
(2)接收器通過一個同步器,識別yreq2後,鎖存數據總線上的數據,併發出確認信號yack
(3)yack信號同步至xclk,產生信號xack1
(4)發送端通過一個同步器,識別xack2。
(5)下一個時鐘週期,將下一個數據放到數據總線上
所以安全地將一個數據從發送端傳輸至接受端需要5個時鐘週期。由此看來握手信號的缺點也十分明顯,傳輸單個數據的延遲太長
**握手信號要求:**數據應在發送時鐘域上穩定至少2個時鐘上升沿。
**缺點:**傳輸單個數據延時高

使用同步FIFO

同步FIFO同步FIFO的工作原理:在同一個時鐘信號下,通過讀、寫指針產生各自的讀、寫地址,再通過產生的讀、寫地址分別從FIFO存儲器中讀取和寫入數據。使用狀態模塊產生的fifo_empty和fifo_full信號。如果fifo_empty有效,說明FIFO已經“讀空”,如果fifo_full有效,說明FIFO已經“寫滿”。
而在讀寫指針相等時,FIFO要麼空要麼滿,所以需要對這兩種情況進行區分。

  • 寫操作使兩個指針在下個時鐘保持相等,即FIFO滿,這時會發出fifo_full信號
  • 使讀操作使兩個指針在下個時鐘保持相等,即FIFO空,這時會發送fifo_empty信號

使用異步FIFO

異步FIFO用來在兩個異步時鐘域建傳輸數據。它用於對性能要求比較高的設計中,尤其是時鐘延時比系統資源更爲重要的環境中。
在這裏插入圖片描述異步FIFO的工作原理:原理上,與同步FIFO的區別在於讀寫數據工作在不同時鐘域下。(與握手信號不同,異步FIFO用於性能要求較高的設計中,延遲比系統資源更爲重要)

  • 避免使用二進制計數器,使用格雷碼同步實現指針;

由於指針與各自的時鐘同步,而彼此的之間異步,使用二進制計數器實現指針,可能會導致用於比較的指針值取樣錯誤。(比如從FFF->000所有位都會發生改變,所以本次採用格雷碼進行操作)

  • 數據指針如何在不同時鐘域傳遞

(1)xclk的寫指針(二進制)->gray 碼 ->經過同步器 ->讀寫指針比較是否產生“寫滿”狀態
(2)yclk的讀指針(二進制) ->gray碼 ->經過同步器 ->讀寫指針比較是否產生"讀空"狀態

  • gray碼的讀寫指針如何比較產生讀寫狀態

判斷讀空時:需要讀時鐘域的格雷碼rgray_next和被同步到讀時鐘域的寫指針wp每一位都相同。
判斷寫滿時:需要寫時鐘域的格雷碼wgray_next和被同步到寫時鐘域的讀指針rp高兩位不同,其餘各位完全相同。

時鐘分頻器

偶數分頻器

偶數分頻器可以用摩爾型狀態機或者計數器很容易實現。

奇數分頻器

也可以使用與偶數分頻相同的方法,但是無法產生50%佔空比的輸出(比如7分頻)。

產生具有50%佔空比的奇數分頻時鐘最簡單的方式是以輸出頻率的一半生成兩個正交相位時鐘(兩個時鐘之間有90度相位差),然後將兩個波形異或得到輸出時鐘(以N=3爲例)

  1. 產生兩個6分頻且相位差有90度的時鐘(一個使用上升沿產生6分頻信號,一個使用下降沿產生6分頻信號)
  2. 對兩個時鐘進行異或處理,產生3分頻目標時鐘
    重點:
    (1)上升沿在計數值爲0時翻轉
    (2)下降沿在計數值爲(N+1)/2時翻轉

    3分頻

分整數分頻

產生1.5倍的分頻時鐘

1.5倍分頻

產生4.5分頻時鐘

使用移位寄存器產生4.5倍分頻的實現(非50%佔空比),對非整數分頻電路進行優化,使輸出時鐘不含毛刺
(1)使用復位值爲000000001的9位移位寄存器,在時鐘上升沿使移位寄存器循環左移一位。
(2)產生4.5倍分頻的第一個脈衝,將在半週期移位第1位並將之與第1位與第2位進行或操作(佔空比40%)
(3)產生4.5倍分頻的第二個脈衝,第5位和第6位在半週期時移動並與第6位進行或操作
4.5倍分頻

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章