FPGA重點(diǎn)知識13條,助你構建完整“邏輯觀(guān)”之一
6、FPGA設計方法概論
本文引用地址:http://dyxdggzs.com/article/201802/375718.htmFPGA是可編程芯片,因此FPGA的設計方法包括硬件設計和軟件設計兩部分。硬件包括FPGA芯片電路、存儲器、輸入輸出接口電路以及其他設備,軟件即是相應的HDL程序以及最新才流行的嵌入式C程序。硬件設計是基礎,但其方法比較固定,本書(shū)將在第4節對其進(jìn)行詳細介紹,本節主要介紹軟件的設計方法。
目前微電子技術(shù)已經(jīng)發(fā)展到SOC階段,即集成系統(Integrated System)階段,相對于集成電路(IC)的設計思想有著(zhù)革命性的變化。SOC是一個(gè)復雜的系統,它將一個(gè)完整產(chǎn)品的功能集成在一個(gè)芯片上,包括核心處理器、存儲單元、硬件加速單元以及眾多的外部設備接口等,具有設計周期長(cháng)、實(shí)現成本高等特點(diǎn),因此其設計方法必然是自頂向下的從系統級到功能模塊的軟、硬件協(xié)同設計,達到軟、硬件的無(wú)縫結合。
這么龐大的工作量顯然超出了單個(gè)工程師的能力,因此需要按照層次化、結構化的設計方法來(lái)實(shí)施。首先由總設計師將整個(gè)軟件開(kāi)發(fā)任務(wù)劃分為若干個(gè)可操作的模塊,并對其接口和資源進(jìn)行評估,編制出相應的行為或結構模型,再將其分配給下一層的設計師。這就允許多個(gè)設計者同時(shí)設計一個(gè)硬件系統中的不同模塊,并為自己所設計的模塊負責;然后由上層設計師對下層模塊進(jìn)行功能驗證。
自頂向下的設計流程從系統級設計開(kāi)始,劃分為若干個(gè)二級單元,然后再把各個(gè)二級單元劃分為下一層次的基本單元,一直下去,直到能夠使用基本模塊或者IP核直接實(shí)現為止,如圖1-6所示。流行的FPGA開(kāi)發(fā)工具都提供了層次化管理,可以有效地梳理錯綜復雜的層次,能夠方便地查看某一層次模塊的源代碼以修改錯誤。

圖1-6 自頂向下的FPGA設計開(kāi)發(fā)流程
在工程實(shí)踐中,還存在軟件編譯時(shí)長(cháng)的問(wèn)題。由于大型設計包含多個(gè)復雜的功能模塊,其時(shí)序收斂與仿真驗證復雜度很高,為了滿(mǎn)足時(shí)序指標的要求,往往需要反復修改源文件,再對所修改的新版本進(jìn)行重新編譯,直到滿(mǎn)足要求為止。這里面存在兩個(gè)問(wèn)題:首先,軟件編譯一次需要長(cháng)達數小時(shí)甚至數周的時(shí)間,這是開(kāi)發(fā)所不能容忍的;其次,重新編譯和布局布線(xiàn)后結果差異很大,會(huì )將已滿(mǎn)足時(shí)序的電路破壞。因此必須提出一種有效提高設計性能,繼承已有結果,便于團隊化設計的軟件工具。FPGA廠(chǎng)商意識到這類(lèi)需求,由此開(kāi)發(fā)出了相應的邏輯鎖定和增量設計的軟件工具。例如,Xilinx公司的解決方案就是PlanAhead。
Planahead 允許高層設計者為不同的模塊劃分相應FPGA芯片區域,并允許底層設計者在在所給定的區域內獨立地進(jìn)行設計、實(shí)現和優(yōu)化,等各個(gè)模塊都正確后,再進(jìn)行設計整合。如果在設計整合中出現錯誤,單獨修改即可,不會(huì )影響到其它模塊。Planahead將結構化設計方法、團隊化合作設計方法以及重用繼承設計方法三者完美地結合在一起,有效地提高了設計效率,縮短了設計周期。
不過(guò)從其描述可以看出,新型的設計方法對系統頂層設計師有很高的要求。在設計初期,他們不僅要評估每個(gè)子模塊所消耗的資源,還需要給出相應的時(shí)序關(guān)系;在設計后期,需要根據底層模塊的實(shí)現情況完成相應的修訂。
典型FPGA開(kāi)發(fā)流程
FPGA的設計流程就是利用EDA開(kāi)發(fā)軟件和編程工具對FPGA芯片進(jìn)行開(kāi)發(fā)的過(guò)程。FPGA的開(kāi)發(fā)流程一般如圖1-7所示,包括電路設計、設計輸入、功能仿真、綜合優(yōu)化、綜合后仿真、實(shí)現、布線(xiàn)后仿真、板級仿真以及芯片編程與調試等主要步驟。

