System Generator簡介


前言

  System generator 安裝之后會在Simulin模塊庫中添加一些Xilinx FPGA專用的模塊庫,包括Basic Element,Communication,Control Logic,DataTypes,DSP,Math,Memory,Shared Momory,Tool等模塊庫,只有使用這里的模塊才能進行FPGA算法的仿真以及進行綜合等等。

       使用這些模塊就可以簡單的選一些模塊,連一些線就能自動生成你需要的HDL代碼,將開發人員從底層枯燥的代碼編寫中解脫出來,將更多的精力放在算法上,非常完美的體現了工具為人服務的理念。

  原文地址:http://blog.csdn.net/renshengrumenglibing/article/details/8144170

一、System Generator快速入門

  A-Xilinx Blockset庫的基本介紹 
  System Generator和Simulink是無縫鏈接的,可以在MATLAB標准工具欄中直接啟動,如圖1所示。這些模塊都根據其功能划分為不同的庫,為了易於使用,又在某些庫中添加了部分有廣泛應用的模塊,所有的模塊都按字母順序排列在Xilinx Index庫中。讀者需要注意的是:在Simulink環境中,只有通過Xilinx模塊搭建的系統才能保證硬件可實現,其地位類似於HDL語言中的可綜合語句。
圖1 Xilinx DSP模塊集

從設計流程中可以看出,熟悉Xilinx DSP基本模塊庫是設計流程中的關鍵環節,只有掌握了基本模塊的特性和功能,才能更好地實現算法。由Xilinx模塊庫和System Generator一起,可生成Xilinx可編程器件的最優邏輯,這屬於最低層的設計模塊,地位等效於IP Core,共有90多個。Xilinx模塊庫簡要說明如表1所列。

表1  System Generator庫的簡要說明

1.基本單元模塊 
  基本單元模塊庫中包含了數字邏輯的標准組件模塊,使用這些模塊可插入時間延遲、改變信號速率、引入常數、計數器以及多路復用器等。此外,還包含了3個特殊的模塊System Generator標志、黑盒子模塊(Black Box)以及邊界定義模塊,后文將對其進行詳細說明。該庫中簡要的模塊說明如表2所列。

表2 基本單元模塊的說明列表

2.通信模塊 
通信應用是FPGA的主要應用領域之一,因此Xilinx的通信模塊庫提供了用於實現數字通信的各種函數,包括卷積編解碼、RS編解碼以及交織器等模塊。該庫中簡要的模塊說明如表3所列。

表3 通信模塊的說明列表

3.控制邏輯模塊 
控制邏輯主要包括了用於創建各種控制邏輯和狀態機的資源,包括了邏輯表達式模塊、軟核控制器、復用器以及存儲器,其簡要說明如表4所列。

表4 控制邏輯模塊的說明列表

4.數據類型模塊 
數據類型模塊主要用於信號的數據類型轉換,包括移位、量化、並/串、串/並轉換以及精度調整模塊,其簡要說明如表5所列。

表5 數據類型模塊的說明列表

5.DSP模塊 
DSP模塊是System Generator的核心,該庫包含了所有常用的DSP模塊,其簡要說明如表6所列。

表6 DSP模塊的說明列表

6.數學運算模塊 
數學運算是任何程序所不可避免的,Xilinx提供了豐富的數學運算庫,包括基本四則運算、三角運算以及矩陣運算等,其簡要說明如表7所列。

表7 數學運算模塊的說明列表

7.存儲器模塊 
該庫包含了所有Xilinx存儲器的Logic Core,其簡要說明如表8所列。

表8 存儲器模塊的說明列表

8.共享儲存器模塊 

表9 共享存儲器模塊的說明列表

9.工具模塊 
工具模塊包含了FPGA設計流程中常用的ModelSim、ChipScope、資源評估等模塊以及算法設計階段的濾波器設計等模塊。該庫的模塊在設計中起輔助作用,都是設計工具,一般不能生成HDL設計,其簡要說明如表10所列。

表10 工具模塊的說明列表

  B-其他模塊

1.FPGA邊界定義模塊 
  System Generator是FPGA實現和算法開發之間橋梁,通過兩個標准模塊“Gateway In”和“Gateway Out”來定義Simulink仿真模型中FPGA的邊界。“Gateway In”模塊標志着FPGA邊界的開始,能夠將輸入的浮點轉換成定點數。“Gateway Out”模塊標志着FPGA邊界的結束,將芯片的輸出數據轉換成雙精度數。在Simulink環境中雙擊這兩個模塊會彈出配置對話框,可以設定不同的轉換規則,如圖10所示。

