FPGA入門教程_第1頁
FPGA入門教程_第2頁
FPGA入門教程_第3頁
FPGA入門教程_第4頁
FPGA入門教程_第5頁
已閱讀5頁,還剩33頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、FPGA 入門教程1數(shù)字電路設(shè)計入門2FPGA 簡介3FPGA 開發(fā)流程4RTL 設(shè)計5Quartus設(shè)計實例6. ModelSim 和 Testbench1.1 數(shù)字電路設(shè)計1.數(shù)字電路設(shè)計入門數(shù)字電路設(shè)計的核心是邏輯設(shè)計。通常,數(shù)字電路的邏輯值只有1和0,表征的是模擬電壓或電流的離散值,一般1代表高電平,0代表低電平。高低電平的含義可以理解為,存在一個判決電平,當信號的電壓值高于判決電平時,我們就認為該信號表征高電平,即為1。反之亦然。當前的數(shù)字電路中存在許多種電平標準,比較常見的有 TTL、CMOS、LVTTL、LVCMOS、ECL、PECL、LVDS、HSTL、SSTL 等。這些電平的

2、詳細指標請見補充教程 1:電平標準。數(shù)字電路設(shè)計大致可分為組合邏輯電路和時序邏輯電路。一般的數(shù)字設(shè)計的教材中對組合邏輯電路和時序邏輯電路的定義分別為:組合邏輯電路的輸出僅與當前的輸入有關(guān),而時序邏輯電路的輸出不但與輸入有關(guān),還和系統(tǒng)上一個狀態(tài)有關(guān)。但是在設(shè)計中,我們一般以時鐘的存在與否來區(qū)分該電路的性質(zhì)。由時鐘沿驅(qū)動工作的電路為時序邏輯電路。大家注意,這兩種電路并不是獨立存在的,他們相互交錯存在于整個電路系統(tǒng)的設(shè)計中。組合邏輯電路組合邏輯電路由任意數(shù)目的邏輯門電路組成,一般包括與門、或門、非門、異或門、與非門、或非門等。一般的組合邏輯電路如下圖:其中 A,B,C,D,E,F 為輸入,G 為輸出

3、。時序邏輯電路時序邏輯電路由時鐘的上升沿或下降沿驅(qū)動工作,其實真正被時鐘沿驅(qū)動的是電路中的觸發(fā)器(Register),也稱為寄存器。觸發(fā)器的工作原理和參數(shù)如下圖:Register的原理和參數(shù)TDQClkClkDtsuQtholdtc-qtsu:建立時間,在時鐘有效沿到來之前觸發(fā)器數(shù)據(jù)輸入應保持穩(wěn)定的時間,如果建立時間不夠,數(shù)據(jù)將不能在這個時鐘沿被打入觸發(fā)器。它間接約束了組合邏輯的最大延時。thold:保持時間,在觸發(fā)器數(shù)據(jù)輸入引腳的數(shù)據(jù)在系統(tǒng)有效時鐘沿到來后,需要保持穩(wěn)定的時間,如果保持時間不夠,數(shù)據(jù)同樣不能被打入觸發(fā)器。它間接約束了組合邏輯的最小延時.tc-q:觸發(fā)器從有效時鐘沿到來到輸出有

4、效的最大時間。下面是兩個簡單的時序邏輯電路例子:(1)、時鐘分頻電路該時序電路的功能為實現(xiàn)對時鐘clk的4 分頻,其中clk_2為 2 分頻時鐘,clk_4為 4分頻時鐘,enable為該電路的使能信號。其功能仿真波形如下圖所示:(2)、序列檢測器該時序電路實現(xiàn)了一個序列檢測器,當輸入序列datain中出現(xiàn)101時,標志位 F 將輸出1,其他時刻輸出0。電路中clk為時鐘信號,D1,D2,D3為移位寄存器的輸出,enable為該電路的使能信號。其功能仿真波形如下圖所示:可見,時序電路設(shè)計的核心是時鐘和觸發(fā)器,這兩者也是我們設(shè)計電路時需重點關(guān)注的。1.2 毛刺的產(chǎn)生與消除 競爭與冒險當一個邏輯門

5、的輸入有兩個或兩個以上的變量發(fā)生改變時,由于這些變量是經(jīng)過不同路徑產(chǎn)生的,使得它們狀態(tài)改變的時刻有先有后,這種時差引起的現(xiàn)象稱為競爭(Race)。競爭的結(jié)果將很可能導致冒險(Hazard)發(fā)生(例如產(chǎn)生毛刺),造成錯誤的后果,并影響系統(tǒng)的工作。組合邏輯電路的冒險僅在信號狀態(tài)改變的時刻出現(xiàn)毛刺,這種冒險是過渡性的,它不會使穩(wěn)態(tài)值偏離正常值,但在時序電路中,冒險是本質(zhì)的,可導致電路的輸出值永遠偏離正常值或者發(fā)生振蕩。避免冒險的最簡單的方法是同一時刻只允許單個輸入變量發(fā)生變化,或者使用寄存器采樣的辦法。 毛刺的產(chǎn)生與危害信號在 FPGA 器件中通過邏輯單元連線時,一定存在延時。延時的大小不僅和連線的

6、長短和邏輯單元的數(shù)目有關(guān),而且也和器件的制造工藝、工作環(huán)境等有關(guān)。因此,信號在器件中傳輸?shù)臅r候,所需要的時間是不能精確估計的,當多路信號同時發(fā)生跳變的瞬間,就產(chǎn)生了“競爭冒險”。這時,往往會出現(xiàn)一些不正確的尖峰信號,這些尖峰信號就是“毛刺”。讓我們來具體看一下毛刺是如何產(chǎn)生的。下圖是一個與門電路,我們期望的設(shè)計是,a 和 b 信號同時變化,這樣輸出 OUT 將一直為 0,但是實際中 OUT產(chǎn)生了毛刺,它的仿真波形如下所示:可見,即使是在最簡單的邏輯運算中,如果出現(xiàn)多路信號同時跳變的情況,在通過內(nèi)部走線之后,就一定會產(chǎn)生毛刺。而現(xiàn)在數(shù)字電路設(shè)計中的信號往往是由時鐘控制的,如果將帶有毛刺的輸出信號

