System Generator是Xilinx公司進行數(shù)字信號處理開發(fā)的一種設(shè)計工具,它通過將Xilinx開發(fā)的一些模塊嵌入到Simulink的庫中,可以在Simulink中進行定點仿真,可是設(shè)置定點信號的類型,這樣就可以比較定點仿真與浮點仿真的區(qū)別。并且可以生成HDL文件,或者網(wǎng)表,可以再ISE中進行調(diào)用?;蛘咧苯由杀忍亓飨螺d文件。能夠加快DSP系統(tǒng)的開發(fā)進度。
用System Generator進行仿真
1、必須包含的模塊:Gateway In、Gateway Out、System Generator、以及Xilinx定點運算單元。
2、對于系統(tǒng)設(shè)計中有精確時鐘限制的外部接口模塊,使用System Generator設(shè)計不是最佳方法,此時可以利用HDL等方法實現(xiàn),然后通過System Generator工具提供的Black Box導(dǎo)入Sysgen工程中即可。
System Generator Blockset
1、主要包括:Xilinx Blockset、Xilinx Preference Blockset 和 Xilinx XtremDSP Kit三個庫函數(shù)塊。
2、Xilinx Blockset包含了所有在Simulink中構(gòu)建數(shù)字信號處理系統(tǒng)和其他FPGA數(shù)字系統(tǒng)的模塊。
3、Xilinx Preference Blockset 是更高層次的模塊,都是由Xilinx Blockset中的模塊組成的,降低了開發(fā)難度,并且具有較高的可靠性。
信號數(shù)據(jù)類型
1、Xilinx Block的輸出格式可以設(shè)定為:Full precision和User-defined precision
Full precision:會在運算中自動進行位寬擴展
User-defined precision:對輸出結(jié)果進行截位(wrap)或飽和(saturate)處理(用戶設(shè)置)。
2、在System Generator中,點擊Format –> Port/Signal Displays –> Port Data Type 即可顯示每個模塊輸入輸出的數(shù)據(jù)類型。
3、當Simulink無法確定數(shù)據(jù)類型和采樣速率時,會報錯,通常這種情況出現(xiàn)在有反饋的情況下。這時可以通過添加一個Assert模塊對信號進行強制制定或重新定義。且不占用硬件資源。
4、Gateway In可以設(shè)定Sample Period,值越大,采樣點越少。一般來說,對于同一組Gateway In,sample period應(yīng)該是一樣的,即采樣率時一樣的。所以當修改一個Gateway In的Sample Period時,記得同時更新同一級的Gateway In的Sample Period。
5、采樣率變換,利用模塊:Up sample和Down sample。System Generator中不同顏色代表不同的采樣率??梢渣c擊Format –> Sample Time Colors
利用Matlab產(chǎn)生測試向量
1、使用From Workspace block / From file產(chǎn)生測試向量。注意數(shù)據(jù)必須是2xn矩陣:
colume 1 = time values
colume 2 = data values
例如:[1:101; sin(2*pi*[0:.01:1])]
2、使用To workspace block將sysgen數(shù)據(jù)輸出到MATLAB進行分析
時鐘周期
1、Simulink system period為Simulink仿真時鐘周期,該周期必須是設(shè)計中所有采樣周期的最大公因子,比如系統(tǒng)中有3個采樣周期(2、3、4),那么Simulink system period為1。
2、如果FPGA系統(tǒng)時鐘周期是10ns,那么Simulink系統(tǒng)周期,2s、3s、4s三個采樣周期分別對應(yīng)FPGA器件實現(xiàn)時的10ns、20ns、30ns、40ns。另一種做法是將Simulink系統(tǒng)周期就定義成FPGA的系統(tǒng)周期,這樣省去了時鐘周期間的換算。
3、可以用Clock Enable Probe模塊來實現(xiàn)潛在的時鐘使能信號。
采樣周期
System Generator中的所有模塊設(shè)計都為離散系統(tǒng),也就是說所有信號和模塊內(nèi)部處理都有采樣率的概念。一個模塊的采樣率決定了該模塊的工作頻率, 一般情況下System Generator自動設(shè)置大部分模塊的采樣率,少數(shù)模塊需要設(shè)計者專門設(shè)定其采樣率。
如何理解采樣周期,參看圖1-15所示的簡單設(shè)計。
圖1-15中“Gateway In”模塊設(shè)置采樣周期(“Sample Period”)為1s,“Gateway Out”模塊將定點數(shù)據(jù)轉(zhuǎn)換成浮點數(shù)(顯示在“Scope”上),得到圖1-16所示的波形。需要注意的是,“Gateway In”模塊中采樣周期選項“Sample Period”只能設(shè)置為正整數(shù)。
圖1-16中,浮點正弦波轉(zhuǎn)換成了定點的采樣波形,采樣周期取決于“Gateway In”模塊中“Sample Period”的設(shè)置,可見采樣周期對信號的影響很大,采樣周期越大(也就是采樣率越?。?,信號一個周期內(nèi)的樣值數(shù)越少,所以信號畸變就越大。
上述例子中,整個系統(tǒng)采用單一采樣周期,而一般的FPGA設(shè)計模塊之間的采樣率是不同的。System Generator支持多速率(也就是多采樣率)設(shè)計,常見的采樣率改變模塊有:Up Sample上采樣和Down Sample下采樣模塊。其它模塊比如(串并變換或者并串變化模塊)也能改變速率,但取決于該模塊的參數(shù)配置,如圖1-17的這個簡單設(shè)計體現(xiàn)了多采樣率在系統(tǒng)的實現(xiàn)。
設(shè)計中有兩種采樣周期SP1和SP2,“Gateway In”定義了第一個采樣周期SP1,“Down Sample”模塊改變了采樣周期得到SP2(SP1兩倍),圖中不同顏色代表了不同的采樣周期。
使用過HDL設(shè)計系統(tǒng)的開發(fā)研究人員都知道,為了能充分利用芯片資源,往往設(shè)計中會提高系統(tǒng)時鐘,這樣在數(shù)據(jù)速率不變的條件下,采取復(fù)用的方法減少硬件資源,但也不能無限制地提高時鐘(受芯片和設(shè)計復(fù)雜程度的約束)。在System Generator設(shè)計中同樣會有類似情況出現(xiàn),某些模塊內(nèi)部處理時鐘速率超過輸入的數(shù)據(jù)速率,也就是說內(nèi)部存在復(fù)用情況,比如FIR濾波器,這樣設(shè)計的目的是為了通過內(nèi)部的高速換取硬件資源的節(jié)省,在這種情況下,該模塊的輸入輸出速率是沒有改變的,也就是說在采樣率上看不出任何明顯的變化,但該模塊內(nèi)部時鐘卻發(fā)生了變化。所以在利用System Generator進行系統(tǒng)設(shè)計時,需要聯(lián)合考慮模塊內(nèi)部處理時鐘和外部數(shù)據(jù)速率,合理設(shè)置模塊的采樣周期,達到系統(tǒng)性能和硬件資源的最優(yōu)化。
在System Generator中,點擊“Format → Sample Time Colors”,不同采樣率模塊顯示的顏色不同,這在多速率系統(tǒng)中顯示很方便。
5.時鐘
System Generator系統(tǒng)設(shè)計一般基于同步時鐘而言,但在一些情況下也支持異步時鐘設(shè)計,包括Simulink仿真測試和硬件實現(xiàn)。在異步時鐘設(shè)計中,將相同時鐘頻率的模塊構(gòu)成一個時鐘域,這樣整個設(shè)計由幾個域構(gòu)成,不同域之間的通信通過雙口RAM或者FIFO進行,具體設(shè)計思想和方法參考1.2.5節(jié)的相關(guān)介紹,下面主要講述同步時鐘設(shè)計中的基本概念。
在“System Generator”圖標中,可以選擇有三種同步時鐘實現(xiàn)方式,如圖1-18所示。
Clock Enables
Clock Generator(DCM)
Expose Clock Ports
1)Clock Enables模式
如果選擇Clock Enables實現(xiàn)模式,整個系統(tǒng)只有一個系統(tǒng)時鐘system clk,System Generator根據(jù)不同采樣周期產(chǎn)生對應(yīng)的Clock Enable,system clk聯(lián)合Clock Enable構(gòu)成設(shè)計中其它采樣率的時鐘。
為了達到上述要求,在“System Generator”圖標中,需要設(shè)計者指定兩個時鐘周期:“Simulink system period”和 “FPGA clock period”。其中Simulink system period為Simulink仿真時鐘周期,該周期必須是設(shè)計中所有采樣周期的最大公因子,比如系統(tǒng)中有3個采樣周期(2、3、4),那么Simulink system period為1;而FPGA clock period為硬件實現(xiàn)時真正的系統(tǒng)時鐘周期(單位納秒ns)。Simulink system period(用p表示) 和 FPGA clock period(用c表示)之間是一一對應(yīng)的關(guān)系,也就是說如果仿真中某個事件使用了kp個仿真時鐘周期,那么對應(yīng)的硬件設(shè)備中該事件同樣使用了kc個系統(tǒng)時鐘周期。
Clock Enable為system clk整數(shù)倍的脈沖波形,如system clk的采樣周期為1,CE2、CE3和CE4分別代表采樣周期2、3、4,其時序關(guān)系如圖1-19所示。
(2)DCM模式
如果選擇Clock Generator(DCM)實現(xiàn)模式,則硬件實現(xiàn)時采用FPGA內(nèi)部的數(shù)字時鐘管理單元(DCM)產(chǎn)生其它采樣率時鐘。如果系統(tǒng)設(shè)計中有大量扇出,采用Clock Enable模式,通常時鐘約束滿足不了,采用DCM的好處是可以最大程度的滿足大扇出的時鐘約束。System Generator將DCM綜合到頂層模塊,輸出時鐘供不同速率的模塊使用,對于Vrtex-4和Virtex-5,DCM提供3個不同速率的輸出端口,對于Spartan-3A DSP提供2個不同速率的時鐘輸出端口,DCM模塊主要包括以下端口:
CLK0:與輸入同頻率的輸出時鐘。
CLK2x:2倍頻輸入頻率的輸出時鐘。
CLKdv:輸入時鐘的任意分頻輸出時鐘。
CLKfx:固定輸出頻率值的時鐘,根據(jù)輸入時鐘頻率值所在的范圍,可以設(shè)置其范圍內(nèi)任意頻率的時鐘輸出。
dcm_reset:DCM模塊的輸入復(fù)位信號。
dcm_locked:輸出信號,DCM輸出穩(wěn)定時鐘的標志位。
但并不是所有的設(shè)計都能使用DCM模式,以下模塊不能使用Clock Generator(DCM)作為其輸入:
Clock Enable Probe:該模塊在任何條件下都不能使用DCM模式
Clock Probe:該模塊在任何條件下都不能使用DCM模式
DAFIR:該模塊在任何條件下都不能使用DCM模式
Downsample:當“Sample”選項設(shè)置為“First value of the frame”時不能使用DCM模式
FIR Compiler:當FIR內(nèi)部處理時鐘與輸入數(shù)據(jù)速率不同時不能使用DCM模式
Parallel to Serial:當“Latency”選項設(shè)置為0時不能使用DCM模式
Time Division De-Multiplexer:該模塊在任何條件下都不能使用DCM模式
Time Division Multiplexer:該模塊在任何條件下都不能使用DCM模式
Upsample:當“Copy samples”選項沒選,或者選擇插值為0操作時不能使用DCM模式
在ISE 10.1版本測試中,DCM模塊在Vrtex-4和Virtex-5下可以達到400MHz的速率,在Spartan-3A DSP可以達到190MHz的速率。
(3)Expose Clock Ports模式
如果選擇Expose Clock Ports模式,則使用外部時鐘作為System Generator的時鐘輸入。
(4)DCM的測試例子
下面是使用DCM模式的一個小例子,通過例子了解DCM模式下System Generator工程的設(shè)計。在本書光盤“chapter1/exp1-2/clocking_options/dcm_case1/dcm_case1.mdl”路徑中,可找到dcm_case1.mdl工程文件。
① 在Simulink下打開工程文件dcm_case1.mdl,如圖1-20所示,該樣例程序利用一個乘加單元(MAC)完成FIR濾波器功能。其中“Coefficient ROM”存儲濾波器的抽頭系數(shù),“ASR”為移位寄存器,移位存儲輸入信號源,“Counter”計數(shù)器完成地址線的編譯操作,用以控制“ASR”和“Coefficient ROM”數(shù)據(jù)依次輸出,“MAC Engine”完成信號源和抽頭系數(shù)的乘加操作。
② 雙擊System Generator圖標,“Compilation”選擇“HDL Netlist”,芯片類型“Part”選擇“Virtex4 xc4vfx12-12ff668”,采用XST綜合器,VHDL語言代碼,F(xiàn)PGA 時鐘周期“FPGA clock period”設(shè)置10ns,“Simulink system period”設(shè)置為1/5,“Mutlirate implemetation”選擇使用“Clock Generator(DCM)”模式,配置參數(shù)如圖1-21所示。
圖1-21 dcm_case1的System Generator圖標配置
圖1-21中,點擊左下角“Generate”完成硬件編譯,在當前目錄下產(chǎn)生文件夾hdl_netlist,包括了sysgen產(chǎn)生的所有相關(guān)文件。
③ 在當前Matlab工作目錄下,雙擊dcm_case1_sysgen.log文件,得到如下的信息:
------------------------------ DCM Clock Outputs -------------------------------
Normalized Period DCM Output Used Frequency
---------------------------------------------------------------------------------------
1 CLK0 100.0000
5 CLKDV 20.0000
-------------------------------------- ** ---------------------------------------------
可見,當前設(shè)計中有兩個時鐘,系統(tǒng)時鐘100MHz(這與System Generator設(shè)置時鐘周期10ns有關(guān)),DCM分頻的另一時鐘為20MHz。
④ 在文件hdl_netlist找到對應(yīng)的工程文件dcm_case1_dcm_mcw.ise,在ISE10.1下打開。雙擊頂層文件dcm_case1_dcm_mcw.vhd,在相應(yīng)位置找到DCM對應(yīng)模塊,如圖1-22所示,其中“CLKIN_PEROID”為輸入系統(tǒng)時鐘周期10ns,“CLKDV_DIVIDE”為DCM分頻系數(shù)5,也就說得到分頻時鐘周期為50ns。
圖1-22 dcm_case1的DCM模塊
⑤ 創(chuàng)建對應(yīng)的UCF文件,在ISE界面下,點擊“User Constraints → Create Timing Constraint”,按圖1-23所示的條件輸入(系統(tǒng)時鐘周期為10ns),保存文件即可。
圖1-23 dcm_case1的UCF配置
⑥ 雙擊“Implement Design → Place & Route → Generate Post-Place & Route Static Timing”,完成布局布線,查看布局布線報告。
⑦ 將“Source”欄切換至“Behavioral Simulation”進行功能仿真,檢查仿真結(jié)果的正確性(System Generator自動產(chǎn)生用于仿真的測試文件Testbench,dcm_case1_dcm_mcw_tb),點擊測試文件“dcm_case1_dcm_mcw_tb.vhd”,雙擊“Simulate Behavioral Model”,得到仿真圖形如圖1-24所示。
圖1-24 dcm_case1的功能仿真結(jié)果
總結(jié)這個設(shè)計小例子可以看出,在10.1版本中使用System Generator完成多速率系統(tǒng)設(shè)計時,如果選擇DCM模式,Sysgen能夠自動調(diào)用DCM模塊,而不需要手動調(diào)整,非常方便。
5.同步機制
System Generator沒有專門的同步機制,也就是說,系統(tǒng)間模塊的同步需要設(shè)計人員自行設(shè)計,System Generator提供一些用于同步緩沖的模塊,比如FIFO等,合理使用這些模塊可以正確處理各個模塊之間的數(shù)據(jù)流控制。當然,Xilinx絕大多數(shù)模塊都有輸入輸出控制信號,比如datain_valid、dataout_valid等,這些信號能控制數(shù)據(jù)流起到同步的作用。所以在大多數(shù)情況下,設(shè)計人員只需要正確級聯(lián)這些模塊,通過邏輯計算得到控制信號即可,無需附加設(shè)計系統(tǒng)同步模塊。
6.模塊封裝(Masking)和參數(shù)傳遞
同Simulink類似,在System Generator中,設(shè)計人員可以將部分模塊封裝構(gòu)成一個子系統(tǒng)(Subsystem),對子系統(tǒng)的操作將直接影響內(nèi)部所有模塊。
(1)模塊的封裝
在Simulink中,模塊的封裝稱之為Masking。操作非常簡單,選中需要封裝的模塊,鼠標右鍵“Creat Subsystem”,即創(chuàng)建完成子系統(tǒng)。
(2)參數(shù)的傳遞
Xilinx Blockset和Simulink中其它模塊一樣,參數(shù)配置可以使用Matlab中的變量和語句,Matlab強大的語句表達能力在這里體現(xiàn)的非常充分。
對于一個子系統(tǒng)(Subsystem)來說,通常需要設(shè)置子系統(tǒng)內(nèi)部模塊的參數(shù)值,當然通過雙擊每個block直接設(shè)置是可以的,除此之外對于封裝好的子系統(tǒng),用參數(shù)傳遞的方法設(shè)置簡單方便。點擊需要參數(shù)傳遞的子模塊,右鍵選擇“Mask Subsystem”,出現(xiàn)圖1-25的配置界面。
圖1-25 子系統(tǒng)參數(shù)創(chuàng)建
圖1-25中,點擊“Parameters”標簽,在“Dialog parameters”欄即可創(chuàng)建參數(shù),本例子中創(chuàng)建一個參數(shù)(取名為trunc_round),代表輸出截位方式。在子系統(tǒng)內(nèi)部,雙擊任意一個模塊,點擊“Basic”標簽,在“Quantization”處右鍵點擊選擇“Define With Expression”,將圖1-25中定義的參數(shù)(trunc_round)鍵入即完成參數(shù)的傳遞,如圖1-26所示。
圖1-26 子系統(tǒng)參數(shù)傳遞
7.資源預(yù)估模塊
System Generator提供一個特殊模塊(Resouce Estimator),該模塊提供資源預(yù)估功能,資源包括Slice、LUT、觸發(fā)器、Block Memory、硬核乘法器等。如圖1-27所示。
圖1-27 Resource Estimator模塊
模塊中【Slices】、【FFs】、【BRAMs】、【LUTs】、【IOBs】、【Emb.Mults】、【TBUFs】分別表示當前模塊占用的硬件資源量。
其中【Estimate options】為資源預(yù)估模式,分為【Estimate】、【Quick】、【Post Map】和【Read Mrp】四種可選模式。
點擊“Estimate”后開始進行資源預(yù)估