1.2.2 系统级建模详解
推荐给好友
打印
加入收藏
更新于2008-11-18 19:57:00

利用System Generator进行系统级建模,工程中可以包含多种元素,比如数据流、HDL模块、Xilinx模块以及Matlab语言函数等,都可以最终映射到硬件实现。本节主要详细介绍利用System Generator进行系统建模过程中的注意事项,包括System Generator Blockset、信号类型、采样和时钟、同步机制、资源评估等。
 
1.System Generator Blockset
在节1.1.3中初步介绍过System Generator Blockset的基本概念,主要包括Xilinx Blockset、Xilinx Preference Blockset和Xilinx XtremDSP Kit三组库函数块。

Xilinx Blockset库包括了所有在Simulink中构建数字信号处理系统和其他FPGA数字系统的模块,按照各个模块的具体功能将Xilinx Blockset划分为多个子库,部分具有广泛适用性的模块出现在多个子库中,如表1-4所示。


表1-4 Xilinx Blockset库

 

 


除了Xilinx Blockset库之外,System Generator库还提供了在使用FPGA进行工程开发过程中经常会用到的一些特定功能和通用性很强的参数化模块,这些模块都是由Xilinx Blockset库中的基本模块数个组合而成的。也就是说开发人员完全可以只使用Xilinx Blockset库中的模块进行开发,但使用Xilinx Preference Blockset库可以降低开发难度,缩短开发时间,并通常都具有较高的可靠性,因为这些模块都是经过优化验证的,有很高的性能指标,如表1-5所示。

 

 
表1-5 Xilinx Preference Blockset库


Xilinx Preference Blockset库中的所有模块几乎都可以看做是一个子系统,都有其参数配置方式和对应的硬件要求等,设计人员在使用时需要仔细参看模块的说明文档。
 
System Generator Blockset是System Generator系统建模中的基本模块,其容纳了几乎所有的数字信号处理单元,同时用户也可以根据基本功能单元组合成特定需求的DSP处理模块,满足设计需求,但值得注意的是,用户在调用每一个System Generator Blockset时,需仔细阅读其说明文档,了解模块的参数含义以及基本用法,有关System Generator Blockset库中所有模块的详细介绍,读者可以参看sysgen_ref说明文档。

2.信号数据类型
为了能达到基于比特的硬件仿真效果,Xilinx blocks的操作都是基于定点数。一般来说,输入数据经过运算后会导致比特扩位,比如3比特的加法器输出为4比特,所以Xilinx blocks可以根据需要设定模块的输出格式:“full precision”和“User-specified precision”。如果选中“full precision”,那么输出比特将根据运算需要进行相应扩位,运算精度不会受到影响;如果选择“User-specified precision”,那么输出结果将被截位或者饱和处理(用户自行设置)。定点数的运算法则以及截位规则与HDL代码设计中类似,有兴趣的读者可以参看MATLAB相关文档或者参看2.3.3节介绍定点模型。

在硬件实现过程中,通常会遇到不确定数的(“Indeterminate”)出现。比如一个双口RAM,两个端口同时对RAM中的某一地址进行写操作时,该地址中的数据即为不确定类型。如果模块中有不确定数出现,则表明该模块的最终硬件实现将会有不可预测的行为,当Simulink进行仿真时,System Generator将会捕捉该错误,故在System Generator设计中一定要避免此种情况的发生。

在System Generator中,用于数学运算的数据可以是不确定类型,但布尔型变量不能是不确定型。如果出现将布尔型变量为不确定数的情况,将会出现仿真错误。大部分Xilinx模块只允许布尔型变量作为其控制端口的输入类型。

在System Generator中,只需要点击“Format → Port Data Types”或者按下“Ctrl+D”键,即可显示每个模块输入输出信号线的数据类型。

3.Assert模块
System Generator模型中,信号必须有固定的数据类型和采样速率,如果Simulink无法确定信号的数据类型和采样速率时,System Generator会报错。此时需要人为添加“Assert”模块。通常这种情况出现在模型设计中存在反馈时,如图1-13所示的简单电路,“Addressable Shift Register”的输出延时后反馈回该模块的输入,此时运行程序出错(信号类型为“illegal”)。


图1-13 没有Assert模块的原始工程


Simulink无法确定“Delay”输出信号的数据类型,为了解决上述的问题,需要手动添加一个“Assert”模块来指定SRL16(Addressable Shift Register)模块输出信号的数据类型和采样速率,如图1-14所示。


图1-14 加入Assert模块后的sysgen工程


“Assert”模块将SRL16(Addressable Shift Register)模块的输出信号指定为“Ufixed_16_2”类型,“Assert”模块的作用体现在对信号进行强制指定或者重新定义,在系统设计的很多地方十分有用,并且在硬件实现时不占用任何资源。设计人员在System Generator工程设计中需恰当利用Assert模块。
 
4.采样周期
System Generator中的所有模块设计都为离散系统,也就是说所有信号和模块内部处理都有采样率的概念。一个模块的采样率决定了该模块的工作频率, 一般情况下System Generator自动设置大部分模块的采样率,少数模块需要设计者专门设定其采样率。
如何理解采样周期,参看图1-15所示的简单设计。


图1-15 采样周期样例工程


图1-15中“Gateway In”模块设置采样周期(“Sample Period”)为1s,“Gateway Out”模块将定点数据转换成浮点数(显示在“Scope”上),得到图1-16所示的波形。需要注意的是,“Gateway In”模块中采样周期选项“Sample Period”只能设置为正整数。


图1-16 采样周期样例的仿真波形

 
图1-16中,浮点正弦波转换成了定点的采样波形,采样周期取决于“Gateway In”模块中“Sample Period”的设置,可见采样周期对信号的影响很大,采样周期越大(也就是采样率越小),信号一个周期内的样值数越少,所以信号畸变就越大。

上述例子中,整个系统采用单一采样周期,而一般的FPGA设计模块之间的采样率是不同的。System Generator支持多速率(也就是多采样率)设计,常见的采样率改变模块有:Up Sample上采样和Down Sample下采样模块。其它模块比如(串并变换或者并串变化模块)也能改变速率,但取决于该模块的参数配置,如图1-17的这个简单设计体现了多采样率在系统的实现。


图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-18 多速率时钟属性选择


(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所示。


图1-19 Clock Enable与System Clk时序关系图

 
(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工程文件。

例1-2:多速率System Generator设计中选择“DCM”模式的测试样例。
① 在Simulink下打开工程文件dcm_case1.mdl,如图1-20所示,该样例程序利用一个乘加单元(MAC)完成FIR滤波器功能。其中“Coefficient ROM”存储滤波器的抽头系数,“ASR”为移位寄存器,移位存储输入信号源,“Counter”计数器完成地址线的编译操作,用以控制“ASR”和“Coefficient ROM”数据依次输出,“MAC Engine”完成信号源和抽头系数的乘加操作。


图1-20 dcm_case1工程


② 双击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”后开始进行资源预估。

 

<上一节  下一节>




 
关于我们 | 诚邀加盟 | 客户服务 | 相关法律 | 网站地图 | 友情链接 | 服务信箱:service@eefocus.com
© 2006 与非门科技信息咨询(北京)有限公司 All Rights Reserved.