7、直接連接到時鐘輸入端、清零或置位端口的設(shè)計,可能會導致嚴重的后果;此外對于多數(shù)據(jù)輸入的復雜運算系統(tǒng),每個數(shù)據(jù)都由相當多的位數(shù)組成。這時,每一級的毛刺都會對結(jié)果有嚴重的影響,如果是多級的設(shè)計,那么毛刺累加后甚至會影響整個設(shè)計的可靠性和精確性。判斷一個邏輯電路在某些輸入信號發(fā)生變化時是否會產(chǎn)生毛刺,首先要判斷信號是否會同時變化,然后判斷在信號同時變化的時候,是否會產(chǎn)生毛刺,這可以通過邏輯函數(shù)的卡諾圖或邏輯函數(shù)表達式來進行判斷。 毛刺的消除毛刺是數(shù)字電路設(shè)計中的棘手問題,它的出現(xiàn)會影響電路工作的穩(wěn)定性、可靠性,嚴重時會導致整個數(shù)字系統(tǒng)的誤動作和邏輯紊亂??梢酝ㄟ^以下幾種方法來消除毛刺:1、輸出加 D

8、 觸發(fā)器 這是一種比較傳統(tǒng)的去除毛刺的方法。原理就是用一個 D觸發(fā)器去讀帶毛刺的信號,利用 D觸發(fā)器對輸入信號的毛刺不敏感的特點,去除信號中的毛刺。在實際中,對于簡單的邏輯電路,尤其是對信號中發(fā)生在非時鐘跳變沿的毛刺信號,去除效果非常的明顯。 但是如果毛刺信號發(fā)生在時鐘信號的跳變沿,D 觸發(fā)器的效果就沒有那么明顯了(加 D觸發(fā)器以后的輸出 q,仍含有毛刺)。另外,D觸發(fā)器的使用還會給系統(tǒng)帶來一定的延時,特別是在系統(tǒng)級數(shù)較多的情況下,延時也將變大,因此在使用D觸發(fā)器去除毛刺的時候,一定要視情況而定,并不是所有的毛刺都可以用 D 觸發(fā)器來消除。2、信號同步法設(shè)計數(shù)字電路的時候采用同步電路可以大大減

9、少毛刺。由于大多數(shù)毛刺都比較短(大概幾個納秒),只要毛刺不出現(xiàn)在時鐘跳變沿,毛刺信號就不會對系統(tǒng)造成危害了。因此一般認為,只要在整個系統(tǒng)中使用同一個時鐘就可以實現(xiàn)系統(tǒng)同步。但是,時鐘信號在 FPGA器件中傳遞時是有延時的,我們無法預知時鐘跳變沿的精確位置。也就是說我們無法保證在某個時鐘的跳變沿讀取的數(shù)據(jù)是一個穩(wěn)定的數(shù)據(jù),尤其是在多級設(shè)計中,這個問題就更加突出。因此,做到真正的"同步"就是去除毛刺信號的關(guān)鍵問題。所以同步的關(guān)鍵就是保證在時鐘的跳變沿讀取的數(shù)據(jù)是穩(wěn)定的數(shù)據(jù)而不是毛刺數(shù)據(jù)。以下為兩種具體的信號同步方法。(1)信號延時同步法信號延時法,它的原理就是在兩級信號傳遞的過

10、程中加一個延時環(huán)節(jié),從而保證在下一個模塊中讀取到的數(shù)據(jù)是穩(wěn)定后的數(shù)據(jù),即不包含毛刺信號。這里所指的信號延時可以是數(shù)據(jù)信號的延時,也可以是時鐘信號的延時。 (2)狀態(tài)機控制使用狀態(tài)機也可以實現(xiàn)信號的同步和消除毛刺的目的。在數(shù)據(jù)傳遞比較復雜的多模塊系統(tǒng)中,由狀態(tài)機在特定的時刻分別發(fā)出控制特定模塊的時鐘信號或者模塊使能信號,狀態(tài)機的循環(huán)控制就可以使得整個系統(tǒng)協(xié)調(diào)運作,同時減少毛刺信號。那么只要我們在狀態(tài)機的觸發(fā)時間上加以處理,就可以避免競爭冒險,從而抑制毛刺的產(chǎn)生。3、格雷碼計數(shù)器對于一般的二進制或十進制計數(shù)器,在計數(shù)時,將有多位信號同時跳變。例如一個 3bit二進制計數(shù)器,由111轉(zhuǎn)換為000時,

11、必將產(chǎn)生毛刺。此時,使用格雷碼計數(shù)器將避免毛刺的出現(xiàn),因為格雷碼計數(shù)器的輸出每次只有一位跳變。其他關(guān)于毛刺的詳細討論,請見補充教程 2:關(guān)于毛刺問題的探討。1.3 同步電路設(shè)計同步電路是指所有電路在同一個公共時鐘的上升沿或下降沿的觸發(fā)下同步地工作。但在實際系統(tǒng)中,往往存在多時鐘域的情況,這時同步的概念有所延伸,不再專指整個設(shè)計同步于同一時鐘沿,而是指設(shè)計應該做到局部同步,在每個時鐘域內(nèi)的電路要同步于同一時鐘沿。 同步電路設(shè)計的優(yōu)點:1同步設(shè)計能有效地避免毛刺的影響,使得設(shè)計更可靠;2同步設(shè)計易于添加異步復位reset,以使整個電路有一個確定的初始狀態(tài); 3同步設(shè)計可以減小環(huán)境對芯片的影響,避免

