陳云 陳恩耀 劉國斌 左麗麗 劉偉
(上海航天電子技術研究所,上海 201109)
復位是FPGA設計中一個基本而又重要的環節。復位的目的是在系統啟動或內部模塊功能發生錯誤時將設計強制定位在一個初始可知狀態, 合理選擇復位方式是電路設計的關鍵。現在常用的復位方式有三種:同步復位、異步復位和異步復位和同步釋放。本文從多角度對三種復位方式的優劣進行了總結, 針對復位設計中存在的問題進行分析并給出了相應的解決方案。
同步復位是指復位信號僅在時鐘信號的有效沿對觸發器進行復位,此時復位信號可以看作觸發器輸入端信號的一部分。同步復位綜合后RTL圖如圖1所示。
同步復位的優點:綜合出較小的觸發器,能夠保證整個電路設計的同步性,確保復位僅在時鐘信號有效沿發生,有利于濾除高頻信號的干擾,有利于進行時序分析及系統的總體同步化,易于進行基于周期的仿真。同步復位的缺點:復位信號的有效時間必須大于時鐘周期,否則無法被識別并進行復位操作,需要一個脈沖延展器來保證復位信號具有一定的脈沖寬度, 以確保能夠在時鐘的有效沿被采樣到,綜合時占用更多的邏輯資源。
異步復位是指無論時鐘沿是否到來,只要復位信號有效沿到來就對系統進行復位,復位信號和時鐘相互獨立。異步復位綜合后RTL圖如圖2所示。
異步復位的優點:有效利用了寄存器CLR端口,節省了系統資源;復位信號的有效時間可以不受時鐘周期的限制,確保其可控性,由于受數據通路時序的要求, 不可能通過在數據通路上添加邏輯門或增加連線延遲來處理同步復位,使用異步復位就可以保證不將復位信號加載到數據通路上,且電路可以不依賴于時鐘進行復位。異步復位的缺點:復位信號如果發生在靠近時鐘沿很近的時間點,那么觸發器就可能沒有足夠的時間維持輸入端信號的值,容易造成亞穩態,從而影響設計的可靠性;復位信號容易受到毛刺的影響,會導致觸發器的誤操作,進而影響設計的穩定性;此外異步復位的可測性和STA的復雜性要高于同步復位。

圖1 同步復位電路圖

圖2 異步復位電路圖
異步復位同步釋放是指在異步復位信號到來的時候不受時鐘信號的同步,而是在復位信號釋放的時候受到時鐘信號的同步。其綜合后RTL圖如圖3所示。
其中異步復位信號使用FPGA寄存器的全局異步復位端口能夠使復位信號有效時刻到達所有寄存器的時鐘偏移最小,既能夠節約資源又能簡化設計。由于異步復位信號釋放時可能導致亞穩態的發生,為了解決這一問題可以采用同步釋放,即先將異步復位信號用電平同步器同步后分配給其他功能模塊,使得這些功能模塊內寄存器在復位釋放時總是滿足復位恢復時間的約束,從而抑制了亞穩態的發生。異步復位同步釋放的雙緩沖電路的復位方式同時彌補了同步復位和異步復位的缺陷,并很好地發揮了他們的優勢之處。異步復位同步釋放的雙緩沖復位方式采用兩級觸發電路,第二級觸發器將第一級觸發信號利用時鐘打一拍,異步信號同步化,有效的降低亞穩態發生概率,同時節約了系統資源,在FPGA邏輯設計中可以很好的提高復位的可靠性。

圖3 異步復位同步釋放電路圖

圖4 恢復時間和釋放時間圖