圖10 轉換模塊示意圖

2.System Generator標志 
每個System Generator應用框圖都必須至少包含一個System Generator標志,如圖11所示,否則會提示錯誤。標志模塊用來驅動整個FPGA實現過程,不與任何模塊相連。雙擊標志模塊,可以打開屬性編輯框,能夠設置目標網表、器件型號、目標性能以及系統時鍾頻率等指標。

圖11 System Generator標志模塊示意圖

3.建立簡易的DSP設計 
一旦定義了FPGA邊界就可以通過Xilinx DSP模塊集合來建立各種DSP設計,包括濾波器、存儲器、算術運算器、邏輯和比特操作器等豐富資源,每個模塊都有詳細的工作頻率和比特寬度定義。標准的Simulink模塊不能在“Gateway In”和“Gateway Out”之間使用,但常用來產生測試數據以及對FPGA的輸出數據進行處理和分析。下面給出一個簡單的FPGA系統設計實例。 

:使用System Generator建立一個3輸入(a、b、c)的DSP4模塊的計算電路,使得輸出p=c+a*b,並利用標准的Simulink模塊對延遲電路進行功能驗證。 
1)打開Simulink庫瀏覽器並建立一個新的Simulink模型,並保存為mydsp.mdl。 
2)在瀏覽器中選擇Xilinx DSP48模塊,並將其拖拽到mydspmydelay.mdl;按照同樣的方法添加邊界定義模塊以及System Generator標志模塊。 
3)為了測試DSP計算電路,添加Simulink標准庫中的常數模塊(Constant)和顯示器(Display)模塊。其中常數模塊用於向DSP計算電路灌數據,作為測試激勵;顯示器則用於觀測輸出數據。 
4)連接模塊,將所有的獨立模塊連成一個整體。其中Xilinx模塊之間的端口可以直接相互連接,直接從一個端口拖拽鼠標到另一個端口來完成,或選中目標模塊,按住Ctrl鍵,再點擊要連接的模塊,Simulink即可自動將兩個模塊連接起來;而Xilinx模塊和非Xilinx模塊之間的連接則需要邊界模塊(Gateway)來銜接。經過連接的設計如圖12所示。

圖12 延遲模塊以及測試平台的組成架構

5)設定系統參數。雙擊“System Generator”模塊,會出現系統設定對話框,如圖13所示。其中“Compilation”欄選擇編譯生成對象,包括HDL網表、FPGA配置比特流、NGC網表、EDK導出工具、硬件協仿真類型以及時序分析文件等6種類型,本例選擇HDL網表類型,會生成ISE工程以及相應的HDL代碼;“Part”欄用於選擇芯片型號,本例選擇Spartan3E xc4vsx55-12ff1148。“Target”欄用於選擇目標文件存放路徑,本例使用默認值,則會在mydelay.mdl所在文件夾中自動生成一個netlist的文件夾,用於存放相應的輸出文件。綜合工具選擇XST,HDL語言選擇Verilog類型,系統時鍾設的周期為100ns,即為10MHz。 “Clock Pin Location”欄的文本框中輸入系統時鍾輸入管腳,則會自動生成管腳約束文件(由於本例只是演示版,所以該項空閑)。此外,可選中“Create testbench”選項,自動生成設計的測試代碼。各項參數確認無誤后,單擊“OK”鍵,保存參數。

圖13 系統參數設定對話框

6)設置關鍵模塊參數。雙擊“Gataway In”、“Gataway Out”模塊,會彈出圖14和圖 15所示的對話框。Gataway In模塊屬性可查看輸入數據位寬和量化規則。

7)運行測試激勵。當參數設置完成后,點擊工具欄的“ ”按鍵,即可運行Simulink仿真,可以看到顯示器輸出為18,表明設計的功能是正確的。 
8)生成HDL代碼。單擊圖13中的“Generate”按鍵,System Generator可自動將設計轉化成HDL代碼。整個轉化過程的起始和結束提示界面分別如圖16和圖 17所示。

讀者可在相應的文件夾的“netlist sysgen”子目錄中打開“nonleaf_results.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模塊基本上都是多形態的,即可根據輸入端口的數據類型來確定輸出數據類型,但在有些情況下需要擴展信號寬度來保證不丟失有效數據。此外,也允許設計人員自定義模塊的輸入、輸出數據的量化效果以及飽和處理。在圖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)。 
  A-編譯並仿真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)的工程文件以及不同類型的硬件協仿真文件。
  • 時序分析類型的編譯結果是該設計的時序分析報告。

  B-編譯約束文件 
  在編譯一個設計時,System Generator會根據用戶的配置產生相應的約束文件,通知下載配置工具如何處理設計輸入,不僅可以完成更高質量的實現,還能夠節省時間。 
