System Generator是Xilinx公司进行数字信号处理开发的一种设计工具,它通过将Xilinx开发的一些模块嵌入到Simulink的库中,可以在Simulink中进行定点仿真,可是设置定点信号的类型,这样就可以比较定点仿真与浮点仿真的区别。并且可以生成HDL文件,或者网表,可以再ISE中进行调用。或者直接生成比特流下载文件。能够加快DSP系统的开发进度。
用System Generator进行仿真
1、必须包含的模块:Gateway In、Gateway Out、System Generator、以及Xilinx定点运算单元。
2、对于系统设计中有精确时钟限制的外部接口模块,使用System Generator设计不是最佳方法,此时可以利用HDL等方法实现,然后通过System Generator工具提供的Black Box导入Sysgen工程中即可。
System Generator Blockset
1、主要包括:Xilinx Blockset、Xilinx Preference Blockset 和 Xilinx XtremDSP Kit三个库函数块。
2、Xilinx Blockset包含了所有在Simulink中构建数字信号处理系统和其他FPGA数字系统的模块。
3、Xilinx Preference Blockset 是更高层次的模块,都是由Xilinx Blockset中的模块组成的,降低了开发难度,并且具有较高的可靠性。
信号数据类型
1、Xilinx Block的输出格式可以设定为:Full precision和User-defined precision
Full precision:会在运算中自动进行位宽扩展
User-defined precision:对输出结果进行截位(wrap)或饱和(saturate)处理(用户设置)。
2、在System Generator中,点击Format –> Port/Signal Displays –> Port Data Type 即可显示每个模块输入输出的数据类型。
3、当Simulink无法确定数据类型和采样速率时,会报错,通常这种情况出现在有反馈的情况下。这时可以通过添加一个Assert模块对信号进行强制制定或重新定义。且不占用硬件资源。
4、Gateway In可以设定Sample Period,值越大,采样点越少。一般来说,对于同一组Gateway In,sample period应该是一样的,即采样率时一样的。所以当修改一个Gateway In的Sample Period时,记得同时更新同一级的Gateway In的Sample Period。
5、采样率变换,利用模块:Up sample和Down sample。System Generator中不同颜色代表不同的采样率。可以点击Format –> Sample Time Colors
利用Matlab产生测试向量
1、使用From Workspace block / From file产生测试向量。注意数据必须是2xn矩阵:
colume 1 = time values
colume 2 = data values
例如:[1:101; sin(2*pi*[0:.01:1])]
2、使用To workspace block将sysgen数据输出到MATLAB进行分析
时钟周期
1、Simulink system period为Simulink仿真时钟周期,该周期必须是设计中所有采样周期的最大公因子,比如系统中有3个采样周期(2、3、4),那么Simulink system period为1。
2、如果FPGA系统时钟周期是10ns,那么Simulink系统周期,2s、3s、4s三个采样周期分别对应FPGA器件实现时的10ns、20ns、30ns、40ns。另一种做法是将Simulink系统周期就定义成FPGA的系统周期,这样省去了时钟周期间的换算。
3、可以用Clock Enable Probe模块来实现潜在的时钟使能信号。
采样周期
System Generator中的所有模块设计都为离散系统,也就是说所有信号和模块内部处理都有采样率的概念。一个模块的采样率决定了该模块的工作频率, 一般情况下System Generator自动设置大部分模块的采样率,少数模块需要设计者专门设定其采样率。
如何理解采样周期,参看图1-15所示的简单设计。
图1-15中“Gateway In”模块设置采样周期(“Sample Period”)为1s,“Gateway Out”模块将定点数据转换成浮点数(显示在“Scope”上),得到图1-16所示的波形。需要注意的是,“Gateway In”模块中采样周期选项“Sample Period”只能设置为正整数。
图1-16中,浮点正弦波转换成了定点的采样波形,采样周期取决于“Gateway In”模块中“Sample Period”的设置,可见采样周期对信号的影响很大,采样周期越大(也就是采样率越小),信号一个周期内的样值数越少,所以信号畸变就越大。
上述例子中,整个系统采用单一采样周期,而一般的FPGA设计模块之间的采样率是不同的。System Generator支持多速率(也就是多采样率)设计,常见的采样率改变模块有:Up Sample上采样和Down Sample下采样模块。其它模块比如(串并变换或者并串变化模块)也能改变速率,但取决于该模块的参数配置,如图1-17的这个简单设计体现了多采样率在系统的实现。
设计中有两种采样周期SP1和SP2,“Gateway In”定义了第一个采样周期SP1,“Down Sample”模块改变了采样周期得到SP2(SP1两倍),图中不同颜色代表了不同的采样周期。
使用过HDL设计系统的开发研究人员都知道,为了能充分利用芯片资源,往往设计中会提高系统时钟,这样在数据速率不变的条件下,采取复用的方法减少硬件资源,但也不能无限制地提高时钟(受芯片和设计复杂程度的约束)。在System Generator设计中同样会有类似情况出现,某些模块内部处理时钟速率超过输入的数据速率,也就是说内部存在复用情况,比如FIR滤波器,这样设计的目的是为了通过内部的高速换取硬件资源的节省,在这种情况下,该模块的输入输出速率是没有改变的,也就是说在采样率上看不出任何明显的变化,但该模块内部时钟却发生了变化。所以在利用System Generator进行系统设计时,需要联合考虑模块内部处理时钟和外部数据速率,合理设置模块的采样周期,达到系统性能和硬件资源的最优化。
在System Generator中,点击“Format → Sample Time Colors”,不同采样率模块显示的颜色不同,这在多速率系统中显示很方便。
5.时钟
System Generator系统设计一般基于同步时钟而言,但在一些情况下也支持异步时钟设计,包括Simulink仿真测试和硬件实现。在异步时钟设计中,将相同时钟频率的模块构成一个时钟域,这样整个设计由几个域构成,不同域之间的通信通过双口RAM或者FIFO进行,具体设计思想和方法参考1.2.5节的相关介绍,下面主要讲述同步时钟设计中的基本概念。
在“System Generator”图标中,可以选择有三种同步时钟实现方式,如图1-18所示。
Clock Enables
Clock Generator(DCM)
Expose Clock Ports
1)Clock Enables模式
如果选择Clock Enables实现模式,整个系统只有一个系统时钟system clk,System Generator根据不同采样周期产生对应的Clock Enable,system clk联合Clock Enable构成设计中其它采样率的时钟。
为了达到上述要求,在“System Generator”图标中,需要设计者指定两个时钟周期:“Simulink system period”和 “FPGA clock period”。其中Simulink system period为Simulink仿真时钟周期,该周期必须是设计中所有采样周期的最大公因子,比如系统中有3个采样周期(2、3、4),那么Simulink system period为1;而FPGA clock period为硬件实现时真正的系统时钟周期(单位纳秒ns)。Simulink system period(用p表示) 和 FPGA clock period(用c表示)之间是一一对应的关系,也就是说如果仿真中某个事件使用了kp个仿真时钟周期,那么对应的硬件设备中该事件同样使用了kc个系统时钟周期。
Clock Enable为system clk整数倍的脉冲波形,如system clk的采样周期为1,CE2、CE3和CE4分别代表采样周期2、3、4,其时序关系如图1-19所示。
(2)DCM模式
如果选择Clock Generator(DCM)实现模式,则硬件实现时采用FPGA内部的数字时钟管理单元(DCM)产生其它采样率时钟。如果系统设计中有大量扇出,采用Clock Enable模式,通常时钟约束满足不了,采用DCM的好处是可以最大程度的满足大扇出的时钟约束。System Generator将DCM综合到顶层模块,输出时钟供不同速率的模块使用,对于Vrtex-4和Virtex-5,DCM提供3个不同速率的输出端口,对于Spartan-3A DSP提供2个不同速率的时钟输出端口,DCM模块主要包括以下端口:
CLK0:与输入同频率的输出时钟。
CLK2x:2倍频输入频率的输出时钟。
CLKdv:输入时钟的任意分频输出时钟。
CLKfx:固定输出频率值的时钟,根据输入时钟频率值所在的范围,可以设置其范围内任意频率的时钟输出。
dcm_reset:DCM模块的输入复位信号。
dcm_locked:输出信号,DCM输出稳定时钟的标志位。
但并不是所有的设计都能使用DCM模式,以下模块不能使用Clock Generator(DCM)作为其输入:
Clock Enable Probe:该模块在任何条件下都不能使用DCM模式
Clock Probe:该模块在任何条件下都不能使用DCM模式
DAFIR:该模块在任何条件下都不能使用DCM模式
Downsample:当“Sample”选项设置为“First value of the frame”时不能使用DCM模式
FIR Compiler:当FIR内部处理时钟与输入数据速率不同时不能使用DCM模式
Parallel to Serial:当“Latency”选项设置为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工程的设计。在本书光盘“chapter1/exp1-2/clocking_options/dcm_case1/dcm_case1.mdl”路径中,可找到dcm_case1.mdl工程文件。
① 在Simulink下打开工程文件dcm_case1.mdl,如图1-20所示,该样例程序利用一个乘加单元(MAC)完成FIR滤波器功能。其中“Coefficient ROM”存储滤波器的抽头系数,“ASR”为移位寄存器,移位存储输入信号源,“Counter”计数器完成地址线的编译操作,用以控制“ASR”和“Coefficient ROM”数据依次输出,“MAC Engine”完成信号源和抽头系数的乘加操作。
② 双击System Generator图标,“Compilation”选择“HDL Netlist”,芯片类型“Part”选择“Virtex4 xc4vfx12-12ff668”,采用XST综合器,VHDL语言代码,FPGA 时钟周期“FPGA clock period”设置10ns,“Simulink system period”设置为1/5,“Mutlirate implemetation”选择使用“Clock Generator(DCM)”模式,配置参数如图1-21所示。
图1-21 dcm_case1的System Generator图标配置
图1-21中,点击左下角“Generate”完成硬件编译,在当前目录下产生文件夹hdl_netlist,包括了sysgen产生的所有相关文件。
③ 在当前Matlab工作目录下,双击dcm_case1_sysgen.log文件,得到如下的信息:
------------------------------ DCM Clock Outputs -------------------------------
Normalized Period DCM Output Used Frequency
---------------------------------------------------------------------------------------
1 CLK0 100.0000
5 CLKDV 20.0000
-------------------------------------- ** ---------------------------------------------
可见,当前设计中有两个时钟,系统时钟100MHz(这与System Generator设置时钟周期10ns有关),DCM分频的另一时钟为20MHz。
④ 在文件hdl_netlist找到对应的工程文件dcm_case1_dcm_mcw.ise,在ISE10.1下打开。双击顶层文件dcm_case1_dcm_mcw.vhd,在相应位置找到DCM对应模块,如图1-22所示,其中“CLKIN_PEROID”为输入系统时钟周期10ns,“CLKDV_DIVIDE”为DCM分频系数5,也就说得到分频时钟周期为50ns。

