只有最初級的邏輯電路才使用單一的時鐘。大多數與數據傳輸相關的應用都有與生俱來的挑戰,即跨越多個時鐘域的數據移動,例如磁盤控制器、CDROM/DVD 控制器、調制解調器、網卡以及網絡處理器等。當信號從一個時鐘域傳送到另外一個時鐘域時,出如今新時鐘域的信號是異步信號。 網絡
在現代 IC、ASIC 以及 FPGA 設計中,許多軟件程序能夠幫助工程師創建幾百萬門的電路,但這些程序都沒法解決信號同步問題。設計者須要瞭解可靠的設計技巧,以減小電路在跨時鐘域通訊時的故障風險。異步
異步時鐘基礎: 函數
從事多時鐘設計的第一步是要理解信號穩定性問題。當一個信號跨越某個時鐘域時,對新時鐘域的電路來講它就是一個異步信號。接收該信號的電路須要對其進行同步。同步能夠防止第一級存儲單元(觸發器)的亞穩態在新的時鐘域裏傳播蔓延。 工具
亞穩態是指觸發器沒法在某個規定時間段內達到一個可確認的狀態。當一個觸發器進入亞穩態時,既沒法預測該單元的輸出電平,也沒法預測什麼時候輸出才能穩定在某個正確的電平上。在這個穩按期間,觸發器輸出一些中間級電平,或者可能處於振盪狀態,而且這種無用的輸出電平能夠沿信號通道上的各個觸發器級聯式傳播下去。spa
對任何一種觸發器,在時鐘觸發沿先後的一個小時間窗口內,輸入信號必須穩定。這一時間窗口是多種因素的函數,包括觸發器設計、實現技術、運行環境以及無緩衝輸出上的負載等。輸入信號陡峭的邊沿能夠將此窗口減至最小。隨着時鐘頻率的升高,會出現更多有問題的時間窗口,而隨着數據頻率的提高,這種窗口的命中機率則會增長。 FPGA 製造商和 IC 晶片廠用「MTBF」來標識合格的觸發器,而且肯定它們的特性。「MTBF」(平均無端障時間)用統計方法描述了一個觸發器的亞穩態特性,即肯定某個觸發器出現故障的機率。在計算 MTBF 時,製造商部分基於輸入信號改變致使觸發器不穩按期間的時間窗口長度。另外,MTBF 的計算還使用了輸入信號的頻率以及驅動觸發器的時鐘頻率。 設計
在一個 ASIC 或 FPGA 庫中,每種觸發器都有時序要求,以幫助你肯定容易出問題的窗口。「創建時間」(Setup time)是指在時鐘沿到來以前,觸發器輸入信號必須保持穩定的時間。「保持時間」(Hold time)則是指在時鐘沿以後,信號必須保持穩定的時間。這些指標一般比較保守,以應對電源電壓、工做溫度、信號質量以及製造工藝等各類可能的差別。若是一個設計知足了這些時序要求,則觸發器出現錯誤的可能性能夠忽略不計。 指針
現代 IC 與 FPGA 設計中使用的綜合工具能夠保證設計能知足每一個數字電路觸發器對創建與保持時間的要求。然而,異步信號卻給軟件提出了難題。對新的時鐘域來講,從其它時鐘域傳來的信號是異步的。大多數綜合工具在斷定異步信號是否知足觸發器時序要求時遇到了麻煩。由於它們不能肯定觸發器處於非穩態的時間,因此它們也就不能肯定從一個觸發同步
器經過組合邏輯到達下一個觸發器的總延遲時間。因此,最好的辦法是使用一些電路來減輕異步信號的影響。 class
信號同步:效率
信號同步的目的是防止新時鐘域中第一級觸發器的亞穩態信號對下級邏輯形成影響。簡單的同步器由兩個觸發器串聯而成,中間沒有其它組合電路。這種設計能夠保證後面的觸發器得到前一個觸發器輸出時,前一個觸發器已退出了亞穩態,而且輸出已穩定。設計中要注意將兩個觸發器放得儘量近,以確保二者間有最小的時滯(clock skew)。
IC 製造廠提供同步單元,幫助完成信號同步工做。這些單元一般包括一個有很是高增益的觸發器,它比普通觸發器耗電更高,也比較大。這種觸發器下降了對輸入信號創建-保持時間的要求,而且當輸入信號致使亞穩態時,它能夠防止出現振盪。另外一種同步器單元包括兩個觸發器,省去了將兩個單獨觸發器靠近放置的工做,也防止設計人員誤在兩個觸發器間加入任何其它的組合邏輯。爲了使同步工做能正常進行,從某個時鐘域傳來的信號應先經過原時鐘域上的一個觸發器,而後不通過兩個時鐘域間的任何組合邏輯,直接進入同步器的第一個觸發器中(圖 1)。這一要求很是重要,由於同步器的第一級觸發器對組合邏輯所產生的毛刺很是敏感。若是一個足夠長的信號毛刺正好知足創建-保持時間的要求,則同步器的第一級觸發器會將其放行,給新時鐘域的後續邏輯送出一個虛假的信號。一個經同步後的信號在兩個時鐘沿之後就成爲新時鐘域中的有效信號。信號的延遲是新時鐘域中的一到兩個時鐘週期。一種粗略的估算方法是同步器電路在新時鐘域中形成兩個時鐘週期的延遲,設計者須要考慮同步延遲將對跨時鐘域的信號時序形成的影響。
數據路徑設計:
在進行信號同步時有一個重要的規則,那就是不該當在設計中的多個地方對同一信號進行同步,即單個信號扇出至多個同步器。由於同步要花一到兩個時鐘週期,設計者不能確切地預測到每一個信號什麼時候跨越一個時鐘域。此外,在新時鐘域中一組經同步後的信號其時序是不定的,由於同步延遲能夠是一到兩個時鐘週期,這與輸入信號到達同步器的時間有關。這種狀況會在各個同步信號間造成一種「競爭情況」。這種競爭情況在須要跨越時鐘域傳輸的多組信號間也會發生,例如數據總線、地址總線和控制總線等。所以,不能對組中的每一個信號單獨使用同步器,也不能對數據或地址總線的每一位單獨使用同步器,由於在新的時鐘域中,要求每一個信號同時有效。
一種解決總線同步問題的方法是使用一個保持寄存器和握手信號。這種電路包括一個保持信號總線的寄存器,以及一個握手機制(圖 7)。握手信號指示新時鐘域的電路什麼時候能夠對總線採樣,以及源電路什麼時候能夠更換當前寄存器中保存的內容。
圖
在這種設計中,傳輸電路將數據(信號總線)存儲在保持寄存器,同時發出請求信號。這兩個動做能夠同時發生,由於請求信號至少要花一個時鐘週期才能讓接收電路檢測到它(最小的握手-同步延遲)。當接收電路採樣到數據(信號總線)時,它發出一個響應信號。這種設計使用了全握手方法,因此要花較長時間才能完成整個傳輸。對接收電路而言,使用全握手信號的設計有較大的時間窗口用於對信號總線採樣,於是效率較低。如用部分握手方法代替全握手方法則能夠加快傳輸速度。
用這種總線同步方式,你能夠同步握手信號,但不能同步信號總線。信號總線來自於保持寄存器,它在接收電路採樣前一直保持穩定。注意,若是傳輸電路向接收電路提交數據太快以至來不及處理,則應用中的總線同步可能不起做用。
高級數據路徑設計:
在許多狀況下,數據在跨越時鐘域時須要「堆積」起來,所以使用單個保持寄存器沒法完成工做。例如一種狀況是某個傳輸電路猝發式發送數據,接收電路來不及採樣。另外一種狀況是接收電路採樣速度超出傳輸電路發送數據的速度,但採樣的數據寬度不夠。這些狀況就要使用 FIFO 了。基本上,設計者使用 FIFO 有兩個目的:速度匹配或數據寬度匹配。在速度匹配時,FIFO 較快的端口處理猝發的數據傳輸,而較慢的端口則維持恆定的數據流。可是,雖然訪問方式和速度不一樣,但進出 FIFO 的平均數據速率必須是相同的,不然 FIFO 就會出現上溢(overflow)或下溢(underflow)問題。與單寄存器設計相同,FIFO 將數據保存在寄存器或存儲器中,同時同步狀態信號,判斷什麼時候能夠把數據寫入 FIFO 或從 FIFO 中讀出。
在速度匹配應用中,每一個端口(讀或寫)的時鐘不一樣。FIFO 中的寄存器使用寫端口時鐘,就像保持寄存器使用電路時鐘來改變寄存器內容同樣。信號同步發生在指針邏輯中,並且比握手信號要複雜得多。如今指針邏輯的設計有多種方法。第一種方法是將讀、寫選通進行同步,同時在各個時鐘域使用計數器來跟蹤 FIFO 中可用的項。計數器反映出可用於讀寫的 FIFO 項目號,計數器也與相應的端口同步。讀計數器跟蹤包含有效數據的項數,而寫計數器則跟蹤能夠存儲數據的項數。當對指針邏輯進行復位時,因爲沒有數據可讀,讀計數器從零起始。寫計數器則從 FIFO 中項的總數開始計數,即全部項都可用來存儲數據。
讀選通訊號累減讀計數器,並與寫時鐘域同步,由於它同時也累加寫計數器。寫選通訊號則累減寫計數器,並與讀時鐘域同步,由於它同時也累加讀計數器。這種設計須要單時鐘寬度脈衝以及用於讀、寫選通的脈衝同步器,由於當一個電平信號從一個時鐘域跨越到另外一個更快的時鐘域時,在較快時鐘域中它能在更多的時鐘週期中保持有效。因爲只要讀或寫信號是有效的,每一個計數器就會發生變化,所以較快的時鐘域就檢測到更多的讀、寫,超出較慢時鐘域實際發生的數量。脈衝同步器能夠將一個時鐘域的時鐘寬度脈衝轉換爲新時鐘域的時鐘寬度脈衝,每一個脈衝都表示一次 FIFO 的讀或寫。
這種 FIFO 狀態技術對讀、寫狀態都不太有利。當 FIFO 中全部項均充滿時,寫端口狀態指示爲滿,並在讀選通觸發後繼續指示 FIFO 滿,由於同步過程會使選通訊號延遲送給寫計數器。讀端口爲空時也會出現這種狀況,由於同步過程會使寫選通訊號延遲到達讀計數器。
這種設計的另外一種考慮是及時檢測全滿/全空狀態。若是 FIFO 還有一項可用,而且有寫選通觸發,則 FIFO 必須當即置爲全滿狀態。這樣才能提早一個時鐘給出全滿標誌,使 FIFO 有足夠時間防止下一個數據寫入而產生溢出。對 FIFO 的讀端口也是這樣。這種狀況下,若是 FIFO 裏只有一個數,而且有讀選通觸發,則必須置全空狀態,以給讀電路足夠的時間防止讀空 FIFO。
這種指針邏輯限制電路在每一個時鐘週期中訪問 FIFO,即便在慢速時鐘域中也是這樣。這一功能的優勢在於訪問 FIFO 的電路至少有一個時鐘週期來評估 FIFO 的狀態。FIFO 能夠將全部項都填滿數據,而不會出現數據被覆蓋或全空無數據可讀的狀況。這種設計的另外一個優勢是每一端均可以讀其相應的計數器,來判斷 FIFO 中還有多少項可用。設計者能夠將這
種 FIFO設計用在進行屢次數據讀/寫的電路中,而不會形成上溢或下溢的狀況。
這種設計的不足之處是由計數器來判斷狀態,而不是直接比較讀、寫指針。對大型 FIFO 來講,這些計數器也很大。並且,因爲使用脈衝同步時,來自較快時鐘域的讀、寫脈衝在較慢時鐘域的脈衝間至少必須有兩個時鐘週期,所以平均數據速率爲最低時鐘頻率的一半。解決這些問題的一種方法是採用直接指針比較法。
在這種 FIFO 設計中,讀、寫指針的比較決定了 FIFO 的狀態。異步設計中的指針比較更富有挑戰性,由於每一個指針位於不一樣的時鐘域中,對信號總線的同步要求在同步握手信號期間總線不發生改變。將這種技術用於指針同步的 FIFO 設計可能會很慢。要解決這個問題,FIFO 指針邏輯使用了格雷碼,代替指針使用的二進制碼。
格雷碼在每一次計數增減時只改變其中的一位(表 3)。你能夠在格雷碼總線上使用同步器,由於每一次總線改變時只有一根信號線有變化,因而就消除了格雷碼總線各位經過不一樣同步器時的競爭狀況。這種設計的指針爲格雷碼計數器。使用二進制指針時須要將其變換成格雷碼後的同步指針,而使用變換邏輯會違反對同步信號的限制,即同步的信號在跨越
時鐘域前要來自觸發器。
格雷碼計數器是一個二進制累加器,在累加器前、後各帶有一個轉換器,分別用於格雷碼轉換爲二進制碼,和二進制碼轉換爲格雷碼(圖 8)。格雷碼與二進制碼的轉換是一個異或運算,因此只需比一個二進制計數器多幾個邏輯電平。在格雷碼轉換成二進制碼時,使用:BN=GN;BN-1=BN+GN-1;BN-2=BN-1+GN-2 ... B1=B2+G1;B0=B1+G0。而將二進制碼轉換成格雷碼時,使用:GN=BN;GN-1=BN+BN-1;GN-2=BN-1+BN-2 ... G1=B2+B1;G0=B1+B0。在設計中能夠採用一樣的技術來比較格雷碼指針的值,即在各個指針與二進制比較邏輯之間增長轉換器。
用這種指針邏輯的 FIFO 很快,每一個時鐘週期中電路均可以讀寫 FIFO。可是,在每一個週期都訪問 FIFO 意味着 FIFO 狀態要包括「將滿」和「將空」兩種指示,這樣讀寫 FIFO 的電路纔能有中止時間。「將滿」表示只能再寫入一項,「將空」則表示只有一項可讀。這種狀況描述了一個要求最少的可能狀態信號的設計,以及一個須要更多指示的設計,若是在固定的最小尺寸狀況下用猝發方式訪問 FIFO 的電路的話。
這種 FIFO 狀態技術會給讀、寫帶來不良狀態。當 FIFO 滿時,寫端口的狀態指示已滿,而在電路從 FIFO 中讀出一項後,該狀態仍爲滿,由於同步機制使讀指針相對寫入一側的比較邏輯有個延遲。一樣,在讀出一側的空狀態指示也有這個問題,由於同步機制使寫指針相對讀出一側的比較邏輯有延遲。
若是你在設計跨不一樣時鐘域電路時,使用一些技術來下降通訊失敗的風險,則處理跨時鐘域的信號就再也不是艱鉅的任務。同步機制能夠防止接收跨時鐘域信號的觸發器出現亞穩態,從而避免致使不可預知的電路行爲。對於在多個時鐘週期內一直保持有效的信號來講,電平同步器的效果很好。對於要轉換成新時鐘域脈衝的較慢時鐘域電平信號,要採用邊沿檢測同步器。最後,對跨時鐘域的脈衝信號應使用脈衝同步器。還要記住,當一個信號總線跨越時鐘域時,整個總線要在同一個時鐘週期內到達新的時鐘域。不要分別同步每個信號,而要採用一個保持寄存器和握手方式。握手用來表示寄存器中的信號什麼時候有效,什麼時候能夠採樣。對數據總線來講,握手和一個保持寄存器頗有用,但每次向新時鐘域傳送的數據字不超過一個。
在最近作的一個USB2.0 Controller中,本人就使用了異步FIFO來解決跨時鐘域信號。異步FIFO是在ISE中直接例化出來,很好的解決了速率匹配和數據寬度匹配問題。