1.2.6 Sysgen中特殊模块的使用说明
推荐给好友
打印
加入收藏
更新于2008-11-18 20:05:05

在1.2.2节讲述了系统建模中常遇到的基本概念,在System Generator系统设计中,有一些模块的使用与其它模块略有不同,需要格外注意。这些模块包括Mcode、DSP48、FDATool、Chipscope Pro等,本节着重介绍这些模块的使用注意事项。

1.Mcode模块的使用
Xilinx Blockset中的“Mcode”模块,能将MATLAB的M代码文件转换成可综合的System Generator模块,模块的每一个输入端口对应M函数中的一个输入参数,每一个输出端口对应函数中的一个返回值。

当然,并不是所有的M函数都能导入“MCode”模块,“MCode”模块支持一类MATLAB语言的有限子集,一般来说使用“MCode”模块实现算术运算、有限状态机和逻辑控制非常有用。而Xilinx提供的另一种DSP综合工具AccelDSP,能实现浮点M文件到硬件比特流的自动产生,非常方便,读者可以参考第二章AccleDSP综合工具的详细介绍。
 
使用“Mcode”模块,首先必须实现编写M函数,且代码文件必须和System Generator模型文件放在同一个文件夹中,或者处于MATLAB路径上的文件夹中。下面用两个实例来说明如何使用“MCode”模块:复数乘法器和有限状态机。

例1-6:“Mcode”模块的使用——复数乘法器。
该例子为复数乘法器样例,在本书附带光盘的“chapter1/exp1-6/mcode_block”路径中找到样例程序,打开函数xlcpxmult.m,代码如下所示:

function [xr, xi] = xlcpxmult(ar, ai, br, bi)
xr = ar * br - ai * bi;
xi = ar * bi + ai * br;

输入参数ar、ai、br和bi分别代表待乘复数的实部和虚部,返回值xr和xi分别代表复乘结果的实部和虚部值。
 
① 在Simulink下打开工程文件mcode_block_tutorial2.mdl,如图1-42所示,该工程包含四个输入和两个输出,四个输入分别代表两复数的实部和虚部,两个输出代表复数乘法的结果。


图1-42 mcode_block_tutorial2工程


② 在空白处加入“MCode”模块,点击“Xilinx Blockset → Control Logic → MCode”,将“MCode”加入空白处。
③ 双击“MCode”模块,点击“Basic”标签,在“MATLAB function”栏填入函数名“xlcpxmult”,其它属性默认配置即可,如图1-43所示。


图1-43 “Mcode”配置xlcpxmult函数


④ 点击“OK”后完成对“MCode”模块的配置,正确连接模块间的连线,点击“Start”,得到图1-44所示的波形,两图分别代表复数乘法结果的实部和虚部波形。


图1-44 mcode_block_tutorial2仿真波形


例1-7:“Mcode”模块的使用——有限状态机样例。
在HDL编程中,通常会遇到状态机的编写,通过“MCode”模块同样可以将状态机的M文件导入Sysgen工程中。该样例为序列检测器状态机,检测输入序列中是否含有“1011”,使用状态机实现,该状态机的状态转移图如图1-45所示。


图1-45 序列检测状态转移图


在附带光盘的“chapter1/exp1-7/mcode_block”路径中可以找到样例程序,用MATALB打开函数“detect1011_w_state.m”,该M文件代码如下所示。

 


① 在Simulink下打开工程文件mcode_block_tutorial4.mdl,双击“Signal From Workspace”模块,输入数据源为“0101101100101100111”,经过状态机检测后,如果出现序列“1011”,则输出高电平。
② 点击“Xilinx Blockset → Control Logic → MCode”,将“MCode”加入空白处。按照样例1-6中同样的方法,导入“detect1011_w_state”函数,正确连接模块间关系,如图1-46所示。

 


图1-46 mcode_block_tutorial4工程


③ 点击“Start”按钮运行仿真,得到图1-47的仿真波形,上图为输入序列,下图为序列检测结果,输入序列为“010110110010110011100000000”,下图检测结果为“00001001….”,符合设计要求。


图1-47 mcode_block_tutorial4仿真波形


2.DSP48的设计方法
Xilinx Virtex-4和Virtex-5芯片提供的硬核乘加单元称之为DSP48,其使用范围非常广泛,通常运用在数字信号处理单元,比如FIR滤波器的实现。DSP48的介绍说明和具体使用可以参看DSP48 Users Guide,图1-48是DSP48的简单结构示意图。


