如何解決FPGA電路設(shè)計(jì)中的毛刺問題
引言
本文引用地址:http://butianyuan.cn/article/20548.htm隨著半導(dǎo)體技術(shù)的飛速發(fā)展,fpga(field programmable gate array)的計(jì)算能力、容量以及可靠性也有了很大的提高。它正以高度靈活的用戶現(xiàn)場編程功能、靈活的反復(fù)改寫功能、高可靠性等優(yōu)點(diǎn),成為數(shù)字電路設(shè)計(jì)、數(shù)字信號處理等領(lǐng)域的新寵。但和所有的數(shù)字電路一樣,毛刺也是fpga電路中的棘手問題。它的出現(xiàn)會影響電路工作的穩(wěn)定性、可靠性,嚴(yán)重時會導(dǎo)致整個數(shù)字系統(tǒng)的誤動作和邏輯紊亂。因此,如何有效正確的解決設(shè)計(jì)中出現(xiàn)的毛刺,就成為整個設(shè)計(jì)中的關(guān)鍵一環(huán)。
本文就fpga設(shè)計(jì)中出現(xiàn)的毛刺問題,根據(jù)筆者自己的經(jīng)驗(yàn)和體會,提出了幾種簡單可行的解決方法和思路,供同行供交流與參考。
fpga電路中毛刺的產(chǎn)生
我們知道,信號在fpga器件中通過邏輯單元連線時,一定存在延時。延時的大小不僅和連線的長短和邏輯單元的數(shù)目有關(guān),而且也和器件的制造工藝、工作環(huán)境等有關(guān)。因此,信號在器件中傳輸?shù)臅r候,所需要的時間是不能精確估計(jì)的,當(dāng)多路信號同時發(fā)生跳變的瞬間,就產(chǎn)生了“競爭冒險”。這時,往往會出現(xiàn)一些不正確的尖峰信號,這些尖峰信號就是“毛刺”。另外,由于fpga以及其它的cpld器件內(nèi)部的分布電容和電感對電路中的毛刺基本沒有什么過濾作用,因此這些毛刺信號就會被“保留”并傳遞到后一級,從而使得毛刺問題更加突出。
可見,即使是在最簡單的邏輯運(yùn)算中,如果出現(xiàn)多路信號同時跳變的情況,在通過內(nèi)部走線之后,就一定會產(chǎn)生毛刺。而現(xiàn)在使用在數(shù)字電路設(shè)計(jì)以及數(shù)字信號處理中的信號往往是由時鐘控制的,多數(shù)據(jù)輸入的復(fù)雜運(yùn)算系統(tǒng),甚至每個數(shù)據(jù)都由相當(dāng)多的位數(shù)組成。這時,每一級的毛刺都會對結(jié)果有嚴(yán)重的影響,如果是多級的設(shè)計(jì),那么毛刺累加后甚至?xí)绊懻麄€設(shè)計(jì)的可靠性和精確性。下面我們將以乘法運(yùn)算電路來說明毛刺的產(chǎn)生以及去除,在實(shí)驗(yàn)中,我們使用的編程軟件是quartus ii2.0,實(shí)驗(yàn)器件為cyclone ep1cf400i7。需要說明一點(diǎn),由于示波器無法顯示該整數(shù)運(yùn)算的結(jié)果,我們這里將只給出軟件仿真的結(jié)果。而具體的編程以及程序的下載我們在這里也不再詳述,可以參考相關(guān)的文獻(xiàn)書籍。
毛刺的消除方法
首先,我們來設(shè)計(jì)一個簡單的乘法運(yùn)算電路。運(yùn)算電路如圖1所示。
圖 1 乘法運(yùn)算運(yùn)算電路及結(jié)果
如圖1(c)所示,如果在不加任何的去除毛刺的措施的時候,我們可以看到結(jié)果c中含有大量的毛刺。產(chǎn)生的原因就是在時鐘的上升沿,每個輸入(a和b)的各個數(shù)據(jù)線上的數(shù)據(jù)都不可能保證同時到達(dá),也就是說在時鐘讀取數(shù)據(jù)線上的數(shù)據(jù)的時候,有的數(shù)據(jù)線上讀取的已經(jīng)是新的數(shù)據(jù),而有的數(shù)據(jù)線上讀取的仍然是上一個數(shù)據(jù),這樣無疑會產(chǎn)生毛刺信號,而當(dāng)數(shù)據(jù)完全穩(wěn)定的時候,毛刺信號也就自然消失了。
輸出加d觸發(fā)器
這是一種比較傳統(tǒng)的去除毛刺的方法。原理就是用一個d觸發(fā)器去讀帶毛刺的信號,利用d觸發(fā)器對輸入信號的毛刺不敏感的特點(diǎn),去除信號中的毛刺。這種方法在簡單的邏輯電路中是常見的一種方法,尤其是對信號中發(fā)生在非時鐘跳變沿的毛刺信號去除效果非常的明顯。
但是對于大多數(shù)的時序電路來說,毛刺信號往往發(fā)生在時鐘信號的跳變沿,這樣d觸發(fā)器的效果就沒有那么明顯了(見圖2,加d觸發(fā)器以后的輸出q,仍含有毛刺)。另外,d觸發(fā)器的使用還會給系統(tǒng)帶來一定的延時,特別是在系統(tǒng)級數(shù)較多的情況下,延時也將變大,因此在使用d觸發(fā)器去除毛刺的時候,一定要視情況而定,并不是所有的毛刺都可以用d觸發(fā)器來消除。
圖2 加d觸發(fā)器后的運(yùn)算電路及結(jié)果
信號同步法
在很多文章中都提到,設(shè)計(jì)數(shù)字電路的時候采用同步電路可以大大減少毛刺。另外,由于大多數(shù)毛刺都比較短(大概幾個納秒),只要毛刺不出現(xiàn)在時鐘跳變沿,毛刺信號就不會對系統(tǒng)造成危害了。因此很多人認(rèn)為,只要在整個系統(tǒng)中使用同一個時鐘就可以達(dá)到系統(tǒng)同步的目標(biāo)了。但是這里面有一個非常嚴(yán)重的問題,就是時鐘信號和其他所有的信號一樣,在fpga器件中傳遞的時候是有延時的,這樣根本就無法預(yù)知時鐘跳變沿的精確位置。也就是說我們無法保證在某個時鐘的跳變沿讀取的數(shù)據(jù)是一個穩(wěn)定的數(shù)據(jù),尤其是在多級設(shè)計(jì)中,這個問題就更加突出了。因此,做到真正的"同步"就是去除毛刺信號的關(guān)鍵問題。我認(rèn)為這里同步的關(guān)鍵就是保證在時鐘的跳變沿讀取的數(shù)據(jù)是穩(wěn)定的數(shù)據(jù)而不是毛刺數(shù)據(jù)。以這個思想為出發(fā)點(diǎn),提出了以下幾種具體的信號同步方法。
信號延時同步法
首先,我們給出了一個兩級乘法(c=a b;q=d c)的運(yùn)算結(jié)果(如圖3所示,這里不再給出運(yùn)算電路)。可以看到,在沒加任何處理過程的時候,兩級結(jié)果c和q中都含有大量的毛刺信號。其中毛刺信號產(chǎn)生的原因就是在計(jì)算時鐘跳變時刻,數(shù)據(jù)信號同時發(fā)生了跳變。另外,第一級信號c中含有大量的毛刺,在經(jīng)過第二次乘法運(yùn)算以后被明顯放大了,從圖3可以看出q中毛刺更加嚴(yán)重了。但在很多實(shí)際工作中,我們最關(guān)心的往往是最后的輸出結(jié)果(q),只要中間信號的毛刺對后面的輸出沒有什么影響我們就不需要對它們作任何處理了。因此,這里所提出的信號同步的核心思想就是消除這些中間毛刺信號的影響。
圖 3 兩級乘法運(yùn)算的結(jié)果仿真
信號延時法,它的原理就是在兩級信號傳遞的過程中加一個延時環(huán)節(jié),從而保證在下一個模塊中讀取到的數(shù)據(jù)是穩(wěn)定后的數(shù)據(jù),即不包含毛刺信號。這里所指的信號延時可以是數(shù)據(jù)信號的延時,也可以是時鐘信號的延時。由于篇幅的關(guān)系,這里我們主要以對時鐘信號的延時來說明信號延時法的原理。對上述計(jì)算過程加時鐘信號延時的原理及結(jié)果如圖4所示。
圖4 加了時鐘延時的兩級乘法運(yùn)算及結(jié)果
圖4中的clkdelay就是時鐘延時環(huán)節(jié)。在加這個環(huán)節(jié)以前的時鐘信號是直接連到模塊b上的,這樣兩個模塊使用同一時鐘,好像已經(jīng)做到了同步,但是如圖3所示,結(jié)果中含有大量的毛刺,其原因就是產(chǎn)生毛刺的根本原因--“競爭冒險"現(xiàn)象沒有得到根本性的消除。加時鐘延時環(huán)節(jié)的作用就是要從根本上消除“競爭冒險”,其過程是將控制模塊b的時鐘延時一段時間,使得模塊b的控制時鐘在上跳變化時數(shù)據(jù)c已經(jīng)達(dá)到了穩(wěn)定,即不含毛刺信號的數(shù)據(jù),而這時數(shù)據(jù)d也已達(dá)到穩(wěn)定,這樣競爭冒險現(xiàn)象消除了,從而毛刺信號也得到了有效的抑制,如圖4 (c) 所示。
與時鐘延時法的原理相同,我們也可以在數(shù)據(jù)信號加延時環(huán)節(jié)來消除競爭冒險的現(xiàn)象,達(dá)到真正的同步。這里的延時環(huán)節(jié)可以使用quartus ⅱ提供的lcell實(shí)現(xiàn),也可以使用d觸發(fā)器和一個高頻的計(jì)數(shù)脈沖靈活實(shí)現(xiàn)。另外我們也可以從綜合結(jié)果(圖4 (c)所示)看到,所加的延時環(huán)節(jié)占用的芯片資源是很少的,是一種簡單有效而且節(jié)約資源的方法。
時鐘信號的靈活使用
和上述方法的原理相似,靈活使用時鐘信號的目的也是盡可能的消除競爭冒險。比如在時鐘的第一個跳變沿觸發(fā)模塊a,下一個跳變沿控制觸發(fā)模塊b,這樣時鐘的交替控制也在一定程度上消除了競爭冒險,從而抑制了毛刺信號。還比如分別使用時鐘的上升沿或者下降沿控制不同的模塊。但是這些方法不適合使用在比較復(fù)雜的設(shè)計(jì)中,否則會使設(shè)計(jì)的條理非常的混亂,給以后的閱讀修改帶來很大的困難。因此,在選用這種方法的時候一定要慎重。
狀態(tài)機(jī)控制
對于大型的數(shù)字電路設(shè)計(jì),狀態(tài)機(jī)是一種非常理想的選擇,能使運(yùn)行性能和硬件資源的占用達(dá)到最佳的優(yōu)化,另外靈活的使用狀態(tài)機(jī)也可以實(shí)現(xiàn)信號的同步和消除毛刺的目的。在數(shù)據(jù)傳遞比較復(fù)雜的多模塊系統(tǒng)中,由狀態(tài)機(jī)在特定的時刻分別發(fā)出控制特定模塊的時鐘信號或者模塊使能信號,狀態(tài)機(jī)的循環(huán)控制就可以使得整個系統(tǒng)協(xié)調(diào)運(yùn)作,同時減少毛刺信號。那么只要我們在狀態(tài)機(jī)的觸發(fā)時間上加以處理,就可以避免競爭冒險,從而抑制毛刺的產(chǎn)生。原理如圖5所示。
圖 5 狀態(tài)機(jī)控制原理
限于篇幅的原因,這里我們只講述狀態(tài)機(jī)控制的原理,提出一種新的思路。
總結(jié)
由于毛刺信號對fpga器件的運(yùn)行有很大的影響,如何有效抑制毛刺信號就成了一個非常突出的問題。但是必須強(qiáng)調(diào)的一點(diǎn)就是,我們首先必須對程序設(shè)計(jì)本身進(jìn)行優(yōu)化和改進(jìn),使毛刺信號的產(chǎn)生降低到最小,比如將一些信號用變量代替來減小延時等。另外,在實(shí)際應(yīng)用中如何選用適合的方法也非常的重要,一定要慎重考慮。比如延時環(huán)節(jié)的加入會使整個系統(tǒng)的延時增大,加入太多時就會影響系統(tǒng)的運(yùn)行等。
評論