摘 要: 毛刺現(xiàn)象在FPGA 設(shè)計中非常普遍, 而毛刺的出現(xiàn)往往導(dǎo)致系統(tǒng)結(jié)果的錯誤。本文從FPGA 的原理結(jié)構(gòu)的角度深入探討了毛刺產(chǎn)生的原因及產(chǎn)生的條件, 總結(jié)了多種不同的解決方法, 并結(jié)合具體的應(yīng)用對解決方案進(jìn)行深入地分析。
FPGA (F ield P rogrammable Gate A rray) 以其容量大、功能強(qiáng)以及可靠性高等特點, 在現(xiàn)代數(shù)字通信系統(tǒng)中得到廣泛的應(yīng)用。采用FPGA 設(shè)計數(shù)字電路已經(jīng)成為數(shù)字電路系統(tǒng)領(lǐng)域的主要設(shè)計方式之一[ 1 ]。在FPGA 的設(shè)計中, 毛刺現(xiàn)象是長期困擾電子設(shè)計工程師的設(shè)計問題之一, 是影響工程師設(shè)計效率和數(shù)字系統(tǒng)設(shè)計有效性和可靠性的主要因素。由于信號在FPGA 的內(nèi)部走線和通過邏輯單元時造成的延遲, 在多路信號變化的瞬間, 組合邏輯的輸出常常產(chǎn)生一些小的尖峰, 即毛刺信號, 這是由FPGA內(nèi)部結(jié)構(gòu)特性決定的。毛刺現(xiàn)象在FPGA 的設(shè)計中是不可避免的, 有時任何一點毛刺就可以導(dǎo)致系統(tǒng)出錯, 尤其是對尖峰脈沖或脈沖邊沿敏感的電路更是如此。因此, 克服和解決毛刺問題對現(xiàn)代數(shù)字系統(tǒng)設(shè)計尤為重要。本文從FPGA 的原理結(jié)構(gòu)的角度探討了產(chǎn)生毛刺的原因及產(chǎn)生的條件, 在此基礎(chǔ)上, 總結(jié)了多種不同的消除方法, 在最后結(jié)合具體的應(yīng)用對解決方案進(jìn)行深入的分析。
1 毛刺產(chǎn)生的原因
以圖1 的例子分析毛刺產(chǎn)生的起因: 圖1 是一個3 位同步加法計數(shù)器, 當(dāng)使能端為高電平時, 在每個時鐘上升沿時刻, QA , QB, QC 從000 逐步變到111, 進(jìn)入到全1狀態(tài)后, 進(jìn)位輸出端輸出半個時鐘脈沖寬度的高電平, 但從圖2 仿真結(jié)果中可以看到在011 變化到100 時刻ROC出現(xiàn)了尖脈沖, 即毛刺。
?
?
以Xilinx 的FPGA 為例分析其內(nèi)部結(jié)構(gòu), 如圖3 所示。
FPGA 芯片是由可構(gòu)造的輸入輸出塊( Input/ OutputBlock, IOB)、可構(gòu)造邏輯塊(Cinfigurable Logic Block, CLB ) 和可編程連線資源( Programmable Interconnect Array, PIA ) 3 種可構(gòu)造單元構(gòu)成的。IOB 位于芯片內(nèi)部四周, 在內(nèi)部邏輯陣列與外部芯片封裝引腳之間提供一個可編程接口, 他主要由邏輯門、觸發(fā)器和控制單元組成。CLB 組成了FPGA 的核心陣列, 能完成用戶指定的邏輯功能; 每個CLB 主要有一個組合邏輯、幾個觸發(fā)器、若干個多選一電路和控制單元組成; PIA 位于芯片內(nèi)部的邏輯塊之間, 經(jīng)編程后形成連線網(wǎng)絡(luò), 用于芯片內(nèi)部邏輯間的相互連接, 并在他們之間傳遞信息。從圖3 中可以看出,對于不同的輸入1、2, 到邏輯塊(M ) 的走線可能是不同的,這就造成了輸入信號的延遲, 假設(shè)1、2 同時變化, 由于延遲的存在, 到達(dá)M 時就有先有后(這種現(xiàn)象稱為競爭) , 在邏輯輸出端就可能會有險象(也稱冒險) , 即產(chǎn)生了毛刺。在上述例子中的011 狀態(tài), 假設(shè)QA 與QB 同時從1 變化到0, 而QC 提前了2 ns 從0 變到1 , 產(chǎn)生一個2 ns 的高電平,這就是毛刺。也就是說, 在FPGA 設(shè)計中, 毛刺產(chǎn)生的根本原因是信號在芯片內(nèi)部走線時產(chǎn)生的延遲。
2 毛刺產(chǎn)生的條件
借助同樣的例子來分析毛刺產(chǎn)生的條件。QA , QB,QC 在每一個時鐘上升沿同時發(fā)生翻轉(zhuǎn), 但實際中由于延遲的存在, 并不能保證QA , QB, QC 到D 觸發(fā)器的布線長短一致。如果QC 比QA , QB 提前了2 ns, 這就形成了2 ns 的全1 狀態(tài), 稱為“假象全1”, 進(jìn)而導(dǎo)致進(jìn)位輸出產(chǎn)生一個尖脈沖。值得注意的是, 在3 變到4 即011 到100時, 3 位中有2 位同時發(fā)生翻轉(zhuǎn), 即在同一時刻有大于一個的信號發(fā)生改變。由于延遲的作用, 多個信號到達(dá)終點的時間有先有后, 形成了競爭, 由競爭產(chǎn)生的錯誤輸出就是毛刺。所以, 毛刺發(fā)生的條件就是在同一時刻有多個信號輸入發(fā)生改變。
3 消除毛刺的方法
知道了毛刺產(chǎn)生的條件, 就可以通過改變設(shè)計, 破壞其條件來減少毛刺的發(fā)生。例如, 利用格雷碼計數(shù)器每次輸出只有一位跳變的特性, 代替普通的二進(jìn)制計數(shù)器, 避免了毛刺的產(chǎn)生[ 3 ]。還可以對電路進(jìn)行改進(jìn), 以消除毛刺對系統(tǒng)的影響。下面對各種方法做分別介紹:
3、1 利用冗余項法
利用冗余項消除毛刺有2 種方法: 代數(shù)法和卡諾圖法, 兩者都是通過增加冗余項來消除險象, 只是前者針對于函數(shù)表達(dá)式而后者針對于真值表。以卡諾圖為例, 若兩個卡諾圓相切, 其對應(yīng)的電路就可能產(chǎn)生險象。因此, 修改卡諾圖, 在卡諾圖的兩圓相切處增加一個圓, 以增加多余項來消除邏輯冒險。但該法對于計數(shù)器型產(chǎn)生的毛刺是無法消除的。
3、2 采樣法
由于冒險多出現(xiàn)在信號發(fā)生電平跳變的時刻, 即在輸出信號的建立時間內(nèi)會產(chǎn)生毛刺, 而在保持時間內(nèi)不會出現(xiàn), 因此, 在輸出信號的保持時間內(nèi)對其進(jìn)行采樣, 就可以消除毛刺信號的影響, 常用的采樣方法有2 種: 一種使用一定寬度的高電平脈沖與輸出相與, 從而避開了毛刺信號, 取得輸出信號的電平值。這種方法必須保證采樣信號在合適的時間產(chǎn)生, 并且只適用于對輸出信號時序和脈沖寬度要求不嚴(yán)的情況。另一種更常見的方法叫鎖存法, 是利用D 觸發(fā)器的輸入端D 對毛刺信號不敏感的特點, 在輸出信號的保持時間內(nèi), 用觸發(fā)器讀取組合邏輯的輸出信號。由于在時鐘的上升沿時刻, 輸出端Q = D , 當(dāng)輸入的信號有毛刺時, 只要不發(fā)生在時鐘的上升沿時刻, 輸出就不會有毛刺。這種方法類似于將異步電路轉(zhuǎn)化為同步電路, 實現(xiàn)簡單, 但同樣會涉及到時序問題。
3、3 吸收法
由于產(chǎn)生的毛刺實際上是高頻窄脈沖, 故增加輸出濾波, 在輸出端接上小電容C 就可以濾除毛刺。但輸出波形的前后沿將變壞, 在對波形要求較嚴(yán)格時, 應(yīng)再加整形電路, 該方法不宜在中間級使用。
3、4 延遲法
因為毛刺最終是由于延遲造成的, 所以可以找出產(chǎn)生延遲的支路。對于相對延遲小的支路, 加上毛刺寬度的延遲可以消除毛刺。但有時隨著負(fù)載增加, 毛刺會繼續(xù)出現(xiàn),而且, 當(dāng)溫度變化, 所加的電壓變化或要增加邏輯門時, 所加的延遲是不同的, 必須重新設(shè)計延遲線, 因而這種方法也是有局限性的。而且采用延遲線的方法產(chǎn)生延遲會由于環(huán)境溫度的變化而使系統(tǒng)可靠性變差。
3、5 硬件描述語言法
這種方法是從硬件描述語言入手, 找出毛刺產(chǎn)生的根本原因, 改變語言設(shè)計, 產(chǎn)生滿足要求的功能模塊, 來代替原來的邏輯功能塊。在圖1 電路中, 一個3 位計數(shù)器可能會在011 到100 和101 到110 發(fā)生跳變時產(chǎn)生毛刺, 究其原因是因為一次有2位發(fā)生跳變, 可以采用VHDL 語言對計數(shù)器編寫如下, 產(chǎn)生的計數(shù)模塊代替原來普通的計數(shù)器。
subdesign modcount
(clk, reset: input; q[2110 ]: output; )
variable
counter3
:MACH IN E O F B ITS ( r [2110 ])
W ITH STA TES ( r0= B"101" ,
r1= B"100" ,
r2= B"000" ,
r3= B"001" ,
r4= B"011" ,
r5= B"010" ,
r6= B"110" ,
r7= B"111") ;
begin
q[ ]= rr [ ];
counter31reset= reset;
counter31clk= clk;
CA SE counter3 IS
w hen r0= > counter3= r1;
w hen r1= > counter3= r2;
w hen r2= > counter3= r3;
w hen r3= > counter3= r4;
w hen r4= > counter3= r5;
w hen r5= > counter3= r6;
w hen r6= > counter3= r7;
w hen r7= > counter3= r0;
END CA SE;
end;
注意在新的計數(shù)器中, 每次狀態(tài)發(fā)生改變時Q 0, Q 1,Q 2 只有1 位發(fā)生跳變, 從根本上消除了毛刺。但計數(shù)器的輸出狀態(tài)沒有規(guī)律, 不便于其他電路利用。如果希望計數(shù)器的輸出狀態(tài)有規(guī)律變化以便其他電路使用, 可以考慮采用雙輸出電路, 一路是單信號輸出, 一路是正常計數(shù)輸出。這種方法從根本上消除了毛刺產(chǎn)生的根源, 具有普遍的意義, 對系統(tǒng)也不會產(chǎn)生影響, 是最為可靠的方法, 其不利之處是這種方法對VHDL 語言要求比較高, 必須對電路的工作狀態(tài)及其轉(zhuǎn)變有全面的分析和掌握, 而隨著電路的復(fù)雜度提高, 毛刺產(chǎn)生的來源繁雜, 實現(xiàn)起來比較困難。
對于一般情況下產(chǎn)生的毛刺, 可以嘗試用D 觸發(fā)器來消除。但用D 觸發(fā)器消除時, 有時會影響到時序, 需要考慮很多問題。所以應(yīng)根據(jù)不同情況, 仔細(xì)地分析毛刺產(chǎn)生的來源和毛刺的性質(zhì), 結(jié)合系統(tǒng)資源選擇具體辦法, 消除毛刺的影響。
4 具體實例
在實際應(yīng)用中要對一個周期同步脈沖信號進(jìn)行檢測,要求若在給定的時間內(nèi)沒有檢測到同步信號則給出一定脈沖寬度的高電平, 作為復(fù)位信號。設(shè)計思想是采用一個計數(shù)器, 當(dāng)有同步信號時對其清零, 并同時開始計數(shù), 根據(jù)給定時間和系統(tǒng)時鐘周期設(shè)定計數(shù)器的模數(shù), 經(jīng)過給定的時間后輸出高電平, 滿足寬度后再置低。
實際要求檢測時間大約1 s, 脈沖寬度保持在20ms左右, 采用5 片74161 級聯(lián), 第5 片計數(shù)器的ROC 接D 觸發(fā)器的使能端。同步信號輸入后, 清零并開始計數(shù), 若不再出現(xiàn)同步脈沖, 經(jīng)16^5 個時鐘周期后, 第5 片的RCO端輸出一個高電平, 使觸發(fā)器的Q 輸出D (高電平) , 再過16^33 2個時鐘周期后使第4 片的QA , QB, QC, QD 接組合門電路輸出低電平, 接到D 觸發(fā)器的計數(shù)器預(yù)制端,使Q 輸出為零。這樣就實現(xiàn)經(jīng)一定延時后的一定寬度的脈沖。經(jīng)仿真結(jié)果如圖4 所示。
仿真平臺采用Max+ PlusII , 時鐘周期設(shè)為10 ns, 經(jīng)計算可以知道在101485 928 2 m s 處產(chǎn)生寬度為81192 Ls的高電平, 但由于存在數(shù)據(jù)建立時間和保持時間, 仿真結(jié)果中的變化時刻并不是嚴(yán)格與計算相符的, 其中q0, q1,q2, q3 是第5 片74161 的輸出, roc1 是第4 片的進(jìn)位輸出,roc 是第5 片的進(jìn)位輸出, roc1 輸出16 個高電平后, roc 同時輸出一個高電平。圖4 中復(fù)位信號reset 卻在51247 m s和101485 297 9m s 處發(fā)生。第一個錯誤的原因是, 由于計數(shù)器累加, 內(nèi)部走線造成的延時, 當(dāng)?shù)? 片計數(shù)器從0111狀態(tài)跳變到1 000 時, 輸入同時有3 位變化, 致使進(jìn)位輸出roc 在roc1 的第8 個輸出時產(chǎn)生了一個尖脈沖, 使觸發(fā)器的Q 端提前發(fā)生電平轉(zhuǎn)變, 導(dǎo)致了在51247 m s 處產(chǎn)生錯誤復(fù)位信號。同樣的原因, 第4 片的進(jìn)位輸出roc1 在第14 個輸出跳變到第15 個輸出時發(fā)生毛刺, 而該毛刺使第5 片161 進(jìn)入計數(shù)狀態(tài), 在roc 端也產(chǎn)生了毛刺, 就出現(xiàn)了圖4 中復(fù)位信號提前翻轉(zhuǎn)的結(jié)果。
對于該電路中存在的毛刺問題, 可以采用2 種方法修改電路。由于該電路對時間要求的不是很嚴(yán)格, 對第4, 5 片74L S161 取1110 狀態(tài)做最后輸出, 就避免了由延遲造成的假象全1 狀態(tài), 仿真結(jié)果證明這種方法是有效的。但這種方法增加了邏輯門數(shù)量, 同時也增加了險象發(fā)生的可能性。
另一種比較可靠且常用的方法是用帶使能端的D 觸發(fā)器代替原來的觸發(fā)器, 把計數(shù)器最后的輸出roc 接到觸發(fā)器的使能端, 時鐘用統(tǒng)一的計數(shù)時鐘, 由于毛刺本身是尖脈沖, 不能滿足數(shù)據(jù)的建立時間和保持時間, 避免了產(chǎn)生的毛刺對Q 的輸出的影響。從仿真結(jié)果(圖5) 中可以看到, 雖然這種方法并不能消除毛刺, 但是毛刺已經(jīng)不具有危害性, 故這是一種簡單有效的方法。
5 結(jié) 語
任何組合電路、反饋電路和計數(shù)器都可能是潛在的毛刺信號發(fā)生器, 但毛刺并不是對所有輸入都有危害, 如觸發(fā)器的D 輸入端, 只要毛刺不出現(xiàn)在時鐘的上升沿并滿足數(shù)據(jù)的建立保持時間, 就不會對系統(tǒng)造成危害。而當(dāng)毛刺信號成為系統(tǒng)的啟動信號、控制信號、握手信號, 觸發(fā)器的清零信號(CL EAR)、預(yù)置信號(PRESET)、時鐘輸入信號(CL K) 或鎖存器的輸入信號時就會產(chǎn)生邏輯錯誤。在實際設(shè)計過程中, 應(yīng)盡量避免將帶有毛刺的信號直接接入對毛刺敏感的輸入端上, 對于產(chǎn)生的毛刺, 應(yīng)仔細(xì)分析毛刺的來源和性質(zhì), 針對不同的信號, 采取不同的解決方法加以消除。毛刺問題在FPGA 設(shè)計中非常關(guān)鍵, 只有深刻理解毛刺的本質(zhì), 才有可能真正掌握設(shè)計的精髓, 本文就FPGA 設(shè)計中的毛刺問題進(jìn)行了深入的探討, 分析其產(chǎn)生的原因和條件, 給出了幾種常用的消除方法, 希望對FPGA 設(shè)計者有一定的參考作用。
參考文獻(xiàn)
[1 ] 王毓銀1 數(shù)字電路邏輯設(shè)計[M ] 1 北京: 高等教育出版社,19991
[2 ] 宋萬杰1CPLD 技術(shù)及其應(yīng)用[M ] 1 西安: 西安電子科技大學(xué)出版社, 19991
[ 3 ] 朱建軍1 關(guān)于毛刺問題的探討[ EB/OL ] 1http: 2004. 51
評論