約束文件可控的指標包括:

  • 系統時鍾的周期;
  • 系統工作速度,和系統時鍾有關、設計的各個模塊必須運行的速度;
  • 管腳分配;
  • 各個外部管腳以及內部端口的工作速度。

約束文件的格式取決於System Generator模塊的綜合工具:對於XST,其文件為XCF格式;對於Synplify/Synplify Pro,則使用NCF文件格式。 

系統時鍾在System Generator標志中設定,編譯時將其寫入約束文件,在實現時將其作為頭等目標。在實際設計中,常常包含速度不同的多條路徑,其中速度最高的采用系統時鍾約束,其余路徑的驅動時鍾只能通過系統時鍾的整數倍分頻得到。當把設計轉成硬件實現時,“Gateway In”和“Gateway Out”模塊就變成了輸入、輸出端口,其管腳分配和接口數據速率必須在其參數對話框中設定,編譯時會將其寫入I/O時序約束文件中。 

  C-HDL測試代碼 
  通常System Generator設計的比特寬度和工作頻率都是確定的,因此Simulink仿真結果也要在硬件上精確匹配,需要將HDL仿真結果和Simulink仿真結果進行比較,才能確認HDL代碼的正確性。特別當其包含黑盒子模塊時,這樣的驗證顯得格外重要。System Generator提供了自動生成測試代碼的功能,並能給出HDL代碼仿真正確與否的指示。 
  假設設計的名字是<design>,雙擊頂層模塊的System Generator標志,將Compilation選項設為HDL Netlist,選中Create Testbench選項,然后點擊Generate選項,不僅可以生成常用的設計文件,還有下面的測試文件:

  • <design>_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模塊。 

例:使用MATLAB編寫一個簡單的移位寄存器完成對輸入數據乘8以及除以4的操作,並使用MCode將其編譯成System Generator直接可用的定點模塊。 

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函數和模型設計關聯起來,如下圖所示。

3.添加邊界模塊、Sytem Generator模塊、正弦波測試激勵以及示波器模塊構成完整的設計,如下圖所示。

4.運行仿真,得到的結果如下圖所示,從中可以看出,設計是正確的,正確實現了.m文件的功能。左圖將信號放大了8倍,右圖將信號縮小了4倍。

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

 

五、子系統的建立和使用

System Generator設計經常作為大型HDL設計的一部分,本節就介紹如何使用System Generator來建立子系統模塊,以及如何在整個系統中對其進行仿真。 
  A-子系統的建立以及仿真方法 
  子系統就是HDL語言中的模塊,也類似於C++語言中的函數,是有效執行自頂向下設計的必備手段。如果將一個復雜設計完全在一個單獨設計中實現,則該設計的驗證和復查工作將是設計人員的噩夢。此外,從設計復用的角度講,子系統可以IP核的方式為多個設計使用,具有高的可重用性,能節省大系統的開發時間。 
  建立子系統最簡單的方法就是利用NGC二進制網表文件,將System Generator設計封裝成一個單獨的二進制模塊,這樣綜合工具將其作為黑盒子看待。在建立子系統時,管腳約束不能在Gataway模塊中定義,同樣時鍾管腳也不能在System Generator模塊中定義,應通過網表編輯器來指定物理約束,這是因為NGC網表中不僅包括了邏輯設計,還包括了設計的約束信息。在復雜系統中建立子系統的設計流程如下所示: 


1.NGC網表文件 
  生成NGC網表是建立子系統的第一步。在System Generator標志中將編譯生成文件類型選為NGC List。如果設計中有時鍾驅動電路,點擊Generate后,會在目標文件夾生成“<design>_cw.ngc”文件,否則會生成“<design>.ngc”文件,其中<design>就是設計的名字。NGC網表文件包括設計中所有的邏輯和約束信息,這意味着將System Generator生成的所有HDL文件、內核以及約束等文件封裝成一個單獨的文件。

2.設計規則

  在復雜系統中使用子模塊時,必須遵循下面兩條規則。 
首先,不能在子模塊設計文件中出現“Gateway In”、“Gateway Out”以及System Generator標志模塊,否則NGDBuild工具會產生下面的警告: 

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. 

