FPGACPLD數(shù)字電路設計經(jīng)驗_第1頁
FPGACPLD數(shù)字電路設計經(jīng)驗_第2頁
FPGACPLD數(shù)字電路設計經(jīng)驗_第3頁
FPGACPLD數(shù)字電路設計經(jīng)驗_第4頁
FPGACPLD數(shù)字電路設計經(jīng)驗_第5頁
已閱讀5頁,還剩22頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、FPGA/CPLD數(shù)字電路設計經(jīng)驗 FPGA/CPLD數(shù)字電路設計經(jīng)驗分享摘要:在數(shù)字電路的設計中,時序設計是一個系統(tǒng)性能的主要標志,在高層次設計方法中,對時序控制的抽象度也相應提高,因此在設計中較難把握,但在理解RTL電路時序模型的基礎上,采用合理的設計方法在設計復雜數(shù)字系統(tǒng)是行之有效的,通過許多設計實例證明采用這種方式可以使電路的后仿真通過率大大提高,并且系統(tǒng)的工作頻率可以達到一個較高水平。關鍵詞:FPGA 數(shù)字電路 時序 時延路徑 建立時間 保持時間1 數(shù)字電路設計中的幾個基本概念:1.1 建立時間和保持時間:建立時間(setup time)是指在觸發(fā)器的時鐘信號上升沿到來以前,數(shù)據(jù)穩(wěn)定

2、不變的時間,如果建立時間不夠,數(shù)據(jù)將不能在這個時鐘上升沿被打入觸發(fā)器;保持時間(hold time)是指在觸發(fā)器的時鐘信號上升沿到來以后,數(shù)據(jù)穩(wěn)定不變的時間, 如果保持時間不夠,數(shù)據(jù)同樣不能被打入觸發(fā)器。  如圖1 。 數(shù)據(jù)穩(wěn)定傳輸必須滿足建立和保持時間的要求,當然在一些情況下,建立時間和保持時間的值可以為零。 PLD/FPGA開發(fā)軟件可以自動計算兩個相關輸入的建立和保持時間(如圖2)圖1 建立時間和保持時間關系圖注:l 在考慮建立保持時間時,應該考慮時鐘樹向后偏斜的情況,在考慮建立時間時應該考慮時鐘樹向前偏斜的情況。在進行后仿真時,最大延遲用來檢查建立時間,最小延時用來檢查保持時間

3、。l 建立時間的約束和時鐘周期有關,當系統(tǒng)在高頻時鐘下無法工作時,降低時鐘頻率就可以使系統(tǒng)完成工作。保持時間是一個和時鐘周期無關的參數(shù),如果設計不合理,使得布局布線工具無法布出高質量的時鐘樹,那么無論如何調整時鐘頻率也無法達到要求,只有對所設計系統(tǒng)作較大改動才有可能正常工作,導致設計效率大大降低。因此合理的設計系統(tǒng)的時序是提高設計質量的關鍵。在可編程器件中,時鐘樹的偏斜幾乎可以不考慮,因此保持時間通常都是滿足的。1.2 FPGA中的競爭和冒險現(xiàn)象信號在FPGA器件內部通過連線和邏輯單元時,都有一定的延時。延時的大小與連線的長短和邏輯單元的數(shù)目有關,同時還受器件的制造工藝、工作電壓、溫度等條件的

4、影響。信號的高低電平轉換也需要一定的過渡時間。由于存在這兩方面因素,多路信號的電平值發(fā)生變化時,在信號變化的瞬間,組合邏輯的輸出有先后順序,并不是同時變化,往往會出現(xiàn)一些不正確的尖峰信號,這些尖峰信號稱為"毛刺"。如果一個組合邏輯電路中有"毛刺"出現(xiàn),就說明該電路存在"冒險"。(與分立元件不同,由于PLD內部不存在寄生電容電感,這些毛刺將被完整的保留并向下一級傳遞,因此毛刺現(xiàn)象在PLD、FPGA設計中尤為突出)圖2是一個邏輯冒險的例子,從圖3的仿真波形可以看出,"A、B、C、D"四個輸入信號經(jīng)過布線延時以后,高低電

5、平變換不是同時發(fā)生的,這導致輸出信號"OUT"出現(xiàn)了毛刺。(我們無法保證所有連線的長度一致,所以即使四個輸入信號在輸入端同時變化,但經(jīng)過PLD內部的走線,到達或門的時間也是不一樣的,毛刺必然產(chǎn)生)??梢愿爬ǖ闹v,只要輸入信號同時變化,(經(jīng)過內部走線)組合邏輯必將產(chǎn)生毛刺。 將它們的輸出直接連接到時鐘輸入端、清零或置位端口的設計方法是錯誤的,這可能會導致嚴重的后果。 所以我們必須檢查設計中所有時鐘、清零和置位等對毛刺敏感的輸入端口,確保輸入不會含有任何毛刺圖2 存在邏輯冒險的電路示例 圖3 圖2所示電路的仿真波形冒險往往會影響到邏輯電路的穩(wěn)定性。時鐘端口、清零和置位

