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