12、器件受溫度,電壓,工藝的影響;4同步設(shè)計可以使靜態(tài)時序分析變得簡單和可靠;5同步設(shè)計可以很容易地組織流水線,提高芯片的運行速度。 同步電路的設(shè)計準則: 1盡可能在設(shè)計中使用同一時鐘,時鐘走全局時鐘網(wǎng)絡(luò)。走全局時鐘網(wǎng)絡(luò)的時鐘是最簡單、最可預測的時鐘,它具有很強的驅(qū)動能力,可以驅(qū)動 FPGA 內(nèi)部中的所有觸發(fā)器,并保證 Clock skew 可以小到忽略的地步。2避免使用混合時鐘沿采樣數(shù)據(jù),即避免在設(shè)計中同時使用時鐘的上升沿和下降沿。3盡量少在模塊內(nèi)部使用計數(shù)器分頻所產(chǎn)生的時鐘。計數(shù)器分頻時鐘需完成的邏輯功能完全可由 PLL 鎖相環(huán)或時鐘使能電路替代。計數(shù)器分頻時鐘的缺點是使得系統(tǒng)內(nèi)時鐘不可控,并

13、產(chǎn)生較大的 Clock skew,還使靜態(tài)時序分析變得復雜。4避免使用門控時鐘。因為經(jīng)組合邏輯產(chǎn)生的門控時鐘極可能產(chǎn)生毛刺,使 D 觸發(fā)器誤動作。5當整個電路需要多個時鐘來實現(xiàn),則可以將整個電路分成若干局部同步電路(盡量以同一個時鐘為一個模塊),局部同步電路之間接口當作異步接口考慮,而且每個時鐘信號的時鐘偏差(T)要嚴格控制。6電路的實際最高工作頻率不應大于理論最高工作頻率,留有設(shè)計余量,保證芯片可靠工作。7電路中所有寄存器、狀態(tài)機在系統(tǒng)被 reset 復位時應處在一個已知的狀態(tài)。關(guān)于同步電路設(shè)計中的其他問題請詳見補充教程 3:華為同步電路設(shè)計規(guī)范。 關(guān)于時鐘設(shè)計的討論目前的工程設(shè)計中一般使用

14、同步時序電路來完成整個系統(tǒng)的設(shè)計,由上一節(jié)可見,時鐘在同步電路設(shè)計中起著至關(guān)重要的作用。那么,我們在設(shè)計時首先要完成的是對時鐘的設(shè)計。 如今在設(shè)計中常見的時鐘類型包括:全局時鐘、內(nèi)部邏輯時鐘和門控時鐘。1 全局時鐘全局時鐘即同步時鐘,它通過 FPGA 芯片內(nèi)的全局時鐘布線網(wǎng)絡(luò)或區(qū)域時鐘網(wǎng)絡(luò)來驅(qū)動,全局時鐘具有高扇出、高精度、低 Jitter 和低 Skew 的特點,它到芯片中的每一個寄存器的延遲最短,且該延遲可被認為是固定值。所以我們推薦在所有的設(shè)計中的時鐘都使用全局時鐘。全局時鐘的設(shè)計有以下幾種方法:(1).由 PLL 鎖相環(huán)來產(chǎn)生全局時鐘。(2). 將 FPGA 芯片內(nèi)部邏輯產(chǎn)生的時鐘分配

15、至全局時鐘布線網(wǎng)絡(luò)。(3). 將外部時鐘通過專用的全局時鐘輸入引腳引入 FPGA。在我們的設(shè)計中,一般推薦電路中的所有的時鐘都由PLL鎖相環(huán)產(chǎn)生。一方面,PLL鎖相環(huán)可實現(xiàn)倍頻和移相的操作,使我們很方便地獲得所需頻率和相位的時鐘;另一方面,PLL 鎖相環(huán)默認將其驅(qū)動的時鐘分配至全局時鐘網(wǎng)絡(luò)或區(qū)域時鐘網(wǎng)絡(luò),Jitter 和 Skew 都很小。 下圖取自我們項目中的一個 PLL 鎖相環(huán)設(shè)計,該 PLL 用于驅(qū)動 DDR 的接口模塊。因為功能所需,DDR 接口需要三個 133MHz 的時鐘,相位分別是-90o、0o、-180o,圖中所示即為該時鐘的產(chǎn)生模塊。我們使用 Quartus的 Megawiz

16、ard 生成 PLL 鎖相環(huán)的 IP core。其中inclk_66為 PLL 鎖相環(huán)的輸入時鐘,由外部的 66MHz 晶振提供,經(jīng)過 PLL 倍頻和移相后得到所需的三個全局時鐘。2 內(nèi)部邏輯時鐘內(nèi)部邏輯時鐘即指由芯片內(nèi)部的組合邏輯或計數(shù)器分頻產(chǎn)生的時鐘。對于組合邏輯時鐘,特別是由多級組合邏輯產(chǎn)生的時鐘,是要被嚴格禁止使用的,因為一方面組合邏輯極容易產(chǎn)生毛刺,特別是對多級組合邏輯;另一方面組合邏輯電路的 Jitter和 Skew 比較大,這將惡化時鐘的質(zhì)量。所以,一般組合邏輯產(chǎn)生的內(nèi)部時鐘僅僅適用于時鐘頻率較低、時鐘精度要求不高的情況。對于計數(shù)器分頻產(chǎn)生的時鐘,也應該盡量少地使用,因為這種時鐘