6、端口對毛刺信號十分敏感,任何一點毛刺都可能會使系統(tǒng)出錯,因此判斷邏輯電路中是否存在冒險以及如何避免冒險是設計人員必須要考慮的問題。如何處理毛刺我們可以通過改變設計,破壞毛刺產(chǎn)生的條件,來減少毛刺的發(fā)生。例如,在數(shù)字電路設計中,常常采用格雷碼計數(shù)器取代普通的二進制計數(shù)器,這是因為格雷碼計數(shù)器的輸出每次只有一位跳變,消除了競爭冒險的發(fā)生條件,避免了毛刺的產(chǎn)生。毛刺并不是對所有的輸入都有危害,例如D觸發(fā)器的D輸入端,只要毛刺不出現(xiàn)在時鐘的上升沿并且滿足數(shù)據(jù)的建立和保持時間,就不會對系統(tǒng)造成危害,我們可以說D觸發(fā)器的D輸入端對毛刺不敏感。 根據(jù)這個特性,我們應當在系統(tǒng)中盡可能采用同步電路,這是因為同步

7、電路信號的變化都發(fā)生在時鐘沿,只要毛刺不出現(xiàn)在時鐘的沿口并且不滿足數(shù)據(jù)的建立和保持時間,就不會對系統(tǒng)造成危害。 (由于毛刺很短,多為幾納秒,基本上都不可能滿足數(shù)據(jù)的建立和保持時間) 去除毛刺的一種常見的方法是利用D觸發(fā)器的D輸入端對毛刺信號不敏感的特點,在輸出信號的保持時間內,用觸發(fā)器讀取組合邏輯的輸出信號,這種方法類似于將異步電路轉化為同步電路。 圖4給出了這種方法的示范電路,圖5是仿真波形。圖4 消除毛刺信號方法之二圖5 圖4所示電路的仿真波形如前所述,優(yōu)秀的設計方案,如采用格雷碼計數(shù)器,同步電路等,可以大大減少毛刺,但它并不能完全消除毛刺。 毛刺并不是對所有輸入都有危害,例如D

8、觸發(fā)器的D輸入端,只要毛刺不出現(xiàn)在時鐘的上升沿并且滿足數(shù)據(jù)的建立和保持時間,就不會對系統(tǒng)造成危害。因此我們可以說D觸發(fā)器的D輸入端對毛刺不敏感。但對于D觸發(fā)器的時鐘端,置位端,清零端,則都是對毛刺敏感的輸入端,任何一點毛刺就會使系統(tǒng)出錯,但只要認真處理,我們可以把危害降到最低直至消除。下面我們就對幾種具體的信號進行探討。1.3 清除和置位信號在FPGA的設計中,全局的清零和置位信號必須經(jīng)過全局的清零和置位管腳輸入,因為他們也屬于全局的資源,其扇出能力大,而且在FPGA內部是直接連接到所有的觸發(fā)器的置位和清零端的,這樣的做法會使芯片的工作可靠、性能穩(wěn)定,而使用普通的IO腳則不能保證該性能。在FP

9、GA的設計中,除了從外部管腳引入的全局清除和置位信號外在FPGA內部邏輯的處理中也經(jīng)常需要產(chǎn)生一些內部的清除或置位信號。清除和置位信號要求象對待時鐘那樣小心地考慮它們,因為這些信號對毛刺也是非常敏感的。在同步電路設計中,有時候可以用同步置位的辦法來替代異步清0。在用硬件描述語言的設計中可以用如下的方式來描述:異步清0的描述方法:process(rst,clk)begin if rst=1 then count<=(others=>0);elsif clkevent and clk=1 then count<=count+1;end if;end process;同步清0的描述

10、方法:processbegin wait until clkevent and clk=1;if rst=1 then count<=(others=>0);else count<=count+1;end if;end process;圖6 異步清0、置位邏輯圖圖7 同步清0、置位關系圖1.4 觸發(fā)器和鎖存器:我們知道,觸發(fā)器是在時鐘的沿進行數(shù)據(jù)的鎖存的,而鎖存器是用電平使能來鎖存數(shù)據(jù)的。所以觸發(fā)器的Q輸出端在每一個時鐘沿都會被更新,而鎖存器只能在使能電平有效器件才會被更新。在FPGA設計中建議如果不是必須那么應該盡量使用觸發(fā)器而不是鎖存器。 那么在使用硬件描述語言進行電路設

11、計的時候如何區(qū)分觸發(fā)器和鎖存器的描述方法哪?其實有不少人在使用的過程中可能并沒有特意區(qū)分過,所以也忽略了二者在描述方法上的區(qū)別。下面是用VHDL語言描述的觸發(fā)器和鎖存器以及綜合器產(chǎn)生的電路邏輯圖。觸發(fā)器的語言描述:processbegin wait until clkevent and clk=1; q<=d;end process;圖 觸發(fā)器鎖存器的語言描述:process(en,d)begin if en=1 then q<=d;end if;end process;圖 所存器由上述對Latch的描述可見,其很容易于選擇器的描述相混淆,用VHDL語言對選擇器的描述方法如下:pr

12、ocess(en,a,b)begin if en=1 then q<=a; else q<=b;end if;end process;2 FPGA/CPLD中的一些設計方法2.1 FPGA設計中的同步設計異步設計不是總能滿足(它們所饋送的觸發(fā)器的)建立和保持時間的要求。因此,異步輸入常常會把錯誤的數(shù)據(jù)鎖存到觸發(fā)器,或者使觸發(fā)器進入亞穩(wěn)定的狀態(tài),在該狀態(tài)下,觸發(fā)器的輸出不能識別為l或0。如果沒有正確地處理,亞穩(wěn)性會導致嚴重的系統(tǒng)可靠性問題。另外,在FPGA的內部資源里最重要的一部分就是其時鐘資源(全局時鐘網(wǎng)絡),它一般是經(jīng)過FPGA的特定全局時鐘管腳進入FPGA內部,后經(jīng)過全局時鐘B

13、UF適配到全局時鐘網(wǎng)絡的,這樣的時鐘網(wǎng)絡可以保證相同的時鐘沿到達芯片內部每一個觸發(fā)器的延遲時間差異是可以忽略不計的。在FPGA中上述的全局時鐘網(wǎng)絡被稱為時鐘樹,無論是專業(yè)的第三方工具還是器件廠商提供的布局布線器在延時參數(shù)提取、分析的時候都是依據(jù)全局時鐘網(wǎng)絡作為計算的基準的。如果一個設計沒有使用時鐘樹提供的時鐘,那么這些設計工具有的會拒絕做延時分析有的延時數(shù)據(jù)將是不可靠的。在我們日常的設計中很多情形下會用到需要分頻的情形,好多人的做法是先用高頻時鐘計數(shù),然后使用計數(shù)器的某一位輸出作為工作時鐘進行其他的邏輯設計。其實這樣的方法是不規(guī)范的。比如下面的描述方法:processbegin wait un

14、til clkevent and clk=1; if fck=1 thencount<=(others=>0); else count<=count+1; end if;end process;processbegin wait until count(2)event and count(2)=1 ; shift_reg<=data;end process;在上述的第一個process電路描述中,首先計數(shù)器的輸出結果(count(2))相對于全局時鐘clk已經(jīng)產(chǎn)生了一定的延時(延時的大小取決于計數(shù)器的位數(shù)和所選擇使用的器件工藝);而在第二個process中使用計數(shù)器的b

15、it2作為時鐘,那么shift_reg相對于全局clk的延時將變得不好控制。布局布線器最終給出的時間分析也是不可靠的。這樣產(chǎn)生的結果波形仿真如下圖所示:正確的做法可以將第二個process這樣來寫。processbegin wait until clkevent and clk=1 ; if count(2 downto 0)=”000” then shift_reg<=data;end if;end process;或者分成兩步來寫:process(count)begin if count(2 downto 0)=”000” thenen<=1;else en<=0;end

16、 if;end process;processbegin wait until clkevent and clk=1 ; if en=1 then shift_reg<=data;end if;end process;這樣做是相當于產(chǎn)生了一個8分頻的使能信號,在使能信號有效的時候將data數(shù)據(jù)采樣到shift_reg寄存器中。但此種情形下shift_reg的延時是相對于全局時鐘clk的。下面的圖形更能看得清楚。圖 上圖中波形的局部放大2.2 FPGA設計中的延時電路的產(chǎn)生:在日常的電路設計中,有時候我們需要對信號進行延時處理來適應對外接口的時序關系,最經(jīng)常也是最典型的情況是做處理機的接口

17、;因為與處理的接口時序關系是異步的,而一個規(guī)范的FPGA設計應該是盡可能采用同步設計。那么遇到這種情況該如何處理呢?首先在FPGA中要產(chǎn)生延時,信號必須經(jīng)過一定的物理資源。在硬件描述語言中有關鍵詞Wait for xx ns,需要說明的是該語法是僅僅用于仿真而不能用于綜合的,可綜合的延時方法有:n 使信號經(jīng)過邏輯門得到延時(如非門);n 使用器件提供的延時單元(如Altera公司的LCELL,Xilinx公司的);注意:當使用多級非門的時候綜合器往往會將其優(yōu)化掉,因為綜合器會認為一個信號非兩次還是它自己。需要說明的是在FPGA/CPLD內部結構是一種標準的宏單元,下圖是Xilinx公司的Spa

18、rtans II系列器件的一個標準宏單元。雖然不同的廠家的芯片宏單元的結構不同,但概括而言都是由一些組合邏輯外加一或二個觸發(fā)器而構成。在實際應用中,當一個模塊內的組合邏輯被使用了那么與其對應的觸發(fā)器也就不能用了;同樣如果觸發(fā)器單元被用了那么組合邏輯單元也就廢了。這就是有時候(特別是使用CPLD)雖然設計使用的資源并不多但布局布線器卻報告資源不夠使用的原因?,F(xiàn)面的一個例子是前一段時間我在公司遇到的一個設計。設計使用Altera公司的EPM7256型號的CPLD。該設計實際使用的寄存器資源只有109個,占整個器件資源的42%??墒窃撛O計使用了如下圖所示的延時方法來做處理器接口的時序:在該電路的設計