圖5 例1綜合后RTL圖
復位設計中復位信號必須保持一定的脈沖寬度以確保時鐘的有效沿采樣區落在此有效脈沖寬度內,如果時鐘采樣時刻是復位信號的跳變沿即不穩定態X態,那么復位信號將被X態掩蓋。要詳細說明亞穩態的產生機制,此處涉及兩個概念:恢復時間Tremoval和釋放時間Tremoval,恢復時間是指復位信號釋放時刻與隨之而來最近的時鐘有效沿之間的最小時間,而釋放時間是指時鐘有效沿與復位信號無效時刻之間的最小時間,如圖4所示。
如果低有效復位信號的上升沿落在這兩個時間窗口內,則觸發器的輸出端的值將為不定態,既可能處于低電平也可能處于高電平,甚至處于震蕩態并在不確定時刻才穩定為高電平或低電平狀態。在亞穩態時如果輸出值在下一個寄存器捕獲之前已經穩定到有效狀態,那么這個有效狀態也可能發生邏輯誤判,如果此邏輯錯誤發生在決定器件某個功能的關鍵性寄存器上,將導致此芯片的相關功能也出錯,此外如果亞穩態信號被捕獲時為震蕩態并傳遞到不同的寄存器,那么這些本該得到相同正確邏輯值的寄存器會得到不同的值,這些不同寄存器有的獲得正確值而另一些則獲得錯誤值,將導致邏輯混亂進而使整個功能發生錯誤。
雖然了解了亞穩態發生的機制,但亞穩態發生是時間問題,往往是不可避免的,目前沒有一種方式可以從根本上消滅異步電路中亞穩態的發生,只能通過優化設計使得評估出現亞穩態的平均無故障時間MTBF(Mean Time Between Failures)變大以抑制亞穩態發生,在現行FPGA設計中往往通過將異步復位信號進行兩級同步后再使用,可以顯著抑制亞穩態的發生,提升系統的可靠性。
FPGA設計中盡量使用專用全局復位或置位資源,其主要作用是對系統中存在的所有觸發器、鎖存器、查找表單元的輸出寄存器進行復位,不會占有額外的布線資源。使用GSR資源,異步復位到達所有寄存器的偏斜最小。
如果設計需求里必須采用某個使能信號進行局部復位,盡量不使用組合邏輯后的信號進行局部復位,組合邏輯出去的電平信號經常伴隨著毛刺,將此信號直接用作復位將導致觸發器的誤判操作,如果非要使用,先此使能信號在需要進行復位的時鐘域內進行多級濾波濾除毛刺后使用,這樣能大大提升設計的穩定性和可靠性。

圖6 例2綜合后RTL圖
在設計時如果對復位問題不夠重視,經常會出現在某些功能模塊使用同步復位后又在其他模塊內使用異步復位的情況,使得同一復位路徑上如果既使用同步復位又使用異步復位,首先會導致復位時這條路徑上相關寄存器的值跳變的時間不一致,如果這些寄存器輸出后續需要做組合邏輯則易產生毛刺進而影響功能的實現,其次這種設計還有可能導致在邏輯綜合和布局布線時發生問題,所以盡量避免此種情況的發生。下面為兩個常見的錯誤設計,其設計代碼和綜合后RTL圖如圖5、圖6。
例1:always@(posedge CLK)begin
if(!RST_N)
Q1 <= 1'b0;
else
Q1 <= DATA;
end
always@(posedge CLK or negedge RST_N)begin
if(!RST_N)
Q2 <= 1'b0;
else
Q2 <= DATA;
end
例2: assign TMP = RST_N_1^RST_N_2;
always@(posedge CLK)begin
if(!TMP)
Q1 <= 1'b0;
else
Q1 <= DATA;
end
always@(posedge CLK or negedge TMP)begin
if(!TMP)
Q2 <= 1'b0;
else
Q2 <= DATA;
end
在復位設計中需要養成一個良好的習慣,最好單獨寫一個模塊作為復位產生模塊, 針對輸入的異步復位信號,在此模塊內通過異步復位同步釋放的方式產生復位,然后將此復位信號作為系統復位接到接到所有其他需要復位的功能模塊中,這樣就會避免發生上述問題。
在FPGA設計中不論是采用同步復位還是異步復位, 復位信號必須盡量與時鐘信號同步, 否則設計可能被復位到一個無效狀態。本文對FPGA 設計中常用的復位設計方法進行了分類、分析和比較,并針對實際復位設計中可能存在的問題,提出了如何提高復位可靠性的方法。隨著FPGA設計規模越來越大、功能越來越多,其復雜程度也不斷提高,對復位設計可靠性的依賴也越來越緊密,一個好的復位設計方案可以有效減少或消除由復位不當所帶來的系統可靠性的問題。
[1]田志明,楊軍,羅嵐.異步復位設計中亞穩態問題及其解決方案[J].電子器件,2002,25(4):435-439.
[2]夏宇聞.Verilog數字系統設計教程(第2版)[M].北京航空航天大學出版社,2008,6.
[3]李忠琪,胡劍浩,王劍.FPGA中復位電路的設計研究[C].中國通信集成電路技術與應用討論會論文集,2008.