17、會帶來比較大的延遲,降低設(shè)計的可靠性,也使得靜態(tài)時序分析變得復雜。計數(shù)器分頻時鐘需完成的邏輯功能完全可由 PLL 鎖相環(huán)或時鐘使能電路替代。還有一種由觸發(fā)器產(chǎn)生的時鐘行波時鐘,即一個觸發(fā)器的輸出用作另一個觸發(fā)器的時鐘輸入。文中 節(jié)描述的時鐘分頻電路就是一種行波時鐘。因為各觸發(fā)器的時鐘之間產(chǎn)生較大的時間偏移,很容易就會違反建立時間、保持時間的要求,導致亞穩(wěn)態(tài)的發(fā)生。所以,這種行波時鐘要被嚴格禁止使用。3 門控時鐘一般情況下,應該避免使用門控時鐘。因為經(jīng)組合邏輯產(chǎn)生的門控時鐘極可能產(chǎn)生毛刺,對系統(tǒng)造成很大危害。但對于某些功耗很大的系統(tǒng)而言,需要使用門控時鐘來降低功耗。我們推薦使用右圖中描述的門控時

18、鐘的設(shè)計,該設(shè)計一般不會產(chǎn)生毛刺和亞穩(wěn)態(tài)的問題。因為觸發(fā)器避免了毛刺的產(chǎn)生,而亞穩(wěn)態(tài)只可能出現(xiàn)在源時鐘的下降沿,但是隨后它與源時鐘低相位相與,最后不會產(chǎn)生影響。source_clkclk_enqoutgated_clksource_clkclk_enDqoutgated_clk門控時鐘最好只在頂層模塊中出現(xiàn),并將其分離到一個在頂層的獨立模塊中。這同時保證了底層的每個模塊有單一的時鐘,且在本模塊中的時鐘不進行門控。在補充教程 4 和補充教程 5 中,我們對時鐘和時序的設(shè)計進行了更詳細的討論。亞穩(wěn)態(tài)在同步電路或異步電路中,如果觸發(fā)器的 setup時間或 hold時間不能得到滿足,就可能產(chǎn)生亞穩(wěn)態(tài),

19、此時觸發(fā)器輸出端Q在有效時鐘沿之后比較長的一段時間處于不確定的狀態(tài),在這段時間里Q 端將會產(chǎn)生毛刺并不斷振蕩、最終固定在某一電壓值上,此電壓值并不一定等于原來數(shù)據(jù)輸入端 D的值。這段時間稱為決斷時間(resolution time)。經(jīng)過決斷時間之后,Q 端將穩(wěn)定到 0 或1 上,但是究竟是 0 還是 1,這是隨機的,與輸入沒有必然的關(guān)系。亞 穩(wěn) 態(tài) 的 危 害 主 要 體現(xiàn)在破壞系統(tǒng)得穩(wěn)定性上,由于輸出在穩(wěn)定下來之前可能是毛刺、振蕩、固定的某一電壓值,因此亞穩(wěn)態(tài)除了導致邏輯誤判之外,嚴重情況下輸出 01 之間的中間電壓值還會使下一級產(chǎn)生亞穩(wěn)態(tài)(即導致亞穩(wěn)態(tài)的傳播)。邏輯誤判將導致功能性錯誤,

20、而亞穩(wěn)態(tài)的傳播則擴大了故障面,嚴重時將導致系統(tǒng)崩潰。在異步時序電路中更容易發(fā)生亞穩(wěn)態(tài),因為異步電路一般具有多個時鐘域,數(shù)據(jù)在兩個時鐘域間傳遞時,非常容易導致 setup時間或 hold時間不滿足而發(fā)生亞穩(wěn)態(tài)。在同步時序電路中,當兩個觸發(fā)器間的組合邏輯延遲過大時,會導致 setup時間不滿足而發(fā)生亞穩(wěn)態(tài)。對跨時鐘域數(shù)據(jù)的處理對跨時鐘域數(shù)據(jù)的處理的核心就是要保證下級時鐘對上級數(shù)據(jù)采樣的setup時間或hold時間滿足要求,即盡量避免亞穩(wěn)態(tài)的發(fā)生和傳播。但是,我們知道,只要系統(tǒng)中有異步元件,亞穩(wěn)態(tài)就是無法避免的,因此設(shè)計的電路首先要減少亞穩(wěn)態(tài)導致錯誤的發(fā)生,其次要使系統(tǒng)對產(chǎn)生的錯誤不敏感。我們推薦使

21、用以下方法來解決異步時鐘域數(shù)據(jù)同步問題。1 用觸發(fā)器打兩拍如下圖,左邊為異步輸入端,經(jīng)過兩級觸發(fā)器同步,在右邊的輸出將是同步的,而且該輸出基本不存在亞穩(wěn)態(tài)。其原理是即使第一個觸發(fā)器的輸出端存在亞穩(wěn)態(tài),經(jīng)過一個 CLK周期后,第二個觸發(fā)器 D 端的電平仍未穩(wěn)定的概率非常小,因此第二個觸發(fā)器 Q 端基本不會產(chǎn)生亞穩(wěn)態(tài)。然而,亞穩(wěn)態(tài)是無法被根除的,一旦亞穩(wěn)態(tài)發(fā)生,后果的嚴重程度依賴于你設(shè)計系統(tǒng)對產(chǎn)生的錯誤是否敏感。2 異步 FIFO 或 DPRAM因為異步 FIFO 或 DPRAM 使用格雷碼計數(shù)器設(shè)計讀寫地址的指針,所以它可以很好地避免亞穩(wěn)態(tài)的發(fā)生。使用方法如下,將上級芯片提供的數(shù)據(jù)隨路時鐘作為寫

