陳云 陳恩耀 劉國斌 左麗麗 劉偉
(上海航天電子技術(shù)研究所,上海 201109)
復(fù)位是FPGA設(shè)計中一個基本而又重要的環(huán)節(jié)。復(fù)位的目的是在系統(tǒng)啟動或內(nèi)部模塊功能發(fā)生錯誤時將設(shè)計強制定位在一個初始可知狀態(tài), 合理選擇復(fù)位方式是電路設(shè)計的關(guān)鍵?,F(xiàn)在常用的復(fù)位方式有三種:同步復(fù)位、異步復(fù)位和異步復(fù)位和同步釋放。本文從多角度對三種復(fù)位方式的優(yōu)劣進行了總結(jié), 針對復(fù)位設(shè)計中存在的問題進行分析并給出了相應(yīng)的解決方案。
同步復(fù)位是指復(fù)位信號僅在時鐘信號的有效沿對觸發(fā)器進行復(fù)位,此時復(fù)位信號可以看作觸發(fā)器輸入端信號的一部分。同步復(fù)位綜合后RTL圖如圖1所示。
同步復(fù)位的優(yōu)點:綜合出較小的觸發(fā)器,能夠保證整個電路設(shè)計的同步性,確保復(fù)位僅在時鐘信號有效沿發(fā)生,有利于濾除高頻信號的干擾,有利于進行時序分析及系統(tǒng)的總體同步化,易于進行基于周期的仿真。同步復(fù)位的缺點:復(fù)位信號的有效時間必須大于時鐘周期,否則無法被識別并進行復(fù)位操作,需要一個脈沖延展器來保證復(fù)位信號具有一定的脈沖寬度, 以確保能夠在時鐘的有效沿被采樣到,綜合時占用更多的邏輯資源。
異步復(fù)位是指無論時鐘沿是否到來,只要復(fù)位信號有效沿到來就對系統(tǒng)進行復(fù)位,復(fù)位信號和時鐘相互獨立。異步復(fù)位綜合后RTL圖如圖2所示。
異步復(fù)位的優(yōu)點:有效利用了寄存器CLR端口,節(jié)省了系統(tǒng)資源;復(fù)位信號的有效時間可以不受時鐘周期的限制,確保其可控性,由于受數(shù)據(jù)通路時序的要求, 不可能通過在數(shù)據(jù)通路上添加邏輯門或增加連線延遲來處理同步復(fù)位,使用異步復(fù)位就可以保證不將復(fù)位信號加載到數(shù)據(jù)通路上,且電路可以不依賴于時鐘進行復(fù)位。異步復(fù)位的缺點:復(fù)位信號如果發(fā)生在靠近時鐘沿很近的時間點,那么觸發(fā)器就可能沒有足夠的時間維持輸入端信號的值,容易造成亞穩(wěn)態(tài),從而影響設(shè)計的可靠性;復(fù)位信號容易受到毛刺的影響,會導(dǎo)致觸發(fā)器的誤操作,進而影響設(shè)計的穩(wěn)定性;此外異步復(fù)位的可測性和STA的復(fù)雜性要高于同步復(fù)位。
圖1 同步復(fù)位電路圖
圖2 異步復(fù)位電路圖
異步復(fù)位同步釋放是指在異步復(fù)位信號到來的時候不受時鐘信號的同步,而是在復(fù)位信號釋放的時候受到時鐘信號的同步。其綜合后RTL圖如圖3所示。
其中異步復(fù)位信號使用FPGA寄存器的全局異步復(fù)位端口能夠使復(fù)位信號有效時刻到達所有寄存器的時鐘偏移最小,既能夠節(jié)約資源又能簡化設(shè)計。由于異步復(fù)位信號釋放時可能導(dǎo)致亞穩(wěn)態(tài)的發(fā)生,為了解決這一問題可以采用同步釋放,即先將異步復(fù)位信號用電平同步器同步后分配給其他功能模塊,使得這些功能模塊內(nèi)寄存器在復(fù)位釋放時總是滿足復(fù)位恢復(fù)時間的約束,從而抑制了亞穩(wěn)態(tài)的發(fā)生。異步復(fù)位同步釋放的雙緩沖電路的復(fù)位方式同時彌補了同步復(fù)位和異步復(fù)位的缺陷,并很好地發(fā)揮了他們的優(yōu)勢之處。異步復(fù)位同步釋放的雙緩沖復(fù)位方式采用兩級觸發(fā)電路,第二級觸發(fā)器將第一級觸發(fā)信號利用時鐘打一拍,異步信號同步化,有效的降低亞穩(wěn)態(tài)發(fā)生概率,同時節(jié)約了系統(tǒng)資源,在FPGA邏輯設(shè)計中可以很好的提高復(fù)位的可靠性。
圖3 異步復(fù)位同步釋放電路圖
圖4 恢復(fù)時間和釋放時間圖
圖5 例1綜合后RTL圖
復(fù)位設(shè)計中復(fù)位信號必須保持一定的脈沖寬度以確保時鐘的有效沿采樣區(qū)落在此有效脈沖寬度內(nèi),如果時鐘采樣時刻是復(fù)位信號的跳變沿即不穩(wěn)定態(tài)X態(tài),那么復(fù)位信號將被X態(tài)掩蓋。要詳細說明亞穩(wěn)態(tài)的產(chǎn)生機制,此處涉及兩個概念:恢復(fù)時間Tremoval和釋放時間Tremoval,恢復(fù)時間是指復(fù)位信號釋放時刻與隨之而來最近的時鐘有效沿之間的最小時間,而釋放時間是指時鐘有效沿與復(fù)位信號無效時刻之間的最小時間,如圖4所示。
如果低有效復(fù)位信號的上升沿落在這兩個時間窗口內(nèi),則觸發(fā)器的輸出端的值將為不定態(tài),既可能處于低電平也可能處于高電平,甚至處于震蕩態(tài)并在不確定時刻才穩(wěn)定為高電平或低電平狀態(tài)。在亞穩(wěn)態(tài)時如果輸出值在下一個寄存器捕獲之前已經(jīng)穩(wěn)定到有效狀態(tài),那么這個有效狀態(tài)也可能發(fā)生邏輯誤判,如果此邏輯錯誤發(fā)生在決定器件某個功能的關(guān)鍵性寄存器上,將導(dǎo)致此芯片的相關(guān)功能也出錯,此外如果亞穩(wěn)態(tài)信號被捕獲時為震蕩態(tài)并傳遞到不同的寄存器,那么這些本該得到相同正確邏輯值的寄存器會得到不同的值,這些不同寄存器有的獲得正確值而另一些則獲得錯誤值,將導(dǎo)致邏輯混亂進而使整個功能發(fā)生錯誤。
雖然了解了亞穩(wěn)態(tài)發(fā)生的機制,但亞穩(wěn)態(tài)發(fā)生是時間問題,往往是不可避免的,目前沒有一種方式可以從根本上消滅異步電路中亞穩(wěn)態(tài)的發(fā)生,只能通過優(yōu)化設(shè)計使得評估出現(xiàn)亞穩(wěn)態(tài)的平均無故障時間MTBF(Mean Time Between Failures)變大以抑制亞穩(wěn)態(tài)發(fā)生,在現(xiàn)行FPGA設(shè)計中往往通過將異步復(fù)位信號進行兩級同步后再使用,可以顯著抑制亞穩(wěn)態(tài)的發(fā)生,提升系統(tǒng)的可靠性。
FPGA設(shè)計中盡量使用專用全局復(fù)位或置位資源,其主要作用是對系統(tǒng)中存在的所有觸發(fā)器、鎖存器、查找表單元的輸出寄存器進行復(fù)位,不會占有額外的布線資源。使用GSR資源,異步復(fù)位到達所有寄存器的偏斜最小。
如果設(shè)計需求里必須采用某個使能信號進行局部復(fù)位,盡量不使用組合邏輯后的信號進行局部復(fù)位,組合邏輯出去的電平信號經(jīng)常伴隨著毛刺,將此信號直接用作復(fù)位將導(dǎo)致觸發(fā)器的誤判操作,如果非要使用,先此使能信號在需要進行復(fù)位的時鐘域內(nèi)進行多級濾波濾除毛刺后使用,這樣能大大提升設(shè)計的穩(wěn)定性和可靠性。
圖6 例2綜合后RTL圖
在設(shè)計時如果對復(fù)位問題不夠重視,經(jīng)常會出現(xiàn)在某些功能模塊使用同步復(fù)位后又在其他模塊內(nèi)使用異步復(fù)位的情況,使得同一復(fù)位路徑上如果既使用同步復(fù)位又使用異步復(fù)位,首先會導(dǎo)致復(fù)位時這條路徑上相關(guān)寄存器的值跳變的時間不一致,如果這些寄存器輸出后續(xù)需要做組合邏輯則易產(chǎn)生毛刺進而影響功能的實現(xiàn),其次這種設(shè)計還有可能導(dǎo)致在邏輯綜合和布局布線時發(fā)生問題,所以盡量避免此種情況的發(fā)生。下面為兩個常見的錯誤設(shè)計,其設(shè)計代碼和綜合后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
在復(fù)位設(shè)計中需要養(yǎng)成一個良好的習慣,最好單獨寫一個模塊作為復(fù)位產(chǎn)生模塊, 針對輸入的異步復(fù)位信號,在此模塊內(nèi)通過異步復(fù)位同步釋放的方式產(chǎn)生復(fù)位,然后將此復(fù)位信號作為系統(tǒng)復(fù)位接到接到所有其他需要復(fù)位的功能模塊中,這樣就會避免發(fā)生上述問題。
在FPGA設(shè)計中不論是采用同步復(fù)位還是異步復(fù)位, 復(fù)位信號必須盡量與時鐘信號同步, 否則設(shè)計可能被復(fù)位到一個無效狀態(tài)。本文對FPGA 設(shè)計中常用的復(fù)位設(shè)計方法進行了分類、分析和比較,并針對實際復(fù)位設(shè)計中可能存在的問題,提出了如何提高復(fù)位可靠性的方法。隨著FPGA設(shè)計規(guī)模越來越大、功能越來越多,其復(fù)雜程度也不斷提高,對復(fù)位設(shè)計可靠性的依賴也越來越緊密,一個好的復(fù)位設(shè)計方案可以有效減少或消除由復(fù)位不當所帶來的系統(tǒng)可靠性的問題。
[1]田志明,楊軍,羅嵐.異步復(fù)位設(shè)計中亞穩(wěn)態(tài)問題及其解決方案[J].電子器件,2002,25(4):435-439.
[2]夏宇聞.Verilog數(shù)字系統(tǒng)設(shè)計教程(第2版)[M].北京航空航天大學出版社,2008,6.
[3]李忠琪,胡劍浩,王劍.FPGA中復(fù)位電路的設(shè)計研究[C].中國通信集成電路技術(shù)與應(yīng)用討論會論文集,2008.