图1-22 dcm_case1的DCM模块
⑤ 创建对应的UCF文件,在ISE界面下,点击“User Constraints → Create Timing Constraint”,按图1-23所示的条件输入(系统时钟周期为10ns),保存文件即可。

图1-23 dcm_case1的UCF配置
⑥ 双击“Implement Design → Place & Route → Generate Post-Place & Route Static Timing”,完成布局布线,查看布局布线报告。
⑦ 将“Source”栏切换至“Behavioral Simulation”进行功能仿真,检查仿真结果的正确性(System Generator自动产生用于仿真的测试文件Testbench,dcm_case1_dcm_mcw_tb),点击测试文件“dcm_case1_dcm_mcw_tb.vhd”,双击“Simulate Behavioral Model”,得到仿真图形如图1-24所示。

图1-24 dcm_case1的功能仿真结果
总结这个设计小例子可以看出,在10.1版本中使用System Generator完成多速率系统设计时,如果选择DCM模式,Sysgen能够自动调用DCM模块,而不需要手动调整,非常方便。
5.同步机制
System Generator没有专门的同步机制,也就是说,系统间模块的同步需要设计人员自行设计,System Generator提供一些用于同步缓冲的模块,比如FIFO等,合理使用这些模块可以正确处理各个模块之间的数据流控制。当然,Xilinx绝大多数模块都有输入输出控制信号,比如datain_valid、dataout_valid等,这些信号能控制数据流起到同步的作用。所以在大多数情况下,设计人员只需要正确级联这些模块,通过逻辑计算得到控制信号即可,无需附加设计系统同步模块。
6.模块封装(Masking)和参数传递
同Simulink类似,在System Generator中,设计人员可以将部分模块封装构成一个子系统(Subsystem),对子系统的操作将直接影响内部所有模块。
(1)模块的封装
在Simulink中,模块的封装称之为Masking。操作非常简单,选中需要封装的模块,鼠标右键“Creat Subsystem”,即创建完成子系统。
(2)参数的传递
Xilinx Blockset和Simulink中其它模块一样,参数配置可以使用Matlab中的变量和语句,Matlab强大的语句表达能力在这里体现的非常充分。
对于一个子系统(Subsystem)来说,通常需要设置子系统内部模块的参数值,当然通过双击每个block直接设置是可以的,除此之外对于封装好的子系统,用参数传递的方法设置简单方便。点击需要参数传递的子模块,右键选择“Mask Subsystem”,出现图1-25的配置界面。

图1-25 子系统参数创建
图1-25中,点击“Parameters”标签,在“Dialog parameters”栏即可创建参数,本例子中创建一个参数(取名为trunc_round),代表输出截位方式。在子系统内部,双击任意一个模块,点击“Basic”标签,在“Quantization”处右键点击选择“Define With Expression”,将图1-25中定义的参数(trunc_round)键入即完成参数的传递,如图1-26所示。

图1-26 子系统参数传递
7.资源预估模块
System Generator提供一个特殊模块(Resouce Estimator),该模块提供资源预估功能,资源包括Slice、LUT、触发器、Block Memory、硬核乘法器等。如图1-27所示。

图1-27 Resource Estimator模块
模块中【Slices】、【FFs】、【BRAMs】、【LUTs】、【IOBs】、【Emb.Mults】、【TBUFs】分别表示当前模块占用的硬件资源量。
其中【Estimate options】为资源预估模式,分为【Estimate】、【Quick】、【Post Map】和【Read Mrp】四种可选模式。
点击“Estimate”后开始进行资源预估