22、信號,將數(shù)據(jù)寫入異步 FIFO 或 DPRAM,然后使用本級的采樣時鐘將數(shù)據(jù)讀出即可。唯一需要注意的是,當兩級時鐘頻率不同時,需要設(shè)計好緩沖區(qū),并通過監(jiān)控full、half、empty、useword信號,保證數(shù)據(jù)不會溢出,也不會被讀空。3 調(diào)整時鐘相位這種方法的設(shè)計難度較大,而且適用面有限。首先需對跨時鐘域數(shù)據(jù)的路徑進行詳細的靜態(tài)時序分析,然后將違反 setup時間和 hold時間的情況一一列出,在不影響其它設(shè)計性能的前提下,綜合考慮調(diào)整兩級時鐘的相位關(guān)系,最終使其 setup時間和 hold 時間滿足要求。2.1 什么是 FPGA2.FPGA 簡介FPGA 是 Field Programm

23、able Gate Array 的縮寫,即現(xiàn)場可編程門陣列,是一種可編程的 IC芯片(集成電路芯片),以下是目前項目中使用的幾種 FPGA 芯片:2.2 FPGA 的結(jié)構(gòu)與組成通常 FPGA 由布線資源分隔的可編程邏輯單元構(gòu)成陣列,又由可編程 I/O 單元圍繞陣列構(gòu)成整個芯片,排成陣列的邏輯單元由布線通道中的可編程內(nèi)連線連接起來實現(xiàn)一定的邏輯功能。目前我們使用的 FPGA 的可編程邏輯單元一般由查找表和觸發(fā)器構(gòu)成。下圖所示即為 Cyclone 系列 FPGA 芯片的邏輯單元(LE)組成。查找表(Look-Up-Table)簡稱為 LUT,其本質(zhì)上就是一個靜態(tài)存儲器 SRAM。 對于下圖左邊所示

24、的電路,查找表是這樣實現(xiàn)的:首先 FPGA 開發(fā)軟件會自動計算邏輯電路的所有可能的結(jié)果,然后把結(jié)果事先寫入查找表中,F(xiàn)PGA 工作時,輸入信號所進行的邏輯運算就等于輸入一個地址進行查表,找出地址對應的內(nèi)容后輸出,即實現(xiàn)了該邏輯功能。實際邏輯電路 LUT 的實現(xiàn)方式 a,b,c,d 輸入0000 0001 . 1111 邏輯輸出0001地址0000 0001 .1111 RAM 中存儲的內(nèi)容0001如果所設(shè)計的是時序電路,需要觸發(fā)器,則 FPGA 開發(fā)軟件會自動將觸發(fā)器配置在查找表的后面,實現(xiàn)組合邏輯時就將觸發(fā)器旁路掉。 當然,對于復雜的設(shè)計,一個 LUT 是無法完成的,F(xiàn)PGA 可以通過進位邏

25、輯將多個 LUT相連起來,實現(xiàn) n 輸入的查找表,實現(xiàn)設(shè)計要求。 通俗地說,F(xiàn)PGA 就是由查找表、觸發(fā)器和布線資源組成。下圖是一個 Cyclone 系列 FPGA 芯片的內(nèi)部結(jié)構(gòu),其中一對查找表和觸發(fā)器構(gòu)成邏輯單元 LE,若干個 LE 組成邏輯陣列塊LAB,最后再配上各種布線資源,就是一個 FPGA 芯片了。詳細的介紹請見:補充教程 6 FPGA PLD結(jié)構(gòu)與原理。2.3 FPGA 與 ASIC 設(shè)計的區(qū)別ASIC 是 Application Specific Integrated Circuit 的縮寫,即專用集成電路。ASIC 和 FPGA屬于 SOC(System on a chip

26、片上系統(tǒng))的兩個發(fā)展方向,兩者唯一的區(qū)別在于,ASIC 的邏輯電路是固化在其芯片中的,我們可以將 ASIC 理解為不可編程的 FPGA。由于 FPGA 設(shè)計是基于固有的硬件結(jié)構(gòu)(如邏輯單元、塊 RAM、PLL/DLL、時鐘資源等)的;而 ASIC 設(shè)計結(jié)構(gòu)靈活,目標多樣,所以 ASIC 設(shè)計的代碼風格和 FPGA 設(shè)計的代碼風格有明顯差異,特別是在功耗、速度、時序等要求上。例如 ASIC 設(shè)計中根據(jù)要求會有意識地采用某些組合邏輯、門控時鐘等,以降低功耗或提高速度。3. FPGA 開發(fā)流程HDL(Hardware Design Language)和原理圖是兩種最常用的數(shù)字硬件電路描述方法,HDL

27、設(shè)計法具有更好的可移植性、通用性和模塊劃分與重用性的特點,在目前的工程設(shè)計中被廣泛使用。所以,我們在使用 FPGA 設(shè)計數(shù)字電路時,其開發(fā)流程是基于 HDL 的。設(shè)計修改Design Modification需求定義(功能定義)Design SpecificationRTL 級 HDL 描述RTL Design Entry功能仿真(前仿真)RTL Simulation管腳分配與設(shè)計約束Assign Pins & Settings綜合 SynthesisRegister Transfer Level 寄存器傳輸級Tools: HDL 編譯器 , Text Editor Block &am

28、p; Symbol (Quartus)Pre-synthesis SimulationTools: ModelSimSynopsys VCS , Active HDL Tools: Assignment Editor (Quartus) Pin Planner (Quartus) Settings Tools :Synplify Synplify Pro Synopsys DCAnalysis & Synthesis(Quartus)門級仿真(綜合后仿真)Gate Level Simulation布局布線Place & Route 時序/時延分析Timing Analysis配