19、中使用了大量的LCELL來產(chǎn)生100多納秒的延時,這樣做的后果是雖然整個電路的觸發(fā)器資源只使用了42%,可是用MaxplusII進行布局布線已經(jīng)不能夠通過了。而且我懷疑經(jīng)過這么多邏輯的延時后所產(chǎn)生的信號還能保持原來的性能不。當需要對某一信號作一段延時時,初學者往往在此信號后串接一些非門或其它門電路,此方法在分離電路中是可行的。但在中,開發(fā)軟件在綜合設計時會將這些門當作冗余邏輯去掉,達不到延時的效果。用ALTERA公司的MaxplusII開發(fā)時,可以通過插入一些原語來產(chǎn)生一定的延時,但這樣形成的延時在芯片中并不穩(wěn)定,會隨溫度等外部環(huán)境的改變而改變,因此并不提倡這樣做。在此,可以用高頻時鐘來驅動一

20、移位寄存器,待延時信號作數(shù)據(jù)輸入,按所需延時正確設置移位寄存器的級數(shù),移位寄存器的輸出即為延時后的信號。此方法產(chǎn)生的延時信號與原信號比有誤差,誤差大小由高頻時鐘的周期來決定。對于數(shù)據(jù)信號的延時,在輸出端用數(shù)據(jù)時鐘對延時后信號重新采樣,就可以消除誤差。對于這樣大的延時我建議的實現(xiàn)方法是采用時鐘鎖存來產(chǎn)生延時的方法,我們知道當一個信號用時鐘鎖存一次,將會占用一個觸發(fā)器資源,信號會向后推移一個時鐘周期;該同事的設計里CPLD芯片正好連接有32MHz的時鐘,那么每用時鐘鎖存一次ssp信號就會推移31ns,這樣只需多使用3個觸發(fā)器資源就可以達到目的了。電路圖和仿真波形如下圖所示:當然這樣做對原來信號高低

21、電平的寬度會稍有改變,但只要是在與其接口的芯片的容許范圍之內就不會影響到功能的實現(xiàn)。圖 用于延時的電路圖上圖仿真波形2.3 如何提高系統(tǒng)的運行速度同步電路的速度是指同步時鐘的速度。同步時鐘愈快,電路處理數(shù)據(jù)的時間間隔越短,電路在單位時間處理的數(shù)據(jù)量就愈大.我們先來看一看同步電路中數(shù)據(jù)傳遞的一個基本模型,如下圖:(Tco是觸發(fā)器時鐘到數(shù)據(jù)輸出的延時;Tdelay是組合邏輯的延時;Tsetup是觸發(fā)器的建立時間)假設數(shù)據(jù)已經(jīng)被時鐘的上升沿打入D觸發(fā)器,那么數(shù)據(jù)到達第一個觸發(fā)器的Q端需要Tco,再經(jīng)過組合邏輯的延時Tdelay到達的第二個觸發(fā)器的D端,要想時鐘能在第二個觸發(fā)器再次被穩(wěn)定的鎖入觸發(fā)器,

22、則時鐘的延遲不能晚于Tco+Tdelay+Tsetup,(我們可以回顧一下前面講過的建立和保持時間的概念,就可以理解為什么公式最后要加上一個Tdelay) 由以上分析可知:最小時鐘周期:T=Tco+Tdelay+Tsetup   最快時鐘頻率 F= 1/T    PLD開發(fā)軟件也正是通過這個公式來計算系統(tǒng)運行速度Fmax注:在這個邏輯圖中有個參數(shù):Tpd ,即時鐘的延時參數(shù),我們在剛才做時間分析的時候,沒有提這個參數(shù),(如果使用PLD的全局時鐘型號,Tpd可以為0,如果是普通時鐘,則不為0)。所以如果考慮到時鐘的延時,精確的公式應該是T=Tco+Tdelay+Ts

23、etup-Tpd。當然以上全部分析的都是器件內部的運行速度,如果考慮芯片I/O管腳延時對系統(tǒng)速度的影響,那么還需要加一些修正。由于Tco、Tsetup是由具體的器件和工藝決定的,我們設計電路時只可以改變Tdelay。所以縮短觸發(fā)器間組合邏輯的延時是提高同步電路速度的關鍵。由于一般同步電路都不止一級鎖存(如圖3),而要使電路穩(wěn)定工作,時鐘周期必須滿足最大延時要求,縮短最長延時路徑,才可提高電路的工作頻率。如圖2所示:我們可以將較大的組合邏輯分解為較小的幾塊,中間插入觸發(fā)器,這樣可以提高電路的工作頻率。這也是所謂“流水線”(pipelining)技術的基本原理。對于圖3的上半部分,它時鐘頻率受制于