图1-48 DSP48的简单结构示意图


DSP48有18比特的有符号乘法器和48比特的加法器、复用器和可配置寄存器构成,具体构造本章不做详细介绍,本节主要介绍在System Generator中如何使用可编程的DSP48。

(1)标准模块的使用
使用乘Mult、加减AddSub、复用Mux等标准模块,在sysgen硬件实现时,乘Mult将综合为DSP48单元,其它模块比如加减AddSub、复用Mux等被综合为FPGA逻辑资源(LUT-based)。为了增强系统设计性能,建议将乘法器的延迟设为3,并将输入加上寄存器,这样乘法器的输出和DSP48的默认配置相同。
除此之外,IPCore的调用也会使用DSP48,比如MAC_FIR,当然也可以通过使用architecture wizard直接调用和配置DSP48硬核单元。

(2)可综合模块的使用
可综合(Synthesizable)Mult、Mux和AddSub模块与标准模块不同,在Synplify或者XST下都有可能被综合DSP48模块,如图1-49所示的Simulink工程:


图1-49 DSP48的简单结构示意图


图1-49中,三个可综合模块(“xlsynmux2”、“xlsynmult”和“xlsynadd”)由“Mcode”模块构成,分别使用下面的三个M函数实现。其中“xlsynmux2”实现选择器功能,“xlsynmult”实现乘法器,“xlsynadd”实现加法器。

 如果设计中包含与上述类似的可综合模块,Synplify Pro和XST都可能将其映射到DSP48上,包括使用连接总线PCOUT-PCIN和BCOUT-BCIN等,前提是该模块的数据位宽不能超过DSP48的最大总线宽度。但值得注意的是,这种通过“Mcode”模块的用户定义将模块映射到DSP48的方法更准确的说是一门艺术,而不是一门科学,所以很多情况得到的结果和用户的设想是不一致的,用户必须通过类似于Synplify Pro的门级技术检测是否正确映射,所以非常复杂,一般情况下不建议以这种模式使用DSP48。

在路径“sysgen_examples/dsp48/synth_fir/synth_fir_tb.mdl”中有一个可综合FIR滤波器的例子,有兴趣的读者可以参考。

(3)DSP48和DSP48 Macro的使用
DSP48最大的特点是可以在每个时钟周期改变其指令(通过改变11比特位宽的控制端口),这使得DSP48能完成资源的复用,比如在FIR滤波器中,数据速率很低,在一个数据周期内,DSP48通过改变指令完成多个抽头系数与数据的相乘,从而节省DSP48的个数。一般情况下通过Mux复用器来达到动态调整DSP48指令的目的,如图1-50所示。


图1-50 DSP48指令复用例子


图中使用“Constant”、“Mux”模块完成DSP48 4个指令的循环,“Constant”模块具有一个特殊功能选项,即完成DSP48的一个指令表达式,如图1-50所示,该工程在硬件实现时,“Constant”模块和“Mux”模块综合后都得到简化,综合后只使用2个4-LUT。
 
DSP48 Macro与DSP48的区别在于其简化了DSP48的使用,尤其是指令需要动态调整时,使用DSP48 Macro更加简单,在路径“chapter1/exp1-8/dsp48/dsp48_macro.mdl”中,双击工程文件dsp48_macro.mdl,如图1-51所示。


图1-51 DSP48 Macro的完成复数乘法器


图1-51中,DSP48 Macro通过复用指令完成复数乘法器,“Counter”控制4条指令序列的循环,双击“DSP48 Macro”模块,在DSP48 Macro属性中输入控制指令即可,非常方便快捷。

使用DSP48构造FIR滤波器是一个非常理想的选择,读者可以参考例子(包含Type1和Type2型FIR滤波器的实现)。在路径“chapter1/exp1-8/dsp48/firs/dsp48_firs_tb.mdl”。

(4)如何利用DSP48达到高性能设计
DSP48的设计通常需要额外的逻辑资源(比如I/O、BRAMS、SLICE等)加以控制,这些逻辑资源通常用作延迟、复用、计数器和逻辑控制等。DSP48硬核乘加单元通常能工作到高达500MHz的时钟速率,而一般的逻辑资源很难达到这样的速率要求。在V4-11系列芯片中,寄存器建立时间需要300ps,保持时间也需要300ps;而一个LUT的延迟通常为166ps,且DSP48和BRAMS的输入、输出需要500ps,再加上时钟的偏移和抖动,让逻辑资源也达到500MHz的速率要求非常困难,所以图1-52给出一些设计中的建议,让DSP48外部逻辑资源速率得到提高,下面分别对图中所示的图标①、②等进行介绍。


