觸發(fā)器的建立時間和保持時間在時鐘上升沿左右定義了一個時間窗口,如果觸發(fā)器數(shù)據(jù)輸入端口上的數(shù)據(jù)在這個時間窗口內(nèi)發(fā)生變化(或者數(shù)據(jù)更新),那么就會產(chǎn)生時序違規(guī)。存在這個時序違規(guī)是因為違反了建立時間要求和保持時間要求,此時觸發(fā)器內(nèi)部的一個節(jié)點(一個內(nèi)部節(jié)點或者要輸出到外部節(jié)點)可能會在一個電壓范圍內(nèi)浮動,無法穩(wěn)定在邏輯0或者邏輯1狀態(tài)。換句話說,如果數(shù)據(jù)在上述窗口中被采集,觸發(fā)器中的晶體管不能可靠地設置為邏輯0或者邏輯1對應的電平上。所以此時的晶體管并未處于飽和區(qū)對應的高或者低電平,而是在穩(wěn)定到一個確定電平之前,徘徊在一個中間電平狀態(tài)(這個中間電平或許是一個正確值,又或許不是)。如圖3-5所示,這就是所謂的亞穩(wěn)態(tài)。
圖3-5 異步時鐘域亞穩(wěn)態(tài)波形圖
由圖3-5中的波形,信號的跳變發(fā)生在建立和保持邊界組成的時間窗口內(nèi),這意味著輸出不會是邏輯0或邏輯1對應的確定電平,而是它們之間的一個中間電平。如果觸發(fā)器包含有一個輸出緩沖,那么亞穩(wěn)態(tài)本身就可以稱為隨著內(nèi)部信號的逐漸穩(wěn)定而在輸出上表現(xiàn)出的雜散過渡。輸出保持亞穩(wěn)態(tài)的時間是隨機的,甚至可能在整個時鐘周期內(nèi)都保持亞穩(wěn)態(tài)。那么,如果這個亞穩(wěn)態(tài)值輸入到組合邏輯,根據(jù)邏輯門電路的切換門檻,錯誤的操作就可以發(fā)生。從時序收斂的角度來說,要求兩個觸發(fā)器之間的組合邏輯延時都要小于最小的時鐘周期,但是這種亞穩(wěn)態(tài)信號保持亞穩(wěn)態(tài)的時間本身就變相地增加了邏輯延時。很顯然,一個亞穩(wěn)態(tài)信號會給設計帶來致命的功能故障,而且該信號也將無法在各個時鐘沿上采集到一致的結果。
只要系統(tǒng)中有異步元件,亞穩(wěn)態(tài)就是無法避免的。亞穩(wěn)態(tài)主要發(fā)生在異步信號檢測、跨時鐘域信號傳輸以及復位電路等常用設計中。
理論上講,如果亞穩(wěn)態(tài)不能夠在一個時鐘周期內(nèi)返回到穩(wěn)定態(tài),那么目的寄存器也會發(fā)生亞穩(wěn)態(tài),這就是亞穩(wěn)態(tài)的傳播。
亞穩(wěn)態(tài)的毛刺直接輸出,有可能導致系統(tǒng)錯誤。比如毛刺信號送給CPU做中斷,可能導致CPU產(chǎn)生錯誤的中斷響應。
采樣到錯誤的電平,導致功能錯誤。這是邏輯設計人員最容易遇到的問題。最典型的例子是,假設有一個4位one-hot編碼的狀態(tài)機。正常的功能只有四個狀態(tài)0、2、4、8,但是這個狀態(tài)機有多個異步輸入信號,那么就會發(fā)生亞穩(wěn)態(tài)。我們知道,亞穩(wěn)態(tài)返回到1或者0是隨機的,這樣就會導致狀態(tài)機的輸入有非法的組合,使狀態(tài)機進入到非法狀態(tài){1,3,5,6,7,9,10,…}。如果狀態(tài)機沒有安全編碼保護,狀態(tài)機就會掛死在非法狀態(tài)。
破壞Block RAM的內(nèi)容。在讀取RAM時,如果生成讀地址的時鐘和RAM的讀時鐘是異步的,那么讀取也會破壞RAM的內(nèi)容。這基本上是因為讀RAM會伴隨一個自動的回寫動作,這是大多數(shù)CMOS FPGA的特性?;貙懙臅r候,由于在地址上發(fā)生了亞穩(wěn)態(tài),導致某一個地址的內(nèi)容回寫到了另外的地址上,從而破壞了RAM的內(nèi)容。
產(chǎn)生亞穩(wěn)態(tài)后,寄存器Q端輸出在穩(wěn)定下來之前可能是毛刺、振蕩、固定的某一電壓值。在信號傳輸中產(chǎn)生亞穩(wěn)態(tài)就會導致與其相連的其他數(shù)字部件將其判斷為不同的判斷,有的判斷到“1”有的判斷到“0”,有的也進入了亞穩(wěn)態(tài),數(shù)字部件就會邏輯混亂。在復位電路中產(chǎn)生亞穩(wěn)態(tài)可能會導致復位失敗。
怎么降低亞穩(wěn)態(tài)發(fā)生的概率成了FPGA設計需要重視的一個注意事項。
使用異步信號時,好的設計都會對異步信號進行同步處理,同步一般采用多級D觸發(fā)器級聯(lián)處理,如圖3-6所示,采用兩級D觸發(fā)器對異步信號進行同步處理。
圖3-6 經(jīng)過兩級觸發(fā)器同步
還有一種方法是用異步FIFO緩存。
最后一種不可忽略的措施是異步復位,同步釋放。
復位情況下的亞穩(wěn)態(tài)常常是由恢復時間和移除時鐘不滿足造成的,因此最常用的處理方式是采用異步復位、同步釋放的方法。采用第二級寄存器輸出作為全局復位信號輸出。
異步復位處理程序示例如下。
FPGA開發(fā)中,遇到最多的就是異步時鐘域了。
檢查初學者的代碼,發(fā)現(xiàn)最多的就是這類問題,異步時鐘域同步化是FPGA設計者最基本的技能。
很多初學者沒有進行同步化處理,設計的程序也能工作。但是工作時間長的話,就會出現(xiàn)不穩(wěn)定的現(xiàn)象,或者出現(xiàn)瞬間的不穩(wěn)定。從外面現(xiàn)象上沒有表現(xiàn)出來,比如CPU通過FPGA讀取外部存儲器(存儲的為圖像數(shù)據(jù)或者模擬量參數(shù))在某一瞬間發(fā)生數(shù)據(jù)讀取錯誤,但是CPU判斷不出來,還是認為正確。
還有一種情況,就是高低溫試驗,很多試驗出問題后,回去查代碼發(fā)現(xiàn)都是由異步時鐘域沒有同步引起的。
筆者經(jīng)歷的一個負面案例是:將一個64 kHz的電信號轉(zhuǎn)換為2 MHz的光模塊信號,最高速率才2 MHz,2 MHz是64的32倍;但就是這個程序,筆者用2 MHz時鐘首先監(jiān)測64 kHz信號,將其中的有效數(shù)據(jù)提出來,然后用2 MHz的速度發(fā)送出去;程序調(diào)試好之后,基本通信十幾秒肯定就會出錯,最后發(fā)現(xiàn)是對輸入的64 kHz信號沒有進行2 MHz同步化,同步兩拍后,連續(xù)工作幾天都沒有出錯。
請慎重對待異步時鐘域的問題!
這是一個神奇的圈子,這里不僅有最優(yōu)質(zhì)的資源,還有其他的驚喜在等待著你,讓我們一探究竟,看看到底還有什么!
聯(lián)系客服