24、第二個較大的組合邏輯的延時,通過適當?shù)姆椒ㄆ骄峙浣M合邏輯,可以避免在兩個觸發(fā)器之間出現(xiàn)過大的延時,消除速度瓶頸。FPGA/CPLD開發(fā)軟件中也有一些參數(shù)設置,通過修改這些設置,可以提高編譯/布局布線后系統(tǒng)速度,但是根據(jù)經(jīng)驗這種速度的提高是很有限的,假如按照要求我們需要設計一個可以工作到50MHz的系統(tǒng),實際布局布線器報告出來的Fmax只有40MHz,此時如果我們使用布局布線器的設置選項最多可以提高到45MHz,這還是運氣比較好的情況。而且你必須了解這些選項的含義、使用背景等。其實在一個設計里影響速度的瓶頸經(jīng)常只會有幾條,我們將延時最大的路徑稱作關鍵路徑。當設計的運行速度不符合系統(tǒng)設計要求的時

25、候我們可以首先找到不能滿足要求的關鍵路徑,按照上述的方法將關鍵路徑上的組合邏輯拆分成多個中間用觸發(fā)器隔開,這樣很容易就可以從根本上提升系統(tǒng)的運行速度了。有的設計在設計開始就知道那部分電路會產(chǎn)生比較大的組合邏輯,導致速度瓶頸的產(chǎn)生,那么就應該在開始就想好解決辦法。比如現(xiàn)在設計需要產(chǎn)生一個32位的加法器,并且要求能夠工作在50MHz。根據(jù)經(jīng)驗直接用32位加法器肯定是達不到50MHz的要求的,這時我們可以將其分成3個12位計數(shù)器來操作,后面的計數(shù)器只要將前面計數(shù)器結果的高位(進位位)相加就可以了。下面是原來在寬帶接入服務器設計中的流量統(tǒng)計單元中的32位加法器的描述:- flow count elem

