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