29、置與下載Configuration.DownloadPost-synthesis SimulationTools: Synopsys DC, PrimeTime ModelSim Simulation (Quartus)Tools : Fitter (Quartus)Tools: Timing Analyzer (Quartus)Tools: ByteBlaster(Quartus)3.1 需求定義(功能定義)設(shè)計和實現(xiàn)一個系統(tǒng)的第一步,是明確整個系統(tǒng)的性能指標,然后進一步將系統(tǒng)功能劃分為可實現(xiàn)的具體功能模塊,同時明確各模塊的功能與基本時序,還可大致確定模塊間的接口,如時鐘、讀寫信號、數(shù)據(jù)流和

30、控制信號等。3.2 RTL 級 HDL 描述 RTL 級(寄存器傳輸級)指不關(guān)注寄存器和組合邏輯的細節(jié)(如使用了多少邏輯門、邏輯門的連接拓撲結(jié)構(gòu)等),通過描述寄存器到寄存器之間的邏輯功能的 HDL 設(shè)計方法。RTL級比門級更抽象,同時也更簡單和高效。RTL級的最大特點是可以直接用綜合工具將其綜合為門級網(wǎng)表。RTL 級設(shè)計直接決定著系統(tǒng)的功能和效率。我們使用的 HDL 語言是 verilog。3.3 功能仿真(前仿真)功能仿真也稱綜合前仿真,其目的是驗證 RTL 級描述是否與設(shè)計意圖一致。為了提高效率,功能仿真需要建立 testbench,其測試激勵一般使用行為級 HDL 語言描述。3.4 管腳

31、分配與設(shè)計約束無論是 RTL 級還是門級的 HDL 設(shè)計方法,在實現(xiàn)該邏輯時都需要與實際的 FPGA 芯片相匹配。管腳分配是指將設(shè)計文件的輸入輸出信號指定到器件的某個管腳,設(shè)置此管腳的電平標準、電流強度等。設(shè)計約束指對設(shè)計的時序約束和在綜合、布局布線階段附加的約束等。3.5 綜合將 RTL 級 HDL 語言翻譯成由與、或、非門等基本邏輯單元組成的門級連接(網(wǎng)表),并根據(jù)設(shè)計目標與要求(約束條件)優(yōu)化所生成的邏輯連接,輸出門級網(wǎng)表文件。3.6 門級仿真(綜合后仿真)在綜合后通過后仿真來檢查綜合結(jié)果是否與原設(shè)計一致。一般,綜合后仿真和功能仿真的測試激勵相同。由于綜合工具日益完善,在目前的 FPGA

32、 設(shè)計中,這一步驟被省略掉。3.7 布局布線布局布線就是使用綜合后的網(wǎng)表文件,將工程的邏輯與時序要求與器件的可用資源相匹配。也可以簡單地將布局布線理解為對 FPGA 內(nèi)部查找表和寄存器資源的合理配置,那么布局可以被理解挑選可實現(xiàn)設(shè)計網(wǎng)表的最優(yōu)的資源組合,布線就是將這些查找表和寄存器資源以最優(yōu)方式連接起來。3.8 時序/時延分析通過時序/時延分析獲得布局布線后系統(tǒng)的延時信息,不僅包括門延時,而且還有實際的布線延時。時序/時延分析的時序仿真是最準確的,能較好地反映芯片的實際工作情況,同時發(fā)現(xiàn)時序違規(guī)(Timing Violation),即不滿足時序約束條件或者器件固有時序規(guī)則(建立時間、保持時間)

33、的情況。3.9 配置與下載通過編程器(programmer)將布局布線后的配置文件下載至 FPGA 中,對其硬件進行編程。配置文件一般為.pof 或.sof 文件格式,下載方式包括 AS(主動)、PS(被動)、JTAG(邊界掃描)等方式。4.RTL 設(shè)計4.1 使用 verilog 進行 RTL 設(shè)計使用 verilog 進行 RTL 設(shè)計一般可歸納為 3 種基本的描述方式:1、數(shù)據(jù)流描述:采用 assign 連續(xù)賦值語句2、行為描述:使用 always 語句或 initial 語句塊的過程賦值語句。3、結(jié)構(gòu)化描述:實例化已有的功能模塊或原語,即平常所說的元件例化和 IP core。其中,連續(xù)

34、賦值語句是連續(xù)驅(qū)動的,也就是說只要輸入變化,都會導致該語句的重新計算。其被賦值的變量不會被電路寄存。過程賦值語句包括非阻塞過程賦值、阻塞過程賦值和連續(xù)過程賦值。對于這些抽象的概念,我們將在其后的實際例子中詳細解釋。 硬件設(shè)計意識RTL設(shè)計其實就是用語言的方式去描述硬件電路行為的過程。這同一般的軟件設(shè)計有很大區(qū)別,因為對于很多的軟件代碼,硬件電路是無法實現(xiàn)的(即無法綜合,從語言到硬件電路的解析過程稱為綜合)。我們只能使用可綜合的代碼結(jié)構(gòu)來實現(xiàn)我們所需的硬件電路。首先,我們需要建立硬件設(shè)計的意識,硬件意識是 RTL 級設(shè)計的基礎(chǔ)。1.電路在物理上是并行工作的。其含義是,一旦接通電源,所有電路都同時

35、工作。2.電路行為的先后順序通過時鐘節(jié)拍得順序來體現(xiàn)。 RLT 級設(shè)計時需注意的問題:1凡是在 always 或 initial 語句中賦值的變量,一定是 reg 類型變量;凡是在 assign 語句中賦值的變量,一定是 wire 類型變量;2 定義存儲器:reg 3 MEMORY 0:7;地址為 07,每個存儲單元都是 4bit;3由于硬件是并行工作的,在 Verilog 語言的 module 中,所有描述語句(包括連續(xù)賦值語句 assign、行為語句塊 always 和 initial 語句塊以及模塊實例化)都是并發(fā)執(zhí)行的。4使用完備的 ifelse 語句,使用條件完備的 case 語句并