26、ent -temporary computing 12 bits adderprocess(Count_0_en,count_buffer,Len,Carry_0_0,Carry_0_1)begin case Count_0_en is -1st Step addition (10 downto 0) + (10 downto 0) when "001" => add_12_a_0 <= ('0' & count_buffer(0)(10 downto 0); add_12_b_0 <= ('0' & Len

27、(10 downto 0); -2nd Step addition (21 downto 11) + Carry_0_0 when "010" => add_12_a_0 <= ('0' & count_buffer(0)(21 downto 11); add_12_b_0 <= ("00000000000" & Carry_0_0); -3rd Step addition (31 downto 22) + Carry_0_1 when "100" => add_12_a_0 &

28、lt;= ("00" & count_buffer(0)(31 downto 22); add_12_b_0 <= ("00000000000" & Carry_0_1); when others => add_12_a_0 <=(others=>X); add_12_b_0 <=(others=>X); end case;end process;-12 bits adderadd_12_result_0 <= add_12_a_0 + add_12_b_0;-Bytes Countprocess

29、(RST,CLK_25MHz,IO,OE_bar,data_sel,Count_0_en)begin if(RST = '1')then -system Reset count_buffer(0) <= (others => '0'); Carry_0_0 <= '0' Carry_0_1 <= '0' Carry_0_2 <= '0' elsif(CLK_25MHz'event and CLK_25MHz = '0')then if(OE_bar = '

30、;0' and data_sel = '0')then count_buffer(0) <= IO; Carry_0_2 <= '0' else case Count_0_en is -1st Step addition (10 downto 0) + (10 downto 0) when "001" => count_buffer(0)(10 downto 0) <= add_12_result_0(10 downto 0); Carry_0_0 <= add_12_result_0(11);-firs

31、t step carry -2nd Step addition (21 downto 11) + Carry_0_0 when "010" => count_buffer(0)(21 downto 11) <= add_12_result_0(10 downto 0); Carry_0_1 <= add_12_result_0(11);-Second step carry -3rd Step addition (31 downto 22) + Carry_0_1 when "100" => count_buffer(0)(31 d

32、ownto 22) <= add_12_result_0(9 downto 0); Carry_0_2 <= add_12_result_0(10);-Third step carry when others => Carry_0_2 <= '0' end case; end if; end if;end process;2.4 信號輸出  當你需要將FPGA/CPLD內部的信號通過管腳輸出給外部相關器件的時候,如果不影響功能最好是將這些信號通過用時鐘鎖存后輸出。因為通常情況下一個板子是工作于一種或兩種時鐘模式下,與FPGA/CPLD相連接的芯

33、片的工作時鐘大多數(shù)情形下與FPGA的時鐘同源,如果輸出的信號經(jīng)過時鐘鎖存可以起到如下的作用:n 容易滿足芯片間信號連接的時序要求;n 容易滿足信號的建立保持時間;如上圖所示,比如FPGA/CPLD在CLK的時鐘沿1鎖存一個信號得到SIG所示的波形,SIG信號需要給另外的一個與其接口的芯片,那么該芯片將一定會在CLK的時鐘沿2正確采樣到SIG信號。但是如果該信號在FPGA/CPLD中輸出的時候不是用時鐘沿鎖存的,那將有可能出現(xiàn)SIG1/SIG2所示的時序關系,則與其接口的芯片在時鐘沿2處采樣該信號的時候有可能出現(xiàn)建立保持時間不滿足要求而出現(xiàn)采樣不可靠、沿打沿等情況。另外通過組合邏輯輸出還有可能出

34、現(xiàn)毛刺的情況。所有這些不規(guī)范的設計都會引起系統(tǒng)工作時的不可靠、不穩(wěn)定的情形。2.5 寄存異步輸入信號我們在日常的設計工作中,F(xiàn)PGA/CPLD總是要與別的芯片相連接的,F(xiàn)PGA/CPLD會給別的芯片輸出信號,同時也要處理別的芯片送來的信號,這些信號往往對FPGA/CPLD內部的時鐘系統(tǒng)而言是異步的,為了可靠的采樣到這些輸入信號,建議將這些輸入信號使用相應的時鐘鎖存后在處理,這樣做:n 將原來的異步信號轉化成同步來處理;n 去除輸入信號中的毛刺(特別是對于數(shù)據(jù)總線);圖 FPGA/CPLD中信號的輸入、輸出鎖存2.6 FPGA/CPLD中的時鐘設計無淪是用離散邏輯、可編程邏輯,還是用全定制硅器件

35、實現(xiàn)的任何數(shù)字設計,為了成功地操作,可靠的時鐘是非常關鍵的。設計不良的時鐘在極限的溫度、電壓或制造工藝的偏差情況下將導致錯誤的行為,并且調試困難、花銷很大。在設計FPGA/CPLD時通常采用幾種時鐘類型。時鐘可分為如下四種類型:全局時鐘、門控時鐘、多級邏輯時鐘和波動式時鐘。多時鐘系統(tǒng)能夠包括上述四種時鐘類型的任意組合。無論采用何種方式,電路中真實的時鐘樹也無法達到假定的理想時鐘,因此我們必須依據(jù)理想時鐘,建立一個實際工作時鐘模型來分析電路,這樣才可以使得電路的實際工作效果和預期的一樣。在實際的時鐘模型中,我們要考慮時鐘樹傳播中的偏斜、跳變和絕對垂直的偏差以及其它一些不確定因素。對于寄存器而言,

36、當時鐘工作沿到來時它的數(shù)據(jù)端應該已經(jīng)穩(wěn)定,這樣才能保證時鐘工作沿采樣到數(shù)據(jù)的正確性,這段數(shù)據(jù)的預備時間我們稱之為建立時間(setup time)。數(shù)據(jù)同樣應該在時鐘工作沿過去后保持一段時間,這段時間稱為保持時間(hold time)。因此具體的時鐘如圖5所示。其中網(wǎng)絡延遲是指時鐘的傳播延時以及因為跳變不垂直等效的偏差,在此基礎上考慮一些不確定因素實際的工作時鐘沿如圖中所示。保持時間(hold)和建立時間(setup)都是相對于實際時鐘跳變而言的。因此在確定電路時序時,必須要考慮到這些因素,使得建立時間和保持時間符合要求。為了使電路正常工作,建立時間和保持時間應該分別滿足:其中tclock_Q_

37、max是時鐘沿變化到數(shù)據(jù)輸出端變化的最慢變化情況,tlogic_max是寄存器間組合邏輯的最大可能延遲,tclock_Q_min和tlogic_min表示最快情況。在考慮建立保持時間時,應該考慮時鐘樹向后偏斜的情況,在考慮建立時間時應該考慮時鐘樹向前偏斜的情況。在進行后仿真時,最大延遲用來檢查建立時間,最小延時用來檢查保持時間。2.6.1 全局時鐘對于一個設計項目來說,全局時鐘(或同步時鐘)是最簡單和最可預測的時鐘。在PLD/FPGA設計中最好的時鐘方案是:由專用的全局時鐘輸入引腳驅動的單個主時鐘去鐘控設計項目中的每一個觸發(fā)器。只要可能就應盡量在設計項目中采用全局時鐘。PLD/FPGA都具有專

38、門的全局時鐘引腳,它直接連到器件中的每一個寄存器。這種全局時鐘提供器件中最短的時鐘到輸出的延時。圖1 示出全局時鐘的實例。圖1 定時波形示出觸發(fā)器的數(shù)據(jù)輸入D1.3應遵守建立時間和保持時間的約束條件。建立和保持時間的數(shù)值在PLD數(shù)據(jù)手冊中給出,也可用軟件的定時分析器計算出來。如果在應用中不能滿足建立和保持時間的要求,則必須用時鐘同步輸入信號(參看下一章“異步輸入”)。圖1 全局時鐘(最好的方法是用全局時鐘引腳去鐘控PLD內的每一個寄存器,于是數(shù)據(jù)只要遵守相對時鐘的建立時間tsu和保持時間th)2.6.2 門控時鐘在許多應用中,整個設計項目都采用外部的全局時鐘是不可能或不實際的。PLD具有乘積項

39、邏輯陣列時鐘(即時鐘是由邏輯產(chǎn)生的),允許任意函數(shù)單獨地鐘控各個觸發(fā)器。然而,當你用陣列時鐘時,應仔細地分析時鐘函數(shù),以避免毛刺。   通常用陣列時鐘構成門控時鐘。門控時鐘常常同微處理器接口有關,用地址線去控制寫脈沖。然而,每當用組合函數(shù)鐘控觸發(fā)器時,通常都存在著門控時鐘。如果符合下述條件,門控時鐘可以象全局時鐘一樣可靠地工作:l 驅動時鐘的邏輯必須只包含一個“與”門或一個“或”門。如果采用任何附加邏在某些工作狀態(tài)下,會出現(xiàn)競爭產(chǎn)生的毛刺。l 邏輯門的一個輸入作為實際的時鐘,而該邏輯門的所有其它輸入必須當成地址或控制線,它們遵守相對于時鐘的建立和保持時間的約束。圖2和圖3

40、是可靠的門控時鐘的實例。在 圖2 中,用一個“與”門產(chǎn)生門控時鐘,在 圖3 中,用一個“或”門產(chǎn)生門控時鐘。在這兩個實例中,引腳nWR和nWE考慮為時鐘引腳,引腳ADDo3是地址引腳,兩個觸發(fā)器的數(shù)據(jù)是信號D1.n經(jīng)隨機邏輯產(chǎn)生的。圖2 “與”門門控時鐘圖3 “或”門門控時鐘圖2和圖3 的波形圖顯示出有關的建立時間和保持時間的要求。這兩個設計項目的地址線必須在時鐘保持有效的整個期間內保持穩(wěn)定(nWR和nWE是低電平有效)。如果地址線在規(guī)定的時間內未保持穩(wěn)定,則在時鐘上會出現(xiàn)毛刺,造成觸發(fā)器發(fā)生錯誤的狀態(tài)變化。另一方面,數(shù)據(jù)引腳D1n只要求在nWR和nWE的有效邊沿處滿足標準的建立和保持時間的規(guī)

41、定。我們往往可以將門控時鐘轉換成全局時鐘以改善設計項目的可靠性。圖4 示出如何用全局時鐘重新設計 圖2 的電路。地址線在控制D觸發(fā)器的使能輸入,許多PLD設計軟件,如MAX+PLUSII軟件都提供這種帶使能端的D觸發(fā)器。當ENA為高電平時,D輸入端的值被鐘控到觸發(fā)器中:當ENA為低電平時,維持現(xiàn)在的狀態(tài)。圖4 “與”門門控時鐘轉化成全局時鐘圖4 中重新設計的電路的定時波形表明地址線不需要在nWR有效的整個期間內保持穩(wěn)定;而只要求它們和數(shù)據(jù)引腳一樣符合同樣的建立和保持時間,這樣對地址線的要求就少很多。圖5給出一個不可靠的門控時鐘的例子。3位同步加法計數(shù)器的RCO輸出用來鐘控觸發(fā)器。然而,計數(shù)器給

42、出的多個輸入起到時鐘的作用,這違反了可靠門控時鐘所需的條件之一。在產(chǎn)生RCO信號的觸發(fā)器中,沒有一個能考慮為實際的時鐘線,這是因為所有觸發(fā)器在幾乎相同的時刻發(fā)生翻轉。而我們并不能保證在PLD/FPGA內部QA,QB,QC到D觸發(fā)器的布線長短一致,因此,如 圖5 的時間波形所示,在器從3計到4時,RCO線上會出現(xiàn)毛刺(假設QC到D觸發(fā)器的路徑較短,即QC的輸出先翻轉)。圖5 不可靠的門控時鐘(定時波形示出在計數(shù)器從3到4改變時,RCO信號如何出現(xiàn)毛刺的)圖6 給出一種可靠的全局鐘控的電路,它是圖5不可靠計數(shù)器電路的改進,RCO控制D觸發(fā)器的使能輸入。這個改進不需要增加PLD的邏輯單元。圖6 不可

43、靠的門控時鐘轉換為全局時鐘2.6.3 多級邏輯時鐘當產(chǎn)生門控時鐘的組合邏輯超過一級(即超過單個的“與”門或“或”門)時,證設計項目的可靠性變得很困難。即使樣機或仿真結果沒有顯示出靜態(tài)險象,但實際上仍然可能存在著危險。通常,我們不應該用多級組合邏輯去鐘控PLD設計中的觸發(fā)器。圖7 給出一個含有險象的多級時鐘的例子。時鐘是由SEL引腳控制的多路選擇器輸出的。多路選擇器的輸入是時鐘(CLK)和該時鐘的2分頻(DIV2)。由圖7 的定時波形圖看出,在兩個時鐘均為邏輯1的情況下,當SEL線的狀態(tài)改變時,存在靜態(tài)險象。險象的程度取決于工作的條件。 多級邏輯的險象是可以去除的。例如,你可以插入“冗余邏輯”到

44、設計項目中。然而,PLD/FPGA編譯器在邏輯綜合時會去掉這些冗余邏輯,使得驗證險象是否真正被去除變得困難了。為此,必須應尋求其它方法來實現(xiàn)電路的功能。圖7 有靜態(tài)險象的多級時鐘圖8 給出 圖7 電路的一種單級時鐘的替代方案。圖中SEL引腳和DIV2信號用于使能D觸發(fā)器的使能輸入端,而不是用于該觸發(fā)器的時鐘引腳。采用這個電路并不需要附加PLD的邏輯單元,工作卻可靠多了。   不同的系統(tǒng)需要采用不同的方法去除多級時鐘,并沒有固定的模式。圖7 無靜態(tài)險象的多級時鐘(這個電路邏輯上等效于圖7,但卻可靠的多)2.6.4 行波時鐘另一種流行的時鐘電路是采用行波時鐘,即一個觸發(fā)器的輸出用作另一個

45、觸發(fā)器的時鐘輸入。如果仔細地設計,行波時鐘可以象全局時鐘一樣地可靠工作。然而,行波時鐘使得與電路有關的定時計算變得很復雜。行波時鐘在行波鏈上各觸發(fā)器的時鐘之間產(chǎn)生較大的時間偏移,并且會超出最壞情況下的建立時間、保持時間和電路中時鐘到輸出的延時,使系統(tǒng)的實際速度下降。    用計數(shù)翻轉型觸發(fā)器構成異步計數(shù)器時常采用行波時鐘,一個觸發(fā)器的輸出鐘控下一個觸發(fā)器的輸入,參看圖9   同步計數(shù)器通常是代替異步計數(shù)器的更好方案,這是因為兩者需要同樣多的宏單元而同步計數(shù)器有較快的時鐘到輸出的時間。圖10 給出具有全局時鐘的同步計數(shù)器,它和 圖9 功能相同,用了同樣多的

46、邏輯單元實現(xiàn),卻有較快的時鐘到輸出的時間。幾乎所有PLD開發(fā)軟件都提供多種多樣的同步計數(shù)器。圖9 行波時鐘圖10 行波時鐘轉換成全局時鐘(這個3位計數(shù)器是圖9異步計數(shù)器的替代電路,它用了同樣的3個宏單元,但有更短的時鐘到輸出的延時)2.6.5  多時鐘系統(tǒng)許多系統(tǒng)要求在同一個PLD內采用多時鐘。最常見的例子是兩個異步微處理器器之間的接口,或微處理器和異步通信通道的接口。由于兩個時鐘信號之間要求一定的建立和保持時間,所以,上述應用引進了附加的定時約束條件。它們也會要求將某些異步信號同步化。圖11 給出一個多時鐘系統(tǒng)的實例。CLK_A用以鐘控REG_A,CLK_B用于鐘控REG_B,由于

47、REG_A驅動著進入REG_B的組合邏輯,故CLK_A的上升沿相對于CLK_B的上升沿有建立時間和保持時間的要求。由于REG_B不驅動饋到REG_A的邏輯,CLK_B的上升沿相對于CLK_A沒有建立時間的要求。此外,由于時鐘的下降沿不影響觸發(fā)器的狀態(tài),所以CLK_A和CLK_B的下降沿之間沒有時間上的要求。如圖4,2II所示,電路中有兩個獨立的時鐘,可是,在它們之間的建立時間和保持時間的要求是不能保證的。在這種情況下,必須將電路同步化。圖12 給出REG_A的值(如何在使用前)同CLK_B同步化。新的觸發(fā)器REG_C由GLK_B觸控,保證REG_G的輸出符合REG_B的建立時間。然而,這個方法

48、使輸出延時了一個時鐘周期。圖ll 多時鐘系統(tǒng)(定時波形示出CLK_A的上升沿相對于CLK_B的上升沿有建立時間和保持時間的約束條件)圖12 具有同步寄存器輸出的多時鐘系統(tǒng)(如果CLK_A和CLK_B是相互獨立的,則REGA的輸出必須在它饋送到1REG_B之前,用REG_C同步化)在許多應用中只將異步信號同步化還是不夠的,當系統(tǒng)中有兩個或兩個以上非同源時鐘的時候,數(shù)據(jù)的建立和保持時間很難得到保證,我們將面臨復雜的時間問題。最好的方法是將所有非同源時鐘同步化。使用PLD內部的鎖項環(huán)(PLL或DLL)是一個效果很好的方法,但不是所有PLD都帶有PLL、DLL,而且?guī)в蠵LL功能的芯片大多價格昂貴,所

49、以除非有特殊要求,一般場合可以不使用帶PLL的PLD。 這時我們需要使用帶使能端的D觸發(fā)器,并引入一個高頻時鐘。圖13 不同源時鐘如圖13所示,系統(tǒng)有兩個不同源時鐘,一個為3MHz,一個為5MHz,不同的觸發(fā)器使用不同的時鐘。為了系統(tǒng)穩(wěn)定,我們引入一個20MHz時鐘,將3M和5M時鐘同步化,如圖15所示。 20M的高頻時鐘將作為系統(tǒng)時鐘,輸入到所有觸發(fā)器的的時鐘端。3M_EN 和5M_EN將控制所有觸發(fā)器的使能端。即原來接3M時鐘的觸發(fā)器,接20M時鐘,同時3M_EN 將控制該觸發(fā)器使能 ,原接5M時鐘的觸發(fā)器,也接20M時鐘,同時5M_EN 將控制該觸發(fā)器使能。 這樣我們就可以將任何非同源時鐘同步化。圖13 同步化任意非同源時鐘(一個DFF和后面非門,與門構成時鐘上升沿檢測電路)  另外,

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論