其次,不能在綜合的時候往NGC網表文件中插入I/O緩存器,否則會報錯。I/O緩存器只能在頂層模塊中使用。 

3.邏輯綜合 
  當使用子系統的NGC網表文件綜合時,其流程如圖23所示。NGC模塊可在頂層模塊中以黑盒子的方式直接例化。為了簡化該過程,當通過NGC目標編譯后,System Generator提供了HDL例化模板,保存在設計路徑,且以“<design>_cw.veo”命名。當選擇VHDL語言時,則其模板名為“<design>_cw.vho”。

4.仿真 
  把System Generator模型編譯成NGC目標后,生成的HDL文件卻只能完成HDL仿真,不能在ISE中綜合。由於HDL文件不能包含在工程中,如果要在HDL仿真器中運行整個設計,就必須指定用戶.do文件。除了HDL文件之外,還需要將內存初始化文件(.mif)和系數文件(.coe)和HDL文件放在同一文件夾中。 

  B-可配置子系統的建立 
  可配置子系統是一類可以作為標准元件使用的Simulink模塊,但又和標准元件模塊不同,其存在多種可選功能,每一種功能都可以實現,可以讓用戶靈活選擇。以可配置FIR濾波器為例,實現快速濾波器需要很多資源,而許多低速的濾波器卻只需要相對很少的資源,將其做成可配置的模塊,就可以允許用戶根據實際情況在速度和硬件代價之間做出最優平衡。這體現了可配置子模塊最大的優勢。 
1.定義一個可配置子模塊 
  可通過新建Simulink庫來定義可配置子系統,且可選模塊的實現也由庫來管理。下面給出新建建庫的具體步驟: 

(1)新建一個空白庫,如圖24所示。

(2)在庫里添加基本實例模塊,如圖25所示。基本實例模塊可以是System Generator中的任意組件。

(3)在庫里面添加可配置子系統模版,如圖26所示。模版可以在Simulink庫瀏覽器中找到,其具體位置為“Simulink/Ports & Subsystems/Configurable Subsystem”。如果有需要,用戶可以修改該模版的名字。

(4)保存庫文件,然后雙擊模版模塊,會彈出如圖27所示的屬性配置界面。根據實現的需要選中相關模塊的檢驗框。最后單擊“OK”再次保存庫文件。

2.使用可配置子系統

要在設計中使用可配置子系統,先按照上面的步驟定義子系統,然后打開庫,將需要的模版模塊拖到設計中合適的位置,這樣設計中就有了可配置子系統的實例,如圖28所示的FIR濾波器模塊。

在實例模塊上點擊右鍵,然后選擇Block Choice選項中的Xilinx DA FIR,將實例作為基礎實現模塊使用。如圖29所示。

3)在可配置子模塊中添加和刪除實例模塊

添加和刪除子系統是編輯、修改可配置子系統的基本操作,按照下面的步驟可以從可配置子系統中刪除實例模塊: 

  • 打開並解鎖子系統的庫;雙擊模版模塊,然后在彈出的用戶界面中取消相應模塊檢驗框的選定,單擊“OK”就可以刪除掉相應的子模塊,如圖30所示;再保存庫,重新編譯即可;最后仍需要在設計更新子系統。 

  對於添加實例模塊的步驟如下:首先,打開並解鎖子系統的庫;然后將實例模塊拖到子系統設計中,雙擊模版模塊;在彈出的用戶界面中選中所需模塊檢驗框,單擊“OK”即可,如圖31所示;再保存庫,重新編譯;在已有的設計中更新子系統。

  • 生成可配置子模塊的硬件電路

  在System Generator中,模塊可用於仿真和產生硬件。有時對於一個可配置子系統,最佳的方式是其既可以成為仿真基礎模塊,也可以用來生成硬件電路。例如將可配置子系統在仿真時作為普通的模塊來產生仿真結果,在實現時作為黑盒子產生功能電路的HDL代碼,就是一種常用方式。System Generator提供了可配置子系統管理模塊來達到上述目的,其使用方法如下: 
  首先,打開、解鎖可配置子系統的庫文件(除了模版模塊),然后雙擊該模塊; 
  其次,將可配置子系統管理模塊拖到打開的庫中,該管理模塊可以在“Xilinx Blockset/Tools/ Configurable Subsystem Manager”路徑中找到,如圖32所示。

最后,雙擊管理模塊打開其屬性配置GUI,選擇可配置子系統中生成硬件電路的模塊,如圖33所示。單擊“OK”保存子系統和庫文件退出即可。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM