认识FPGA触发器的亚稳态
邊沿型觸發器的輸出有兩個穩定狀態: 高電平或者低電平。為保證可靠操作, 必須要滿足觸發器的時序要求,也就是我們熟知的建立時間和保持時間。如果輸入信號違反了觸發器的時序要求, 那么觸發器的輸出信號就有可能會出現非法狀態—亞穩態。亞穩態是一種不穩定狀態,在一定時間后, 最終返回到兩個穩定狀態之一。亞穩態輸出的信號是什么樣子的? 對于系統有什么危害? 如果降低亞穩態帶來的危害? 這是下面要探討的問題。
[文中有幾張圖片對于了解本文很關鍵,如果不能顯示,請參考博客相冊中topic2.png]
亞穩態的特點:
1. 增加觸發器進入穩定狀態的時間。
亞穩態的壞處之一是會導致觸發器的TCO時間比正常情況要大。多出來的時間tR (resolution time) 就是亞穩態持續的時間,參考圖1。如果觸發器的時序要求tSU(建立時間)和tH(保持時間)被滿足,那么觸發器的延時TCO=tCO_norm; 否則如果違反了觸發器的時序要求,那么觸發器在經過tCO_norm時間后,進入亞穩態,亞穩態持續的時間叫做resolution time,標識為tR。tR過后,亞穩態返回到兩個穩定狀態之一。
認識FPGA觸發器的亞穩態
圖 1
數據的跳變距離觸發器的采樣時刻越近,tR就越大。這種關系參見圖2.
認識FPGA觸發器的亞穩態
器件制造商給出的tSU和tH指標都是有余量的。輕微的違反tSU或者tH并不會發生亞穩態,只是導致觸發器的tCO超出器件的規范(spec)。只有當數據的跳變出現在亞穩態捕捉窗口W (見圖2中的W,fs級別的時間窗口),才會發生亞穩態??偟膩碚f,數據的跳變越靠近W窗口,觸發器進入穩定態的時間就越長。
在同步設計中,源觸發器(Source FlipFlop)的輸出必須在一個時鐘周期內穩定下來,才能夠被目的觸發器(Destination FlipFlop)準確采樣。如果tR過大,可能讓目的寄存器采樣到亞穩態,會導致亞穩態的傳播。
2. 輸出毛刺、振蕩、或中間電平
經過一段時間之后,亞穩態返回到穩定狀態。有可能返回到高電平,也有可能返回到低電平, 這和輸入的數據無關。且在亞穩態的過程中,觸發器的輸出可能在震蕩,也可能徘徊在一個固定的中間電平上。我們來看一個真實案例。見圖3.
認識FPGA觸發器的亞穩態
在這個案例中,我們測試一個FPGA邏輯單元中的亞穩態現象。在測試中,我們讓sel信號固定在0,那么邏輯關系為 F1 <= local_2m輸入,F0 <= local_2m輸入,local_2m和cdr_2m都是2MHz的方波信號,被一個50MHz的異步時鐘作同步化處理。Verilog代碼為:
always @(posedge clk_50m)
if(sel==1)begin
clk2m_oa <= cdr_2m ;
clk2m_ob <= cdr_2m ;
end
else begin
clk2m_oa <= local_2m ;
clk2m_ob <= local_2m ;
end
測試中我們發現觸發器的輸出clk2m_ob上偶爾有毛刺出現,但是觸發器的輸入F1和F0上并沒有毛刺。而且這個毛刺和下一個clk2m_ob跳變沿的間隔剛好是50MHz的一個周期20nS。 參考圖4,紅色為F1,黃色為clk2m_ob。
我們來分析下這個毛刺。由于2MHz輸入信號local_2m和50MHz時鐘clk_50m是異步的,因此毫無疑問會有亞穩態的出現。當亞穩態出現的時候,觸發器的輸出一開始隨機震蕩到高電平,但很快亞穩態結束,并返回到”錯誤的”低電平狀態。于是就表現為毛刺。如果想從門電路角度解釋為什么會出現毛刺,可以參考文獻[5].
在測試中,每大約一小時,clk2m_ob就會出現一次這樣的毛刺。可以看出亞穩態的捕捉窗口是非常小的。這個實驗中大約發生了 60 minutes * 60 seconds/20nS = 180*10^9次采樣。因此捕捉窗口的大致范圍為20nS * (2/25) / (180*10^9) ~= 9 *10^(-12) s = 9 fs. 這么高的精度,沒有任何儀器可以精確模擬,這也是為什么亞穩態現象只能用統計的方法去研究的原因。
另一方面,同樣的電路功能,clk2m_oa卻從來沒有出現過這樣的毛刺。這說明亞穩態掉表現形式不是固定的。猜測clk2m_oa的亞穩態表現為中間電平的形式,并最終返回到”正確”的狀態。由于tR時間非常短,并且亞穩態和信號的邊沿混和在一起,無法和正常情況進行區分。根據XAPP094的解釋,亞穩態的表現是和器件的PVT(制作工藝Process,電壓Voltage,溫度Temperature)相關的,并且和具體電路的增益,噪聲相關。如果是這樣,clk2m_oa和clk2m_ob的各自觸發器的或增益或噪聲是有差異的,所以表現不一致。
3. 亞穩態返回到哪一個穩定態是不可預測的,而且和輸入數據無關。
亞穩態返回到哪一個穩定態是不可預測的,和輸入數據無關。因此假設亞穩態較快的返回,目的寄存器(destination FF)能夠采樣到穩態電平,也可能采樣到錯誤的電平,導致系統功能錯誤。
亞穩態的危害
目前主流的FPGA都是基于同步設計思想。一個良好的子模塊設計都是同步于同一個時鐘的子系統。當不同時鐘域的多個模塊進行通信時,就可能會發生亞穩態。
另外,同一個時鐘域內,如果時序不滿足,比如由于組合邏輯和走線的延時過大,導致源寄存器的跳變到達目的寄存器的時刻剛好位于時鐘的跳變沿,也會發生亞穩態。當然,在同步模塊中,對于一個時序收斂良好的設計,不會存在亞穩態的情況。
1. 理論上講,如果亞穩態不能夠在一個時鐘周期內返回到穩定態,那么目的寄存器也會發生亞穩態。這就是亞穩態的傳播。
2. 亞穩態的毛刺直接輸出,有可能導致系統錯誤。比如毛刺信號送給CPU做中斷,可能導致CPU產生錯誤的中斷響應。
3. 采樣到錯誤的電平,導致功能錯誤。這是邏輯設計人員最容易遇到的問題。最典型的例子是,假設有一個4bits one-hot編碼的狀態機。正常的功能只有四個狀態0,2,4,8。但是這個狀態機的有多個異步輸入信號,那么就會發生亞穩態。我們知道,亞穩態返回到1或者0是隨機的,這樣就會出現狀態機的輸入有非法的組合,導致狀態機進入到非法狀態{1,3,5,6,7,9,10….}。如果狀態機沒有安全編碼保護,狀態機就會掛死在非法狀態。
4. 破壞Block RAM的內容。在讀取RAM時,如果生成讀地址的時鐘和RAM的讀時鐘是異步的,那么讀取也會破壞RAM的內容?;旧鲜且驗樽xRAM會伴隨一個自動的回寫動作,這是大多數CMOS FPGA的特性。回寫的時候,由于在地址上發生了亞穩態,導致某一個地址的內容回寫到了另外的地址上,從而破壞了RAM的內容。
亞穩態的處理
理論上講,異步信號輸入到一個同步系統,亞穩態是不可避免的?,F實問題是如何降低亞穩態帶來的危害,如何降低亞穩態發生的概率。
亞穩態最終會返回到穩定態,因此只要等足夠的時間,就可以免受亞穩態的危害。亞穩態返回的時間tR(resolution time)是個很復雜的問題,取決于系統的MTBF要求和器件本身??偟膩硎呛芏痰?。對于90nm或者更小的工藝,在可以接受的MTBF如10年內,tR大約在1nS左右;MTBF如1000年內,tR大約在2nS左右,具體可以咨詢響應的FPGA制造商。
1. 降低亞穩態發生的概率。
經典的處理方法是多拍同步。參見圖5的Correct Method.
異步信號經過第一個寄存器,如果發生了亞穩態,2nS(假設MTBF=1000Y)左右返回到穩定態,如果時鐘周期大于2ns(時鐘頻率小于500MHz), 那么顯然第二個寄存器就沒有亞穩態發生了。此時亞穩態的唯一影響就是不能在最準確的時刻識別到異步信號,有可能早一拍,或者晚一拍識別。
多說一點,為了處理亞穩態,識別異步信號需要的時間就較長(2拍或者更多),這就是目前流行的同步設計的代價。異步設計較好的解決了這個問題,異步設計靠硬件握手機制來反饋什么時候識別成功。有興趣的朋友可以了解一下一個新興的FPGA公司Achronix。
作為對比,我們看看圖5中的wrong method. 第一拍觸發器在接收異步信號后,產生了亞穩態。由于經過了組合邏輯和走線的延時,亞穩態傳播到目的寄存器的時間增大很多。這種情況下,只有在很低速的時鐘頻率時,第二拍觸發器才可以避免亞穩態。因此是不正確的處理方法。
一個良好的設計必須有好的容錯能力,讓設計對亞穩態不敏感。如果亞穩態出現,至少要有能力恢復。
小結
亞穩態是一個邏輯設計者必須知道的知識點。搞清楚亞穩態的響應,并采取措施防范是一個良好的邏輯設計的基本要求,必須在編碼過程中加倍小心。而不是在亞穩態對設計產生了危害之后,再花費大量資源去找出根因。做正確的事情遠比把事情做正確要重要的多。希望本文對你的工作有所幫助。
References:
[1]Altera, AN042 , Metastability in Altera Devices
[2]Xilinx, XAPP094:Metastable Recovery in Virtex-II Pro FPGAs
[3]Lattice, Tn1055:Metastability in Lattice Devices
[4]wikipedia.org, Metastability in electronics
[5]TI, Metastable Response in 5-V Logic Circuits
總結
以上是生活随笔為你收集整理的认识FPGA触发器的亚稳态的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 菜鸟做设计必看!有关如何做设计的整体思路
- 下一篇: 奇异递归模板模式(Curiously R