5)設定系統參數。雙擊“System Generator”模塊,會出現系統設定對話框,如圖1-4所示。其中“Compilation”欄選擇編譯生成對象,包括HDL網表、FPGA配置比特流、NGC網表、EDK導出工具、硬件協仿真類型以及時序分析文件等6種類型,本例選擇HDL網表類型,會生成ISE工程以及相應的HDL代碼;“Part”欄用于選擇芯片型號,本例選擇Zynq 7020。“Target”欄用于選擇目標文件存放路徑,本例使用默認值,則會在mydelay.mdl所在文件夾中自動生成一個netlist的文件夾,用于存放相應的輸出文件。綜合工具選擇XST,HDL語言選擇Verilog類型,系統時鐘設的周期為100ns,即為10MHz。 “Clock Pin Location”欄的文本框中輸入系統時鐘輸入管腳,則會自動生成管腳約束文件(由于本例只是演示版,所以該項空閑)。此外,可選中“Create testbench”選項,自動生成設計的測試代碼。各項參數確認無誤后,單擊“OK”鍵,保存參數。
?
1-4 系統參數設定對話框
6)設置關鍵模塊參數。雙擊“Gataway In”、“Gataway Out”模塊,會彈出圖1-5和圖 1-6所示的對話框。Gataway In模塊屬性可查看輸入數據位寬和量化規則。
?
圖1-5 Gataway In模塊屬性對話框/圖1-6Gataway Out模塊屬性對話框
7)運行測試激勵。當參數設置完成后,點擊工具欄的“run ”按鍵,即可運行Simulink仿真,可以看到顯示器輸出為46,表明設計的功能是正確的。
8)生成HDL代碼。單擊 system Generator 窗口的“Generate”按鍵,System Generator可自動將設計轉化成HDL代碼。整個轉化過程的起始和結束提示界面分別如圖1-6和圖 1-7所示。
圖1-6 自動生成代碼過程的起始提示標志/圖1-7 自動生成代碼過程的結束提示標志
讀者可在相應的文件夾netlist 里的 sysgen 子目錄中打開“my_dsp.v”文件,查看相應的代碼,用戶可將其作為子模塊直接使用。
二、System Generator中的信號類型
System Generator是面向硬件設計的工具,因此數據類型只能是定點的,而Simulink中的基本數據類型是雙精度浮點型,因此Xilinx模塊和Simulink模塊連接時需要通過邊界模塊來轉換。“Gateway In”模塊把浮點數轉換成定點數,“Gateway Out”把定點數轉換成浮點數。此外,對于Simulink中的連續時間信號,還必須經過“Gateway In”模塊的采樣轉換才能使用。
System Generator中的數據類型命名規則是非常簡易且便于記憶的形式,如Fix_8_6表示此端口為8比特有符號數,其中6比特為小數部分。如果是無符號數,則帶有“Ufix”前綴。在System Generator中,可通過選擇 “Format” 菜單中的“Port/Signal Display Port Data Types”命令,來顯示所有端口的數據類型,形象顯示整個系統的數據精度。
Xilinx模塊基本上都是多形態的,即可根據輸入端口的數據類型來確定輸出數據類型,但在有些情況下需要擴展信號寬度來保證不丟失有效數據。此外,也允許設計人員自定義模塊的輸入、輸出數據的量化效果以及飽和處理。在圖8-14所示的“Gateway In”模塊屬性對話框中,“Output type”選擇數據為布爾型、有符號數還是無符號數;“Number of bits”即為定點數的位寬;“Binary point”為小數部分的寬度;“Quantization”選擇定點量化模式;“Overflow”用于設定飽和處理模式;“Sample period”用于對連續時間信號的采樣。因此按照System Generator的數據形式命名規則,“Gateway In”模塊的數據類型為Fix/Ufix_(Number of bits)_(Binary point )。
此外,還有DSP48 instruction,顯示為“UFix_11_0”,是Xilinx針對數字信號處理的專用模塊,用于實現乘加運算。
三、 自動代碼生成
System Generator能夠自動地將設計編譯為低級的HDL描述,且編譯方式多樣,取決于System Generator標志中的設置。為了生成HDL代碼,還需要生成一些輔助下載的文件工程文件、約束文件等,和用于驗證的測試代碼(HDL testbench)。
1.編譯并仿真System Generator模塊
前面已經提到要對一個System Generator的設計進行仿真或者將其轉化成硬件,則設計中必須包含一個System Generator生成標志。也可以將多個生成標志分布于不同的層中(一層一個),在層狀結構中,處于別的層下的稱為從模塊,不屬于從模塊的則為主模塊。但是特定的參數(如系統時鐘頻率)只能在主模塊中設置。
對于任一添加的模塊,都可以在System Generator模塊中指定其代碼生成方式和仿真處理形式,要編譯整個系統,在頂層模塊中利用System Generator模塊生成代碼即可。
不同編譯類型的設定將會產生不同的輸出文件,可選的編譯類型包括兩個網表文件類型(HDL網表和NGC網表)、比特流文件類型、EDK導出工具類型以及時序分析類型等4類。
HDL網表類型是最常用的網表結構,其相應的輸出結果包括HDL代碼文件、EDIF文件和一些用于簡化下載過程的輔助文件。設計結果可以直接被綜合工具(如XST等)綜合,也可以反饋到Xilinx物理設計工具(如ngdbuild、map、par和bitgen等)來產生配置FPGA的比特流文件。編譯產生的文件類型如ISE中是一致的。NGC網表類型的編譯結果和HDL網表類似,只是用NGC文件代替了HDL代碼文件。
比特流文件類型的編譯結果是直接能夠配置FPGA的二進制比特流文件,并能直接在FPGA硬件平臺上直接運行的。如果安裝了硬件協仿真平臺,可以通過選擇“Hardware Co-simulation > XtremeDSP Development Kit > PCI and USB”,生成適合XtremeDSP開發板的二進制比特流文件。
EDK導出工具類型的編譯結果是可以生成直接導入Xilinx嵌入式開發工具(EDK)的工程文件以及不同類型的硬件協仿真文件。
時序分析類型的編譯結果是該設計的時序分析報告。
2.編譯約束文件
在編譯一個設計時,System Generator會根據用戶的配置產生相應的約束文件,通知下載配置工具如何處理設計輸入,不僅可以完成更高質量的實現,還能夠節省時間。
約束文件可控的指標包括:
系統時鐘的周期;
系統工作速度,和系統時鐘有關、設計的各個模塊必須運行的速度;
管腳分配;
各個外部管腳以及內部端口的工作速度。
約束文件的格式取決于System Generator模塊的綜合工具:對于XST,其文件為XCF格式;對于Synplify/Synplify Pro,則使用NCF文件格式。
系統時鐘在System Generator標志中設定,編譯時將其寫入約束文件,在實現時將其作為頭等目標。在實際設計中,常常包含速度不同的多條路徑,其中速度最高的采用系統時鐘約束,其余路徑的驅動時鐘只能通過系統時鐘的整數倍分頻得到。當把設計轉成硬件實現時,“Gateway In”和“Gateway Out”模塊就變成了輸入、輸出端口,其管腳分配和接口數據速率必須在其參數對話框中設定,編譯時會將其寫入I/O時序約束文件中。
3.HDL測試代碼
通常System Generator設計的比特寬度和工作頻率都是確定的,因此Simulink仿真結果也要在硬件上精確匹配,需要將HDL仿真結果和Simulink仿真結果進行比較,才能確認HDL代碼的正確性。特別當其包含黑盒子模塊時,這樣的驗證顯得格外重要。System Generator提供了自動生成測試代碼的功能,并能給出HDL代碼仿真正確與否的指示。
假設設計的名字是,雙擊頂層模塊的System Generator標志,將Compilation選項設為HDL Netlist,選中Create Testbench選項,然后點擊Generate選項,不僅可以生成常用的設計文件,還有下面的測試文件:
_tb.vhd/.v文件,包含完整的HDL測試代碼;
Various.dat文件,包含了測試代碼仿真時的測試激勵向量和期望向量;
腳本Scripts vcom.do和vsim.do文件,用于在Modelsim中完成測試代碼的編譯和仿真,并將其結果和自動編譯產生的HDL測試向量進行比較。
Various.dat文件是System Generator將通過“Gataway In/Out”模塊的數據保存下來而形成的,其中經過輸入模塊的數據是測試激勵,而通過輸出模塊的數據就是期望結果。測試代碼只是簡單的封裝器,將測試激勵送進生成的HDL代碼,然后對輸出結果和期望結果完成比較,給出正確指示。
四、 編譯MATLAB設計生成FPGA代碼
Xilinx公司提供了兩種方法將MATLAB設計.m文件轉化為HDL設計,一種就是利用AccelDSP綜合器;另一種就是直接利用MCode模塊。前者多應用于復雜或高速設計中,常用來完成高層次的IP核開發;而后者使用方便,支持MATLAB語言的有限子集,對實現算術運算、有限狀態機和邏輯控制是非常有用的。本節內容以介紹MCode模塊為主。
MCode模塊實現的是裝載在里面的.m函數的功能。此外,還能夠使用Xilinx的定點類型數對.m函數進行評估。該模塊使用回歸狀態變量以保證內部狀態穩定不變,其輸入、輸出端口都由.m函數確定。
要使用MCode模塊,必須實現編寫.m函數,且代碼文件必須和System Generator模型文件放在同一個文件夾中,或者處于MATLAB路徑上的文件夾中。下面用兩個實例來說明如何使用MCode模塊。
例1-1 使用MATLAB編寫一個簡單的移位寄存器完成對輸入數據乘8以及除以4的操作,并使用MCode將其編譯成System Generator直接可用的定點模塊。
.m 函數的生成是比較簡單的,我們只需要 new function ,然后將相應的函數代碼輸入,并且保存即可。
1.相關的.m函數代碼為:
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函數添加到下列三個位置之一:
模型文件存放的位置;
模型目錄下名字為private的子文件夾;
MATLAB路徑下。
然后,新建一個System Generator設計,添加MCode模塊,雙擊模塊,在彈出頁面中,通過Browse按鍵將.m函數和模型設計關聯起來,如圖1-8所示。 當我們想修改MCode 代碼時候,我們只需要雙擊該模塊,然后彈出屬性窗口,選擇 Edit M-File 即可。
?
圖1-8 MCode模塊關聯界面示意圖
3.添加邊界模塊、Sytem Generator模塊、正弦波測試激勵以及示波器模塊構成完整的設計,如圖1-9所示。
圖1-9 簡單移位模塊設計示意圖
4.運行仿真,得到的結果如圖1-10所示,從中可以看出,設計是正確的,正確實現了.m文件的功能。左圖將信號放大了8倍,右圖將信號縮小了4倍。
?
圖1-10 簡單移位模塊仿真結果示意圖
5.自動生成代碼,得到的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
評論
查看更多