图1-52 如何使用DSP48达到高性能设计


① 在DSP48、BRAM16、FIFO16的输入、输出都加上寄存器。
② 需要的时候,在DSP48和BRAM外部额外加上寄存器。
③ 在DSP48级联时,使用DSP48的PCOUT-PCIN总线。
④ 在超过20-40个SLICE构成的路径上加寄存器。
⑤ 控制扇出(fanout)不超过32负载,并且每个负载路径限制在20个SLICE内。
⑥ 基于LUT构建的逻辑输出都加上寄存器。
⑦ LUT构建的逻辑单元不能超过一级。
⑧ 尽量使用RAMS,SRL16控制状态,而不使用状态机。
⑨ 使用DSP48完成位宽在8-16比特的计数器和加法器。
⑩ 使用区域约束语句:"INST ff1* LOC = SLICE_X0Y8:SLICE_X1Y23;"。

在利用DSP48设计时,尤其是初学者,应多加注意以上几点,确保设计的可靠性。
 
3.利用FDATool进行滤波器设计
在Matlab中使用fdatool命令可以得到滤波器的GUI设计界面,用户可以设定滤波器类型、采样速率、截止带宽、阻带下降dB等参数,点击“Design Filter”即可设计出相应的滤波器。在System Generator进行设计时,“FDATool Block”模块有类似功能,可以很方便地设计用户所需滤波器,FDATool Block模块在“Xilinx Blockset → DSP”可以找到。

本节通过一个例子,讲述在System Generator设计中如何使用“FDATool”,并且指出注意事项。在附带光盘的“chapter1/exp1-9/mac_fir”路径中可以找到该例子。

例1-9:利用“FDATool”模块进行滤波器设计。
(1)在Simulink下打开mac_df2t_soln.mdl工程,如图1-53所示,该工程中“MAC Based Filter”为定点FIR滤波器,“Reference Filter”为对应的浮点滤波器模块,用于对比定点模块的性能指标,“FDATool”用于滤波器设计。为了能同时观测滤波器的频率响应特性,使用了频率响应计算模块。


图1-53 mac_fir工程样例


(2)在“MAC Based Filter”模块上点击右键,选择“Edit Mask”,按图1-54的参数配置“MAC Based Filter”,分别代表滤波器抽头系数(“coef”),以及抽头系数的量化属性(比特位宽“coef_width”、小数点位置“coef_binpt”)、输入数据的量化属性(比特位宽“data_width”、小数点位置“data_binpt”)、采样率Fs等。


图1-54 mask参数传递


(3)在“Xilinx Blockset”库中找到“FDATool”模块,加入当前工程中,双击“FDATool”模块,并且按照如下参数设置FDATool中的低通滤波器参数。

Sampling frequency:Fs = 44.1 KHz
Passband frequency:Fpass = 6 KHz
Stopband frequency:Fstop = 7.725 KHz
Passband ripple:Apass = 1dB
Stopband ripple:Astop = 48 dB

点击“Design Filter”后得到一个43抽头的低通FIR滤波器,与Matlab中的fdatool一样,可以查看频响特性、查看抽头系数等信息。使用下面命令行语句可以查看当前FDA Tool产生的抽头系数:

xlfda_numerator('FDATool')

同时使用Matlab中的max和min语句帮助设计者找到当前滤波器抽头系数中的最大值和最小值,从而确定如何定点量化出抽头系数。比如在本设计中,最大值为0.3022,故设定抽头系数类型为Fix_12_12(也就是位宽为12比特,小数点在最左端),可以表示的数据范围在-0.5到0.4998。如果改为Fix_12_11,表示范围-1到0.9995,虽然也能量化当前的抽头系数,但却损失了精度,所以要合理设置抽头系数类型。

(4)双击“Reference Filter”模块,在“Numerator”处填入“xlfda_numerator('FDATool')”代表使用“FDATool”模块当前设计的滤波器抽头系数,“Denominator”设置为1,“Initial conditions”设置为0。双击“MAC Based Filter”模块,在“Filter Coefficients”处填入“xlfda_numerator('FDATool')”,抽头系数量化属性中“Coefficient Width”设置12,小数点位置“Coefficient Binary Point”设置12,“Data Width”设置10,“Data Binary Point”设置8,“Sampling Frequency”设置为44100,如图1-55所示。


图1-55 MAC Based Filter和Reference Filter模块的参数配置


读者可以在路径“chapter1/exp1-9/mac_fir”中找到配置完成的整个工程设计,名称为mac_fir_soln.mdl。


(5)在Simulink下打开mac_fir_soln.mdl工程,点击“Start”仿真,得到图1-56所示的滤波器频率响应波形。上图为“MAC Based Filter”模块的滤波器频率响应特性曲线,下图为“Reference Filter”模块的滤波器频率响应特性曲线,两模块使用相同的滤波器系数,不同的是“MAC Based Filter”模块进行了量化处理。从特性曲线上,两者几乎看不出任何差别,阻带下降值都在50dB左右。

 


图1-56 mac_fir_soln仿真波形


(6)双击“MAC Based Filter”模块,将输入数据类型改变为“FIX_8_6”,也就是“Data Width”设置8,“Data Binary Point”设置6;滤波器抽头系数类型改变为“FIX_10_10”,也就是“Coefficient Width”设置10,小数点位置“Coefficient Binary Point”设置10;再次点击“Start”仿真工程,得到图1-57的对比特性曲线图。


图1-57 修改后的mac_fir_soln仿真波形


图1-57中,蓝色曲线代表定点滤波器(“MAC Based Filter”)频率响应特性,红色曲线代表浮点滤波器(“Reference Filter”)频率响应特性。由于数据位宽和抽头系数量化属性的改变,使得定点频率特性比浮点差。故对于“FDAToo“l设计的滤波器抽头系数,设计人员要合理设置量化属性,同时要合理设置输入数据源的量化属性,才能得到良好的频响特性。

本例子使用的“MAC Based Filter”中,只有一个MAC单元处理模块,建议读者参看“Reference Library”库,里面有很多滤波器的模块,包括多通道、插值、CIC滤波器等,以加强对滤波器的深入了解。

4.ChipScope Pro的使用
ChipScope Pro为Xilinx公司推出的线逻辑分析仪,其通过软件的方式具有逻辑分析仪的功能,且成本低廉、操作简单,因此具有极高的实用价值。ChipScope Pro既可以独立使用,也可以在ISE集成环境中使用,非常灵活。在System Generator工具中也有Chipscope Pro模块。

本节通过样例形式介绍在“ChipScope Pro”模块在System Generator中的使用,使用Chipscope Pro进行在线调试需要在Simulink模型设计中加入“Chipscope Pro”模块,通过JTAG接口实时地进行芯片内部信号的检测。在附带光盘的“chapter1/exp1-10/chipscope”路径中可以找到该例子,该文件夹里面包含以下内容:
例1-10:利用“Chipscope Pro”模块在线调试System Generator工程。
 chip.mdl:原始的Simulink工程。
 chip_soln.mdl:添加入“Chipscope Pro”模块并正确连线后的Simulink工程。
 osc_clock_2v80.bit:在XC2V80芯片实现硬件映射后的比特流文件。
(1)在Simulink下打开工程文件chip.mdl,如图1-58所示,该工程中包含正弦和余弦查找表,一个8比特计数器Counter驱动查找表地址的变化,为了方便Chipscope Pro检测信号端口,sin和cos管脚都引出,同时用Counter与255作求模运算来作为Chipscope Pro的触发条件,且Counter最高比特作为LED灯的触发指示。


图1-58 chip的sysgen工程


(2)点击“Start”按钮,仿真波形如图1-59所示,共四个子图,第一图显示LED灯变化波形图,第二图为计数器变化图(0到255循环变化),第三和第四图为正、余弦信号发生器输出的信号波形(两者间相位相差90度)。


图1-59 chip的仿真波形


(3)在“Xilinx Blockset → Tools”中找到“Chipscope Pro”模块,加入当前工程中。
(4)双击“Chipscope Pro”模块,配置参数。参数配置与在ISE中的Chipscope Pro的配置类同,这里就不多作说明。
(5)正确连接“Chipscope Pro”,“Counter”作为触发条件输入Chipscope Pro的“Trig”端,观察Sin和Cos输出端口,如图1-60所示。


图1-60 加入Chipscope Pro后的sysgen工程


(6)添加管脚约束。
本例中,需要指定LED和时钟的管脚约束,在开发板XtremeDSP Development kit中实现。双击“Gateway Out1”模块,选中“Specify IOB Location constraint”,输入“Y11”作为LED的管脚名,如图1-61所示.