36、設(shè)置 default 操作,以防止產(chǎn)生鎖存器 latch,因為鎖存器對毛刺敏感。5嚴禁設(shè)計組合邏輯反饋環(huán)路,它最容易引起振蕩、毛刺、時序違規(guī)等問題。6不要在兩個或兩個以上的語句塊(always 或 initial)中對同一個信號賦值。 阻塞賦值與非阻塞賦值在 Verilog HDL 中,有兩種過程性賦值方式,即阻塞賦值(blocking assignment)和非阻塞賦值(non-blocking assignment)。這兩種賦值方式有著根本的區(qū)別,如果使用不當,綜合出來的結(jié)果會和設(shè)計的期望結(jié)果相去甚遠。1阻塞賦值的操作符為 “ = ”。它的含義是在計算等式右側(cè)表達式值及完成其賦值時不會被其

37、他的 verilog 語句打斷,就是說,在當前賦值沒有完成之前,它阻塞了其他 verilog語句的執(zhí)行。例如:begin x = y + c; /語句 1 y = a + b; /語句 2end語句 1 和語句 2 都要求在同一仿真時刻執(zhí)行,但在語句 1 沒有執(zhí)行完之前,是不會執(zhí)行語句 2 的,它"阻塞"語句 2 的執(zhí)行。這里說的"執(zhí)行完"指的是在本時刻計算完 y+c 的值,并賦給 y。若該仿真時刻 y=5(舊值),c=4,a=3,b=1,則 x=9,y=4。還有下面的情況,過程 1 和過程 2 是同一個 module 中的兩個 always 語句塊。過

38、程 1:過程 2:always (posedge clk or negedge rst_n) always (posedge clk or negedge rst_n)begin begin if ( rst_n = 1'b0) if ( rst_n = 1'b0) y = 1'b0; x = 1'b1; else else y = x; x = y; end end 仿真開始時,兩個 always 語句塊將并行地同時執(zhí)行。如果仿真器先執(zhí)行過程 2 的話,則在復位完后,x、y 的值最終都會變?yōu)?1;如果先執(zhí)行過程 1,則 x、y 的值最終都會變?yōu)?0。 為什么會

39、出現(xiàn)這種情況呢?因為按照 Verilog 的標準,上例中兩個 always 塊是并行執(zhí)行的,與書寫的前后順序無關(guān),但是,verilog 標準沒有規(guī)定在這種特殊情況下的執(zhí)行順序。所以,這需要我們在編程時避免這樣的代碼。 2非阻塞賦值的操作符為 “ <= ”。它的含義是在賦值操作時刻開始時計算等式右邊,賦值操作時刻結(jié)束時更新等式左邊。在這期間,可以執(zhí)行其它 verilog 語句,也不阻塞其它 verilog 語句的執(zhí)行。例如: begin x <= y + c; /語句 1 y <= a + b; /語句 2end雖然語句 1 的在語句 2 之前,但是由于是非阻塞賦值,語句 1

40、的執(zhí)行不影響語句 2 的執(zhí)行,在該仿真時刻完了后,才更新左端的值。若該仿真時刻 y=5(舊值),c=4,a=3,b=1,則x=8,y=4。同樣,對于下面的情況,過程 1 和過程 2 是同一個 module 中的兩個 always 語句塊。1過程 :過程 2:always (posedge clk or negedge rst_n) always (posedge clk or negedge rst_n)begin begin if ( rst_n = 1'b0) if ( rst_n = 1'b0) y = 1'b0; x = 1'b1; else else

41、y = x; x = y; end end 由于仿真時刻完了后才會去更新左端的值,所以上面兩個過程將最終形成一反饋移位寄存器。在實際使用中,我們需要遵循以下的原則:1在時序邏輯中,使用非阻塞賦值;2在組合邏輯中,使用阻塞賦值;3在同一個 always 塊中,不要混合使用阻塞賦值和非阻塞賦值;4在同一個 always 塊中,如果既有組合邏輯又有時序邏輯,使用非阻塞賦值;5always 模塊的敏感表為電平敏感信號時,使用阻塞賦值;6不要使用#0 時延進行賦值。7不要在阻塞賦值中使用時延語句。8在行為級描述中,若語句間是順序執(zhí)行的關(guān)系,使用阻塞賦值。另外一點需注意的就是,阻塞賦值是相對時間賦值,非阻

42、塞賦值是絕對時間賦值。4.2 HDL 代碼的可綜合性任何符合HDL語法標準的代碼都是對硬件行為的一種描述,但不一定是可直接對應成電路的設(shè)計信息。行為描述可以基于不同的層次,如系統(tǒng)級,算法級,寄存器傳輸級(RTL)、門級等等。以目前大部分 EDA 軟件的綜合能力來說,只有 RTL 或更低層次的行為描述才能保證是可綜合的。絕大部分電路設(shè)計必須遵循 RTL 的模式來編寫代碼,而不能隨心所欲得寫僅僅符合語法的 HDL 代碼。 哪些是不可綜合的代碼我們不可能將所有不可綜合的代碼都一一列出,我們舉幾個例子來說明這個問題: 1.對于一些抽象的行為描述代碼是不可綜合的。比如我們常見的延遲語句(如:#delay

43、)、初始化語句 initial 以及等待語句wait 都是不可綜合的,他們所描述的功能對硬件而言是不可實現(xiàn)的。2.對于一些抽象的運算代碼也是不可綜合的。比如,實現(xiàn)兩個變量相除運算的代碼:always (posedge clk) c<=A/B;我們將發(fā)現(xiàn)這句代碼只能在前仿真中正確執(zhí)行,在 Quartus和其他 EDA 軟件中都不能將其綜合成硬件。試想一下,如果我們自己用筆算除法是怎么做的?從高位到低位逐次試除、求余、移位。試除和求余需要減法器,商數(shù)和余數(shù)的中間結(jié)果必須有寄存器存儲;而這些運算顯然不能在一個時鐘延上完成,它需要一個狀態(tài)機來控制時序,經(jīng)過多個時鐘周期才能得出結(jié)果。一句簡單的 C

