FPGA入門(mén)教程,主要用于新手進(jìn)行FPGA學(xué)習(xí)。
FPGA入門(mén)教程 1.?dāng)?shù)字電路設(shè)計(jì)入門(mén) 2.FPGA簡(jiǎn)介 3.FPGA開(kāi)發(fā)流程 4.RTL設(shè)計(jì) 5.QuartusⅡ設(shè)計(jì)實(shí)例 6. ModelSim和Testbench1. 數(shù)字電路設(shè)計(jì)入門(mén) 1.1數(shù)字電路設(shè)計(jì) 數(shù)字電路設(shè)計(jì)的核心是邏輯設(shè)計(jì)。通常,數(shù)字電路的邏輯值只有‘1’和‘0’,表征的是模擬電壓或電流的離散值,一般‘1’代表高電平,‘0’代表低電平。 高低電平的含義可以理解為,存在一個(gè)判決電平,當(dāng)信號(hào)的電壓值高于判決電平時(shí),我們就認(rèn)為該信號(hào)表征高電平,即為‘1’。反之亦然。 當(dāng)前的數(shù)字電路中存在許多種電平標(biāo)準(zhǔn),比較常見(jiàn)的有TTL、CMOS、LVTTL、LVCMOS、ECL、PECL、LVDS、HSTL、SSTL等。這些電平的詳細(xì)指標(biāo)請(qǐng)見(jiàn)《補(bǔ)充教程1:電平標(biāo)準(zhǔn)》。 數(shù)字電路設(shè)計(jì)大致可分為組合邏輯電路和時(shí)序邏輯電路。 一般的數(shù)字設(shè)計(jì)的教材中對(duì)組合邏輯電路和時(shí)序邏輯電路的定義分別為:組合邏輯電路的輸出僅與當(dāng)前的輸入有關(guān),而時(shí)序邏輯電路的輸出不但與輸入有關(guān),還和系統(tǒng)上一個(gè)狀態(tài)有關(guān)。 但是在設(shè)計(jì)中,我們一般以時(shí)鐘的存在與否來(lái)區(qū)分該電路的性質(zhì)。由時(shí)鐘沿驅(qū)動(dòng)工作的電路為時(shí)序邏輯電路。大家注意,這兩種電路并不是獨(dú)立存在的,他們相互交錯(cuò)存在于整個(gè)電路系統(tǒng)的設(shè)計(jì)中。 1.1.1組合邏輯電路 組合邏輯電路由任意數(shù)目的邏輯門(mén)電路組成,一般包括與門(mén)、或門(mén)、非門(mén)、異或門(mén)、與非門(mén)、或非門(mén)等。一般的組合邏輯電路如下圖: 其中A,B,C,D,E,F為輸入,G為輸出。 1.1.2時(shí)序邏輯電路 時(shí)序邏輯電路由時(shí)鐘的上升沿或下降沿驅(qū)動(dòng)工作,其實(shí)真正被時(shí)鐘沿驅(qū)動(dòng)的是電路中的觸發(fā)器(Register),也稱(chēng)為寄存器。觸發(fā)器的工作原理和參數(shù)如下圖: 下面是兩個(gè)簡(jiǎn)單的時(shí)序邏輯電路例子: (1)、時(shí)鐘分頻電路 該時(shí)序電路的功能為實(shí)現(xiàn)對(duì)時(shí)鐘’clk’的4分頻,其中’clk_2’為2分頻時(shí)鐘,’clk_4’為4分頻時(shí)鐘,’enable’為該電路的使能信號(hào)。其功能仿真波形如下圖所示: (2)、序列檢測(cè)器 該時(shí)序電路實(shí)現(xiàn)了一個(gè)序列檢測(cè)器,當(dāng)輸入序列‘datain’中出現(xiàn)‘101’時(shí),標(biāo)志位F將輸出‘1’,其他時(shí)刻輸出‘0’。電路中‘clk’為時(shí)鐘信號(hào),‘D1’,‘D2’,‘D3’為移位寄存器的輸出,’enable’為該電路的使能信號(hào)。其功能仿真波形如下圖所示: 可見(jiàn),時(shí)序電路設(shè)計(jì)的核心是時(shí)鐘和觸發(fā)器,這兩者也是我們?cè)O(shè)計(jì)電路時(shí)需重點(diǎn)關(guān)注的。 1.2毛刺的產(chǎn)生與消除 1.2.1競(jìng)爭(zhēng)與冒險(xiǎn) 當(dāng)一個(gè)邏輯門(mén)的輸入有兩個(gè)或兩個(gè)以上的變量發(fā)生改變時(shí),由于這些變量是經(jīng)過(guò)不同路徑產(chǎn)生的,使得它們狀態(tài)改變的時(shí)刻有先有后,這種時(shí)差引起的現(xiàn)象稱(chēng)為競(jìng)爭(zhēng)(Race)。競(jìng)爭(zhēng)的結(jié)果將很可能導(dǎo)致冒險(xiǎn)(Hazard)發(fā)生(例如產(chǎn)生毛刺),造成錯(cuò)誤的后果,并影響系統(tǒng)的工作。 組合邏輯電路的冒險(xiǎn)僅在信號(hào)狀態(tài)改變的時(shí)刻出現(xiàn)毛刺,這種冒險(xiǎn)是過(guò)渡性的,它不會(huì)使穩(wěn)態(tài)值偏離正常值,但在時(shí)序電路中,冒險(xiǎn)是本質(zhì)的,可導(dǎo)致電路的輸出值永遠(yuǎn)偏離正常值或者發(fā)生振蕩。 避免冒險(xiǎn)的最簡(jiǎn)單的方法是同一時(shí)刻只允許單個(gè)輸入變量發(fā)生變化,或者使用寄存器采樣的辦法。 1.2.2毛刺的產(chǎn)生與危害 信號(hào)在FPGA器件中通過(guò)邏輯單元連線時(shí),一定存在延時(shí)。延時(shí)的大小不僅和連線的長(zhǎng)短和邏輯單元的數(shù)目有關(guān),而且也和器件的制造工藝、工作環(huán)境等有關(guān)。因此,信號(hào)在器件中傳輸?shù)臅r(shí)候,所需要的時(shí)間是不能精確估計(jì)的,當(dāng)多路信號(hào)同時(shí)發(fā)生跳變的瞬間,就產(chǎn)生了“競(jìng)爭(zhēng)冒險(xiǎn)”。這時(shí),往往會(huì)出現(xiàn)一些不正確的尖峰信號(hào),這些尖峰信號(hào)就是“毛刺”。 讓我們來(lái)具體看一下毛刺是如何產(chǎn)生的。下圖是一個(gè)與門(mén)電路, 我們期望的設(shè)計(jì)是,a和b信號(hào)同時(shí)變化,這樣輸出OUT將一直為0,但是實(shí)際中OUT產(chǎn)生了毛刺,它的仿真波形如下所示: 可見(jiàn),即使是在最簡(jiǎn)單的邏輯運(yùn)算中,如果出現(xiàn)多路信號(hào)同時(shí)跳變的情況,在通過(guò)內(nèi)部走線之后,就一定會(huì)產(chǎn)生毛刺。而現(xiàn)在數(shù)字電路設(shè)計(jì)中的信號(hào)往往是由時(shí)鐘控制的,如果將帶有毛刺的輸出信號(hào)直接連接到時(shí)鐘輸入端、清零或置位端口的設(shè)計(jì),可能會(huì)導(dǎo)致嚴(yán)重的后果;此外對(duì)于多數(shù)據(jù)輸入的復(fù)雜運(yùn)算系統(tǒng),每個(gè)數(shù)據(jù)都由相當(dāng)多的位數(shù)組成。這時(shí),每一級(jí)的毛刺都會(huì)對(duì)結(jié)果有嚴(yán)重的影響,如果是多級(jí)的設(shè)計(jì),那么毛刺累加后甚至?xí)绊懻麄€(gè)設(shè)計(jì)的可靠性和精確性。 判斷一個(gè)邏輯電路在某些輸入信號(hào)發(fā)生變化時(shí)是否會(huì)產(chǎn)生毛刺,首先要判斷信號(hào)是否會(huì)同時(shí)變化,然后判斷在信號(hào)同時(shí)變化的時(shí)候,是否會(huì)產(chǎn)生毛刺,這可以通過(guò)邏輯函數(shù)的卡諾圖或邏輯函數(shù)表達(dá)式來(lái)進(jìn)行判斷。 1.2.3毛刺的消除 毛刺是數(shù)字電路設(shè)計(jì)中的棘手問(wèn)題,它的出現(xiàn)會(huì)影響電路工作的穩(wěn)定性、可靠性,嚴(yán)重時(shí)會(huì)導(dǎo)致整個(gè)數(shù)字系統(tǒng)的誤動(dòng)作和邏輯紊亂。 可以通過(guò)以下幾種方法來(lái)消除毛刺: 1、輸出加D觸發(fā)器 這是一種比較傳統(tǒng)的去除毛刺的方法。原理就是用一個(gè)D觸發(fā)器去讀帶毛刺的信號(hào),利用D觸發(fā)器對(duì)輸入信號(hào)的毛刺不敏感的特點(diǎn),去除信號(hào)中的毛刺。在實(shí)際中,對(duì)于簡(jiǎn)單的邏輯電路,尤其是對(duì)信號(hào)中發(fā)生在非時(shí)鐘跳變沿的毛刺信號(hào),去除效果非常的明顯。但是如果毛刺信號(hào)發(fā)生在時(shí)鐘信號(hào)的跳變沿,D觸發(fā)器的效果就沒(méi)有那么明顯了(加D觸發(fā)器以后的輸出q,仍含有毛刺)。另外,D觸發(fā)器的使用還會(huì)給系統(tǒng)帶來(lái)一定的延時(shí),特別是在系統(tǒng)級(jí)數(shù)較多的情況下,延時(shí)也將變大,因此在使用D觸發(fā)器去除毛刺的時(shí)候,一定要視情況而定,并不是所有的毛刺都可以用D觸發(fā)器來(lái)消除。 2、信號(hào)同步法 設(shè)計(jì)數(shù)字電路的時(shí)候采用同步電路可以大大減少毛刺。由于大多數(shù)毛刺都比較短(大概幾個(gè)納秒),只要毛刺不出現(xiàn)在時(shí)鐘跳變沿,毛刺信號(hào)就不會(huì)對(duì)系統(tǒng)造成危害了。因此一般認(rèn)為,只要在整個(gè)系統(tǒng)中使用同一個(gè)時(shí)鐘就可以實(shí)現(xiàn)系統(tǒng)同步。但是,時(shí)鐘信號(hào)在FPGA器件中傳遞時(shí)是有延時(shí)的,我們無(wú)法預(yù)知時(shí)鐘跳變沿的精確位置。也就是說(shuō)我們無(wú)法保證在某個(gè)時(shí)鐘的跳變沿讀取的數(shù)據(jù)是一個(gè)穩(wěn)定的數(shù)據(jù),尤其是在多級(jí)設(shè)計(jì)中,這個(gè)問(wèn)題就更加突出。因此,做到真正的"同步"就是去除毛刺信號(hào)的關(guān)鍵問(wèn)題。所以同步的關(guān)鍵就是保證在時(shí)鐘的跳變沿讀取的數(shù)據(jù)是穩(wěn)定的數(shù)據(jù)而不是毛刺數(shù)據(jù)。以下為兩種具體的信號(hào)同步方法。 (1)信號(hào)延時(shí)同步法 信號(hào)延時(shí)法,它的原理就是在兩級(jí)信號(hào)傳遞的過(guò)程中加一個(gè)延時(shí)環(huán)節(jié),從而保證在下一個(gè)模塊中讀取到的數(shù)據(jù)是穩(wěn)定后的數(shù)據(jù),即不包含毛刺信號(hào)。這里所指的信號(hào)延時(shí)可以是數(shù)據(jù)信號(hào)的延時(shí),也可以是時(shí)鐘信號(hào)的延時(shí)。 (2)狀態(tài)機(jī)控制 使用狀態(tài)機(jī)也可以實(shí)現(xiàn)信號(hào)的同步和消除毛刺的目的。在數(shù)據(jù)傳遞比較復(fù)雜的多模塊系統(tǒng)中,由狀態(tài)機(jī)在特定的時(shí)刻分別發(fā)出控制特定模塊的時(shí)鐘信號(hào)或者模塊使能信號(hào),狀態(tài)機(jī)的循環(huán)控制就可以使得整個(gè)系統(tǒng)協(xié)調(diào)運(yùn)作,同時(shí)減少毛刺信號(hào)。那么只要我們?cè)跔顟B(tài)機(jī)的觸發(fā)時(shí)間上加以處理,就可以避免競(jìng)爭(zhēng)冒險(xiǎn),從而抑制毛刺的產(chǎn)生。 3、格雷碼計(jì)數(shù)器 對(duì)于一般的二進(jìn)制或十進(jìn)制計(jì)數(shù)器,在計(jì)數(shù)時(shí),將有多位信號(hào)同時(shí)跳變。例如一個(gè)3bit二進(jìn)制計(jì)數(shù)器,由’111’轉(zhuǎn)換為’000’時(shí),必將產(chǎn)生毛刺。此時(shí),使用格雷碼計(jì)數(shù)器將避免毛 刺的出現(xiàn),因?yàn)楦窭状a計(jì)數(shù)器的輸出每次只有一位跳變。 其他關(guān)于毛刺的詳細(xì)討論,請(qǐng)見(jiàn)補(bǔ)充教程2:關(guān)于毛刺問(wèn)題的探討。 1.3同步電路設(shè)計(jì) 同步電路是指所有電路在同一個(gè)公共時(shí)鐘的上升沿或下降沿的觸發(fā)下同步地工作。但在實(shí)際系統(tǒng)中,往往存在多時(shí)鐘域的情況,這時(shí)同步的概念有所延伸,不再專(zhuān)指整個(gè)設(shè)計(jì)同步于同一時(shí)鐘沿,而是指設(shè)計(jì)應(yīng)該做到局部同步,在每個(gè)時(shí)鐘域內(nèi)的電路要同步于同一時(shí)鐘沿。 1.3.1同步電路設(shè)計(jì)的優(yōu)點(diǎn): 1.同步設(shè)計(jì)能有效地避免毛刺的影響,使得設(shè)計(jì)更可靠; 2.同步設(shè)計(jì)易于添加異步復(fù)位reset,以使整個(gè)電路有一個(gè)確定的初始狀態(tài); 3.同步設(shè)計(jì)可以減小環(huán)境對(duì)芯片的影響,避免器件受溫度,電壓,工藝的影響; 4.同步設(shè)計(jì)可以使靜態(tài)時(shí)序分析變得簡(jiǎn)單和可靠; 5.同步設(shè)計(jì)可以很容易地組織流水線,提高芯片的運(yùn)行速度。 1.3.2同步電路的設(shè)計(jì)準(zhǔn)則: 1.盡可能在設(shè)計(jì)中使用同一時(shí)鐘,時(shí)鐘走全局時(shí)鐘網(wǎng)絡(luò)。走全局時(shí)鐘網(wǎng)絡(luò)的時(shí)鐘是最簡(jiǎn)單、最可預(yù)測(cè)的時(shí)鐘,它具有很強(qiáng)的驅(qū)動(dòng)能力,可以驅(qū)動(dòng)FPGA內(nèi)部中的所有觸發(fā)器,并保證Clock skew可以小到忽略的地步。 2.避免使用混合時(shí)鐘沿采樣數(shù)據(jù),即避免在設(shè)計(jì)中中同時(shí)使用時(shí)鐘的上升沿和下降沿。 3.盡量少在模塊內(nèi)部使用計(jì)數(shù)器分頻所產(chǎn)生的時(shí)鐘。計(jì)數(shù)器分頻時(shí)鐘需完成的邏輯功能完全可由PLL鎖相環(huán)或時(shí)鐘使能電路替代。計(jì)數(shù)器分頻時(shí)鐘的缺點(diǎn)是使得系統(tǒng)內(nèi)時(shí)鐘不可控,并產(chǎn)生較大的Clock skew,還使靜態(tài)時(shí)序分析變得復(fù)雜。 4.避免使用門(mén)控時(shí)鐘。因?yàn)榻?jīng)組合邏輯產(chǎn)生的門(mén)控時(shí)鐘極可能產(chǎn)生毛刺,使D觸發(fā)器誤動(dòng)作。 5.當(dāng)整個(gè)電路需要多個(gè)時(shí)鐘來(lái)實(shí)現(xiàn),則可以將整個(gè)電路分成若干局部同步電路(盡量以同一個(gè)時(shí)鐘為一個(gè)模塊),局部同步電路之間接口當(dāng)作異步接口考慮,而且每個(gè)時(shí)鐘信號(hào)的時(shí)鐘偏差(△T)要嚴(yán)格控制。 6.電路的實(shí)際最高工作頻率不應(yīng)大于理論最高工作頻率,留有設(shè)計(jì)余量,保證芯片可靠工作。 7.電路中所有寄存器、狀態(tài)機(jī)在系統(tǒng)被reset復(fù)位時(shí)應(yīng)處在一個(gè)已知的狀態(tài)。 關(guān)于同步電路設(shè)計(jì)中的其他問(wèn)題請(qǐng)?jiān)斠?jiàn)補(bǔ)充教程3:華為同步電路設(shè)計(jì)規(guī)范。 1.3.3關(guān)于時(shí)鐘設(shè)計(jì)的討論 目前的工程設(shè)計(jì)中一般使用同步時(shí)序電路來(lái)完成整個(gè)系統(tǒng)的設(shè)計(jì),由上一節(jié)可見(jiàn),時(shí)鐘在同步電路設(shè)計(jì)中起著至關(guān)重要的作用。那么,我們?cè)谠O(shè)計(jì)時(shí)首先要完成的是對(duì)時(shí)鐘的設(shè)計(jì)。 如今在設(shè)計(jì)中常見(jiàn)的時(shí)鐘類(lèi)型包括: 全局時(shí)鐘、內(nèi)部邏輯時(shí)鐘和門(mén)控時(shí)鐘。 1. 全局時(shí)鐘 全局時(shí)鐘即同步時(shí)鐘,它通過(guò)FPGA芯片內(nèi)的全局時(shí)鐘布線網(wǎng)絡(luò)或區(qū)域時(shí)鐘網(wǎng)絡(luò)來(lái)驅(qū)動(dòng),全局時(shí)鐘具有高扇出、高精度、低Jitter和低Skew的特點(diǎn),它到芯片中的每一個(gè)寄存器的延遲最短,且該延遲可被認(rèn)為是固定值。所以我們推薦在所有的設(shè)計(jì)中的時(shí)鐘都使用全局時(shí)鐘。全局時(shí)鐘的設(shè)計(jì)有以下幾種方法:
(1). 由PLL鎖相環(huán)來(lái)產(chǎn)生全局時(shí)鐘。 (2). 將FPGA芯片內(nèi)部邏輯產(chǎn)生的時(shí)鐘分配至全局時(shí)鐘布線網(wǎng)絡(luò)。 (3). 將外部時(shí)鐘通過(guò)專(zhuān)用的全局時(shí)鐘輸入引腳引入FPGA。 在我們的設(shè)計(jì)中,一般推薦電路中的所有的時(shí)鐘都由PLL鎖相環(huán)產(chǎn)生。一方面,PLL鎖相環(huán)可實(shí)現(xiàn)倍頻和移相的操作,使我們很方便地獲得所需頻率和相位的時(shí)鐘;另一方面,PLL鎖相環(huán)默認(rèn)將其驅(qū)動(dòng)的時(shí)鐘分配至全局時(shí)鐘網(wǎng)絡(luò)或區(qū)域時(shí)鐘網(wǎng)絡(luò),Jitter和Skew都很小。 下圖取自我們項(xiàng)目中的一個(gè)PLL鎖相環(huán)設(shè)計(jì),該P(yáng)LL用于驅(qū)動(dòng)DDR的接口模塊。因?yàn)楣δ芩�,DDR接口需要三個(gè)133MHz的時(shí)鐘,相位分別是‘-90’、‘0’、‘-180’,圖中所示即為該時(shí)鐘的產(chǎn)生模塊。我們使用QuartusⅡ的Megawizard生成PLL鎖相環(huán)的IP core。其中‘inclk_66’為PLL鎖相環(huán)的輸入時(shí)鐘,由外部的66MHz晶振提供,經(jīng)過(guò)PLL倍頻和移相后得到所需的三個(gè)全局時(shí)鐘。 ooo
2. 內(nèi)部邏輯時(shí)鐘 內(nèi)部邏輯時(shí)鐘即指由芯片內(nèi)部的組合邏輯或計(jì)數(shù)器分頻產(chǎn)生的時(shí)鐘。 對(duì)于組合邏輯時(shí)鐘,特別是由多級(jí)組合邏輯產(chǎn)生的時(shí)鐘,是要被嚴(yán)格禁止使用的,因?yàn)橐环矫娼M合邏輯極容易產(chǎn)生毛刺,特別是對(duì)多級(jí)組合邏輯;另一方面組合邏輯電路的Jitter和Skew比較大,這將惡化時(shí)鐘的質(zhì)量。所以,一般組合邏輯產(chǎn)生的內(nèi)部時(shí)鐘僅僅適用于時(shí)鐘頻率較低、時(shí)鐘精度要求不高的情況。 對(duì)于計(jì)數(shù)器分頻產(chǎn)生的時(shí)鐘,也應(yīng)該盡量少地使用,因?yàn)檫@種時(shí)鐘會(huì)帶來(lái)比較大的延遲,降低設(shè)計(jì)的可靠性,也使得靜態(tài)時(shí)序分析變得復(fù)雜。計(jì)數(shù)器分頻時(shí)鐘需完成的邏輯功能完全可由PLL鎖相環(huán)或時(shí)鐘使能電路替代。 還有一種由觸發(fā)器產(chǎn)生的時(shí)鐘—行波時(shí)鐘,即一個(gè)觸發(fā)器的輸出用作另一個(gè)觸發(fā)器的時(shí)鐘輸入。文中1.1.2節(jié)描述的時(shí)鐘分頻電路就是一種行波時(shí)鐘。因?yàn)楦饔|發(fā)器的時(shí)鐘之間產(chǎn)生較大的時(shí)間偏移,很容易就會(huì)違反建立時(shí)間、保持時(shí)間的要求,導(dǎo)致亞穩(wěn)態(tài)的發(fā)生。所以,這種行波時(shí)鐘要被嚴(yán)格禁止使用。 3. 門(mén)控時(shí)鐘 一般情況下,應(yīng)該避免使用門(mén)控時(shí)鐘。因?yàn)榻?jīng)組合邏輯產(chǎn)生的門(mén)控時(shí)鐘極可能產(chǎn)生毛刺,對(duì)系統(tǒng)造成很大危害。但對(duì)于某些功耗很大的系統(tǒng)而言,需要使用門(mén)控時(shí)鐘來(lái)降低功耗。 我們推薦使用右圖中描述的門(mén)控時(shí)鐘的設(shè)計(jì),該設(shè)計(jì)一般不會(huì)產(chǎn)生毛刺和亞穩(wěn)態(tài)的問(wèn)題。因?yàn)橛|發(fā)器避免了毛刺的產(chǎn)生,而亞穩(wěn)態(tài)只可能出現(xiàn)在源時(shí)鐘的下降沿,但是隨后它與源時(shí)鐘低相位相與,最后不會(huì)產(chǎn)生影響。 門(mén)控時(shí)鐘最好只在頂層模塊中出現(xiàn),并將其分離到一個(gè)在頂層的獨(dú)立模塊中。這同時(shí)保證了底層的每個(gè)模塊有單一的時(shí)鐘,且在本模塊中的時(shí)鐘不進(jìn)行門(mén)控。 在補(bǔ)充教程4和補(bǔ)充教程5中,我們對(duì)時(shí)鐘和時(shí)序的設(shè)計(jì)進(jìn)行了更詳細(xì)的討論。 Dsource_clkclk_engated_clkqoutsource_clkclk_enqoutgated_clk 1.3.4亞穩(wěn)態(tài)在同步電路或異步電路中,如果觸發(fā)器的setup 時(shí)間或hold 時(shí)間不能得到滿足,就可能產(chǎn)生亞穩(wěn)態(tài),此時(shí)觸發(fā)器輸出端Q在有效時(shí)鐘沿之后比較長(zhǎng)的一段時(shí)間處于不確定的狀態(tài),在這段時(shí)間里Q端將會(huì)產(chǎn)生毛刺并不斷振蕩、最終固定在某一電壓值上,此電壓值并不一定等于原來(lái)數(shù)據(jù)輸入端D的值。這段時(shí)間稱(chēng)為決斷時(shí)間(resolution time)。經(jīng)過(guò)決斷時(shí)間之后,Q端將穩(wěn)定到0或1上,但是究竟是0還是1,這是隨機(jī)的,與輸入沒(méi)有必然的關(guān)系。 亞穩(wěn)態(tài)的危害主要體現(xiàn)在破壞系統(tǒng)得穩(wěn)定性上,由于輸出在穩(wěn)定下來(lái)之前可能是毛刺、振蕩、固定的某一電壓值,因此亞穩(wěn)態(tài)除了導(dǎo)致邏輯誤判之外,嚴(yán)重情況下輸出0~1之間的中間電壓值還會(huì)使下一級(jí)產(chǎn)生亞穩(wěn)態(tài)(即導(dǎo)致亞穩(wěn)態(tài)的傳播)。邏輯誤判將導(dǎo)致功能性錯(cuò)誤,而亞穩(wěn)態(tài)的傳播則擴(kuò)大了故障面,嚴(yán)重時(shí)將導(dǎo)致系統(tǒng)崩潰。 在異步時(shí)序電路中更容易發(fā)生亞穩(wěn)態(tài),因?yàn)楫惒诫娐芬话憔哂卸鄠€(gè)時(shí)鐘域,數(shù)據(jù)在兩個(gè)時(shí)鐘域間傳遞時(shí),非常容易導(dǎo)致setup 時(shí)間或hold 時(shí)間不滿足而發(fā)生亞穩(wěn)態(tài)。在同步時(shí)序電路中,當(dāng)兩個(gè)觸發(fā)器間的組合邏輯延遲過(guò)大時(shí),會(huì)導(dǎo)致setup 時(shí)間不滿足而發(fā)生亞穩(wěn)態(tài)。 1.3.5對(duì)跨時(shí)鐘域數(shù)據(jù)的處理 對(duì)跨時(shí)鐘域數(shù)據(jù)的處理的核心就是要保證下級(jí)時(shí)鐘對(duì)上級(jí)數(shù)據(jù)采樣的setup 時(shí)間或hold 時(shí)間滿足要求,即盡量避免亞穩(wěn)態(tài)的發(fā)生和傳播。但是,我們知道,只要系統(tǒng)中有異步元件,亞穩(wěn)態(tài)就是無(wú)法避免的,因此設(shè)計(jì)的電路首先要減少亞穩(wěn)態(tài)導(dǎo)致錯(cuò)誤的發(fā)生,其次要使系統(tǒng)對(duì)產(chǎn)生的錯(cuò)誤不敏感。我們推薦使用以下方法來(lái)解決異步時(shí)鐘域數(shù)據(jù)同步問(wèn)題。 1. 用觸發(fā)器打兩拍 如下圖,左邊為異步輸入端,經(jīng)過(guò)兩級(jí)觸發(fā)器同步,在右邊的輸出將是同步的,而且該輸出基本不存在亞穩(wěn)態(tài)。其原理是即使第一個(gè)觸發(fā)器的輸出端存在亞穩(wěn)態(tài),經(jīng)過(guò)一個(gè)CLK周期后,第二個(gè)觸發(fā)器D端的電平仍未穩(wěn)定的概率非常小,因此第二個(gè)觸發(fā)器Q端基本不會(huì)產(chǎn)生亞穩(wěn)態(tài)。然而,亞穩(wěn)態(tài)是無(wú)法被根除的,一旦亞穩(wěn)態(tài)發(fā)生,后果的嚴(yán)重程度依賴(lài)于你
設(shè)計(jì)系統(tǒng)對(duì)產(chǎn)生的錯(cuò)誤是否敏感。 2. 異步FIFO或DPRAM 因?yàn)楫惒紽IFO或DPRAM使用格雷碼計(jì)數(shù)器設(shè)計(jì)讀寫(xiě)地址的指針,所以它可以很好地避免亞穩(wěn)態(tài)的發(fā)生。使用方法如下,將上級(jí)芯片提供的數(shù)據(jù)隨路時(shí)鐘作為寫(xiě)信號(hào),將數(shù)據(jù)寫(xiě)入異步FIFO或DPRAM,然后使用本級(jí)的采樣時(shí)鐘將數(shù)據(jù)讀出即可。唯一需要注意的是,當(dāng)兩級(jí)時(shí)鐘頻率不同時(shí),需要設(shè)計(jì)好緩沖區(qū),并通過(guò)監(jiān)控full、half、empty、useword
是,當(dāng)兩級(jí)時(shí)鐘頻率不同時(shí),需要設(shè)計(jì)好緩沖區(qū),并通過(guò)監(jiān)控full、half、empty、useword3. 調(diào)整時(shí)鐘相位 這種方法的設(shè)計(jì)難度較大,
FPGA是Field Program芯片(集成電路芯片), 通常FPGA由布線資源分隔 列構(gòu)成整個(gè)芯片,目前我們使用的 片的邏輯單元( 可能的結(jié)果,然后把結(jié)果事先寫(xiě)入查找表中,F(xiàn)PGA工作時(shí),輸入信號(hào)所進(jìn)行的邏輯運(yùn)算就查找表(Look-Up-Table)簡(jiǎn)稱(chēng)為L(zhǎng)UT,其本質(zhì)上就是一個(gè)靜態(tài)存儲(chǔ)器SRAM。 對(duì)于下 實(shí)際邏輯電路 LUT的實(shí)現(xiàn)方式 .... | | | | | | | |
3.1 需求定義(功能定義) 設(shè)計(jì)和實(shí)現(xiàn)一個(gè)系統(tǒng)的第一步,是明確整個(gè)系統(tǒng)的性能指標(biāo),然后進(jìn)一步將系統(tǒng)功能劃 分為可實(shí)現(xiàn)的具體功能模塊,同時(shí)明確各模塊的功能與基本時(shí)序,還可大致確定模塊間的接 口,如時(shí)鐘、讀寫(xiě)信號(hào)、數(shù)據(jù)流和控制信號(hào)等。 3.2 RTL 級(jí) HDL 描述 RTL 級(jí)(寄存器傳輸級(jí))指不關(guān)注寄存器和組合邏輯的細(xì)節(jié)(如使用了多少邏輯門(mén)、邏 輯門(mén)的連接拓?fù)浣Y(jié)構(gòu)等),通過(guò)描述寄存器到寄存器之間的邏輯功能的 HDL 設(shè)計(jì)方法。RTL 級(jí)比門(mén)級(jí)更抽象,同時(shí)也更簡(jiǎn)單和高效。RTL 級(jí)的最大特點(diǎn)是可以直接用綜合工具將其綜 合為門(mén)級(jí)網(wǎng)表。RTL 級(jí)設(shè)計(jì)直接決定著系統(tǒng)的功能和效率。我們使用的 HDL 語(yǔ)言是 verilog。 3.3 功能仿真(前仿真) 功能仿真也稱(chēng)綜合前仿真,其目的是驗(yàn)證 RTL 級(jí)描述是否與設(shè)計(jì)意圖一致。為了提高效 率,功能仿真需要建立testbench,其測(cè)試激勵(lì)一般使用行為級(jí) HDL 語(yǔ)言描述。 3.4 管腳分配與設(shè)計(jì)約束 無(wú)論是 RTL 級(jí)還是門(mén)級(jí)的 HDL 設(shè)計(jì)方法,在實(shí)現(xiàn)該邏輯時(shí)都需要與實(shí)際的 FPGA 芯片 相匹配。管腳分配是指將設(shè)計(jì)文件的輸入輸出信號(hào)指定到器件的某個(gè)管腳,設(shè)置此管腳的電 平標(biāo)準(zhǔn)、電流強(qiáng)度等。設(shè)計(jì)約束指對(duì)設(shè)計(jì)的時(shí)序約束和在綜合、布局布線階段附加的約束等。 3.5 綜合 將 RTL 級(jí) HDL 語(yǔ)言翻譯成由與、或、非門(mén)等基本邏輯單元組成的門(mén)級(jí)連接(網(wǎng)表),并 根據(jù)設(shè)計(jì)目標(biāo)與要求(約束條件)優(yōu)化所生成的邏輯連接,輸出門(mén)級(jí)網(wǎng)表文件。 3.6 門(mén)級(jí)仿真(綜合后仿真) 在綜合后通過(guò)后仿真來(lái)檢查綜合結(jié)果是否與原設(shè)計(jì)一致。一般,綜合后仿真和功能仿真 的測(cè)試激勵(lì)相同。由于綜合工具日益完善,在目前的 FPGA 設(shè)計(jì)中,這一步驟被省略掉。 3.7 布局布線 配。也可以簡(jiǎn)單地將布局布線理解為對(duì) FPGA 內(nèi)部查找表和寄存器資源的合理配置,那么‘布 布局布線就是使用綜合后的網(wǎng)表文件,將工程的邏輯與時(shí)序要求與器件的可用資源相匹 局’ 可以被理解挑選可實(shí)現(xiàn)設(shè)計(jì) 資源以最優(yōu)方式連接起來(lái)。 3.8時(shí)序/時(shí)延分析布線延時(shí)。時(shí)序/時(shí)延分析的時(shí)序仿真是最準(zhǔn)確的,能較好地反映芯片的實(shí)際工作情況,同 時(shí)發(fā)現(xiàn)時(shí)序違規(guī)(Timing Vio 時(shí)間、保持時(shí)間)的情況。3.9配置與下載 通過(guò)編程器(programmer)將布 程。文件格JTAG 4.2. ,我們舉幾個(gè)例子來(lái)說(shuō)明這個(gè)問(wèn)題: 的延遲語(yǔ)句(如:#delay)、 ,他們所描述的功能對(duì)硬件而言是不 。比如,實(shí)現(xiàn)兩個(gè)變量相除運(yùn)算的代碼:c<=A/B; 我們將發(fā)現(xiàn)這句代碼只能在前仿真中正確執(zhí)行,在 QuartusⅡ和其他 EDA 軟件中都不 能將其綜合成硬件。 除、求余、移位。試除和求余需要減法器,商數(shù)和余數(shù)的中間結(jié)果必須有寄存器存儲(chǔ);而這 些運(yùn)算顯然不能在一 完成,它需要一個(gè)狀態(tài)機(jī)來(lái)控制時(shí)序,經(jīng)過(guò)多個(gè)時(shí)鐘周期才 能得出結(jié)果。 次描述的 EDA (注:有些 FPGA 的配套軟件提供乘除法的運(yùn)算模塊, 但也只能支持直接調(diào)用,不支持把形如 C=A/B 的語(yǔ)句綜合成除法模塊)。 3.對(duì)于不定次數(shù)的循環(huán)運(yùn)算是不可綜合的,比如對(duì)于如下的代碼段: 是有限的、固定的。當(dāng)綜合軟件遇到循環(huán)語(yǔ)句時(shí),總是將其展開(kāi)成若干條順序執(zhí)行的語(yǔ)句, 是常數(shù),則展開(kāi)的語(yǔ)句數(shù)是確定的,具有可綜合性;而 對(duì)應(yīng)的硬件電路數(shù)量也不能確定,無(wú)法被綜合。這樣 的語(yǔ)句還包括 while,repeat,forever 等,他們都不可綜合。 通常 EDA 軟件對(duì) HDL 代碼的綜合能力總是比人的思維差。也就是說(shuō),對(duì)于一段代碼, 那 EDA 軟件肯定也不行。比如說(shuō),加法器、 ,所以類(lèi)似 A+B-C,(A>B)?C:D 這樣的運(yùn)算一定可以綜合。 實(shí) 僅符合語(yǔ)法的HDL代碼。 1哪些是不可綜合的代碼 我們不可能將所有不可綜合的代碼都一一列出 1.對(duì)于一些抽象的行為描述代碼是不可綜合的。比如我們常見(jiàn) 初始化語(yǔ)句initial以及等待語(yǔ)句wait都是不可綜合的 可實(shí)現(xiàn)的。 2.對(duì)于一些抽象的運(yùn)算代碼也是不可綜合的 always @(posedge clk) 試想一下,如果我們自己用筆算除法是怎么做的?從高位到低位逐次試 個(gè)時(shí)鐘延上 一句簡(jiǎn)單的C=A/B同所有這些相比顯得太抽象,對(duì)于只能接受RTL或更低層 軟件來(lái)說(shuō)確實(shí)太難實(shí)現(xiàn)。 for (i=0; i<wordlength ; i=i+1) parity = parity xor data[ i]; 當(dāng)wordlength為變量時(shí),任何EDA軟件都不能綜合這個(gè)代碼。這是因?yàn)橛布?guī)模必須 然后再綜合成電路。若wordlength 若它是變量時(shí),展開(kāi)的語(yǔ)句數(shù)不確定,4.2.2如何判斷自己寫(xiě)的代碼是可綜合的如果你不能想象出一個(gè)較直觀的硬件實(shí)現(xiàn)方法,多路選擇器是大家都很熟悉的電路 而除法、開(kāi)根、對(duì)數(shù)等等較復(fù)雜的運(yùn)算,必須通過(guò)一定的算法實(shí)現(xiàn),沒(méi)有直觀簡(jiǎn)單的現(xiàn)方法,則可以判斷那些計(jì)算式是不能綜合的,必須按它們的算法寫(xiě)出更具體的代碼才能實(shí)現(xiàn)。此外,硬件無(wú)法支持的抽象行為描述,當(dāng)然也不能被綜合。不過(guò),這樣的判斷標(biāo)準(zhǔn)非常主觀模糊, 要一個(gè)相對(duì)客觀的標(biāo)準(zhǔn),一般來(lái)說(shuō):在RTL級(jí)的描述中,所有邏輯運(yùn)算和加減法運(yùn)算、 然有缺陷,所以,正確的判斷仍然要靠實(shí)踐來(lái)積累經(jīng)驗(yàn)。當(dāng)你可以較準(zhǔn)確判斷代碼的可綜合性的時(shí)候,你對(duì)HDL的掌握就算完全入門(mén)了。優(yōu)化RTL代碼追求的最終目標(biāo)是面積或者速度,或者是兩者的平衡。面積和速度是FPGA設(shè)計(jì)的兩個(gè)基本標(biāo)準(zhǔn)�!懊娣e”是指一個(gè)設(shè)計(jì)所消耗FPGA的邏輯資源數(shù)量,“速度”指設(shè)計(jì)在芯片上穩(wěn)定運(yùn)行所能夠達(dá)到的最高頻率。兩者是對(duì)立統(tǒng)一的,即要 面積最小、速度最高時(shí)不現(xiàn)實(shí)的。我們的設(shè)計(jì)目標(biāo)應(yīng)該是在滿足設(shè)計(jì)時(shí)序 更高。4.3.1 Pipelining技術(shù)器位置,用寄存器合理分割該組合邏輯路徑,從而降低路徑 具體實(shí)現(xiàn)可通過(guò)下圖的方法,首先對(duì)時(shí)延較大 時(shí)延較大的組合邏輯a_rega_pipe a_int a_reg a_pipe a_int z_reg HDL描述的結(jié)構(gòu)寄存器,然后運(yùn)用優(yōu)化工具自動(dòng)將大組合邏輯拆分為幾個(gè)小的組合邏輯,同時(shí)將寄存器放在小組合邏輯在中間。
完整的Word格式文檔51黑下載地址:
FPGA入門(mén)教程.doc
(158 KB, 下載次數(shù): 28)
2018-10-31 15:44 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|