圖1-7 FPGA開(kāi)發(fā)的一般流程
1. 電路設計
在系統設計之前,首先要進(jìn)行的是方案論證、系統設計和FPGA芯片選擇等準備工作。系統工程師根據任務(wù)要求,如系統的指標和復雜度,對工作速度和芯片本身的各種資源、成本等方面進(jìn)行權衡,選擇合理的設計方案和合適的器件類(lèi)型。一般都采用自頂向下的設計方法,把系統分成若干個(gè)基本單元,然后再把每個(gè)基本單元劃分為下一層次的基本單元,一直這樣做下去,直到可以直接使用EDA元件庫為止。
2. 設計輸入
設計輸入是將所設計的系統或電路以開(kāi)發(fā)軟件要求的某種形式表示出來(lái),并輸入給EDA工具的過(guò)程。常用的方法有硬件描述語(yǔ)言(HDL)和原理圖輸入方法等。原理圖輸入方式是一種最直接的描述方式,在可編程芯片發(fā)展的早期應用比較廣泛,它將所需的器件從元件庫中調出來(lái),畫(huà)出原理圖。這種方法雖然直觀(guān)并易于仿真,但效率很低,且不易維護,不利于模塊構造和重用。更主要的缺點(diǎn)是可移植性差,當芯片升級后,所有的原理圖都需要作一定的改動(dòng)。目前,在實(shí)際開(kāi)發(fā)中應用最廣的就是HDL語(yǔ)言輸入法,利用文本描述設計,可以分為普通HDL和行為HDL。普通HDL有ABEL、CUR等,支持邏輯方程、真值表和狀態(tài)機等表達方式,主要用于簡(jiǎn)單的小型設計。而在中大型工程中,主要使用行為HDL,其主流語(yǔ)言是Verilog HDL和VHDL。這兩種語(yǔ)言都是美國電氣與電子工程師協(xié)會(huì )(IEEE)的標準,其共同的突出特點(diǎn)有:語(yǔ)言與芯片工藝無(wú)關(guān),利于自頂向下設計,便于模塊的劃分與移植,可移植性好,具有很強的邏輯描述和仿真功能,而且輸入效率很高。
3. 功能仿真
功能仿真,也稱(chēng)為前仿真,是在編譯之前對用戶(hù)所設計的電路進(jìn)行邏輯功能驗證,此時(shí)的仿真沒(méi)有延遲信息,僅對初步的功能進(jìn)行檢測。仿真前,要先利用波形編輯器和HDL等建立波形文件和測試向量(即將所關(guān)心的輸入信號組合成序列),仿真結果將會(huì )生成報告文件和輸出信號波形,從中便可以觀(guān)察各個(gè)節點(diǎn)信號的變化。如果發(fā)現錯誤,則返回設計修改邏輯設計。常用的工具有Model Tech公司的ModelSim、Sysnopsys公司的VCS和Cadence公司的NC-Verilog以及NC-VHDL等軟件。
4. 綜合優(yōu)化
所謂綜合就是將較高級抽象層次的描述轉化成較低層次的描述。綜合優(yōu)化根據目標與要求優(yōu)化所生成的邏輯連接,使層次設計平面化,供FPGA布局布線(xiàn)軟件進(jìn)行實(shí)現。就目前的層次來(lái)看,綜合優(yōu)化(Synthesis)是指將設計輸入編譯成由與門(mén)、或門(mén)、非門(mén)、RAM、觸發(fā)器等基本邏輯單元組成的邏輯連接網(wǎng)表,而并非真實(shí)的門(mén)級電路。真實(shí)具體的門(mén)級電路需要利用FPGA制造商的布局布線(xiàn)功能,根據綜合后生成的標準門(mén)級結構網(wǎng)表來(lái)產(chǎn)生。為了能轉換成標準的門(mén)級結構網(wǎng)表,HDL程序的編寫(xiě)必須符合特定綜合器所要求的風(fēng)格。由于門(mén)級結構、RTL級的HDL程序的綜合是很成熟的技術(shù),所有的綜合器都可以支持到這一級別的綜合。常用的綜合工具有Synplicity公司的Synplify/Synplify Pro軟件以及各個(gè)FPGA廠(chǎng)家自己推出的綜合開(kāi)發(fā)工具。
5. 綜合后仿真
綜合后仿真檢查綜合結果是否和原設計一致。在仿真時(shí),把綜合生成的標準延時(shí)文件反標注到綜合仿真模型中去,可估計門(mén)延時(shí)帶來(lái)的影響。但這一步驟不能估計線(xiàn)延時(shí),因此和布線(xiàn)后的實(shí)際情況還有一定的差距,并不十分準確。目前的綜合工具較為成熟,對于一般的設計可以省略這一步,但如果在布局布線(xiàn)后發(fā)現電路結構和設計意圖不符,則需要回溯到綜合后仿真來(lái)確認問(wèn)題之所在。在功能仿真中介紹的軟件工具一般都支持綜合后仿真。
6. 實(shí)現與布局布線(xiàn)
實(shí)現是將綜合生成的邏輯網(wǎng)表配置到具體的FPGA芯片上,布局布線(xiàn)是其中最重要的過(guò)程。布局將邏輯網(wǎng)表中的硬件原語(yǔ)和底層單元合理地配置到芯片內部的固有硬件結構上,并且往往需要在速度最優(yōu)和面積最優(yōu)之間作出選擇。布線(xiàn)根據布局的拓撲結構,利用芯片內部的各種連線(xiàn)資源,合理正確地連接各個(gè)元件。目前,FPGA的結構非常復雜,特別是在有時(shí)序約束條件時(shí),需要利用時(shí)序驅動(dòng)的引擎進(jìn)行布局布線(xiàn)。布線(xiàn)結束后,軟件工具會(huì )自動(dòng)生成報告,提供有關(guān)設計中各部分資源的使用情況。由于只有FPGA芯片生產(chǎn)商對芯片結構最為了解,所以布局布線(xiàn)必須選擇芯片開(kāi)發(fā)商提供的工具。
7. 實(shí)現與布局布線(xiàn)
時(shí)序仿真,也稱(chēng)為后仿真,是指將布局布線(xiàn)的延時(shí)信息反標注到設計網(wǎng)表中來(lái)檢測有無(wú)時(shí)序違規(即不滿(mǎn)足時(shí)序約束條件或器件固有的時(shí)序規則,如建立時(shí)間、保持時(shí)間等)現象。時(shí)序仿真包含的延遲信息最全,也最精確,能較好地反映芯片的實(shí)際工作情況。由于不同芯片的內部延時(shí)不一樣,不同的布局布線(xiàn)方案也給延時(shí)帶來(lái)不同的影響。因此在布局布線(xiàn)后,通過(guò)對系統和各個(gè)模塊進(jìn)行時(shí)序仿真,分析其時(shí)序關(guān)系,估計系統性能,以及檢查和消除競爭冒險是非常有必要的。在功能仿真中介紹的軟件工具一般都支持綜合后仿真。
8. 板級仿真與驗證
板級仿真主要應用于高速電路設計中,對高速系統的信號完整性、電磁干擾等特征進(jìn)行分析,一般都以第三方工具進(jìn)行仿真和驗證。
9. 芯片編程與調試
設計的最后一步就是芯片編程與調試。芯片編程是指產(chǎn)生使用的數據文件(位數據流文件,Bitstream Generation),然后將編程數據下載到FPGA芯片中。其中,芯片編程需要滿(mǎn)足一定的條件,如編程電壓、編程時(shí)序和編程算法等方面。邏輯分析儀(Logic Analyzer,LA)是FPGA設計的主要調試工具,但需要引出大量的測試管腳,且LA價(jià)格昂貴。目前,主流的FPGA芯片生產(chǎn)商都提供了內嵌的在線(xiàn)邏輯分析儀(如Xilinx ISE中的ChipScope、Altera QuartusII中的SignalTapII以及SignalProb)來(lái)解決上述矛盾,它們只需要占用芯片少量的邏輯資源,具有很高的實(shí)用價(jià)值。
1.3.3 基于FPGA的SOC設計方法
基于FPGA的SOC設計理念將FPGA可編程的優(yōu)點(diǎn)帶到了SOC領(lǐng)域,其系統由嵌入式處理器內核、DSP單元、大容量處理器、吉比特收發(fā)器、混合邏輯、IP以及原有的設計部分組成。相應的FPGA規模大都在百萬(wàn)門(mén)以上,適合于許多領(lǐng)域,如電信、計算機等行業(yè)。
系統設計方法是SOC常用的方法學(xué),其優(yōu)勢在于,可進(jìn)行反復修改并對系統架構實(shí)現進(jìn)行驗證,??? 包括SOC集成硬件和軟件組件之間的接口。不過(guò),目前仍存在很多問(wèn)題,最大的問(wèn)題就是沒(méi)有通用的系統描述語(yǔ)言和系統級綜合工具。隨著(zhù)FPGA平臺的融入,將 SOC逐步地推向了實(shí)用。SOC平臺的核心部分是內嵌的處理內核,其硬件是固定的,軟件則是可編程的;外圍電路則由FPGA的邏輯資源組成,大都以IP 的形式提供,例如存儲器接口、USB接口以及以太網(wǎng)MAC層接口等,用戶(hù)根據自己需要在內核總線(xiàn)上添加,并能自己訂制相應的接口IP和外圍設備。
基于FPGA的典型SOC開(kāi)發(fā)流程為:
1.芯片內的考慮
從設計生成開(kāi)始,設計人員需要從硬件/軟件協(xié)同驗證的思路入手,以找出只能在系統集成階段才會(huì )被發(fā)現的軟、硬件缺陷。然后選擇合適的芯片以及開(kāi)發(fā)工具,在綜合過(guò)程得到優(yōu)化,隨后進(jìn)行精確的實(shí)現,以滿(mǎn)足實(shí)際需求。由于設計規模越來(lái)越大,工作頻率也到了數百兆赫茲,布局布線(xiàn)的延遲將變得非常重要。為了確保滿(mǎn)足時(shí)序,需要在布局布線(xiàn)后進(jìn)行靜態(tài)時(shí)序分析,對設計進(jìn)行驗證。
2.板級驗證
在芯片設計完畢后,需要再進(jìn)行板級驗證,以便在印刷電路板(PCB)上保證與最初設計功能一致。因此,PCB布局以及信號完整性測試應被納入設計流程。由于芯片內設計所做的任何改變都將反映在下游的設計流程中,各個(gè)過(guò)程之間的數據接口和管理也必須是無(wú)誤的。預計SOC系統以及所必須的額外過(guò)程將使數據的大小成指數增長(cháng),因此,管理各種數據集本身是急劇挑戰性的任務(wù)
7、DCM時(shí)鐘管理單元
看Xilinx的Datasheet會(huì )注意到Xilinx的FPGA沒(méi)有PLL,其實(shí)DCM就是時(shí)鐘管理單元。
1、DCM概述
DCM內部是DLL(Delay Lock Loop結構,對時(shí)鐘偏移量的調節是通過(guò)長(cháng)的延時(shí)線(xiàn)形成的。DCM的參數里有一個(gè)PHASESHIFT(相移),可以從0變到255。所以我們可以假設內部結構里從輸入引腳clkin到輸出引腳clk_1x之間應該有256根延時(shí)線(xiàn)(實(shí)際上,由于對不同頻率的時(shí)鐘都可以從0變到255,延時(shí)線(xiàn)的真正數目應該比這個(gè)大得多)。DCM總會(huì )把輸入時(shí)鐘clkin和反饋時(shí)鐘CLKFB相比較,如果它們的延時(shí)差不等于所設置的PHASESHIFT,DCM就會(huì )改變在clkin和clk_1x之間的延時(shí)線(xiàn)數目,直到相等為止,輸出和輸入形成閉環(huán),動(dòng)態(tài)調整到設定值再退出。這個(gè)從不等到相等所花的時(shí)間,就是輸出時(shí)鐘鎖定的時(shí)間,相等以后,lock_flag標識才會(huì )升高。
當DCM發(fā)現clkin和clkfb位相差不等于PHASESHIFT的時(shí)候,就去調節clk_1x和clkin之間延時(shí),所以如果clk_1x和clkfb不相關(guān)的話(huà),那就永遠也不能鎖定了。

圖一、DCM和BUFG配合使用示意圖
2、如何使用DCM
DCM一般和BUFG配合使用,要加上BUFG,應該是為了增強時(shí)鐘的驅動(dòng)能力。DCM的一般使用方法是,將其輸出clk_1x接在BUFG的輸入引腳上,BUFG的輸出引腳反饋回來(lái)接在DCM的反饋時(shí)鐘腳CLKFB上。另外,在FPGA里,只有BUFG的輸出引腳接在時(shí)鐘網(wǎng)絡(luò )上,所以一般來(lái)說(shuō)你可以不使用DCM,但你一定會(huì )使用BUFG。有些兄弟總喜歡直接將外部輸入的時(shí)鐘驅動(dòng)內部的寄存器,其實(shí)這個(gè)時(shí)候雖然你沒(méi)有明顯地例化BUFG,但工具會(huì )自動(dòng)給你加上的。
3、使用DCM可以消除時(shí)鐘skew
使用DCM可以消除時(shí)鐘skew。這個(gè)東西一直是我以前所沒(méi)有想清楚的,時(shí)鐘從DCM輸出開(kāi)始走線(xiàn)到寄存器,這段skew的時(shí)間總是存在的,為什么用DCM就可以消除呢?直到有一天忽然豁然開(kāi)朗,才明白其原委。對高手來(lái)說(shuō),也許是極為easy的事情,但也許有些朋友并不一定了解,所以寫(xiě)出來(lái)和大家共享。
為說(shuō)明方便起見(jiàn),我們將BUFG的輸出引腳叫做clk_o,從clk_o走全局時(shí)鐘布線(xiàn)到寄存器時(shí)叫做clk_o_reg,從clk_o走線(xiàn)到DCM的反饋引腳CLKFB上時(shí)叫clkfb,如圖所示。實(shí)際上clk_o, clk_o_reg, clkfb全部是用導線(xiàn)連在一起的。
所謂時(shí)鐘skew,指的就是clk_o到clk_o_reg之間的延時(shí)。如果打開(kāi)FPGA_Editor看底層的結構,就可以發(fā)現雖然DCM和BUFG離得很近,但是從clk_o到clkfb卻繞了很長(cháng)一段才走回來(lái),從而導致從clk_o到clk_o_reg和clkfb的延時(shí)大致相等。
總之就是clk_o_reg和clkfb的相位應該相等。所以當DCM調節clkin和clkfb的相位相等時(shí),實(shí)際上就調節了clkin和clk_o_reg相等。而至于clk_1x和clk_o的相位必然是超前于clkin, clkfb, clk_o_reg的,而clk_1x和clk_o之間的延時(shí)就很明顯,就是經(jīng)過(guò)那個(gè)BUFG的延遲時(shí)間。
4、對時(shí)鐘skew的進(jìn)一步討論
最后,說(shuō)一說(shuō)時(shí)鐘skew的概念。時(shí)鐘skew實(shí)際上指的是時(shí)鐘驅動(dòng)不同的寄存器時(shí),由于寄存器之間可能會(huì )隔得比較遠,所以時(shí)鐘到達不同的寄存器的時(shí)間可能會(huì )不一樣,這個(gè)時(shí)間差稱(chēng)為時(shí)鐘skew。這種時(shí)鐘skew可以通過(guò)時(shí)鐘樹(shù)來(lái)解決,也就是使時(shí)鐘布線(xiàn)形成一種樹(shù)狀結構,使得時(shí)鐘到每一個(gè)寄存器的距離是一樣的。很多FPGA芯片里就布了這樣的時(shí)鐘樹(shù)結構。也就是說(shuō),在這種芯片里,時(shí)鐘skew基本上是不存在的。
說(shuō)到這里,似乎有了一個(gè)矛盾,既然時(shí)鐘skew的問(wèn)題用時(shí)鐘樹(shù)就解決了,那么為什么還需要DCM+BUFG來(lái)解決這個(gè)問(wèn)題?另外,既然時(shí)鐘skew指的是時(shí)鐘驅動(dòng)不同寄存器之間的延時(shí),那么上面所說(shuō)的clk_o到clk_o_reg豈非不能稱(chēng)為時(shí)鐘skew?
先說(shuō)后一個(gè)問(wèn)題。在一塊FPGA內部,時(shí)鐘skew問(wèn)題確實(shí)已經(jīng)被FPGA的時(shí)鐘方案樹(shù)解決,在這個(gè)前提下clk_o到clk_o_reg充其量只能叫做時(shí)鐘延時(shí),而不能稱(chēng)之為時(shí)鐘skew??上У氖荈PGA的設計不可能永遠只在內部做事情,它必然和外部交換數據。例如從外部傳過(guò)來(lái)一個(gè)32位的數據以及隨路時(shí)鐘,數據和隨路時(shí)鐘之間滿(mǎn)足建立保持時(shí)間關(guān)系(Setup Hold time),你如何將這32位的數據接收進(jìn)來(lái)?如果你不使用DCM,直接將clkin接在BUFG的輸入引腳上,那么從你的clk_o_reg就必然和clkin之間有個(gè)延時(shí),那么你的clk_o_reg還能保持和進(jìn)來(lái)的數據之間的建立保持關(guān)系嗎?顯然不能。相反,如果你采用了DCM,接上反饋時(shí)鐘,那么clk_o_reg和clkin同相,就可以利用它去鎖存進(jìn)來(lái)的數據??梢?jiàn),DCM+BUFG的方案就是為了解決這個(gè)問(wèn)題。而這個(gè)時(shí)候clk_o到clk_o_reg的延時(shí),我們可以看到做內部寄存器和其他芯片傳過(guò)來(lái)的數據之間的時(shí)鐘skew。
由此,我們可以得出一個(gè)推論,從晶振出來(lái)的時(shí)鐘作為FPGA的系統時(shí)鐘時(shí),我們可以不經(jīng)過(guò)DCM,而直接接到BUFG上就可以,因為我們并不在意從clkin到clk_o_reg的這段延時(shí)。
評論