現(xiàn)在的FPGA算法的實(shí)現(xiàn)有下面幾種方法:
1. Verilog/VHDL 語言的開發(fā) ;
2. system Generator;
3. ImpulsC 編譯器實(shí)現(xiàn)從 C代碼到 HDL 語言;
4. Vivado HLS。
本文主要講述第二種方法的配置方法。
system Generator
System generator 可以和 ISE or Vivado 進(jìn)行無縫連接。 但是需要有個(gè)版本的對應(yīng)關(guān)系:
System generator 安裝之后會(huì)在Simulin模塊庫中添加一些Xilinx FPGA專用的模塊庫,包括Basic Element,Communication,Control Logic,DataTypes,DSP,Math,Memory,Shared Momory,Tool等模塊庫,只有使用這里的模塊才能進(jìn)行FPGA算法的仿真以及進(jìn)行綜合等等。使用這些模塊就可以簡單的選一些模塊,連一些線就能自動(dòng)生成你需要的HDL代碼,將開發(fā)人員從底層枯燥的代碼編寫中解脫出來,將更多的精力放在算法上,非常完美的體現(xiàn)了工具為人服務(wù)的理念。 ISE14.7 ,Vavido HLS 已經(jīng)能夠使用C和C++生成HDL代碼,那個(gè)主要是針對Xilinx公司7系列的FPGA,有興趣的同學(xué)可以嘗試。另外 Matlab2013a 將HDL coder作為一個(gè)獨(dú)立的工具添加進(jìn)來,已經(jīng)能夠支持Xilinx公司的FPGA。
一、System Generator快速入門
(一).Xilinx Blockset庫的基本介紹
System Generator和Simulink是無縫鏈接的,可以在MATLAB標(biāo)準(zhǔn)工具欄中直接啟動(dòng),如圖1-1所示。這些模塊都根據(jù)其功能劃分為不同的庫,為了易于使用,又在某些庫中添加了部分有廣泛應(yīng)用的模塊,所有的模塊都按字母順序排列在Xilinx Index庫中。讀者需要注意的是:在Simulink環(huán)境中,只有通過Xilinx模塊搭建的系統(tǒng)才能保證硬件可實(shí)現(xiàn),其地位類似于HDL語言中的可綜合語句。
圖1-1 Xilinx DSP模塊集 (Xilinx Blockset)
從設(shè)計(jì)流程中可以看出,熟悉Xilinx DSP基本模塊庫是設(shè)計(jì)流程中的關(guān)鍵環(huán)節(jié),只有掌握了基本模塊的特性和功能,才能更好地實(shí)現(xiàn)算法。由Xilinx模塊庫和System Generator一起,可生成Xilinx可編程器件的最優(yōu)邏輯,這屬于最低層的設(shè)計(jì)模塊,地位等效于IP Core,共有90多個(gè)。Xilinx模塊庫簡要說明如表1-1所列。
表1-1 System Generator庫的簡要說明
1.基本單元模塊 (Basic Elements)
基本單元模塊庫中包含了數(shù)字邏輯的標(biāo)準(zhǔn)組件模塊,使用這些模塊可插入時(shí)間延遲、改變信號速率、引入常數(shù)、計(jì)數(shù)器以及多路復(fù)用器等。此外,還包含了3個(gè)特殊的模塊System Generator標(biāo)志、黑盒子模塊(Black Box)以及邊界定義模塊,后文將對其進(jìn)行詳細(xì)說明。該庫中簡要的模塊說明如表1-2所列。
表1-2 基本單元模塊的說明列表
2.通信模塊 (communication )
通信應(yīng)用是FPGA的主要應(yīng)用領(lǐng)域之一,因此Xilinx的通信模塊庫提供了用于實(shí)現(xiàn)數(shù)字通信的各種函數(shù),包括卷積編解碼、RS編解碼以及交織器等模塊。該庫中簡要的模塊說明如表1-3所列。
表1-3 通信模塊的說明列表
3.控制邏輯模塊 (Control Logic)
控制邏輯主要包括了用于創(chuàng)建各種控制邏輯和狀態(tài)機(jī)的資源,包括了邏輯表達(dá)式模塊、軟核控制器、復(fù)用器以及存儲器,其簡要說明如表1-4所列。
表1-4 控制邏輯模塊的說明列表
4.?dāng)?shù)據(jù)類型模塊 (Data Types)
數(shù)據(jù)類型模塊主要用于信號的數(shù)據(jù)類型轉(zhuǎn)換,包括移位、量化、并/串、串/并轉(zhuǎn)換以及精度調(diào)整模塊,其簡要說明如表1-5所列。
表1-5 數(shù)據(jù)類型模塊的說明列表
5.DSP模塊
DSP模塊是System Generator的核心,該庫包含了所有常用的DSP模塊,其簡要說明如表1-6所列。
表1-6 DSP模塊的說明列表
6.?dāng)?shù)學(xué)運(yùn)算模塊 (Math)
數(shù)學(xué)運(yùn)算是任何程序所不可避免的,Xilinx提供了豐富的數(shù)學(xué)運(yùn)算庫,包括基本四則運(yùn)算、三角運(yùn)算以及矩陣運(yùn)算等,其簡要說明如表1-7所列。
表1-7 數(shù)學(xué)運(yùn)算模塊的說明列表
7.存儲器模塊 (Memory)
該庫包含了所有Xilinx存儲器的Logic Core,其簡要說明如表1-8所列。
表1-8 存儲器模塊的說明列表
8.共享儲存器模塊
without it
共享存儲器模塊主要用于共享存儲器操作。
表1-9 共享存儲器模塊的說明列表
9.工具模塊 (Tools)
工具模塊包含了FPGA設(shè)計(jì)流程中常用的ModelSim、ChipScope、資源評估等模塊以及算法設(shè)計(jì)階段的濾波器設(shè)計(jì)等模塊。該庫的模塊在設(shè)計(jì)中起輔助作用,都是設(shè)計(jì)工具,一般不能生成HDL設(shè)計(jì),其簡要說明如表1-10所列。
表1-10 工具模塊的說明列表
(二).FPGA邊界定義模塊
System Generator是FPGA實(shí)現(xiàn)和算法開發(fā)之間橋梁,通過兩個(gè)標(biāo)準(zhǔn)模塊“Gateway In”和“Gateway Out”來定義Simulink仿真模型中FPGA的邊界。“Gateway In”模塊標(biāo)志著FPGA邊界的開始,能夠?qū)⑤斎氲母↑c(diǎn)轉(zhuǎn)換成定點(diǎn)數(shù)?!癎ateway Out”模塊標(biāo)志著FPGA邊界的結(jié)束,將芯片的輸出數(shù)據(jù)轉(zhuǎn)換成雙精度數(shù)。在Simulink環(huán)境中雙擊這兩個(gè)模塊會(huì)彈出配置對話框,可以設(shè)定不同的轉(zhuǎn)換規(guī)則,如圖1-1所示。
圖1-1 轉(zhuǎn)換模塊示意圖
3.System Generator標(biāo)志
每個(gè)System Generator應(yīng)用框圖都必須至少包含一個(gè)System Generator標(biāo)志,如圖1-2所示,否則會(huì)提示錯(cuò)誤。標(biāo)志模塊用來驅(qū)動(dòng)整個(gè)FPGA實(shí)現(xiàn)過程,不與任何模塊相連。雙擊標(biāo)志模塊,可以打開屬性編輯框,能夠設(shè)置目標(biāo)網(wǎng)表、器件型號、目標(biāo)性能以及系統(tǒng)時(shí)鐘頻率等指標(biāo)。
圖1-2 System Generator標(biāo)志模塊示意圖
4.建立簡易的DSP設(shè)計(jì)
一旦定義了FPGA邊界就可以通過Xilinx DSP模塊集合來建立各種DSP設(shè)計(jì),包括濾波器、存儲器、算術(shù)運(yùn)算器、邏輯和比特操作器等豐富資源,每個(gè)模塊都有詳細(xì)的工作頻率和比特寬度定義。標(biāo)準(zhǔn)的Simulink模塊不能在“Gateway In”和“Gateway Out”之間使用,但常用來產(chǎn)生測試數(shù)據(jù)以及對FPGA的輸出數(shù)據(jù)進(jìn)行處理和分析。下面給出一個(gè)簡單的FPGA系統(tǒng)設(shè)計(jì)實(shí)例。
例1-1 使用System Generator建立一個(gè)3輸入(a、b、c)的DSP48 模塊的計(jì)算電路,使得輸出p=c+a*b,并利用標(biāo)準(zhǔn)的Simulink模塊對延遲電路進(jìn)行功能驗(yàn)證。
1)打開Simulink庫瀏覽器并建立一個(gè)新的Simulink模型,并保存為mydsp.mdl。
2)在瀏覽器中選擇Xilinx DSP48 Macro 3.0 模塊,并將其拖拽到my_DSP.mdl;按照同樣的方法添加邊界定義模塊以及System Generator標(biāo)志模塊。
3)為了測試DSP計(jì)算電路,添加Simulink標(biāo)準(zhǔn)庫中的常數(shù)模塊(Constant)和顯示器(Display)模塊。其中常數(shù)模塊用于向DSP計(jì)算電路灌數(shù)據(jù),作為測試激勵(lì);顯示器則用于觀測輸出數(shù)據(jù)。
4)連接模塊,將所有的獨(dú)立模塊連成一個(gè)整體。其中Xilinx模塊之間的端口可以直接相互連接,直接從一個(gè)端口拖拽鼠標(biāo)到另一個(gè)端口來完成,或選中目標(biāo)模塊,按住Ctrl鍵,再點(diǎn)擊要連接的模塊,Simulink即可自動(dòng)將兩個(gè)模塊連接起來;而Xilinx模塊和非Xilinx模塊之間的連接則需要邊界模塊(Gateway)來銜接。經(jīng)過連接的設(shè)計(jì)如圖1-3所示。
圖1-3 延遲模塊以及測試平臺的組成架構(gòu)
5)設(shè)定系統(tǒng)參數(shù)。雙擊“System Generator”模塊,會(huì)出現(xiàn)系統(tǒng)設(shè)定對話框,如圖1-4所示。其中“Compilation”欄選擇編譯生成對象,包括HDL網(wǎng)表、FPGA配置比特流、NGC網(wǎng)表、EDK導(dǎo)出工具、硬件協(xié)仿真類型以及時(shí)序分析文件等6種類型,本例選擇HDL網(wǎng)表類型,會(huì)生成ISE工程以及相應(yīng)的HDL代碼;“Part”欄用于選擇芯片型號,本例選擇Zynq 7020?!癟arget”欄用于選擇目標(biāo)文件存放路徑,本例使用默認(rèn)值,則會(huì)在mydelay.mdl所在文件夾中自動(dòng)生成一個(gè)netlist的文件夾,用于存放相應(yīng)的輸出文件。綜合工具選擇XST,HDL語言選擇Verilog類型,系統(tǒng)時(shí)鐘設(shè)的周期為100ns,即為10MHz。 “Clock Pin Location”欄的文本框中輸入系統(tǒng)時(shí)鐘輸入管腳,則會(huì)自動(dòng)生成管腳約束文件(由于本例只是演示版,所以該項(xiàng)空閑)。此外,可選中“Create testbench”選項(xiàng),自動(dòng)生成設(shè)計(jì)的測試代碼。各項(xiàng)參數(shù)確認(rèn)無誤后,單擊“OK”鍵,保存參數(shù)。
?
1-4 系統(tǒng)參數(shù)設(shè)定對話框
6)設(shè)置關(guān)鍵模塊參數(shù)。雙擊“Gataway In”、“Gataway Out”模塊,會(huì)彈出圖1-5和圖 1-6所示的對話框。Gataway In模塊屬性可查看輸入數(shù)據(jù)位寬和量化規(guī)則。
?
圖1-5 Gataway In模塊屬性對話框/圖1-6Gataway Out模塊屬性對話框
7)運(yùn)行測試激勵(lì)。當(dāng)參數(shù)設(shè)置完成后,點(diǎn)擊工具欄的“run ”按鍵,即可運(yùn)行Simulink仿真,可以看到顯示器輸出為46,表明設(shè)計(jì)的功能是正確的。
8)生成HDL代碼。單擊 system Generator 窗口的“Generate”按鍵,System Generator可自動(dòng)將設(shè)計(jì)轉(zhuǎn)化成HDL代碼。整個(gè)轉(zhuǎn)化過程的起始和結(jié)束提示界面分別如圖1-6和圖 1-7所示。
圖1-6 自動(dòng)生成代碼過程的起始提示標(biāo)志/圖1-7 自動(dòng)生成代碼過程的結(jié)束提示標(biāo)志
讀者可在相應(yīng)的文件夾netlist 里的 sysgen 子目錄中打開“my_dsp.v”文件,查看相應(yīng)的代碼,用戶可將其作為子模塊直接使用。
二、System Generator中的信號類型
System Generator是面向硬件設(shè)計(jì)的工具,因此數(shù)據(jù)類型只能是定點(diǎn)的,而Simulink中的基本數(shù)據(jù)類型是雙精度浮點(diǎn)型,因此Xilinx模塊和Simulink模塊連接時(shí)需要通過邊界模塊來轉(zhuǎn)換?!癎ateway In”模塊把浮點(diǎn)數(shù)轉(zhuǎn)換成定點(diǎn)數(shù),“Gateway Out”把定點(diǎn)數(shù)轉(zhuǎn)換成浮點(diǎn)數(shù)。此外,對于Simulink中的連續(xù)時(shí)間信號,還必須經(jīng)過“Gateway In”模塊的采樣轉(zhuǎn)換才能使用。
System Generator中的數(shù)據(jù)類型命名規(guī)則是非常簡易且便于記憶的形式,如Fix_8_6表示此端口為8比特有符號數(shù),其中6比特為小數(shù)部分。如果是無符號數(shù),則帶有“Ufix”前綴。在System Generator中,可通過選擇 “Format” 菜單中的“Port/Signal Display Port Data Types”命令,來顯示所有端口的數(shù)據(jù)類型,形象顯示整個(gè)系統(tǒng)的數(shù)據(jù)精度。
Xilinx模塊基本上都是多形態(tài)的,即可根據(jù)輸入端口的數(shù)據(jù)類型來確定輸出數(shù)據(jù)類型,但在有些情況下需要擴(kuò)展信號寬度來保證不丟失有效數(shù)據(jù)。此外,也允許設(shè)計(jì)人員自定義模塊的輸入、輸出數(shù)據(jù)的量化效果以及飽和處理。在圖8-14所示的“Gateway In”模塊屬性對話框中,“Output type”選擇數(shù)據(jù)為布爾型、有符號數(shù)還是無符號數(shù);“Number of bits”即為定點(diǎn)數(shù)的位寬;“Binary point”為小數(shù)部分的寬度;“Quantization”選擇定點(diǎn)量化模式;“Overflow”用于設(shè)定飽和處理模式;“Sample period”用于對連續(xù)時(shí)間信號的采樣。因此按照System Generator的數(shù)據(jù)形式命名規(guī)則,“Gateway In”模塊的數(shù)據(jù)類型為Fix/Ufix_(Number of bits)_(Binary point )。
此外,還有DSP48 instruction,顯示為“UFix_11_0”,是Xilinx針對數(shù)字信號處理的專用模塊,用于實(shí)現(xiàn)乘加運(yùn)算。
三、 自動(dòng)代碼生成
System Generator能夠自動(dòng)地將設(shè)計(jì)編譯為低級的HDL描述,且編譯方式多樣,取決于System Generator標(biāo)志中的設(shè)置。為了生成HDL代碼,還需要生成一些輔助下載的文件工程文件、約束文件等,和用于驗(yàn)證的測試代碼(HDL testbench)。
1.編譯并仿真System Generator模塊
前面已經(jīng)提到要對一個(gè)System Generator的設(shè)計(jì)進(jìn)行仿真或者將其轉(zhuǎn)化成硬件,則設(shè)計(jì)中必須包含一個(gè)System Generator生成標(biāo)志。也可以將多個(gè)生成標(biāo)志分布于不同的層中(一層一個(gè)),在層狀結(jié)構(gòu)中,處于別的層下的稱為從模塊,不屬于從模塊的則為主模塊。但是特定的參數(shù)(如系統(tǒng)時(shí)鐘頻率)只能在主模塊中設(shè)置。
對于任一添加的模塊,都可以在System Generator模塊中指定其代碼生成方式和仿真處理形式,要編譯整個(gè)系統(tǒng),在頂層模塊中利用System Generator模塊生成代碼即可。
不同編譯類型的設(shè)定將會(huì)產(chǎn)生不同的輸出文件,可選的編譯類型包括兩個(gè)網(wǎng)表文件類型(HDL網(wǎng)表和NGC網(wǎng)表)、比特流文件類型、EDK導(dǎo)出工具類型以及時(shí)序分析類型等4類。
HDL網(wǎng)表類型是最常用的網(wǎng)表結(jié)構(gòu),其相應(yīng)的輸出結(jié)果包括HDL代碼文件、EDIF文件和一些用于簡化下載過程的輔助文件。設(shè)計(jì)結(jié)果可以直接被綜合工具(如XST等)綜合,也可以反饋到Xilinx物理設(shè)計(jì)工具(如ngdbuild、map、par和bitgen等)來產(chǎn)生配置FPGA的比特流文件。編譯產(chǎn)生的文件類型如ISE中是一致的。NGC網(wǎng)表類型的編譯結(jié)果和HDL網(wǎng)表類似,只是用NGC文件代替了HDL代碼文件。
比特流文件類型的編譯結(jié)果是直接能夠配置FPGA的二進(jìn)制比特流文件,并能直接在FPGA硬件平臺上直接運(yùn)行的。如果安裝了硬件協(xié)仿真平臺,可以通過選擇“Hardware Co-simulation > XtremeDSP Development Kit > PCI and USB”,生成適合XtremeDSP開發(fā)板的二進(jìn)制比特流文件。
EDK導(dǎo)出工具類型的編譯結(jié)果是可以生成直接導(dǎo)入Xilinx嵌入式開發(fā)工具(EDK)的工程文件以及不同類型的硬件協(xié)仿真文件。
時(shí)序分析類型的編譯結(jié)果是該設(shè)計(jì)的時(shí)序分析報(bào)告。
2.編譯約束文件
在編譯一個(gè)設(shè)計(jì)時(shí),System Generator會(huì)根據(jù)用戶的配置產(chǎn)生相應(yīng)的約束文件,通知下載配置工具如何處理設(shè)計(jì)輸入,不僅可以完成更高質(zhì)量的實(shí)現(xiàn),還能夠節(jié)省時(shí)間。
約束文件可控的指標(biāo)包括:
系統(tǒng)時(shí)鐘的周期;
系統(tǒng)工作速度,和系統(tǒng)時(shí)鐘有關(guān)、設(shè)計(jì)的各個(gè)模塊必須運(yùn)行的速度;
管腳分配;
各個(gè)外部管腳以及內(nèi)部端口的工作速度。
約束文件的格式取決于System Generator模塊的綜合工具:對于XST,其文件為XCF格式;對于Synplify/Synplify Pro,則使用NCF文件格式。
系統(tǒng)時(shí)鐘在System Generator標(biāo)志中設(shè)定,編譯時(shí)將其寫入約束文件,在實(shí)現(xiàn)時(shí)將其作為頭等目標(biāo)。在實(shí)際設(shè)計(jì)中,常常包含速度不同的多條路徑,其中速度最高的采用系統(tǒng)時(shí)鐘約束,其余路徑的驅(qū)動(dòng)時(shí)鐘只能通過系統(tǒng)時(shí)鐘的整數(shù)倍分頻得到。當(dāng)把設(shè)計(jì)轉(zhuǎn)成硬件實(shí)現(xiàn)時(shí),“Gateway In”和“Gateway Out”模塊就變成了輸入、輸出端口,其管腳分配和接口數(shù)據(jù)速率必須在其參數(shù)對話框中設(shè)定,編譯時(shí)會(huì)將其寫入I/O時(shí)序約束文件中。
3.HDL測試代碼
通常System Generator設(shè)計(jì)的比特寬度和工作頻率都是確定的,因此Simulink仿真結(jié)果也要在硬件上精確匹配,需要將HDL仿真結(jié)果和Simulink仿真結(jié)果進(jìn)行比較,才能確認(rèn)HDL代碼的正確性。特別當(dāng)其包含黑盒子模塊時(shí),這樣的驗(yàn)證顯得格外重要。System Generator提供了自動(dòng)生成測試代碼的功能,并能給出HDL代碼仿真正確與否的指示。
假設(shè)設(shè)計(jì)的名字是,雙擊頂層模塊的System Generator標(biāo)志,將Compilation選項(xiàng)設(shè)為HDL Netlist,選中Create Testbench選項(xiàng),然后點(diǎn)擊Generate選項(xiàng),不僅可以生成常用的設(shè)計(jì)文件,還有下面的測試文件:
_tb.vhd/.v文件,包含完整的HDL測試代碼;
Various.dat文件,包含了測試代碼仿真時(shí)的測試激勵(lì)向量和期望向量;
腳本Scripts vcom.do和vsim.do文件,用于在Modelsim中完成測試代碼的編譯和仿真,并將其結(jié)果和自動(dòng)編譯產(chǎn)生的HDL測試向量進(jìn)行比較。
Various.dat文件是System Generator將通過“Gataway In/Out”模塊的數(shù)據(jù)保存下來而形成的,其中經(jīng)過輸入模塊的數(shù)據(jù)是測試激勵(lì),而通過輸出模塊的數(shù)據(jù)就是期望結(jié)果。測試代碼只是簡單的封裝器,將測試激勵(lì)送進(jìn)生成的HDL代碼,然后對輸出結(jié)果和期望結(jié)果完成比較,給出正確指示。
四、 編譯MATLAB設(shè)計(jì)生成FPGA代碼
Xilinx公司提供了兩種方法將MATLAB設(shè)計(jì).m文件轉(zhuǎn)化為HDL設(shè)計(jì),一種就是利用AccelDSP綜合器;另一種就是直接利用MCode模塊。前者多應(yīng)用于復(fù)雜或高速設(shè)計(jì)中,常用來完成高層次的IP核開發(fā);而后者使用方便,支持MATLAB語言的有限子集,對實(shí)現(xiàn)算術(shù)運(yùn)算、有限狀態(tài)機(jī)和邏輯控制是非常有用的。本節(jié)內(nèi)容以介紹MCode模塊為主。
MCode模塊實(shí)現(xiàn)的是裝載在里面的.m函數(shù)的功能。此外,還能夠使用Xilinx的定點(diǎn)類型數(shù)對.m函數(shù)進(jìn)行評估。該模塊使用回歸狀態(tài)變量以保證內(nèi)部狀態(tài)穩(wěn)定不變,其輸入、輸出端口都由.m函數(shù)確定。
要使用MCode模塊,必須實(shí)現(xiàn)編寫.m函數(shù),且代碼文件必須和System Generator模型文件放在同一個(gè)文件夾中,或者處于MATLAB路徑上的文件夾中。下面用兩個(gè)實(shí)例來說明如何使用MCode模塊。
例1-1 使用MATLAB編寫一個(gè)簡單的移位寄存器完成對輸入數(shù)據(jù)乘8以及除以4的操作,并使用MCode將其編譯成System Generator直接可用的定點(diǎn)模塊。
.m 函數(shù)的生成是比較簡單的,我們只需要 new function ,然后將相應(yīng)的函數(shù)代碼輸入,并且保存即可。
1.相關(guān)的.m函數(shù)代碼為:
function [lsh3, rsh2] = xlsimpleshift(din)
% [lsh3, rsh2] = xlsimpleshift(din) does a left shift 3 bits and a
% right shift 2 bits. The shift operation is accomplished by
% multiplication and division of power of two constant.
lsh3 = din * 8;
rsh2 = din / 4;
2.將.m函數(shù)添加到下列三個(gè)位置之一:
模型文件存放的位置;
模型目錄下名字為private的子文件夾;
MATLAB路徑下。
然后,新建一個(gè)System Generator設(shè)計(jì),添加MCode模塊,雙擊模塊,在彈出頁面中,通過Browse按鍵將.m函數(shù)和模型設(shè)計(jì)關(guān)聯(lián)起來,如圖1-8所示。 當(dāng)我們想修改MCode 代碼時(shí)候,我們只需要雙擊該模塊,然后彈出屬性窗口,選擇 Edit M-File 即可。
?
圖1-8 MCode模塊關(guān)聯(lián)界面示意圖
3.添加邊界模塊、Sytem Generator模塊、正弦波測試激勵(lì)以及示波器模塊構(gòu)成完整的設(shè)計(jì),如圖1-9所示。
圖1-9 簡單移位模塊設(shè)計(jì)示意圖
4.運(yùn)行仿真,得到的結(jié)果如圖1-10所示,從中可以看出,設(shè)計(jì)是正確的,正確實(shí)現(xiàn)了.m文件的功能。左圖將信號放大了8倍,右圖將信號縮小了4倍。
?
圖1-10 簡單移位模塊仿真結(jié)果示意圖
5.自動(dòng)生成代碼,得到的Verilog文件如下所列。
module myshift (
din,
dout1,
dout2
);
input [15:0] din;
output [15:0] dout1;
output [15:0] dout2;
wire [15:0] din_net;
wire [15:0] dout1_net;
wire [15:0] dout2_net;
assign din_net = din;
assign dout1 = dout1_net;
assign dout2 = dout2_net;
mcode_6b96190926 mcode (
.e(1'b0),
.lk(1'b0),
.lr(1'b0),
.in(din_net),
.sh3(dout1_net),
.sh2(dout2_net)
);
endmodule
五、子系統(tǒng)的建立和使用
System Generator設(shè)計(jì)經(jīng)常作為大型HDL設(shè)計(jì)的一部分,本節(jié)就介紹如何使用System Generator來建立子系統(tǒng)模塊,以及如何在整個(gè)系統(tǒng)中對其進(jìn)行仿真。
1.子系統(tǒng)的建立以及仿真方法
子系統(tǒng)就是HDL語言中的模塊,也類似于C++語言中的函數(shù),是有效執(zhí)行自頂向下設(shè)計(jì)的必備手段。如果將一個(gè)復(fù)雜設(shè)計(jì)完全在一個(gè)單獨(dú)設(shè)計(jì)中實(shí)現(xiàn),則該設(shè)計(jì)的驗(yàn)證和復(fù)查工作將是設(shè)計(jì)人員的噩夢。此外,從設(shè)計(jì)復(fù)用的角度講,子系統(tǒng)可以IP核的方式為多個(gè)設(shè)計(jì)使用,具有高的可重用性,能節(jié)省大系統(tǒng)的開發(fā)時(shí)間。
建立子系統(tǒng)最簡單的方法就是利用NGC二進(jìn)制網(wǎng)表文件,將System Generator設(shè)計(jì)封裝成一個(gè)單獨(dú)的二進(jìn)制模塊,這樣綜合工具將其作為黑盒子看待。在建立子系統(tǒng)時(shí),管腳約束不能在Gataway模塊中定義,同樣時(shí)鐘管腳也不能在System Generator模塊中定義,應(yīng)通過網(wǎng)表編輯器來指定物理約束,這是因?yàn)镹GC網(wǎng)表中不僅包括了邏輯設(shè)計(jì),還包括了設(shè)計(jì)的約束信息。在復(fù)雜系統(tǒng)中建立子系統(tǒng)的設(shè)計(jì)流程如下所示:
圖1-11 建立子系統(tǒng)的設(shè)計(jì)流程
1)NGC網(wǎng)表文件
如圖1-11所示,生成NGC網(wǎng)表是建立子系統(tǒng)的第一步。在System Generator標(biāo)志中將編譯生成文件類型選為NGC List,如圖1-12所示。如果設(shè)計(jì)中有時(shí)鐘驅(qū)動(dòng)電路,點(diǎn)擊Generate后,會(huì)在目標(biāo)文件夾生成“_cw.ngc”文件,否則會(huì)生成“.ngc”文件,其中就是設(shè)計(jì)的名字。NGC網(wǎng)表文件包括設(shè)計(jì)中所有的邏輯和約束信息,這意味著將System Generator生成的所有HDL文件、內(nèi)核以及約束等文件封裝成一個(gè)單獨(dú)的文件。
圖7-22 選擇編譯生成文件類型
2)設(shè)計(jì)規(guī)則
在復(fù)雜系統(tǒng)中使用子模塊時(shí),必須遵循下面兩條規(guī)則。
首先,不能在子模塊設(shè)計(jì)文件中出現(xiàn)“Gateway In”、“Gateway Out”以及System Generator標(biāo)志模塊,否則NGDBuild工具會(huì)產(chǎn)生下面的警告:
WARNING: NgdBuild:483 - Attribute "LOC" on "clk" is on the wrong type of
object. Please see the Constraints Guide for more information on this
attribute.
其次,不能在綜合的時(shí)候往NGC網(wǎng)表文件中插入I/O緩存器,否則會(huì)報(bào)錯(cuò)。I/O緩存器只能在頂層模塊中使用。
3)邏輯綜合
當(dāng)使用子系統(tǒng)的NGC網(wǎng)表文件綜合時(shí),其流程如圖1-13所示。NGC模塊可在頂層模塊中以黑盒子的方式直接例化。為了簡化該過程,當(dāng)通過NGC目標(biāo)編譯后,System Generator提供了HDL例化模板,保存在設(shè)計(jì)路徑,且以“_cw.veo”命名。當(dāng)選擇VHDL語言時(shí),則其模板名為“_cw.vho”。
圖1-13 綜合時(shí)的流程圖
4)仿真
把System Generator模型編譯成NGC目標(biāo)后,生成的HDL文件卻只能完成HDL仿真,不能在ISE中綜合。由于HDL文件不能包含在工程中,如果要在HDL仿真器中運(yùn)行整個(gè)設(shè)計(jì),就必須指定用戶.do文件。除了HDL文件之外,還需要將內(nèi)存初始化文件(.mif)和系數(shù)文件(.coe)和HDL文件放在同一文件夾中。
2.可配置子系統(tǒng)的建立
可配置子系統(tǒng)是一類可以作為標(biāo)準(zhǔn)元件使用的Simulink模塊,但又和標(biāo)準(zhǔn)元件模塊不同,其存在多種可選功能,每一種功能都可以實(shí)現(xiàn),可以讓用戶靈活選擇。以可配置FIR濾波器為例,實(shí)現(xiàn)快速濾波器需要很多資源,而許多低速的濾波器卻只需要相對很少的資源,將其做成可配置的模塊,就可以允許用戶根據(jù)實(shí)際情況在速度和硬件代價(jià)之間做出最優(yōu)平衡。這體現(xiàn)了可配置子模塊最大的優(yōu)勢。
1)定義一個(gè)可配置子模塊
可通過新建Simulink庫來定義可配置子系統(tǒng),且可選模塊的實(shí)現(xiàn)也由庫來管理。下面給出新建建庫的具體步驟:
(1)新建一個(gè)空白庫,如圖1-14所示。
圖1-14 新建空白庫
(2)在庫里添加基本實(shí)例模塊,如圖1-15所示?;緦?shí)例模塊可以是System Generator中的任意組件。
圖1-15 添加基本實(shí)例模塊
(3)在庫里面添加可配置子系統(tǒng)模版,如圖1-16所示。模版可以在Simulink庫瀏覽器中找到,其具體位置為“Simulink/Ports & Subsystems/Configurable Subsystem”。如果有需要,用戶可以修改該模版的名字。
圖1-16 添加可配置子系統(tǒng)模塊
(4)保存庫文件,然后雙擊模版模塊,會(huì)彈出如圖1-17所示的屬性配置界面。根據(jù)實(shí)現(xiàn)的需要選中相關(guān)模塊的檢驗(yàn)框。最后單擊“OK”再次保存庫文件。
圖1-17 屬性配置界面
2)使用可配置子系統(tǒng)
要在設(shè)計(jì)中使用可配置子系統(tǒng),先按照上面的步驟定義子系統(tǒng),然后打開庫,將需要的模版模塊拖到設(shè)計(jì)中合適的位置,這樣設(shè)計(jì)中就有了可配置子系統(tǒng)的實(shí)例,如圖1-18所示的FIR濾波器模塊。
?
圖1-18 可配置子系統(tǒng)實(shí)例
在實(shí)例模塊上點(diǎn)擊右鍵,然后選擇Block Choice選項(xiàng)中的Xilinx DA FIR,將實(shí)例作為基礎(chǔ)實(shí)現(xiàn)模塊使用。如圖1-19所示。
圖1-19 將實(shí)例作為基礎(chǔ)實(shí)現(xiàn)模塊
3)在可配置子模塊中添加和刪除實(shí)例模塊
添加和刪除子系統(tǒng)是編輯、修改可配置子系統(tǒng)的基本操作,按照下面的步驟可以從可配置子系統(tǒng)中刪除實(shí)例模塊:
(1)打開并解鎖子系統(tǒng)的庫;雙擊模版模塊,然后在彈出的用戶界面中取消相應(yīng)模塊檢驗(yàn)框的選定,單擊“OK”就可以刪除掉相應(yīng)的子模塊,如圖1-20所示;再保存庫,重新編譯即可;最后仍需要在設(shè)計(jì)更新子系統(tǒng)。
對于添加實(shí)例模塊的步驟如下:首先,打開并解鎖子系統(tǒng)的庫;然后將實(shí)例模塊拖到子系統(tǒng)設(shè)計(jì)中,雙擊模版模塊;在彈出的用戶界面中選中所需模塊檢驗(yàn)框,單擊“OK”即可,如圖1-21所示;再保存庫,重新編譯;在已有的設(shè)計(jì)中更新子系統(tǒng)。
圖1-20 刪除子模塊/圖1-21 添加子系統(tǒng)
(2)生成可配置子模塊的硬件電路
在System Generator中,模塊可用于仿真和產(chǎn)生硬件。有時(shí)對于一個(gè)可配置子系統(tǒng),最佳的方式是其既可以成為仿真基礎(chǔ)模塊,也可以用來生成硬件電路。例如將可配置子系統(tǒng)在仿真時(shí)作為普通的模塊來產(chǎn)生仿真結(jié)果,在實(shí)現(xiàn)時(shí)作為黑盒子產(chǎn)生功能電路的HDL代碼,就是一種常用方式。System Generator提供了可配置子系統(tǒng)管理模塊來達(dá)到上述目的,其使用方法如下:
首先,打開、解鎖可配置子系統(tǒng)的庫文件(除了模版模塊),然后雙擊該模塊;
其次,將可配置子系統(tǒng)管理模塊拖到打開的庫中,該管理模塊可以在“Xilinx Blockset/Tools/ Configurable Subsystem Manager”路徑中找到,如圖1-22所示。
圖1-22 可配置子系統(tǒng)管理模塊
最后,雙擊管理模塊打開其屬性配置GUI,選擇可配置子系統(tǒng)中生成硬件電路的模塊,如圖1-23所示。單擊“OK”保存子系統(tǒng)和庫文件退出即可。
圖1-23 選擇可配置子系統(tǒng)的硬件模塊
評論
查看更多