FPGA設(shè)計(jì)的基本原則
面積與速度折衷原則
面積和速度是ASIC芯片設(shè)計(jì)中一對(duì)相互制約、影響成本和性能的指標(biāo),貫穿FPGA設(shè)計(jì)的始終。在FPGA設(shè)計(jì)中,面積是指一個(gè)設(shè)計(jì)消耗的FPGA內(nèi) 部邏輯資源的數(shù)量,可以用消耗的觸發(fā)器和查找表的個(gè)數(shù)或者是等效邏輯門數(shù)來衡量;速度是指一個(gè)設(shè)計(jì)在FPGA上穩(wěn)定運(yùn)行時(shí)所能 達(dá)到的最高頻率,由設(shè)計(jì)時(shí)序狀態(tài)決定。
關(guān)于面積和速度的折衷,應(yīng)在滿足設(shè)計(jì)時(shí)序和工作頻率要求的前提下,占用最小的芯片面積;或者在所規(guī)定 的面積下,使得設(shè)計(jì)的時(shí)序余量最大,能夠在更高的頻率上穩(wěn)定運(yùn)行。通常,在資源足夠的情況下,更多是選擇速度的最優(yōu),這也是FPGA的 特點(diǎn)。在具體設(shè)計(jì)中,應(yīng)根據(jù)具體性能指標(biāo)要求,在保證系統(tǒng)功能和性能的同時(shí),降低資源消耗從而降低功耗和成本。
硬件原則
第二個(gè)原則是硬件原則。
首先,要注意FPGA的邏輯設(shè)計(jì)所采用的硬件描述語言VHDL或Verilog與 軟件語言C和C++有本質(zhì)區(qū)別,在使用硬件描述語言進(jìn)行設(shè)計(jì)時(shí),不應(yīng)片面追求代碼的簡潔。
其次,要采用正確的編碼方法。要對(duì)所需實(shí)現(xiàn)的硬件電路的結(jié)構(gòu)和相互連接有清晰的理解和構(gòu)想,然后再用 適當(dāng)?shù)腣HDL語言表達(dá)出來。實(shí)際上綜合軟件對(duì)所寫的代碼在進(jìn)行推論的時(shí)候,得到的硬件結(jié)果會(huì)因編碼方式的不會(huì)而不同,直接影 響硬件的實(shí)現(xiàn)。
系統(tǒng)原則
第三個(gè)原則是系統(tǒng)原則。FPGA作為硬件系統(tǒng)設(shè)計(jì),應(yīng)該對(duì)設(shè)計(jì)全局進(jìn)行宏 觀上的合理安排,包括邏輯功能模塊劃分、時(shí)鐘域信號(hào)的產(chǎn)生和驅(qū)動(dòng)、模塊復(fù)用、時(shí)序或引腳約束、面積速度折衷等。這些系統(tǒng)上的考慮不僅關(guān)系到是否能夠最大程 度地發(fā)揮項(xiàng)目成員的協(xié)同設(shè)計(jì)能力,而且直接決定著設(shè)計(jì)的綜合、實(shí)現(xiàn)效果和相關(guān)的操作時(shí)間。
模塊化設(shè)計(jì)是系統(tǒng)原則的一個(gè)很好體現(xiàn),它是自頂向下、模塊劃分、分工協(xié)作設(shè)計(jì)思路的集中體現(xiàn),是大型 復(fù)雜系統(tǒng)的推薦設(shè)計(jì)方法。圖1是模塊化設(shè)計(jì)的簡單流程。
同步原則
在設(shè)計(jì)電路時(shí),可以有異步電路和同步電路兩種實(shí)現(xiàn)方法。異步電路使用組合邏輯電路實(shí)現(xiàn),沒有統(tǒng)一的時(shí) 鐘信號(hào),容易產(chǎn)生毛刺和競爭冒險(xiǎn);同步時(shí)序電路使用組合邏輯和觸發(fā)器實(shí)現(xiàn)電路功能,主要信號(hào)和輸出信號(hào)都由時(shí)鐘驅(qū)動(dòng)觸發(fā)器產(chǎn)生,能夠避免毛刺,信號(hào)穩(wěn)定。
·從資源使用方面考慮,推薦使用同步設(shè)計(jì)。雖然在ASIC設(shè)計(jì)中同步電路 比異步電路占用的面積大,但是在FPGA中,是以邏輯單元衡量電路面積的,所以同步設(shè)計(jì)并不比異步設(shè)計(jì)浪費(fèi)資源。
·從延遲設(shè)計(jì)方面考慮,異步電路的延時(shí)靠門延時(shí)來實(shí)現(xiàn),比較難預(yù)測;同步電路使用計(jì)數(shù)器或觸發(fā)器實(shí)現(xiàn) 延時(shí)。
·同步設(shè)計(jì)時(shí)鐘信號(hào)的質(zhì)量和穩(wěn)定性決定了同步時(shí)序電路的性能,F(xiàn)PGA的 內(nèi)部有專用的時(shí)鐘資源,如全局時(shí)鐘布線資源、專用的時(shí)鐘管理模塊DUL、PLL等。
·目前商用的FPGA都是面向同步的電路設(shè)計(jì)而優(yōu)化的,同步時(shí)序電路可以 很好地避免毛刺,提倡在設(shè)計(jì)中全部使用同步邏輯電路。特別注意,不同的時(shí)鐘域的接口需要進(jìn)行同步。
FPGA設(shè)計(jì)的技巧
乒乓操作
圖2是乒乓操作流程圖。從圖中可以看出,數(shù)據(jù)經(jīng)過兩個(gè)緩沖模塊,在向緩沖 模塊1輸入數(shù)據(jù)的時(shí)候,緩沖模塊2的數(shù)據(jù)會(huì)送到下一級(jí)進(jìn)行處理,從外部看數(shù)據(jù)流沒有停頓。所以乒乓 操作能夠提高處理速度。
實(shí)際上,乒乓操作是用一種低速模塊來處理高速數(shù)據(jù)流,即用兩個(gè)緩沖模塊實(shí)現(xiàn)了串并轉(zhuǎn)換,用兩個(gè)預(yù)處理 模塊并行,利用面積換速度。
串并轉(zhuǎn)換
串并轉(zhuǎn)換是FPGA設(shè)計(jì)的一個(gè)重要技巧,是數(shù)據(jù)流處理的常用手段,也是面 積與速度互換思想的直接體現(xiàn)。串并轉(zhuǎn)換的實(shí)現(xiàn)方法多種多樣,根據(jù)數(shù)據(jù)的排序和數(shù)量要求,可以選用以下方式:小的設(shè)計(jì)用寄存器、數(shù)據(jù)量比較大的用ROM、 復(fù)雜的串并轉(zhuǎn)換用狀態(tài)機(jī),或者直接利用功能模塊來實(shí)現(xiàn)。
流水線操作
流水線操作是高速設(shè)計(jì)中一個(gè)經(jīng)常用到的設(shè)計(jì)手段。如果某個(gè)數(shù)據(jù)的處理流程分為若干步驟,而且整個(gè)數(shù)據(jù) 處理是“單流向”的,即沒有反饋或者迭代運(yùn)算,前一個(gè)步驟的輸出是下一個(gè)步驟的輸入,則可以采用流水線設(shè)計(jì)方法提高系統(tǒng)的工作頻率。
·流水線設(shè)計(jì)時(shí),要對(duì)時(shí)序進(jìn)行合理安排,每個(gè)操作步驟的劃分要合理,仔細(xì)考慮各個(gè)步驟間的數(shù)據(jù)流量。
·如果前級(jí)操作時(shí)間恰好等于后級(jí)操作時(shí)間,設(shè)計(jì)最為簡單,前級(jí)直接輸出到后級(jí)輸入就行了。
·如果前級(jí)操作時(shí)間大于后級(jí)操作時(shí)間,后級(jí)會(huì)經(jīng)??臻e,可以對(duì)前級(jí)的數(shù)據(jù)進(jìn)行適當(dāng)緩存,再輸出到后級(jí) 的輸入端。
·如果前級(jí)操作時(shí)間小于后級(jí)操作時(shí)間,必須通過復(fù)制邏輯,將數(shù)據(jù)流分流和并行預(yù)處理,或者在前級(jí)對(duì)數(shù) 據(jù)采用存儲(chǔ)、后處理方式、否則會(huì)造成后級(jí)數(shù)據(jù)溢出。所以怎樣平衡各個(gè)模塊的處理時(shí)間,在設(shè)計(jì)中要給予適當(dāng)?shù)目紤]。
數(shù)據(jù)接口的同步
·如果輸入數(shù)據(jù)的節(jié)拍和本系統(tǒng)處理時(shí)鐘同頻,可以直接用本系統(tǒng)的主時(shí)鐘對(duì)輸入數(shù)據(jù)寄存器進(jìn)行采樣,完 成輸入數(shù)據(jù)的同步化。
·如果輸入數(shù)據(jù)和本系統(tǒng)的處理時(shí)鐘是異步的,要用處理時(shí)鐘對(duì)輸入的數(shù)據(jù)做兩次(或多次)寄存器采樣, 完成輸入數(shù)據(jù)的同步化。兩次(或多次)采樣的作用是抑制亞穩(wěn)態(tài)的傳播,適用于對(duì)少量對(duì)錯(cuò)誤不敏感的功能單元。
·為了避免異步的時(shí)鐘域產(chǎn)生錯(cuò)誤的采樣電平,一般使用RAM、FIFO存 儲(chǔ)的方法完成異步時(shí)鐘域的數(shù)據(jù)轉(zhuǎn)換,在輸入端口使用上一級(jí)時(shí)鐘寫數(shù)據(jù),在輸出端口使用本級(jí)時(shí)鐘來讀數(shù)據(jù),能夠非常方便地完成異步時(shí)鐘域之間的數(shù)據(jù)交換。
時(shí)序電路設(shè)計(jì)
圖3給出了時(shí)序電路的一般結(jié)構(gòu)。
首先是庫說明語句Library declarations。接著是實(shí)體 結(jié)構(gòu),給出實(shí)體模塊的名稱Entity,由Port引出的輸入輸出的清單。再后面是結(jié)構(gòu)體,然后是 內(nèi)部信號(hào)說明。接著設(shè)置了一個(gè)狀態(tài)進(jìn)程,定義存儲(chǔ)元件,進(jìn)程名稱為State process,敏感的清單一般是存儲(chǔ)元件,reset、next state、Input等信號(hào),是存儲(chǔ)元件的輸入信號(hào),在這些信號(hào)下,進(jìn)程會(huì)激活。然后是狀態(tài)進(jìn)程的Begin, 開始以后對(duì)狀態(tài)的元件進(jìn)行VHDL描述,順序描述完以后,結(jié)束狀態(tài)進(jìn)程。下面的設(shè)置是組合進(jìn)程,這個(gè)進(jìn)程的敏感清單通常包括所 有的輸入。接下來是進(jìn)程的Begin,在Begin里頭給出了規(guī)定組合邏輯的VHDL描 述,最后是進(jìn)程結(jié)束與結(jié)構(gòu)體結(jié)束。
前面已經(jīng)講過,F(xiàn)PGA設(shè)計(jì)盡量采用同步設(shè)計(jì)。這里要考慮同步硬件的RTL描 述。描述設(shè)計(jì)的寄存器到寄存器的功能,即描述寄存器之間組合邏輯的功能。
有效編碼方式和If-Then-Else比較
在組合進(jìn)程和狀態(tài)進(jìn)程中,都可能會(huì)用到If-Then-Else和case語 句,綜合出來的結(jié)果和組合邏輯情況一樣,都會(huì)有不同,case語句用一個(gè)模塊來實(shí)現(xiàn),If-Then-Else用 帶有特權(quán)編碼的譯碼器實(shí)現(xiàn)。
在組合進(jìn)程和狀態(tài)進(jìn)程中,用If-Then-Else和case語 句帶來的問題
對(duì)Case語句的要求
一般情況下,如果不需要特權(quán)編碼,建議用Case語句。組合邏輯上,要求Case語 句對(duì)所有分支進(jìn)行定義,如果有幾don't care輸出也可以利用,能夠節(jié)省描述方式。Case語 句能節(jié)省資源,減少延時(shí)。
Case語句在組合進(jìn)程和時(shí)序進(jìn)程中帶來的問題
·Case 語句在組合的進(jìn)程(VHDL)或 在always語句(Verilog)中:
要求在case語句中,對(duì)所有分支中的所有輸出必須定義,才能防止出現(xiàn)鎖 存;如果不是所有的分支都定義了,可以在case語句之前利用一個(gè)缺省語句來防止鎖存的產(chǎn)生。
·C語句在時(shí)序進(jìn)程(VHDL)或在always語 句(Verilog)中:
如果在Case語句的分支中有的輸出沒有定義,就會(huì)產(chǎn)生一個(gè)時(shí)鐘的使能信 號(hào),這個(gè)信號(hào)并不出現(xiàn)錯(cuò)誤,但是可能會(huì)產(chǎn)生一個(gè)很長的時(shí)鐘使能方程式,使設(shè)計(jì)不能實(shí)現(xiàn)。那么在case語句之前利用一個(gè)缺省語 句防止不必要的時(shí)鐘使能產(chǎn)生。
FPGA設(shè)計(jì)常用的一些模塊有:存儲(chǔ)單元、全局時(shí)鐘資源和鎖相環(huán)、全局復(fù)位/置位信號(hào)、高速串行收發(fā)器等,下 面做簡要介紹。
鎖存器與寄存器
鎖存是電平有效,在電平有效的情況下,輸入送到輸出;寄存器是時(shí)鐘沿有效,當(dāng)時(shí)鐘到的時(shí)候才輸出。在 邏輯單元里頭除了查找表外都有寄存器,所以建議大家使用沿有效的寄存器,不要用增加組合邏輯來實(shí)現(xiàn)的鎖存器。
時(shí)鐘使能
VHDL程序的編碼方式將決定是不是利用時(shí)鐘使能信號(hào),時(shí)鐘使能使得時(shí)序約束更容易控制。
鎖存與變量
推薦分配一個(gè)初始值或者信號(hào)給變量,就不會(huì)有反饋出現(xiàn),如果一個(gè)變量沒有分配初始值,獲得一個(gè)信號(hào)鎖 存就要產(chǎn)生,可能引起設(shè)計(jì)功能不正確。鎖存的產(chǎn)生和變量的情況一樣,不要有不確定的條件產(chǎn)生。
DFF利用rising_edge
觸發(fā)器利用語句rising_edge(clk) 時(shí)鐘的上升沿,如果時(shí)鐘的上升沿來了,則數(shù)據(jù)給定,這是寄存。rising_edge是IEEE的 函數(shù),是在1164的軟件包里定義的一個(gè)函數(shù),規(guī)定了信號(hào)值必須是0和1,X、Z到1轉(zhuǎn) 換是不允許的,三態(tài)到1的轉(zhuǎn)換是不允許,必須是0到1。
DFF利用clk'event and clk=1
如果用clk'event and clk=十,clk就 是信號(hào)名稱,event是VHDL的一個(gè)屬性,規(guī)定了信號(hào)值的變化,那么CLK等 于1意味著正沿觸發(fā)。clk'event and clk=1,信號(hào)的名稱是clk,event表 示信號(hào)的數(shù)值需要有一個(gè)變化,等于1表示正沿觸發(fā),是沿觸發(fā)的語句,綜合出來是觸發(fā)器、寄存器的推論。
移位寄存器
這里的描述是IF的異步清除CLK等于1的 時(shí)候,Q全置0,然后上升沿到達(dá)以后,如果使能等于1,Q等 于Q的低七位挪到高七位,補(bǔ)充一個(gè)入信號(hào),是一個(gè)左移,移位寄存器是并行出,串行入,異步的清除和使能左移,如果增加和移去同 步控制,在這個(gè)方式出現(xiàn)移動(dòng),這個(gè)語句里頭信號(hào)只是表示高七位和進(jìn)來的信號(hào)組合成一個(gè)八位的信號(hào)。
基本的計(jì)數(shù)器
基本的計(jì)數(shù)器主要有帶時(shí)鐘使能的計(jì)數(shù)器、帶同步清零的計(jì)數(shù)器、上/下計(jì)數(shù)器、帶同步加載的計(jì)數(shù)器、帶 同步加載和計(jì)數(shù)使能的計(jì)數(shù)器、帶同步加載和計(jì)數(shù)使能的計(jì)數(shù)器、帶同步加載的上/下計(jì)數(shù)器、模塊200計(jì)數(shù)器、使用整數(shù)的模塊200計(jì) 數(shù)器等,這里不再一一介紹,詳情可登錄查詢。
信號(hào)與變量
信號(hào)僅僅用做VHDL實(shí)體的連接口。信號(hào)僅可以在結(jié)構(gòu)體內(nèi)說明,它們可以 作為參數(shù)通過函數(shù)和過程。變量在進(jìn)程塊、過程和函數(shù)內(nèi)進(jìn)行說明。信號(hào)賦值通過“<=”實(shí)現(xiàn),變量的賦值通過“:=”實(shí)現(xiàn),見圖4和 圖5。
三態(tài)Tri-states
IEEE的標(biāo)準(zhǔn)在STD_LOGIC軟件包中定義了三態(tài)的Z值, 仿真就是高阻態(tài),綜合的時(shí)候轉(zhuǎn)換成三態(tài)緩沖器。
Altera器件只有I/0單元有三態(tài)緩沖器,其好處是消除了可能的總線連接,解決了 內(nèi)部邏輯的位置問題。因?yàn)闊o需三態(tài)緩沖區(qū),減少了器件的測試,節(jié)省了成本。其內(nèi)部的三態(tài)必須轉(zhuǎn)換成組合邏輯,復(fù)雜的輸出使能容易引起錯(cuò)誤和低效率邏輯,但 是在I/0單元里有三態(tài)緩沖器。
雙向管腳
當(dāng)管腳被說明作為方向INOUT的時(shí)候,利用INOUT的 腳作為輸入或者是三態(tài)輸出,在程序中,設(shè)置了一個(gè)bi direction,作用雙向的INOUT信 號(hào)。當(dāng)CE使能信號(hào)等于1的時(shí)候,來自核的from core信號(hào)送到 雙向腳,否則的話三態(tài),這個(gè)時(shí)候雙向作為一個(gè)三態(tài)輸出,還有一個(gè)輸入賦給,來自信號(hào)送到三態(tài),輸入送到內(nèi)核。
存儲(chǔ)器
綜合工具有不同的能力來識(shí)別各種存儲(chǔ)器。為了識(shí)別各種存儲(chǔ)器,綜合工具對(duì)特定的譯碼類型非常敏感,通 常在綜合工具文件中有說明。綜合工具可能在結(jié)構(gòu)實(shí)現(xiàn)上有一些限制,如只有同步寫、時(shí)鐘配置的限制、存儲(chǔ)器尺寸的限制等,必須說明一個(gè)陣列數(shù)據(jù)類型來保存存 儲(chǔ)器的值。存儲(chǔ)器有單端口Memory,單端口雙時(shí)鐘Memory,雙時(shí)鐘Memcry、ROM等。
評(píng)論