图1-61 添加管脚约束


(7)双击“System Generator”图标,“Compilation”选项选择“Bitstream”,选择正确的开发板(“Virtex2 xc2v3000-4fg676”),设定系统时钟周期25ns,并且指定相应管脚“Y13”,如图1-62所示。


图1-62 System Generator图标属性配置


(8)点击“Generate”产生比特文件(“osc_clock_2v80.bit”)。
(9)将比特文件下载到开发板中后,按Chipscope Pro的使用方法,使用Chipscope Pro观察波形,点击“Bus Plot”,选择“data vs time”模式,同时选中“Cos”和“Sin”信号显示,得到图1-63的波形,两者之间相位差90度。


图1-63 Chipscope Pro仿真波形

 


5.Clock Enable中ce_clr信号的使用
在1.2.2节中了解到,在用System Generator硬件实现时,可以选择3种时钟实现方式:Clock Enable、DCM和外部时钟模式。默认情况下为Clock Enable模式,此模式下使用一个系统时钟加上多个CE信号来实现多时钟速率设计。当System Generator作为一个子模块导入另一个工程时,通常需要正确控制sysgen模块和其它模块之间的数据流同步时序,也就是说需要动态调整对输入数据采样点的位置,解决的方法是引入“ce_clr”信号,即在System Generator图标属性中选中“Provide clock enable clear pin”,如图1-64所示。

 


图1-64 Provide clock enable clear pin属性设置

 
本小节首先介绍ce_clr控制信号对输入数据采样点的影响,其次介绍在System Generator设计中,各种速率转换模块受ce_clr信号的影响程度。

(1)ce_clr信号的作用
在Clock Enable模式下,添加ce_clr控制信号可以有效控制对输入数据的采样点位置。如图1-65所示,ce_clr信号有效时(高电平有效)对CE4进行清0操作,无效时重新开始产生CE4信号。


图1-65 ce_clr对采样点的影响


图1-65中,CLK为系统时钟,假设采样周期为1;CE4是周期为4倍CLK的脉冲波形,所以CLK结合CE4后采样周期为4,相当于4倍降采样。ce_clr信号的插入,改变了对Din输入数据的采样点位置(延迟了2个时钟周期进行采样)。

在硬件实现时,ce_clr信号作为整个Sysgen设计的输入端口,无法在Simulink中进行仿真,但ce_clr影响着接口模块对数据的采样点位置,故对ce_clr信号的仿真非常必要,需要采用HDL co-simulation协同仿真,并且按照如下步骤操作:
① 在“System Generator”图标属性中选择“Provide clock enable clear”选项,在“Compilation”选择“NGC Netlist”。
② 点击“Generate”按钮,完成自动代码产生。
③ 在Matlab命令行键入以下命令,产生post translate VHDL Netlist文件,如果是Verilog代码,只需要将-ofmt vhdl换成-ofmt verilog即可。
>> !netgen -ofmt vhdl ./<target_directory>/<design_name>_cw.ngc
④ 在Simulink下将③产生的HDL文件导入“Black Box”,采用HDL co-simulation模式仿真ce_clr对设计的影响(HDL co-simulation请参见1.5.4节)

(2)ce_clr信号对速率转换模块的影响
ce_clr信号能改变输入采样数据的初始相位,所以对于sysgen中的速率转换模块来说,ce_clr的加入直接影响到该模块的正常工作,表1-6列举了ce_clr对sysgen所有速率转换模块的影响(其中“Down Sample”和“Up Sample”模块根据设置不同分为两种)。


表1-6 ce_clr对速率转换模块的影响


从表1-6的速率转换模块分析,不同模块受ce_clr的影响不同,在使用ce_clr时,需要注意下面几点,确保程序的逻辑正确性。

 将设计中“Down Sample”降采样模块(采第一个值)换成等效的降采样模块(采最后一个值)。

 设计中尽量使用“Up Sample”过采样模块(重复插值)。

 从ce_clr无效到下一个ce信号有效之前,通常模块的输出数据是无效的,如果该设计不允许出现无效数据,那么可以将并串、串并、时分复用和时分解复用等模块等效用计数器、过采样和降采样模块来替代。
 
 在模块设计(比如乘加模块)中的计数器使用通常需要使用reset信号,那么在sysgen中,用ce_clr和ce逻辑与得到reset信号。

 使用ce_clr信号,建议通过HDL co-simulation仿真其逻辑性能。

 

 

<上一节  下一节>




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