44、=A/B 同所有這些相比顯得太抽象,對于只能接受 RTL 或更低層次描述的 EDA軟件來說確實太難實現(xiàn)。(注:有些 FPGA 的配套軟件提供乘除法的運算模塊,但也只能支持直接調(diào)用,不支持把形如 C=A/B 的語句綜合成除法模塊)。3.對于不定次數(shù)的循環(huán)運算是不可綜合的,比如對于如下的代碼段:for (i=0; i<wordlength ; i=i+1) parity = parity xor datai; 當 wordlength 為變量時,任何 EDA 軟件都不能綜合這個代碼。這是因為硬件規(guī)模必須是有限的、固定的。當綜合軟件遇到循環(huán)語句時,總是將其展開成若干條順序執(zhí)行的語句,然后再綜合

45、成電路。若wordlength是常數(shù),則展開的語句數(shù)是確定的,具有可綜合性;而若它是變量時,展開的語句數(shù)不確定,對應的硬件電路數(shù)量也不能確定,無法被綜合。這樣的語句還包括 while,repeat,forever 等,他們都不可綜合。 如何判斷自己寫的代碼是可綜合的通常 EDA 軟件對 HDL 代碼的綜合能力總是比人的思維差。也就是說,對于一段代碼,如果你不能想象出一個較直觀的硬件實現(xiàn)方法,那 EDA 軟件肯定也不行。比如說,加法器、多路選擇器是大家都很熟悉的電路,所以類似A+B-C,(A>B)?C:D 這樣的運算一定可以綜合。而除法、開根、對數(shù)等等較復雜的運算,必須通過一定的算法實現(xiàn),

46、沒有直觀簡單的實現(xiàn)方法,則可以判斷那些計算式是不能綜合的,必須按它們的算法寫出更具體的代碼才能實現(xiàn)。此外,硬件無法支持的抽象行為描述,當然也不能被綜合。不過,這樣的判斷標準非常主觀模糊,遇到具體情況還得按設(shè)計人員自己的經(jīng)驗來判斷。如果要一個相對客觀的標準,一般來說:在 RTL 級的描述中,所有邏輯運算和加減法運算、以及他們的有限次組合,基本上是可綜合的,否則就有無法綜合的可能性。當然,這樣的標準仍然有缺陷,所以,正確的判斷仍然要靠實踐來積累經(jīng)驗。當你可以較準確判斷代碼的可綜合性的時候,你對 HDL 的掌握就算完全入門了。4.3 RTL 代碼的優(yōu)化優(yōu)化RTL代碼追求的最終目標是面積或者速度,或者

47、是兩者的平衡。面積和速度是FPGA 設(shè)計的兩個基本標準?!懊娣e”是指一個設(shè)計所消耗 FPGA 的邏輯資源數(shù)量,“速度”指設(shè)計在芯片上穩(wěn)定運行所能夠達到的最高頻率。兩者是對立統(tǒng)一的,即要求一個設(shè)計同時具備面積最小、速度最高時不現(xiàn)實的。我們的設(shè)計目標應該是在滿足設(shè)計時序要求和最高頻率要求的前提下,占用最小的芯片面積,或者在所規(guī)定的面積下,使設(shè)計的時序余量更大,頻率更高。4.3.1 Pipelining 技術(shù)Pipelining,即流水線時序優(yōu)化方法,其本質(zhì)是調(diào)整一個較大的組合邏輯路徑中的寄存器位置,用寄存器合理分割該組合邏輯路徑,從而降低路徑 Clock-To-Output和 Setup 等時間參

48、數(shù)的要求,達到提高設(shè)計頻率的目的。具體實現(xiàn)可通過下圖的方法,首先對時延較大的組合邏輯,在它旁邊加上若干個需優(yōu)化的寄存器,然后運用優(yōu)化工具自動將大組合邏輯拆分為幾個小的組合邏輯,同時將寄存器放在小組合邏輯在中間。時 延 較 大 的組合邏輯a_reg a_pipe a_intHDL 描述的結(jié)構(gòu)a_rega_pipe工具自動優(yōu)化之后的結(jié)構(gòu)a_intz_regz_reg 模塊復用與資源共享模塊復用與資源共享的目的在于節(jié)約FPGA的邏輯資源,即節(jié)約面積。我們通過下面這個例子來說明這個優(yōu)化方法。如果需要實現(xiàn)一個補碼平方器,輸入是8bit補碼,求其平方和。因為輸入是補碼,所以當最高位是 1 時,表示原值是負

49、數(shù),需要按位取反,加 1 后再平方;當最高位是 0 時,表示原值是正數(shù),直接求平方。下面是兩種 RTL 設(shè)計實現(xiàn)方式:第一種 RTL 設(shè)計實現(xiàn):module resource_share1 (data_in,square);input 7:0 data_in; /輸入是補碼output 15:0 square;wire 7:0 data_bar;assign data_bar = data_in + 1;assign square=(data_in7)? (data_bar*data_bar) : (data_in*data_in);endmodule第二種 RTL 設(shè)計實現(xiàn): module resource_share2 (data_in,square);input 7:0 data_in; /輸入是補碼output 15:0 square;wire 7:0 data_tmp;assign data_tmp = (data_in7)? (data_in + 1) : data_in;assign square = data_tmp * data_tmp;endmodule可以發(fā)現(xiàn),第一種 RTL 設(shè)計需要兩個 16bit 乘法器,同時平方;而第二種 RTL 設(shè)計

溫馨提示

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

最新文檔

評論

0/150

提交評論