|
第1章 可編程邏輯設(shè)計(jì)指導(dǎo)原則 (1)面積和速度的平衡與互換原則。 “面積”指一個(gè)設(shè)計(jì)所消耗FPGA/CPLD的邏輯資源數(shù)量:對(duì)于FPGA,可以用所消耗的觸發(fā)器(FF)和查找表(LUT)來(lái)衡量;對(duì)于CPLD,常用宏單元(MC)衡量。 “速度”指設(shè)計(jì)在芯片上穩(wěn)定運(yùn)行時(shí)所能達(dá)到的最高頻率,這個(gè)頻率由設(shè)計(jì)的時(shí)序狀況決定,與設(shè)計(jì)滿足的時(shí)鐘周期、PAD to PAD time、clock setup time、clock hold time和clock-to-output delay等眾多時(shí)序特征量密切相關(guān)。 如果設(shè)計(jì)的時(shí)序余量比較大,運(yùn)行的頻率比較高,則意味著設(shè)計(jì)的健壯性更強(qiáng),整個(gè)系統(tǒng)的質(zhì)量更有保證;另一方面,設(shè)計(jì)所消耗的面積更小,則意味著在單位芯片上實(shí)現(xiàn)的功能模塊更多,需要的芯片數(shù)量更少,整個(gè)系統(tǒng)的成本也隨之大幅度消減。相比之下,滿足時(shí)序、工作頻率的要求更重要一些,當(dāng)兩者沖突時(shí),采用速度優(yōu)先的準(zhǔn)則。 從理論上講,一個(gè)設(shè)計(jì)如果時(shí)序余量較大,所能跑的頻率遠(yuǎn)遠(yuǎn)高于設(shè)計(jì)要求,那么就能通過(guò)功能模塊復(fù)用減少整個(gè)設(shè)計(jì)消耗的芯片面積,用速度的優(yōu)勢(shì)換面積的節(jié)約;反之,如果設(shè)計(jì)的時(shí)序要求很高,普通方法達(dá)不到設(shè)計(jì)頻率,那么一般可以通過(guò)將數(shù)據(jù)流串并轉(zhuǎn)換,并行復(fù)制多個(gè)操作模塊,對(duì)整個(gè)設(shè)計(jì)進(jìn)行“乒乓操作”和“串并轉(zhuǎn)換”的思想進(jìn)行處理,在芯片輸出模塊處再對(duì)數(shù)據(jù)進(jìn)行“并串轉(zhuǎn)換”。 “面積換速度”的思想:首先將輸入的高速數(shù)據(jù)進(jìn)行串并轉(zhuǎn)換,然后利用較低的速度對(duì)多個(gè)模塊并行處理所分配的數(shù)據(jù),最后將處理結(jié)果“并串轉(zhuǎn)換”,完成數(shù)據(jù)速率的要求。這樣我們?cè)谡麄€(gè)處理模塊的兩端看都是高速數(shù)據(jù)流。路由器設(shè)計(jì)的例子:
操作過(guò)程中還涉及很多的方法和技巧,例如,對(duì)高速數(shù)據(jù)流進(jìn)行串并轉(zhuǎn)換,采用“乒乓操作”方法提高數(shù)據(jù)處理速率等。 (2)硬件原則。 for循環(huán)語(yǔ)句的使用:實(shí)際工作中,除了描述仿真測(cè)試激勵(lì)(testbench)時(shí)使用for循環(huán)語(yǔ)句外,極少在RTL級(jí)編碼中使用for循環(huán),因?yàn)閒or循環(huán)會(huì)被綜合器展開(kāi)為所有變量情況的執(zhí)行語(yǔ)句,每個(gè)變量獨(dú)立占用寄存器資源,每條執(zhí)行語(yǔ)句并不能有效地復(fù)用硬件邏輯資源,造成巨大的資源浪費(fèi)。在RTL級(jí)描述中,遇到類(lèi)似算法,推薦的方式是先搞清楚設(shè)計(jì)的時(shí)序要求,做一個(gè)reg型計(jì)數(shù)器,在每個(gè)時(shí)鐘沿累加,并在每個(gè)時(shí)鐘判斷計(jì)數(shù)器情況,并相應(yīng)的處理,能復(fù)用的處理模塊盡量復(fù)用,即使所有操作都不能服用,也可采用case語(yǔ)句展開(kāi)處理。 casex和casez 應(yīng)用一定要小心,要注意是否可綜合。 if……else……與case語(yǔ)句的使用:在verilog語(yǔ)法中,if……else……語(yǔ)句是有“優(yōu)先級(jí)”的,一般來(lái)說(shuō)第一個(gè)if的優(yōu)先級(jí)最高,最后一個(gè)else的優(yōu)先級(jí)最低。如果描述編碼器,在有些綜合器的參數(shù)中就有關(guān)于優(yōu)先級(jí)編碼器硬件原語(yǔ)的選項(xiàng)priority encoder extraction。而case語(yǔ)句是“平行”的結(jié)構(gòu),所有的case的條件和執(zhí)行都沒(méi)有“優(yōu)先級(jí)”。而建立優(yōu)先級(jí)結(jié)構(gòu)(優(yōu)先級(jí)樹(shù))會(huì)消耗大量的組合邏輯,所以能夠使用case語(yǔ)句的地方盡量用case替換if……else… (3)系統(tǒng)原則。 對(duì)設(shè)計(jì)的全局有個(gè)宏觀的合理安排,比如時(shí)鐘域、模塊復(fù)用、約束、面積和速度等問(wèn)題。 一般來(lái)說(shuō),實(shí)時(shí)性要求高、頻率快的功能模塊適合使用FPGA/CPLD實(shí)現(xiàn)。而FPGA和CPLD相比,更適合實(shí)現(xiàn)規(guī)模較大、頻率較高、寄存器資源使用較多的設(shè)計(jì)。使用FPGA/CPLD設(shè)計(jì)時(shí),應(yīng)該對(duì)芯片內(nèi)部的各種底層硬件資源、可用的設(shè)計(jì)資源有一個(gè)較深刻的認(rèn)識(shí),F(xiàn)PGA一般觸發(fā)器資源比較豐富,CPLD組合邏輯資源更豐富一些,這直接影響著兩者使用的編碼風(fēng)格。 RAM資源的使用: altera高端器件(如stratix II、stratix GX、stratix等)內(nèi)部同時(shí)含有3種塊RAM結(jié)構(gòu),分別是M512 (512bit)RAM、M4K RAM(4kbit)、M-RAM(512kbit),其中M512 RAM適合做一些靈活的小塊buffer、FIFO、DPRAM、SPRAM、ROM等;M4K RAM應(yīng)用最廣,適用于一般的需求;M-RAM適合做大塊數(shù)據(jù)的緩沖區(qū),如在通信的SDH/SONET傳輸領(lǐng)域,有一些900Kbit的大數(shù)據(jù)包,用M-RAM實(shí)現(xiàn)緩沖結(jié)構(gòu)非常方便。 軟核的使用:FPGA的一個(gè)發(fā)展趨勢(shì)是越來(lái)越多的FPGA產(chǎn)品將包含DSP或CPU等軟處理核,從而FPGA將由傳統(tǒng)的硬件設(shè)計(jì)手段逐步過(guò)渡為系統(tǒng)級(jí)設(shè)計(jì)工具。內(nèi)嵌在FPGA之中的DSP或CPU處理模塊比較適合應(yīng)用于運(yùn)算密集的FIR濾波器、編碼解碼、FFT等操作,其工作效率可以達(dá)到系統(tǒng)DSP和CPU 的幾百倍。 串行收發(fā)器的使用:很多高端FPGA內(nèi)嵌了SERDES以完成高速串行信號(hào)的收發(fā)。SERializer和DESerializer的英文縮寫(xiě),即串行收發(fā)器,它由兩部分組成:發(fā)端是串行發(fā)送單元SERializer,用高速時(shí)鐘調(diào)制編碼數(shù)據(jù)流;接收端為串行接收單元DESerializer,其主要作用是從數(shù)據(jù)流中恢復(fù)出時(shí)鐘信號(hào),并解調(diào)還原數(shù)據(jù),根據(jù)其功能,接收單元還有一個(gè)名稱(chēng)叫時(shí)鐘數(shù)據(jù)恢復(fù)器(CDR,clock and data recovery)。FPGA中SERDES技術(shù)的應(yīng)用很好的解決了高速系統(tǒng)數(shù)據(jù)傳輸?shù)钠款i,節(jié)約了單板面積,提高了系統(tǒng)的穩(wěn)定性,是高速系統(tǒng)設(shè)計(jì)的強(qiáng)有力支撐。 根據(jù)設(shè)計(jì)的速度要求,要合理選擇器件的速度等級(jí),并在設(shè)計(jì)中正確地分頻不同速度等級(jí)的布線資源與時(shí)鐘資源,需要提醒的是:選擇高等級(jí)的器件和改善布線資源分配僅僅是提高芯片工作速度的輔助手段,設(shè)計(jì)速度主要由電路的整體結(jié)構(gòu)、代碼的coding style等因素決定,善用芯片內(nèi)部的PLL或DLL資源完成時(shí)鐘的分頻、倍頻、移相等操作不僅簡(jiǎn)化了設(shè)計(jì),并且能有效地提高系統(tǒng)各的精度和穩(wěn)定性。
(4)同步設(shè)計(jì)原則。 同步設(shè)計(jì)原則: 早期PLD設(shè)計(jì)經(jīng)常采用行波計(jì)數(shù)器(ripple counter)或者異步脈沖生成器等典型的異步邏輯設(shè)計(jì)方式以節(jié)約設(shè)計(jì)所消耗的面積資源,但異步邏輯設(shè)計(jì)的時(shí)序正確性完全依賴(lài)于每個(gè)邏輯元件和布線的延遲,所以其時(shí)序相對(duì)繁雜而困難,并且極易產(chǎn)生亞穩(wěn)態(tài)、毛刺等,造成設(shè)計(jì)穩(wěn)定性下降和設(shè)計(jì)頻率不高,但FPGA/CPLD的一個(gè)顯著發(fā)展趨勢(shì)是低成本器件不斷經(jīng)濟(jì)化,器件資源不再成為設(shè)計(jì)的主要矛盾,而同步時(shí)序電路對(duì)全面提高設(shè)計(jì)的頻率和穩(wěn)定性至關(guān)重要,從這個(gè)層面上來(lái)講,盡量使用同步時(shí)序電路更加重要。 現(xiàn)代PLD設(shè)計(jì)推薦采用同步時(shí)序設(shè)計(jì)方式。 同步時(shí)序設(shè)計(jì)的注意事項(xiàng): 穩(wěn)定可靠的數(shù)據(jù)采樣必須遵從以下兩個(gè)原則: . setup時(shí)間原則:在有效時(shí)鐘沿到達(dá)前,數(shù)據(jù)輸入至少已經(jīng)穩(wěn)定了采樣寄存器的setup時(shí)間之久。 . hold時(shí)間原則:在有效時(shí)鐘沿到達(dá)后,數(shù)據(jù)輸入至少還將穩(wěn)定保持采樣寄存器的hold時(shí)間之久。 同步時(shí)序電路的延遲:最常用的設(shè)計(jì)方法是用分頻或倍頻的時(shí)鐘或者同步計(jì)數(shù)器完成所需的延遲。換句話說(shuō),同步時(shí)序電路的延遲被當(dāng)做一個(gè)電路邏輯來(lái)設(shè)計(jì),對(duì)于比較大的和特殊定時(shí)要求的演示,一般要用高速時(shí)鐘產(chǎn)生一個(gè)計(jì)數(shù)器,根據(jù)計(jì)數(shù)器的計(jì)數(shù)控制延時(shí);對(duì)于比較小的延時(shí),可以用D觸發(fā)器打一下,這種做法不僅僅使信號(hào)延時(shí)了一個(gè)時(shí)鐘周期,而且完成了信號(hào)與時(shí)鐘的初次同步,在輸入信號(hào)采樣和增加時(shí)序約束余量中使用,另外許多初學(xué)者用行為級(jí)(behavioral level)方法描述延時(shí),如“#5 a <= 4’b0101;”這種行為級(jí)描述方法常用于仿真測(cè)試激勵(lì),但是在電路綜合時(shí)會(huì)被忽略,并不能起到延時(shí)作用。 Verilog定義為reg型,不一定綜合成寄存器。 Verilog代碼中最常用的兩種數(shù)據(jù)類(lèi)型是wire和reg,一般來(lái)說(shuō),wire型指定的數(shù)據(jù)和網(wǎng)線通過(guò)組合邏輯實(shí)現(xiàn),而reg型指定的數(shù)據(jù)不一定就是用寄存器實(shí)現(xiàn)。 可編程邏輯常用設(shè)計(jì)思想和技巧 (4種思想和技巧:乒乓操作、串并轉(zhuǎn)換、流水線操作和數(shù)據(jù)接口同步) “乒乓操作”:常用于數(shù)據(jù)流控制的處理技巧。 特點(diǎn): 1.把乒乓操作模塊當(dāng)作一個(gè)整體,站在這個(gè)模塊的兩端看數(shù)據(jù),輸入數(shù)據(jù)流和輸出數(shù)據(jù)流都是連續(xù)不斷的,非常適合對(duì)數(shù)據(jù)流進(jìn)行流水線式處理,因此乒乓操作常常應(yīng)用于流水線式算法,完成數(shù)據(jù)的無(wú)縫緩沖與處理。 2.可以節(jié)約緩沖區(qū)空間。 3. 可以用低速模塊處理高速數(shù)據(jù)流。所要求的數(shù)據(jù)處理速率僅僅為輸入數(shù)據(jù)速率的1/2。 “串并轉(zhuǎn)換”:面積換速度,SERDES技術(shù)就是串并轉(zhuǎn)換的典型應(yīng)用。 “流水線操作”:是高速設(shè)計(jì)的一個(gè)常用設(shè)計(jì)手段。如果某個(gè)設(shè)計(jì)的處理流程分為若干步驟,而且整個(gè)數(shù)據(jù)處理是“單流向的”,即沒(méi)有反饋或者迭代運(yùn)算,前一個(gè)步驟的輸出是下一個(gè)步驟的輸入,則可以考慮采用流水線設(shè)計(jì)方法提高系統(tǒng)的工作效率。 異步時(shí)鐘域數(shù)據(jù)同步: 很多設(shè)計(jì)工作部穩(wěn)定都是源于異步時(shí)鐘域數(shù)據(jù)同步不穩(wěn)定。 異步時(shí)鐘域數(shù)據(jù)同步,也被稱(chēng)為數(shù)據(jù)接口同步,指任何兩個(gè)時(shí)鐘不同步的數(shù)據(jù)域之間可靠地進(jìn)行數(shù)據(jù)交換的問(wèn)題,數(shù)據(jù)的時(shí)鐘域不同步主要有兩種情況: . 兩個(gè)域的時(shí)鐘頻率相同,但是相差不固定,或者相差固定但是不可測(cè),簡(jiǎn)稱(chēng)為同頻異相問(wèn)題。 . 兩個(gè)時(shí)鐘域頻率根本不同,簡(jiǎn)稱(chēng)為異頻問(wèn)題。 兩種不推薦的異步時(shí)鐘域操作方法: 一種是通過(guò)增加buffer或者其他門(mén)延時(shí)調(diào)整采樣;另一種是盲目使用時(shí)鐘正負(fù)沿調(diào)整數(shù)據(jù)采樣。 (1) 通過(guò)增加buffer等組合邏輯延遲線調(diào)整采樣時(shí)間。 在早期邏輯電路圖設(shè)計(jì)階段,有些設(shè)計(jì)者習(xí)慣通過(guò)手工加入buffer或者非門(mén)調(diào)整數(shù)據(jù)延遲的習(xí)慣,從而保證本級(jí)模塊的時(shí)鐘對(duì)上級(jí)模塊數(shù)據(jù)的建立、保持時(shí)間的要求,這種做法主要應(yīng)用場(chǎng)合為:一是使用分立邏輯元件(如74系列)搭建數(shù)字邏輯電路;另一種是在ASIC設(shè)計(jì)領(lǐng)域。但是是由你過(guò)組合邏輯方法產(chǎn)生延遲容易產(chǎn)生毛刺,而且時(shí)序余量較差,一旦外界條件變換(環(huán)境試驗(yàn)、特別是高低溫試驗(yàn)),采樣時(shí)序就有可能完全紊亂,造成電路癱瘓,電路的可維護(hù)性和繼承性都很差。 但是如果使用者使用了同一個(gè)時(shí)鐘的兩個(gè)沿,但是保證沒(méi)有在同一個(gè)周期內(nèi)同時(shí)使用雙沿,則不會(huì)增加時(shí)鐘頻率。 (2) 盲目使用時(shí)鐘正負(fù)沿調(diào)整數(shù)據(jù)采樣。 很多人習(xí)慣隨意使用時(shí)鐘的正負(fù)沿調(diào)整采樣,甚至產(chǎn)生一系列不同相位或不同占空比的時(shí)鐘,使用其正負(fù)沿調(diào)整數(shù)據(jù)。該做法不推薦,原因如下: . 第一,如果在一個(gè)時(shí)鐘周期內(nèi)使用時(shí)鐘的雙沿同時(shí)操作,則使用該時(shí)鐘的同相倍頻時(shí)鐘也能實(shí)現(xiàn)相同的功能,換句話說(shuō),一個(gè)時(shí)鐘周期內(nèi),使用時(shí)鐘的雙沿同時(shí)操作,相當(dāng)于使用了一個(gè)同相的倍頻時(shí)鐘,此時(shí)因?yàn)樵O(shè)計(jì)的時(shí)鐘頻率提升,所有相關(guān)的使用約束都會(huì)變得更緊,不利于可靠實(shí)現(xiàn)。 . 第二,FPGA中PLL和DLL都能較好地保證某個(gè)時(shí)鐘沿的jitter、skew和占空比等各種參數(shù)指標(biāo),而對(duì)于另一個(gè)時(shí)鐘沿的指標(biāo)控制并不是那么嚴(yán)格,特別對(duì)于綜合、實(shí)現(xiàn)等EDA的軟件,如果明確對(duì)另外一個(gè)沿進(jìn)行相關(guān),這個(gè)沿的時(shí)序分析不一定完善,其綜合或?qū)崿F(xiàn)結(jié)果就不一定能?chē)?yán)格滿足用戶(hù)期望的時(shí)序要求(如setup、hold時(shí)間等),往往造成在該沿操作部穩(wěn)定的結(jié)果。 兩類(lèi)異步時(shí)鐘域操作的解決方法: (1) 同頻異相問(wèn)題。 簡(jiǎn)單解決方法是用后級(jí)時(shí)鐘對(duì)前級(jí)數(shù)據(jù)采樣兩次,即通常所述的用寄存器打兩拍,這樣有效減少了亞穩(wěn)態(tài)的傳播,使后級(jí)電路數(shù)據(jù)都是有效電平值。但這種做法并不能保證兩級(jí)寄存器采樣后的數(shù)據(jù)是正確的電平值,因?yàn)橐坏?/SPAN>setup或hold時(shí)間不滿足,采樣發(fā)生亞穩(wěn)態(tài),則經(jīng)判決時(shí)間(resolution time)后,可能判決到錯(cuò)誤電平值。所以這種方法僅僅適用于對(duì)少量錯(cuò)誤不敏感的功能單元。 可靠的做法是用DPRAM、FIFO或者一段寄存器buffer完成異步時(shí)鐘域的數(shù)據(jù)轉(zhuǎn)換。把數(shù)據(jù)存放在DPRAM或FIFO的方法如下:將上級(jí)芯片提供的數(shù)據(jù)隨路時(shí)鐘作為寫(xiě)信號(hào),將數(shù)據(jù)寫(xiě)入DPRAM或FIFO,然后使用本級(jí)的采樣時(shí)鐘將數(shù)據(jù)讀出即可,由于時(shí)鐘頻率相同,所以DPRAM或FIFO兩端的數(shù)據(jù)吞吐率一致。 (2) 異頻問(wèn)題。 解決方法是使用DPRAM或FIFO。思路同上。用上級(jí)隨路時(shí)鐘寫(xiě)入上級(jí)數(shù)據(jù),然后用本級(jí)時(shí)鐘讀出數(shù)據(jù),但是由于時(shí)鐘頻率不同,所以?xún)蓚€(gè)端口的數(shù)據(jù)吞吐率不一致,設(shè)計(jì)時(shí)一定要開(kāi)好緩沖區(qū),并通過(guò)監(jiān)控(full、half、empty等指示)確保數(shù)據(jù)流不會(huì)溢出。 異步時(shí)鐘域的轉(zhuǎn)換核心問(wèn)題就是要保證下級(jí)時(shí)鐘對(duì)上級(jí)數(shù)據(jù)采樣的setup時(shí)間和hold時(shí)間。如果觸發(fā)器的setup時(shí)間和hold時(shí)間不滿足,就可能出現(xiàn)亞穩(wěn)態(tài),此時(shí),觸發(fā)器輸出端Q在有效時(shí)鐘沿之后比較長(zhǎng)的一段時(shí)間內(nèi)處于不確定的狀態(tài),在這段時(shí)間內(nèi)Q端產(chǎn)生毛刺并不斷震蕩,最終固定在某一電壓值,此電壓值并不一定等于原來(lái)數(shù)據(jù)輸入端D的數(shù)值,這段時(shí)間稱(chēng)為決斷時(shí)間(resolution time)。經(jīng)過(guò)resolution time之后Q端將穩(wěn)定到0或1上,但究竟是0還是1是隨機(jī)的,與輸入沒(méi)有必然關(guān)系。 亞穩(wěn)態(tài)破壞系統(tǒng)的穩(wěn)定性。 只要系統(tǒng)中有異步元件,亞穩(wěn)態(tài)就無(wú)法避免,因此設(shè)計(jì)的電路首先要減少亞穩(wěn)態(tài)導(dǎo)致的錯(cuò)誤,其次要使系統(tǒng)對(duì)產(chǎn)生的錯(cuò)誤不敏感。前者要靠同步設(shè)計(jì)來(lái)實(shí)現(xiàn),后者根據(jù)不同的設(shè)計(jì)應(yīng)用有不同的處理方法。 使用兩級(jí)寄存器采樣可以有效地減少亞穩(wěn)態(tài)繼續(xù)傳播的概率。其原理是即使第一個(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)。理論上如果再添加一級(jí)寄存器,使同步采樣達(dá)到3級(jí),則末級(jí)輸出為亞穩(wěn)態(tài)的概率幾乎為0. 兩級(jí)寄存器采樣僅能降低亞穩(wěn)態(tài)的概率,但并不能保證第二級(jí)輸出的穩(wěn)態(tài)的電平就是正確電平,由于經(jīng)過(guò)resolution time之后寄存器輸出的電平是一個(gè)不確定的穩(wěn)態(tài)值,也就是說(shuō)這種處理方法并不能排除采樣錯(cuò)誤的產(chǎn)生,這時(shí)就要求說(shuō)設(shè)計(jì)的系統(tǒng)對(duì)采樣錯(cuò)誤有一定的容忍度。 Altera推薦的coding style 良好的coding style對(duì)設(shè)計(jì)的工作頻率,說(shuō)消耗的芯片面積,甚至整個(gè)系統(tǒng)的穩(wěn)定性都非常重要,而且良好規(guī)范的coding style將更便于設(shè)計(jì)的移植,如從一個(gè)器件族移植到另一個(gè)器件族,或者同一個(gè)器件族不同速度等級(jí)之間的移植,還包括altera FPGA利用hard copy向結(jié)構(gòu)化ASIC的移植等。 “好的coding style會(huì)使綜合、實(shí)現(xiàn)等優(yōu)化事半功倍,達(dá)到最優(yōu)化的結(jié)果;不良的coding style會(huì)使綜合、實(shí)現(xiàn)南轅北轍,甚至產(chǎn)生錯(cuò)誤的結(jié)果。”,所以,綜合、實(shí)現(xiàn)等EDA工具的優(yōu)化能力和正確性最終取決于設(shè)計(jì)的coding style的優(yōu)劣。 Coding style分為一般性coding style和針對(duì)綜合工具、實(shí)現(xiàn)工具、器件類(lèi)型的coding style。另有一部分coding style是針對(duì)altera器件的特點(diǎn)和硬件結(jié)構(gòu)的,與器件緊密聯(lián)系。使用altera推薦的coding style能夠正確地實(shí)例化底層單元模塊,合理地利用其固有的硬件結(jié)構(gòu),以達(dá)到最優(yōu)化的設(shè)計(jì)效果。 這里所說(shuō)的coding style主要是基于RTL級(jí)而言的。 (1) 結(jié)構(gòu)層次化編碼(hierarchical coding) (2) 模塊化劃分的技巧(design partitioning) 模塊劃分的基本原則如下: 1. 對(duì)每個(gè)同步時(shí)序設(shè)計(jì)的子模塊的輸出使用寄存器。使用寄存器分割同步時(shí)序單元的好處有:便于綜合工具權(quán)衡所分割的子模塊中的組合電路部分和同步時(shí)序電路部分,從而達(dá)到更好的時(shí)序優(yōu)化效果,這種模塊劃分符合時(shí)序約束的習(xí)慣,便于利用約束屬性進(jìn)行時(shí)序約束。 2. 將相關(guān)的邏輯或者可以服用的邏輯劃分在同一模塊內(nèi)(呼應(yīng)系統(tǒng)原則)。可最大程度上復(fù)用資源,減少設(shè)計(jì)所消耗的面積;更利于綜合工具優(yōu)化某個(gè)具體功能的時(shí)序關(guān)鍵路徑; 3. 將不同優(yōu)化目標(biāo)的邏輯分開(kāi)。 對(duì)于時(shí)序緊張的部分,應(yīng)獨(dú)立劃分為一個(gè)模塊,其優(yōu)化目標(biāo)為“speed”,以便于時(shí)序約束,也便于綜合和實(shí)現(xiàn)工具進(jìn)行優(yōu)化;將資源消耗過(guò)大的部分劃分為獨(dú)立的模塊,優(yōu)化目標(biāo)設(shè)定為“area”,有利于區(qū)域布局與約束。這種同時(shí)考慮兩種優(yōu)化目標(biāo)會(huì)使綜合器陷入互相制約的困境,耗費(fèi)巨大的綜合優(yōu)化時(shí)間也得不到令人滿意的綜合優(yōu)化結(jié)果。 4. 將松約束的邏輯歸到同一個(gè)模塊。 5. 將存儲(chǔ)邏輯獨(dú)立劃分成模塊。大多數(shù)的仿真器對(duì)大面積的RAM都有獨(dú)特的內(nèi)存管理方式,以提高仿真效率。 6. 合適的模塊規(guī)模。 龐大的模塊將要求對(duì)綜合器同時(shí)處理更多的邏輯結(jié)構(gòu),對(duì)綜合器的處理能力和計(jì)算機(jī)的配置提出了較高的要求;不利于發(fā)揮目前非常流行的增量綜合與實(shí)現(xiàn)技術(shù)的優(yōu)勢(shì)。 組合邏輯的注意事項(xiàng): 1. 避免組合邏輯反饋環(huán)路(combinational loops)。組合邏輯反饋環(huán)路是PLD設(shè)計(jì)的大忌,最容易因震蕩、毛刺、時(shí)序違規(guī)等引起整個(gè)系統(tǒng)的不穩(wěn)定和不可靠。 具體操作方法:. 牢記任何反饋環(huán)路必須包含寄存器; . 檢查綜合、實(shí)現(xiàn)報(bào)告的warning信息,發(fā)現(xiàn)combinational loops后進(jìn)行相應(yīng)的修改。 (3) 替換延遲鏈(delay chains)。避免使用異步的delay chains。 (4) 替換異步脈沖產(chǎn)生單元(pulse generator) 在異步設(shè)計(jì)中,常用delay chains完成脈沖產(chǎn)生。這類(lèi)異步方法設(shè)計(jì)的脈沖產(chǎn)生電路的脈沖寬度取決于delay chains的門(mén)延遲和線延遲。會(huì)帶來(lái)穩(wěn)定性、可靠性問(wèn)題,故必須避免使用。同步時(shí)序設(shè)計(jì)脈沖電路的常用方法設(shè)計(jì)的脈沖寬度不因器件改變或設(shè)計(jì)移植而改變,恒等于時(shí)鐘周期,而且避免了異步設(shè)計(jì)的諸多不確定因素,其時(shí)序路徑編譯計(jì)算、STA分析和仿真驗(yàn)證。 (5) 慎用鎖存器(latch)。同步時(shí)序設(shè)計(jì)要盡量避免使用latch。如在設(shè)計(jì)組合邏輯時(shí)使用不完全的條件判斷語(yǔ)句,如有if沒(méi)有else或者不完整的case語(yǔ)句等;另一種情況是設(shè)計(jì)中有組合邏輯的反饋環(huán)路等異步邏輯。 時(shí)鐘設(shè)計(jì)的注意事項(xiàng): 同步時(shí)序電路推薦的時(shí)鐘使用方式:時(shí)鐘經(jīng)全局時(shí)鐘輸入引腳輸入,通過(guò)FPGA內(nèi)部專(zhuān)用PLL或DLL進(jìn)行倍頻/分頻移相等調(diào)整與運(yùn)算,然后經(jīng)FPGA內(nèi)部全局時(shí)鐘布線資源驅(qū)動(dòng)到達(dá)芯片內(nèi)所有寄存器和其他模塊的時(shí)鐘輸入端。 對(duì)于內(nèi)部邏輯產(chǎn)生的時(shí)鐘必須在組合邏輯產(chǎn)生的時(shí)鐘后插入寄存器,否則會(huì)使設(shè)計(jì)部穩(wěn)定,對(duì)于時(shí)鐘路徑必須插入寄存器以過(guò)濾毛刺。 另外組合邏輯產(chǎn)生的時(shí)鐘的jitter和Skew都比較大,如果時(shí)鐘產(chǎn)生邏輯的延遲比數(shù)據(jù)路徑的延遲更大,會(huì)帶來(lái)負(fù)的skew,負(fù)的skew同步邏輯設(shè)計(jì)而言是災(zāi)難性的,所以使用組合邏輯產(chǎn)生內(nèi)部時(shí)鐘僅僅適用于時(shí)鐘頻率較低、時(shí)鐘精度要求不高的情況;另外這類(lèi)時(shí)鐘應(yīng)該使用全局布線資源或者第二全局布線資源之類(lèi)的快速布線資源布線,而且需要對(duì)組合邏輯電路附加一定的約束條件。 Ripple counter(行波計(jì)數(shù)器):結(jié)構(gòu)為一組寄存器級(jí)聯(lián),每個(gè)寄存器的輸出端接到下一級(jí)寄存器的時(shí)鐘管腳,這種計(jì)數(shù)器常常用于異步分頻電路,典型的異步時(shí)序邏輯。異步時(shí)序邏輯會(huì)帶來(lái)各種各樣的時(shí)序問(wèn)題,在同步時(shí)序電路設(shè)計(jì)中必須嚴(yán)格避免使用ripple counter。 時(shí)鐘選擇:為適應(yīng)不同數(shù)據(jù)速率要求,經(jīng)常要進(jìn)行時(shí)鐘切換。切換的最佳途徑是使用FPGA/CPLD內(nèi)部的專(zhuān)用clock MUX(全局時(shí)鐘網(wǎng)絡(luò)),這些MUX反應(yīng)速度快,鎖定時(shí)間短,切換瞬間帶來(lái)的抖動(dòng)和沖擊小。如果器件沒(méi)有專(zhuān)用的clock MUX,應(yīng)盡量滿足: . 時(shí)鐘切換控制邏輯在配置后將不再改變; . 時(shí)鐘切換后,對(duì)所有相關(guān)電路復(fù)位,以保證所有寄存器、狀態(tài)機(jī)和RAM等電路的狀態(tài)不會(huì)鎖死進(jìn)入死循環(huán); . 所有設(shè)計(jì)系統(tǒng)對(duì)時(shí)鐘切換過(guò)程發(fā)生的短暫錯(cuò)誤不敏感。 門(mén)控時(shí)鐘:一種常用減少功耗的手段,在同步時(shí)序電路中,應(yīng)該盡量不適用Geted Clock。門(mén)控時(shí)鐘會(huì)污染clock的質(zhì)量,通過(guò)門(mén)控后產(chǎn)生毛刺并使時(shí)鐘的skew,jitter等指標(biāo)惡化。如果真的要減少功耗,可采用低核電壓FPGA(core電壓為1.0v),FPGA休眠功能,動(dòng)態(tài)部分重構(gòu)技術(shù),clock MUX等技術(shù)。 時(shí)鐘同步使能端:大多數(shù)如寄存器等同步單元都支持時(shí)鐘的同步使能(synchromous clock enable),通過(guò)使用synchromous clock enable端完成某些邏輯功能,有時(shí)可以節(jié)約芯片面積并提高設(shè)計(jì)頻率。 全局異步復(fù)位資源:大多數(shù)FPGA都具有專(zhuān)用的全局異步復(fù)位/置位資源,這類(lèi)資源通常使用專(zhuān)用的低skew、低delay布線資源,直接到達(dá)寄存器、block RAM等底層單元,以保證高性能的復(fù)位/置位效果。Altera器件中一般使用全局時(shí)鐘網(wǎng)絡(luò)驅(qū)動(dòng)全局同步或異步復(fù)位/置位信號(hào)。全局同步或異步置位/復(fù)位信號(hào)的應(yīng)用比較復(fù)雜,不是所有的情況都推薦使用,但是一般情況下使用全局同步或異步復(fù)位/置位信號(hào)可以簡(jiǎn)化設(shè)計(jì)、節(jié)約芯片面積。 使用pipeline技術(shù)優(yōu)化時(shí)序:即流水線時(shí)序優(yōu)化方法,其本質(zhì)是調(diào)整一個(gè)較長(zhǎng)的組合邏輯路徑中寄存器位置,用寄存器合理分割該組合邏輯路徑,從而降低了對(duì)路徑的clock-to-output和setup 等時(shí)間參數(shù)的要求,達(dá)到提高設(shè)計(jì)頻率的目的。但是必須注意的是pipeline優(yōu)化技術(shù)只能合理地調(diào)整寄存器位置,而不應(yīng)該憑空增加寄存器級(jí)數(shù),所以pipeline有時(shí)也被稱(chēng)為register balance。 模塊復(fù)用與resource sharing:不要依靠綜合工具的優(yōu)化能力進(jìn)行優(yōu)化,主要還是要通過(guò)提高coding style的修養(yǎng)來(lái)提高代碼質(zhì)量。 邏輯復(fù)制:扇出非常大時(shí),為了增加信號(hào)的驅(qū)動(dòng)能力,必須插入多級(jí)buffer,這樣就在一定程度上增加了這個(gè)型號(hào)路徑的延遲,這時(shí)我們可以復(fù)制生成這個(gè)信號(hào)的邏輯,使多路同頻同相的信號(hào)驅(qū)動(dòng)后續(xù)電路,平均到每路的扇出變低,不需要加buffer也能滿足驅(qū)動(dòng)能力的要求,這樣就節(jié)約了該信號(hào)的路徑時(shí)延。 邏輯復(fù)制與前面的resource sharing是兩個(gè)對(duì)立統(tǒng)一的概念。Resource sharing目的是為了節(jié)省面積資源,而邏輯復(fù)制的目的是為了提高工作頻率。當(dāng)使用邏輯復(fù)制手段提高工作頻率的時(shí)候,必然會(huì)增加面積資源,對(duì)立統(tǒng)一,是面積與速度的平衡。 信號(hào)敏感表:時(shí)序邏輯的信號(hào)敏感表比較好寫(xiě),在信號(hào)敏感表寫(xiě)明時(shí)鐘信號(hào)的正負(fù)觸發(fā)沿即可,關(guān)于信號(hào)敏感表的主要問(wèn)題幾種在組合邏輯的信號(hào)敏感表的寫(xiě)法,需強(qiáng)調(diào)的是: (1) 將操作進(jìn)程(verilog 的always block或VHDL的process block)中使用到的所有輸入信號(hào)和條件判斷信號(hào)都列在信號(hào)敏感表中。 (2) 希望通過(guò)證件信號(hào)敏感表來(lái)完成某項(xiàng)邏輯功能的大錯(cuò)特錯(cuò); (3) 不完整的信號(hào)敏感表會(huì)造成前仿真結(jié)果和綜合、實(shí)現(xiàn)后仿真結(jié)果不一致; (4) 一般綜合工具對(duì)于不完整的信號(hào)敏感表的默認(rèn)做法是,將處理進(jìn)程中用到的所有輸入和判斷條件信號(hào)都默認(rèn)到綜合結(jié)果的信號(hào)敏感表中,并對(duì)原設(shè)計(jì)代碼敏感表中遺漏的信號(hào)報(bào)警告信息。 狀態(tài)機(jī)設(shè)計(jì)的一般原則: (1) 選擇狀態(tài)機(jī)的編碼方式。Binary、gray-code編碼使用最少的觸發(fā)器,較多的組合邏輯,而one-hot編碼反之。由于CPLD更多地提供組合邏輯資源,而FPGA更多地提供觸發(fā)器資源,所以CPLD多使用gray-code,而FPGA多使用one-hot編碼。另一方面,對(duì)于小型設(shè)計(jì)使用gray-code和binary編碼更有效,而大型狀態(tài)機(jī)使用one-hot更高效。 (2) 兩種狀態(tài)機(jī)的設(shè)計(jì)方法。第一種,將狀態(tài)機(jī)轉(zhuǎn)移和狀態(tài)的操作、判斷等寫(xiě)到一個(gè)模塊中;另一種是將狀態(tài)轉(zhuǎn)移單獨(dú)寫(xiě)成一個(gè)模塊,將狀態(tài)的操作和判斷等寫(xiě)到另一個(gè)模塊中。后者方式較好。 因?yàn)椋籂顟B(tài)轉(zhuǎn)移是用寄存器實(shí)現(xiàn)的,是同步時(shí)序部分。狀態(tài)轉(zhuǎn)移條件的判斷是通過(guò)組合邏輯判斷實(shí)現(xiàn)的,之所以后者更合理就在于第二種編碼將同步時(shí)序和組合邏輯分別放到不同的程序塊中實(shí)現(xiàn),這樣不但便于閱讀、理解、維護(hù),更重要的是鯉魚(yú)綜合器優(yōu)化代碼,利于用戶(hù)添加合適的時(shí)序約束條件,利于布局布線器實(shí)現(xiàn)設(shè)計(jì)。 (3) 初始狀態(tài)和默認(rèn)狀態(tài)。 (4) 指定默認(rèn)輸出值。所有輸出指定一個(gè)默認(rèn)的輸出值;所有輸出最好用寄存器打一拍。 (5) 狀態(tài)機(jī)輸出邏輯復(fù)用。將輸出邏輯獨(dú)立出來(lái),單獨(dú)寫(xiě)一個(gè)部分。 三態(tài)信號(hào)的設(shè)計(jì):altera推薦在設(shè)計(jì)頂層中所有的雙向總線(既做輸入又做輸出的總線)定義為三態(tài)信號(hào)。但必須注意的是,禁止在除頂層以外的其他子層次定義雙向端口,除非是頂層中直接驅(qū)動(dòng)雙向端口的,禁止賦值高阻態(tài)Z。 Stratix II的ALM可以配置成6輸入LUT,使用6-LUT可以同時(shí)完成3bit加法; 大多數(shù)FPGA都是基于LE結(jié)構(gòu)的,一個(gè)LE由一個(gè)4輸入查找表加上一個(gè)觸發(fā)器組成 |
|
|
來(lái)自: zhangquanling > 《FPGA_混飯吃的》