FPGA設(shè)計(jì)的常見問題
1 數(shù)字電路設(shè)計(jì)中的幾個(gè)基本概念:
1.1 建立時(shí)間和保持時(shí)間:
建立時(shí)間(setup time)是指在觸發(fā)器的時(shí)鐘信號(hào)上升沿到來以前,數(shù)據(jù)穩(wěn)定不變的時(shí)間,如果建立時(shí)間不夠,數(shù)據(jù)將不能在這個(gè)時(shí)鐘上升沿被打入觸發(fā)器;保持時(shí)間(hold time)是指在觸發(fā)器的時(shí)鐘信號(hào)上升沿到來以后,數(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í)間。
1.2 FPGA中的競爭和冒險(xiǎn)現(xiàn)象
信號(hào)在FPGA器件內(nèi)部通過連線和邏輯單元時(shí),都有一定的延時(shí)。延時(shí)的大小與連線的長短和邏輯單元的數(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),就說明該電路存在冒險(xiǎn)。(與分立元件不同,由于PLD內(nèi)部不存在寄生電容電感,這些毛刺將被完整的保留并向下一級(jí)傳遞,因此毛刺現(xiàn)象在PLD、FPGA設(shè)計(jì)中尤為突出)圖2是一個(gè)邏輯冒險(xiǎn)的例子,從圖3的仿真波形可以看出,A、B、C、D四個(gè)輸入信號(hào)經(jīng)過布線延時(shí)以后,高低電平變換不是同時(shí)發(fā)生的,這導(dǎo)致輸出信號(hào)OUT出現(xiàn)了毛刺。(我們無法保證所有連線的長度一致,所以即使四個(gè)輸入信號(hào)在輸入端同時(shí)變化,但經(jīng)過PLD內(nèi)部的走線,到達(dá)或門的時(shí)間也是不一樣的,毛刺必然產(chǎn)生)。可以概括的講,只要輸入信號(hào)同時(shí)變化,(經(jīng)過內(nèi)部走線)組合邏輯必將產(chǎn)生毛刺。將它們的輸出直接連接到時(shí)鐘輸入端、清零或置位端口的設(shè)計(jì)方法是錯(cuò)誤的,這可能會(huì)導(dǎo)致嚴(yán)重的后果。 所以我們必須檢查設(shè)計(jì)中所有時(shí)鐘、清零和置位等對(duì)毛刺敏感的輸入端口,確保輸入不會(huì)含有任何毛刺。
如何處理毛刺
我們可以通過改變?cè)O(shè)計(jì),破壞毛刺產(chǎn)生的條件,來減少毛刺的發(fā)生。例如,在數(shù)字電路設(shè)計(jì)中,常常采用格雷碼計(jì)數(shù)器取代普通的二進(jìn)制計(jì)數(shù)器,這是因?yàn)楦窭状a計(jì)數(shù)器的輸出每次只有一位跳變,消除了競爭冒險(xiǎn)的發(fā)生條件,避免了毛刺的產(chǎn)生。
毛刺并不是對(duì)所有的輸入都有危害,例如D觸發(fā)器的D輸入端,只要毛刺不出現(xiàn)在時(shí)鐘的上升沿并且滿足數(shù)據(jù)的建立和保持時(shí)間,就不會(huì)對(duì)系統(tǒng)造成危害,我們可以說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)化為同步電路。圖4給出了這種方法的示范電路,圖5是仿真波形。
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í)候可以用同步置位的辦法來替代異步清0。在用硬件描述語言的設(shè)計(jì)中可以用如下的方式來描述:
異步清0的描述方法:
process(rst,clk)
begin
if rst=’1’ then
count=(others=>'0’);
elsif clk’event and clk=’1’ then
count=count+1;
end if;
end process;
同步清0的描述方法:
process
begin
wait until clk’event and clk=’1’;
if rst=’1’ then
count=(others=>’0’);
else
count=count+1;
end if;
end process;
1.4 觸發(fā)器和鎖存器:
我們知道,觸發(fā)器是在時(shí)鐘的沿進(jìn)行數(shù)據(jù)的鎖存的,而鎖存器是用電平使能來鎖存數(shù)據(jù)的。所以觸發(fā)器的Q輸出端在每一個(gè)時(shí)鐘沿都會(huì)被更新,而鎖存器只能在使能電平有效器件才會(huì)被更新。在FPGA設(shè)計(jì)中建議如果不是必須那么應(yīng)該盡量使用觸發(fā)器而不是鎖存器。
那么在使用硬件描述語言進(jìn)行電路設(shè)計(jì)的時(shí)候如何區(qū)分觸發(fā)器和鎖存器的描述方法哪?其實(shí)有不少人在使用的過程中可能并沒有特意區(qū)分過,所以也忽略了二者在描述方法上的區(qū)別。下面是用VHDL語言描述的觸發(fā)器和鎖存器以及綜合器產(chǎn)生的電路邏輯圖。
觸發(fā)器的語言描述:
process
begin
wait until clk’event and clk=’1’;
q=d;
end process;
2 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í)鐘樹,無論是專業(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
begin
wait until clk’event and clk=’1’;
if fck=’1’ then
count=(others=>’0’);
else
count=count+1;
end if;
評(píng)論