1.1 建立時間和保持時間:
建立時間(setup time)是指在觸發(fā)器的時鐘信號上升沿到來以前,數(shù)據(jù)穩(wěn)定不變的時間,如果建立時間不夠,數(shù)據(jù)將不能在這個時鐘上升沿被打入觸發(fā)器;保持時間(hold time)是指在觸發(fā)器的時鐘信號上升沿到來以后,數(shù)據(jù)穩(wěn)定不變的時間, 如果保持時間不夠,數(shù)據(jù)同樣不能被打入觸發(fā)器。 數(shù)據(jù)穩(wěn)定傳輸必須滿足建立和保持時間的要求,當(dāng)然在一些情況下,建立時間和保持時間的值可以為零。 PLD/FPGA開發(fā)軟件可以自動計算兩個相關(guān)輸入的建立和保持時間
注:在考慮建立保持時間時,應(yīng)該考慮時鐘樹向后偏斜的情況,在考慮建立時間時應(yīng)該考慮時鐘樹向前偏斜的情況。在進行后仿真時,最大延遲用來檢查建立時間,最小延時用來檢查保持時間。
建立時間的約束和時鐘周期有關(guān),當(dāng)系統(tǒng)在高頻時鐘下無法工作時,降低時鐘頻率就可以使系統(tǒng)完成工作。保持時間是一個和時鐘周期無關(guān)的參數(shù),如果設(shè)計不合理,使得布局布線工具無法布出高質(zhì)量的時鐘樹,那么無論如何調(diào)整時鐘頻率也無法達到要求,只有對所設(shè)計系統(tǒng)作較大改動才有可能正常工作,導(dǎo)致設(shè)計效率大大降低。因此合理的設(shè)計系統(tǒng)的時序是提高設(shè)計質(zhì)量的關(guān)鍵。在可編程器件中,時鐘樹的偏斜幾乎可以不考慮,因此保持時間通常都是滿足的。
1.2 FPGA中的競爭和冒險現(xiàn)象
信號在FPGA器件內(nèi)部通過連線和邏輯單元時,都有一定的延時。延時的大小與連線的長短和邏輯單元的數(shù)目有關(guān),同時還受器件的制造工藝、工作電壓、溫度等條件的影響。信號的高低電平轉(zhuǎn)換也需要一定的過渡時間。由于存在這兩方面因素,多路信號的電平值發(fā)生變化時,在信號變化的瞬間,組合邏輯的輸出有先后順序,并不是同時變化,往往會出現(xiàn)一些不正確的尖峰信號,這些尖峰信號稱為"毛刺"。如果一個組合邏輯電路中有"毛刺"出現(xiàn),就說明該電路存在"冒險"。(與分立元件不同,由于PLD內(nèi)部不存在寄生電容電感,這些毛刺將被完整的保留并向下一級傳遞,因此毛刺現(xiàn)象在PLD、FPGA設(shè)計中尤為突出)是一個邏輯冒險的例子,從圖3的仿真波形可以看出,"A、B、C、D"四個輸入信號經(jīng)過布線延時以后,高低電平變換不是同時發(fā)生的,這導(dǎo)致輸出信號"OUT"出現(xiàn)了毛刺。(我們無法保證所有連線的長度一致,所以即使四個輸入信號在輸入端同時變化,但經(jīng)過PLD內(nèi)部的走線,到達或門的時間也是不一樣的,毛刺必然產(chǎn)生)?梢愿爬ǖ闹v,只要輸入信號同時變化,(經(jīng)過內(nèi)部走線)組合邏輯必將產(chǎn)生毛刺。 將它們的輸出直接連接到時鐘輸入端、清零或置位端口的設(shè)計方法是錯誤的,這可能會導(dǎo)致嚴(yán)重的后果。 所以我們必須檢查設(shè)計中所有時鐘、清零和置位等對毛刺敏感的輸入端口,確保輸入不會含有任何毛刺
冒險往往會影響到邏輯電路的穩(wěn)定性。時鐘端口、清零和置位端口對毛刺信號十分敏感,任何一點毛刺都可能會使系統(tǒng)出錯,因此判斷邏輯電路中是否存在冒險以及如何避免冒險是設(shè)計人員必須要考慮的問題。
如何處理毛刺
我們可以通過改變設(shè)計,破壞毛刺產(chǎn)生的條件,來減少毛刺的發(fā)生。例如,在數(shù)字電路設(shè)計中,常常采用格雷碼計數(shù)器取代普通的二進制計數(shù)器,這是因為格雷碼計數(shù)器的輸出每次只有一位跳變,消除了競爭冒險的發(fā)生條件,避免了毛刺的產(chǎn)生。
毛刺并不是對所有的輸入都有危害,例如D觸發(fā)器的D輸入端,只要毛刺不出現(xiàn)在時鐘的上升沿并且滿足數(shù)據(jù)的建立和保持時間,就不會對系統(tǒng)造成危害,我們可以說D觸發(fā)器的D輸入端對毛刺不敏感。 根據(jù)這個特性,我們應(yīng)當(dāng)在系統(tǒng)中盡可能采用同步電路,這是因為同步電路信號的變化都發(fā)生在時鐘沿,只要毛刺不出現(xiàn)在時鐘的沿口并且不滿足數(shù)據(jù)的建立和保持時間,就不會對系統(tǒng)造成危害。 (由于毛刺很短,多為幾納秒,基本上都不可能滿足數(shù)據(jù)的建立和保持時間)
去除毛刺的一種常見的方法是利用D觸發(fā)器的D輸入端對毛刺信號不敏感的特點,在輸出信號的保持時間內(nèi),用觸發(fā)器讀取組合邏輯的輸出信號,這種方法類似于將異步電路轉(zhuǎn)化為同步電路。
如前所述,優(yōu)秀的設(shè)計方案,如采用格雷碼計數(shù)器,同步電路等,可以大大減少毛刺,但它并不能完全消除毛刺。 毛刺并不是對所有輸入都有危害,例如D觸發(fā)器的D輸入端,只要毛刺不出現(xiàn)在時鐘的上升沿并且滿足數(shù)據(jù)的建立和保持時間,就不會對系統(tǒng)造成危害。因此我們可以說D觸發(fā)器的D輸入端對毛刺不敏感。但對于D觸發(fā)器的時鐘端,置位端,清零端,則都是對毛刺敏感的輸入端,任何一點毛刺就會使系統(tǒng)出錯,但只要認(rèn)真處理,我們可以把危害降到最低直至消除。下面我們就對幾種具體的信號進行探討。
1.3 清除和置位信號在FPGA的設(shè)計中,全局的清零和置位信號必須經(jīng)過全局的清零和置位管腳輸入,因為他們也屬于全局的資源,其扇出能力大,而且在FPGA內(nèi)部是直接連接到所有的觸發(fā)器的置位和清零端的,這樣的做法會使芯片的工作可靠、性能穩(wěn)定,而使用普通的IO腳則不能保證該性能。
在FPGA的設(shè)計中,除了從外部管腳引入的全局清除和置位信號外在FPGA內(nèi)部邏輯的處理中也經(jīng)常需要產(chǎn)生一些內(nèi)部的清除或置位信號。清除和置位信號要求象對待時鐘那樣小心地考慮它們,因為這些信號對毛刺也是非常敏感的。
在同步電路設(shè)計中,有時候可以用同步置位的辦法來替代異步清0。在用硬件描述語言的設(shè)計中可以用如下的方式來描述:
異步清0的描述方法:
1.4 觸發(fā)器和所存器:
我們知道,觸發(fā)器是在時鐘的沿進行數(shù)據(jù)的鎖存的,而所存器是用電平使能來鎖存數(shù)據(jù)的。所以觸發(fā)器的Q輸出端在每一個時鐘沿都會被更新,而所存器只能在使能電平有效器件才會被更新。在FPGA設(shè)計中建議如果不是必須那么應(yīng)該盡量使用觸發(fā)器而不是所存器。
那么在使用硬件描述語言進行電路設(shè)計的時候如何區(qū)分觸發(fā)器和所存器的描述方法哪?其實有不少人在使用的過程中可能并沒有特意區(qū)分過,所以也忽略了二者在描述方法上的區(qū)別。下面是用VHDL語言描述的觸發(fā)器和所存器以及綜合器產(chǎn)生的電路邏輯圖。
觸發(fā)器的語言描述:
process2 FPGA/CPLD中的一些設(shè)計方法
2.1 FPGA設(shè)計中的同步設(shè)計
異步設(shè)計不是總能滿足(它們所饋送的觸發(fā)器的)建立和保持時間的要求。因此,異步輸入常常會把錯誤的數(shù)據(jù)鎖存到觸發(fā)器,或者使觸發(fā)器進入亞穩(wěn)定的狀態(tài),在該狀態(tài)下,觸發(fā)器的輸出不能識別為l或0。如果沒有正確地處理,亞穩(wěn)性會導(dǎo)致嚴(yán)重的系統(tǒng)可靠性問題。
另外,在FPGA的內(nèi)部資源里最重要的一部分就是其時鐘資源(全局時鐘網(wǎng)絡(luò)),它一般是經(jīng)過FPGA的特定全局時鐘管腳進入FPGA內(nèi)部,后經(jīng)過全局時鐘BUF適配到全局時鐘網(wǎng)絡(luò)的,這樣的時鐘網(wǎng)絡(luò)可以保證相同的時鐘沿到達芯片內(nèi)部每一個觸發(fā)器的延遲時間差異是可以忽略不計的。
在FPGA中上述的全局時鐘網(wǎng)絡(luò)被稱為時鐘樹,無論是專業(yè)的第三方工具還是器件廠商提供的布局布線器在延時參數(shù)提取、分析的時候都是依據(jù)全局時鐘網(wǎng)絡(luò)作為計算的基準(zhǔn)的。如果一個設(shè)計沒有使用時鐘樹提供的時鐘,那么這些設(shè)計工具有的會拒絕做延時分析有的延時數(shù)據(jù)將是不可靠的。
在我們?nèi)粘5脑O(shè)計中很多情形下會用到需要分頻的情形,好多人的做法是先用高頻時鐘計數(shù),然后使用計數(shù)器的某一位輸出作為工作時鐘進行其他的邏輯設(shè)計。其實這樣的方法是不規(guī)范的。比如下面的描述方法:
process在上述的第一個process電路描述中,首先計數(shù)器的輸出結(jié)果(count(2))相對于全局時鐘clk已經(jīng)產(chǎn)生了一定的延時(延時的大小取決于計數(shù)器的位數(shù)和所選擇使用的器件工藝);而在第二個process中使用計數(shù)器的bit2作為時鐘,那么shift_reg相對于全局clk的延時將變得不好控制。布局布線器最終給出的時間分析也是不可靠的。這樣產(chǎn)生的結(jié)果波形仿真如下圖所示:
正確的做法可以將第二個process這樣來寫。
這樣做是相當(dāng)于產(chǎn)生了一個8分頻的使能信號,在使能信號有效的時候?qū)ata數(shù)據(jù)采樣到shift_reg寄存器中。但此種情形下shift_reg的延時是相對于全局時鐘clk的。下面的圖形更能看得清楚。
2.2 FPGA設(shè)計中的延時電路的產(chǎn)生:
在日常的電路設(shè)計中,有時候我們需要對信號進行延時處理來適應(yīng)對外接口的時序關(guān)系,最經(jīng)常也是最典型的情況是做處理機的接口;因為與處理的接口時序關(guān)系是異步的,而一個規(guī)范的FPGA設(shè)計應(yīng)該是盡可能采用同步設(shè)計。那么遇到這種情況該如何處理呢?
首先在FPGA中要產(chǎn)生延時,信號必須經(jīng)過一定的物理資源。在硬件描述語言中有關(guān)鍵詞Wait for xx ns,需要說明的是該語法是僅僅用于仿真而不能用于綜合的,可綜合的延時方法有:
使信號經(jīng)過邏輯門得到延時(如非門);?
使用器件提供的延時單元(如Altera公司的LCELL,Xilinx公司的);?
注意:當(dāng)使用多級非門的時候綜合器往往會將其優(yōu)化掉,因為綜合器會認(rèn)為一個信號非兩次還是它自己。
需要說明的是在FPGA/CPLD內(nèi)部結(jié)構(gòu)是一種標(biāo)準(zhǔn)的宏單元,下圖是Xilinx公司的Spartans II系列器件的一個標(biāo)準(zhǔn)宏單元。雖然不同的廠家的芯片宏單元的結(jié)構(gòu)不同,但概括而言都是由一些組合邏輯外加一或二個觸發(fā)器而構(gòu)成。在實際應(yīng)用中,當(dāng)一個模塊內(nèi)的組合邏輯被使用了那么與其對應(yīng)的觸發(fā)器也就不能用了;同樣如果觸發(fā)器單元被用了那么組合邏輯單元也就廢了。這就是有時候(特別是使用CPLD)雖然設(shè)計使用的資源并不多但布局布線器卻報告資源不夠使用的原因。
現(xiàn)面的一個例子是前一段時間我在公司遇到的一個設(shè)計。設(shè)計使用Altera公司的EPM7256型號的CPLD。該設(shè)計實際使用的寄存器資源只有109個,占整個器件資源的42%?墒窃撛O(shè)計使用了如下圖所示的延時方法來做處理器接口的時序:
在該電路的設(shè)計中使用了大量的LCELL來產(chǎn)生100多納秒的延時,這樣做的后果是雖然整個電路的觸發(fā)器資源只使用了42%,可是用MaxplusII進行布局布線已經(jīng)不能夠通過了。而且我懷疑經(jīng)過這么多邏輯的延時后所產(chǎn)生的信號還能保持原來的性能不。
當(dāng)需要對某一信號作一段延時時,初學(xué)者往往在此信號后串接一些非門或其它門電路,此方法在分離電路中是可行的。但在FPGA中,開發(fā)軟件在綜合設(shè)計時會將這些門當(dāng)作冗余邏輯去掉,達不到延時的效果。用ALTERA公司的MaxplusII開發(fā)FPGA?xí)r,可以通過插入一些LCELL原語來產(chǎn)生一定的延時,但這樣形成的延時在FPGA芯片中并不穩(wěn)定,會隨溫度等外部環(huán)境的改變而改變,因此并不提倡這樣做。在此,可以用高頻時鐘來驅(qū)動一移位寄存器,待延時信號作數(shù)據(jù)輸入,按所需延時正確設(shè)置移位寄存器的級數(shù),移位寄存器的輸出即為延時后的信號。此方法產(chǎn)生的延時信號與原信號比有誤差,誤差大小由高頻時鐘的周期來決定。對于數(shù)據(jù)信號的延時,在輸出端用數(shù)據(jù)時鐘對延時后信號重新采樣,就可以消除誤差。
| 歡迎光臨 (http://m.raoushi.com/bbs/) | Powered by Discuz! X3.1 |