第7章
FPGA DSP嵌入式系统设计
§7.1
设计流程概述
DSP(Digital Signal Processing)技术在通信、图像处理增强、数据获取、雷达及视频处理等等领域有着广泛的应用,因此,DSP的使用也不只存在唯一的方法,而是要根据不同的目的提出不同的解决MATCH_
word
word文档格式规范word作业纸小票打印word模板word简历模板免费word简历
_1714221046950_1。可编程芯片的FPGA逐渐成为这些解决方案中的一个重要的组成部分。预计用于DSP的可编程芯片的产量将以平均每年41.6%的比率增长,到2005年,产量已达到17.8亿美元。
通常,DSP算法的实现有两种途径:低速的用于普通目的的可编程DSP芯片;高速的用于特定目的的固定功能DSP芯片组和ASIC(Application Specific Integrated Circuit)芯片。而FPGA是DSP设计人员的另一种选择。大多数FPGA是由逻辑单元阵列、各个逻辑单元之间的可编程互连线、I/O管腿和其他一些如片上的存储器之类的资源组成的。其中逻辑单元是由1个四输入的查找表和1个触发器构成的。
与普通的DSP芯片相比,FPGA芯片能够更好地实现并行处理,从而提高了性能并节省了能源。如算法中使用了14个MAC(Multiply & Accumulate),与只有1到4个MAC的通用DSP芯片不同,在FPGA中可以配置14个乘法器,以实现并发处理。而这种流水线结构的数据流可以使信号负载最小化,从而节省指令和数据存取的系统开销。此外,因为芯片所消耗的能量与它的时钟频率成正比,FPGA可以将输入的数据流分离开,并将它们作为几个并行的数据流进行处理,从而工作在一个较低的时钟频率下,这样做也就节省了能源。相对来讲,FPGA设计的灵活性和适应性更强。而与ASIC芯片相比,FPGA可以反复使用,并且在产品制成后还能重新更改设计。这样做有三点好处:修补bug;加入新的功能;使系统适应新的
标准
excel标准偏差excel标准偏差函数exl标准差函数国标检验抽样标准表免费下载红头文件格式标准下载
。使用FPGA的现场可编程能力,不但避免了高额的开发费用,而且满足产品的上市需求。
虽然有如此多的优点,但是目前FPGA在DSP应用上所占用的份额并不大,而且主要是用做协处理器,以辅助DSP芯片完成一些计算密集型的算法。这种现象的造成主要有两方面的原因。一方面,在软件上,DSP与FPGA之间有着巨大的隔阂。生活在软件世界的DSP程序员要学习如寄存器、门、VHDL代码等等新的知识才能进入电子工程的世界。这两类设计人员不但完成设计时所使用的工具不一样,而且,在设计中所考虑的问题也不同。表1表示了他们之间的差异。另一方面,在硬件上,原先的FPGA芯片没有集成专门的乘法器,只能依靠用户自己编辑乘法器。乘法器的实现比较耗费以查找表为主的系统资源,所以在编辑完并行的MAC后,FPGA所剩的资源无几,从而限制了FPGA的使用。正是由于这两个主要的因素,使FPGA无法在DSP领域中有更大的作为。
表7-1
DSP设计者
FPGA设计者
设计方法
C,C++,汇编
MATLAB,SimuLink
VHDL/Verilog编程
综合,映射,布局布线
设计问题
信噪比,误码率,采样率
腿到腿延时,流水线和逻辑层次,布局规划
横亘在软件间的隔阂和硬件结构上的差异限制了FPGA的DSP应用,但是现在这项工作变得简单了,Xilinx公司提出了一整套的解决方案。不但出现了IP(Intellectual Property)核(Core)形式的DSP算法和将这些IP核集成到FPGA设计的工具软件,而且出现了新的FPGA芯片。软件上一个重要的代表是XtremeDSP系列软件包,主要包括:
MathWorks公司的Matlab和Xilinx公司的System Generator负责系统级设计;
Mentor Graphics公司的FPGA Advantage或Synplicity公司的Synplify Pro做HDL综合;
Model Technology公司的ModelSim负责仿真;
Xilinx公司的Foundation Series ISE负责硬件实现。
图7-1表示使用Xtreme设计DSP算法的流程。在硬件方面,Xilinx公司推出最新的Virtex II系列FPGA芯片。它内置了192个18×18 bit的高性能组合乘法器,支持高达250MHz的数据率,内部固化了并行的DSP数据模型。它的密度达到一千万系统门,可以运行600G MAC/s。大大超出了当今通用DSP芯片的性能(TI的高端DSP芯片TMS320C6000的定点系列C64x只能达到1.6—2.4G MAC/s)。设计方法和硬件结构上的改进使FPGA在DSP上的应用前景变得光明起来。
图7-1 Xtreme系统中实现DSP的设计流程图
Xilinx公司同它的合作者联合提出了XtremeDSP解决方案,它在系统结构设计和基于FPGA的DSP系统硬件实现之间建立起一座桥梁。System Generator同Simulink模型工具结合,可以参数化、最优化算法。它可以自动从行为级的系统模型转换到FPGA实现,其间不再需要手工重设,大大节省了开发时间并降低了出错概率。通过软件,用户可以在DSP函数的算法、性能、节能、硅片面积中进行选取,可以快速地分析出它的运算速度和花费。
图7-2
基于模型的设计过程
Xilinx FPGA支持用户在同一个设计的不同部分创建自定义的字长。Xtreme支持不同的比特数、流水线程度和实现的选择方法。对于某些需要更多比特数来表示精度的通道,只要更改IP的参数,软件就会自动适应新的数据配置。
Xtreme的配置灵活,用户可以根据需要进行设置:若全部使用并行结构就可以达到最大的数据吞吐量,也可以由于降低了系统时钟而节省能源;相反的,若全部使用串行结构则会使硅面积最小,节省花费,但同时仍能够得到相当的性能。
MATLAB作为线性系统的一种分析和仿真工具,在工程和计算科学上有着广泛的应用。它建立在向量、数组和矩阵的基础上,结合了可视化的数学计算和强大的技术语言。内建的接口可以从指令、文件、外部数据库和程序中迅速得到数据。Simulink作为Matlab的一个工具箱(toolbox),在整个的DSP设计中起着举足轻重的作用。它是一个交互式的工具,用于对复杂的系统进行建模、仿真和分析。成为控制系统设计、DSP设计、通信系统设计和其它仿真应用的首选工具。它的特性为:建立图形式的模块列表,模拟复杂系统,评估系统的性能,提高设计水平;建立模拟、数字或数模混合的信号系统,控制逻辑器件;与Matlab的结合;与Stateflow紧密结合,建立数据驱动行为的模型;广泛利用DSP库。
System Generator是Xilinx公司的的一个模块集(blockset),它是simulink的一个插件,其中设置了Xilinx特有的DSP功能的IP核,包括了基本DSP函数和逻辑算符,如FIR(Finite Impulse Response)、FFT(Fast Fourier Transform)、存储器、数学函数、转换器、延时线等等。这些预先定义好的模块保证了FPGA实现时的位-bit和周期-cycle的正确。使用它可以自动生成VHDL/Verilog语言、测试向量以及可以使ModelSim仿真的“.do”文件。为了得到最佳的性能、密度和可预测性,System Generator还会自动将特定的设计模块映射成高度优化了的IP核模型。Xilinx Blockset中的模块,有的可以直接映射到硬件,有的对应着IP核。它们中每个都可以根据设计要求更改参数,支持双精度和定点的算法。这个模块集是一个可以外部扩展的库,使用的是C++的定点算法,所以用户可以创建自己的基于C++类的Simulink库元件,在设计中它会被当作黑箱(Blackbox)处理。
有两种可以实现HDL综合的工具:Mentor Graphics的FPGA Advantage和Synplicity的Synplify。这两个工具都可以将上一步(使用Simulink和Xilinx System Generator完成的设计)的顶层(和附加的子VHDL文件)HDL行为级或RTL设计文件转化成门级表示(EDIF文件)。可以使用其中的任意一个软件来完成这个任务。这些工具可以:将HDL综合成门级的设计实现;通过消除对每个门的定义,减少了设计时间;减少了手工将硬件说明翻译为原理图设计中可能出现的错误数量;在最优化原始的HDL代码过程中应用了综合工具的自动技术(如机械编码类型、自动I/O插入),从而使设计更有效率。
使用ModelSim就可以在设计过程中对HDL进行仿真,以保证结果的正确性。它的特性如下:通过使用Direct Compile结构,达到最快的编辑速度和有竞争力的模拟性能;使用Single Kernel Simulation,将VHDL和Verilog结合在一起;将machine和Simulator版本独立开来,以简化可携带性和库的维护。
Xilinx的ISE软件包含了最新的实现工具,可以用来创建有效简洁的设计。当综合完VHDL文件后,就会得到顶层的EDIF文件(也有子层的EDIF文件),将这些EDIF文件作为Xilinx Design Manager的输入源进行实现,它将翻译(Translate)、映射(Map)、布局布线(Place & Route)以及配置(Configure)该设计。最终得到下载用的位流文件。它的时序驱动的布局布线特性允许用户为特定的路径指定自己的时序;静态时序分析能够减少设计步骤;能够在实现前后对设计进行验证;可以重新迭代先前的设计以缩短整个设计周期。
利用FPGA实现DSP嵌入式系统,已有互相补充的软件设计工具,表7-2列出了在系统建模和设计、算法开发和优化、HDL仿真和产生及设计校验和诊断等不同设计阶段使用的软件。
表7-2
FPGA实现DSP的软件工具
设计阶段
软件和功能
软件公司
系统建模和设计
Simulink:动态系统的多域仿真和基于模型设计的平台,提供交互的图形环境和定制的模块库集合
MathWorks
Platform Studio:包含广泛种类嵌入设计工具、IP、库、引导卡和设计产生器的集成开发环境,
Xilinx
算法开发和优化
MATLAB:算法开发、数据可视化、数据分析及数值计算的高级技术计算语言和交互环境,
MathWorks
DSP综合工具提供MATLAB与system Generator或ISE之间的直接链接,自动产生可综合的RTL模型和测试床
Accelchip:直接由C语言的程序转换到FPGA的硬件
Xilinx
HDL仿真和产生
ISE:设计者可用VHDL或Verilog设计,对FPGA编程,利用System Generator时,可按批作业模式调用
Xilinx
Synthesis:综合工具XST/Synplify Pro可低成本、高效率映射设计到FPGA硬件,按批作业模式选择他们来和System Generator一起使用
Xilinx/Synplicity
ModelSim:System Generator提供必要的接口与ModelSim仿真器连接,可以利用它做HDL协同仿真或实时地输入仿真结果到Simulink/System Generator仿真
Mentor Graphics
设计校验和诊断
ChipScope Pro:监视FPGA的内部测点,预测和诊断设计,探测结果可插入到Simulink/System Generator内
Xilinx
§7.2
FPGA设计DSP技术
ISE实现软件、System Generator以及MATLAB/Simulink工具之间都有相互配合的版本问题,对于ISE8.1以上的版本,要求相同序号的System Generator版本,并配合使用MATLAB/Simulink7.2以上的版本,如R2006a等。
System Generator8.1以上的版本,只要执行SysGenInstall.exe的执行文件,安装时会自动找到MATLAB/Simulink(R2006a)的安装
目录
工贸企业有限空间作业目录特种设备作业人员作业种类与目录特种设备作业人员目录1类医疗器械目录高值医用耗材参考目录
,将Xilinx的Blockset模块集安装到Simulink中。
7.2.1
浮点数与定点数的表示与转换
在设计仿真中Simulink是利用双精度数(double)表示数值,它是64位2的补码浮点数,而双精度数对FPGA是无效或不实际的。
当利用有限位数来表示二进制数时,二进制点的位置确定了所表示数的范围和精度,二者的关系是二进制点前面的位数多表示的数值的有效范围大,精度就低,相反,二进制点后面的位数多,数值精度提高,数值有效范围减小。
例:16位数值 0001011001101011=213+210+29+26+25+23+21+20
=4096+1024+512+64+32+8+2+1=5739
表示此数需要的二进制位数为
N=log10X / log102 =log105739 / log102 = 3.7588 / 0.3010=12.4866
取最靠近的整数为13位。
已知16进制的数值可以按照如下方式进行二进制变换和计算数值
166B= 0001 0110 0110 1011
=(1*163)+ (6*162)+ (6*161)+ (B*160)
=(1*4096)+(6*256)+(6*16)+(11)=5739
对于DSP技术更好的方式理解2的补码数是将其符号表示位看作为原始的二进制数的相应的部分,这个要点是实现时只是这位有负的加权值,所以,2的补码数值如下计算。
11111111= -27+26+25+24+23+22+21+20
= -128+64+32+16+8+4+2+1
= -128+127
= -1(10)
对于双精度的64位2的补码浮点数,由于二进制点可以移动,所以在±9.233*1018之间的任何数都可以表示,精度为1.08*10-19,也就是浮点数可以做到数值范围大,精度高,这也是双精度的含义。由于硬件无法按照双精度的要求进行实现,所以要转换成N位的定点数。
在Simulink中Xilinx的模块集有三种数据类型:
1. 不带符号的N位定点数,表示为UFix_N_m,其中N为二进制位数,m为二进制点距离最低位的位置,最大精度为2 m;
2. 带符号的N位定点数,表示为Fix_N_m,其中N为二进制位数,m为二进制点距离最低位的位置, 最大精度为2 m;
3. 布尔类型数,总是定义为0或1,作为控制口的使能(CE)或复位(reset),所以不可以设为无效。
例:数值为 -2.261108,表示为Fix_16_13的格式,
101.1011110100101= -22+20+2-1+2-3+2-4+2-5+2-6+2-8+2-11+2-13 =
-4+1+0.5+0.125+0.0625+0.03125+0.015625+0.00390625+0.00048828125+0.0001220703125
= -2.2611083984375
图7-3
数据类型
在基于模型的系统设计流程中,当Xilinx模块集中的带符号的定点数模块需要与Simulink的双精度数模块通信时,必须要进行数据类型的变换,这是基于模型的系统设计流程中重要概念之一。
为了完成这个数据类型变换,要选择Xilinx模块集中的GatewayIn实现双精度数到定点数的转换,或者选择Xilinx模块集中的GatewayOut实现定点数到双精度数的转换。
Gateway In/Out两个模块可以通过选择参数来控制如何实现双精度数与定点数之间的相互转换。一般来说,主要由Gateway In模块的参数选择来进行控制,除了选择带符号或不带符号定点数的位数和二进制点位置之外,还需要选择以下两个参数:
1. 量化方式:截断(Trancate)或舍入(Round);
2. 溢出方式:饱和(Saturate)或交迭(Wrap)。
当小数部分的位数不足以表示一个数值的小数部分时,将出现量化的情况,截断是放弃最低有效位右边的所有位,当有两个等距离最接近表示的数值,舍入将取最接近表示的数值,或取偏离0最远的数值。
图7-4
双精度浮点数到定点数的转换
例:完全精确数值为: 001.10111101010000 = - 2.2607421875
截断的结果为:Fix_12_9 101.101111010 = - 2.26171875
舍入的结果为:Fix_12_9 101.101111011 = - 2.259765625
取决于采用截断还是舍入的方法,对于正的完全精确数值和无符号完全精确数值都会有不同的输出结果。
例:正的完全精确数值为: 101.10111101010000 = 1.7392578125
截断的结果为:Fix_12_9 101.101111010 = 1.73828125
舍入的结果为:Fix_12_9 101.101111011 = 1.740234375
例:无符号完全精确数值为: 101.10111101010000 = 5.7392578125
截断的结果为:Fix_12_9 101.101111010 = 5.73828125
舍入的结果为:Fix_12_9 101.101111011 = 5.740234375
当一个数值超出了表示的范围将出现溢出,选择饱和时,取最大的正值或最大的负值,
在定点数中选择交迭时,就放弃超出最大有效位的任何有效位。在仿真的过程中出现溢出将有溢出标志作为Simulink 的错误产生。
例:完全精确的数值为:01101.1011 = 13.6875
饱和的结果为:Fix_7_4 011.1111 = 3.9375
交迭的结果为:Fix_7_4 101.1011 = - 2.3125
不论选择哪种方式处理量化和溢出,产生的HDL模型和Simulink的模型将有相同的行为特性。究竟选择量化和溢出方式中的哪一种,实际上取决于设计的要求和硬件的实现,量化方式中截断不增加硬件,而舍入要增加进行进位的硬件资源,所以在满足设计要求的情况下,应尽量选择截断的量化方式。溢出方式中选择饱和的方式可以防止输出的振荡,输出数据不再改变,实现上也要增加硬件的资源。
数据类型中的布尔(Boolean)类型是为模块的控制口设计的,如模块的时钟使能(CE)或复位(reset )口要选择布尔类型,布尔类型是一位的非符号数的变量,与一位的非符号数的区别是,一位的非符号数可以变为无效,但是布尔类型的数只定义为高或低电平的1或0两种情况,而不可以变为无效,否则控制口也将失效,系统无法工作。
例:定义以下的2的补码二进制分数的格式和计算其数值:
1100011.01011
格式为:Fix_12_5,
数值为:-64+32+2+1+0.25+0.0625+0.03125 = -917/32 = -28.65625
例:什么格式应该利用来表示以下的信号:
1. 最大值为+1,最小值为 -1,量化为12位数据:Fix_12_10;
2. 最大值为0.8,最小值为 0.2,量化为10位数据:UFix_10_10;
3. 最大值为278,最小值为 -138,量化为11位数据:Fix_11_1 。
例:求进行加法和乘法运算时,完全精度的输出数据类型。
1.
+ =
2. * =
利用Xilinx的模块集中的模块创建一个System Generator的设计,这些模块是硬件可实现的SysGen模型,此模型必须包含System Generator模块,SysGen模型要通过I/O模块作为Xilinx模块集与其他的Simulink的模块之间的接口,模型的输入端通过Gateway In与Simulink的源连接,模型的输出端通过Gateway Out与Simulink的沉及库函数连接,如图7-5所示,模型的仿真和优化就很方便。
图7-5
Simulink模块的设计模型
7.2.2
采样周期的设置
在SysGen模型中的每个SysGen信号必须被采样,出现在等距离离散时间点上的瞬间称为采样时间。在基于模型的Simulink建模设计中,每个模块都有“采样周期”,它常对应模块的功能如何计算和结果如何输出,所以采样周期是基于模型的系统设计流程中另一个重要概念。
对于Gateway In 和模块的w/o输入的采样周期必须明确设定,采样周期也可以由其他模块的输入采样时间来驱动。采样周期的单位可以认为是任意的,但是许多Simulink的源模块有一个时间要素,例如,1/44100的采样周期意味着模块的功能每间隔1/44100秒执行一次。当设置采样周期时,要遵循奈奎斯特(Niquist)定理。一个模块的采样周期直接与其在实际硬件中如何定时有关。
在System Generator模块的参数中必须设置Simulink的系统周期,对于单数据率的系统,Simulink的系统周期将与设计中设置的采样周期相同。如图7-6所示。
图7-6
采样周期的设置
§7.3
System Generator模块
在Xilinx模块集中,对可以转化为HDL代码的模块,其标示都以一个“X”型的水印来区别于其它的Simulink模块。对SysGen设计,Xilinx模块集有一些十分重要和特殊的模块,要给以特别的注意。
1
System Generator模块:
System Generator模块是一个极其重要的基本模块,它不仅使得在Simulink下建立的SysGen模型提供了层次化的表述能力,同时还必须由它来激活代码生成器,以实现模型的HDL代码转化。对于一个SysGen模型,至少要保证顶层有一个System Generator模块。
在一个SysGen模型中,System Generator的参数选择对话窗如图7-7所示。在此窗口中,要进行定制的参数有:
(1)Xilinx System Generator:
① 目标器件的系列、型号、速度等级、封装。
SysGen支持的器件系列有:Virtex -4,Virtex-II Pro,Virtex-II, Virtex-E, Virtex,Spartan3E,Spartan3,Spartan-IIE和Spartan-II系列。
② 采用的综合工具。
对于选用不同的综合工具,要求生成的代码也有一定的差别。目前支持的综合工具有:Leonardo Spectrum, Synplicity Synplify Pro, Synplify和Xilinx XST。
③ 目标路径。
设计的目标代码保存的路径。
④ 产生测试向量复选框。
如果选择了该项,则在生成HDL代码时可以将Simulink仿真输入转换成VHDL测试激励向量,将Simulink仿真输出转换成对应的VHDL测试输出向量。这些向量可用于所产生的VHDL代码的行为仿真。
图7-7
System Generator的参数选择对话窗
(2)System Period(系统周期):分别设置Simulink的系统周期和实现硬件的系统时钟周期,前者默认的时间单位是秒,后者为纳秒。
(3)Hierarchical Control(层次控制):
①Override with Doubles:
以双精度浮点的方式仿真Xilinx模块或Simulink模型,替代Xilinx模块的定点方式。设置为“Override with Doubles”的Xilinx模块显示为灰色。关于Xilinx模块的定点和浮点方式在Gateway In模块和Gateway Out模块的介绍中详细阐述。在下拉选择框中,可以指定在进行Simulink仿真时,FPGA设计是根据
“According to Block Masks”模块的屏蔽情况,使用双精度浮点信号取代定点信号; “Everywhere in Subsystem”在子系统中使用双精度浮点信号取代定点信号;
“Nowhere in Subsystem”在子系统中不使用双精度浮点信号取代定点信号。
② Generate Cores:选择在生成VHDL代码的过程中,是否生成Xilinx LogiCOREs。可选项有:
“According to Block Masks”——根据模块的屏蔽情况生成Xilinx LogiCOREs;
“Everywhere Available”——在任何可能的地方,都生成Xilinx LogiCOREs,
“Nowhere”——不生成Xilinx LogiCOREs。
设置好System Generator的参数后,单击Generate按钮开始生成VHDL代码。如果目标目录不存在,会提示创建该目录。在代码生成过程中,会显示一个进度条来表示生成进度。代码生成后,会弹出一个确认信息窗,点击确认即可。
2
Black Box模块:
Black Box模块是一个十分重要的基本模块,在Simulink环境里,并不是所有的硬件结构都可以通过Xilinx模块集中的模块进行组合来实现;但为了能进行设计系统的模型仿真,设计的Simulink模型又应该是一个完整的模型。黑匣子(Black Box)模块就是专门设计用来解决这种矛盾,提供Simulink模型与构造的HDL源码之间的接口。此外,在设计中,某些组件可能已经用VHDL或Verilog设计好了可直接调用,或者某些组件直接用VHDL编写比起在Simulink里建模要更为简单些。这些情况下,都要选用Black Box模块。
Black Box模块的使用方法是:
(1)将Black Box模块添加到模型中;
对Black Box模块的要求:
与Black Box模块有关的VHDL元件必须遵从以下System Generator的要求和规定:
1. 实体名称必须与设计中任何其他实体的名称不同;
2. 在顶层的实体中不允许双向端口;
3. 不是时钟或时钟使能的任何端口必须具有std_logic_vector的数据类型;
4. 是时钟或时钟使能的任何端口必须具有std_logic的数据类型;
顶层的VHDL程序必须为每个Simulink中有关的采样率设置分别的时钟和时钟使能端口。
在black Box的VHDL程序中时钟和时钟使能端口应该如下表示:
1. 时钟和时钟使能信号必须成对地出现;
2. 虽然Black Box可以有多个时钟端口,但利用单个时钟源驱动每个时钟端口;
3. 只有时钟使能的速率是不同的;
4. 每个时钟的名称(和每个时钟使能的名称)必须包含clk(和ce)的字符;
5. 时钟使能的名称必须与相应的时钟名称相同,只是clk用ce代替。
时钟和时钟使能端口在Black Box模块的图框中不可见。
Black Box模块必须通过一个MATLAB的M函数的文件描述它的接口,例如,端口和generics,设计的实现,通过HDL协同仿真的仿真模型等。
这个M函数文件的名称应该在模块参数对话框中进行规定。
M函数的配置文件要完成以下的工作:
1. 规定HDL 元件的顶层实体名称,它应该与black box名称一致;
例:this_block.setEntityName('fir_blackbox');
2. 选择语言(即 VHDL 或Verilog);
例:this_block.setTopLevelLanguage('VHDL');
3. 描述端口,包括类型、方向、位宽度、二进制点位置、名称和采样率;
例:this_block.addSimulinkInport('reset');
this_block.addSimulinkInport('din');
this_block.addSimulinkOutport('dout');
dout_port.setType('Fix_30_0');
4. 定义由此black box 的HDL要求的任何generics;
5. 规定此black box 的HDL 和与此模块有关的其它文件 (例如 EDIF);
例:this_block.addFile('fir.edn'); -- added entries
this_block.addFile('fir.mif');
this_block.addFile('fir.vhd');
6. 定义为此模块的时钟和时钟使能;
7. 定义是否此HDL 有任何组合的通过反馈的路径。
(2)如果在模型的项目路径下含有VHDL文件,自动执行一个配置向导,选择相应的HDL文件,如图7-8所示;
图
7-8 Black Box参数定制对话窗
(3)设置Black Box的参数,如图7-9所示。
图7-9
Black Box参数设置对话框
Black Box的参数包括以下几项:
(1)Block Congiguration M-Function:规定Black Box模块配置M函数的名称。M函数可以是手工编写的,也可以是由配置向导自动生成的。
Black Box必须通过MATLAB M函数描述它的接口:例如端口、通用属性(generics)、它的实现、选项和HDL协同仿真的仿真模型等。
配置M函数完成以下任务:
1. 规定与Black Box模块有关的HDL元件的顶层实体名称;
2. 规定使用的语言(VHAL 或 Verilog);
3. 描述端口,包括类型、方向、位宽度、二进制点位置和采样率;
4. 定义由Black Box模块的HDL元件要求任何通用属性(generics);
5. 规定Black Box模块的HDL元件和与此模块有关的其他文件(如EDIF);
6. 定义模块的时钟和时钟使能
7. 说明是否HDL元件有任何通过反馈的组合路径;
(2)Simulation Mode:有“Inactive”和“Use HDL Co-Simulation”两个选项。如果是前者的话,那么在仿真是,将忽略输入始终输出零。如果是后者的话,则使用HDL协同仿真。这时,需要在模型中新增一个ModelSim模块,并在Black Box模块的“HDL Co-Simulator To Use (specify helper block by name)”中指定该ModelSim模块。
(3)FPGA Area:提供用于资源使用估算的信息。
在生成代码时,该子系统功能的硬件实现直接使用指定的VHDL文件。也可以使用Verilog文件,但这时必须人工编写模块的M函数。进行仿真时,Black Box模块通过结合Simulation Multiplexer模块和ModelSim模块有多种灵活的仿真方法。
3
ModelSim模块
ModelSim HDL协同仿真模块配置和控制对一个或几个Black Box模块的协同仿真。这个模块完成以下工作:
1. 构造为允许black box HDL在 ModelSim中被仿真所需要的附加VHDL;
2. 当Simulink 仿真开始时引起ModelSim一个对话时间;
3. 传递 在 Simulink 和 ModelSim之间的通信;
4. 当 black box HDL 被编译时
报告
软件系统测试报告下载sgs报告如何下载关于路面塌陷情况报告535n,sgs报告怎么下载竣工报告下载
是否有错误内检测;
5. 当仿真完成时,如果合适终止ModelSim。
在仿真期间,每个 ModelSim 模块引起一个ModelSim的拷贝,所以利用ModelSim 一个license,如果license 是不足的,几个black boxe模块可以共享此相同的模块,除了灵活性差,采用这个方式没有东西损失,在ModelSim中的时间刻度匹配在Simulink中的时间刻度,即, i.e., one second of Simulink 的一秒仿真时间对应ModelSim的一秒仿真时间。参数选择如图7-10所示。
图7-10
ModelSim模块参数选择
4
Gateway In模块和Gateway Out模块:
对于Simulink仿真,通常的Simulink模型都是浮点仿真。而对于用Xilinx模块实现的设计,由于最终是要用FPGA完成一个硬件电路的实现,因而在默认方式下,Simulink中的Xilinx模块是进行定点仿真,而其余的Simulink一般模块是做浮点仿真。
Matlab IO(接口模块)组中的Gateway In模块和Gateway Out模块提供了FPGA设计(定点)和通常Simulink模块(浮点)之间的接口功能。Gateway In模块将其它Simulink模块的双精度浮点数据转换成Xilinx FPGA需要的定点数据,而Gateway Out模块则正好相反。可以在一个实例中,选中“Format”菜单里的“Port data types”来验证。
但是有的时候,在用户选择定点宽度,或者用定点方式仿真FPGA设计没有得到期望的结果或结果不正确时,用户就希望,可以选择以双精度浮点的方式仿真整个系统或特定的某些模块,以帮助发现FPGA设计的哪一部分存在量化错误。这时就可以通过设置Xilinx模块参数中的“Override with Double”项,并配合以System Generator模块里的相应设置来实现。
5. Concat模块、Convert模块、Reinterpret模块和Slice 模块
在以下的一些情况下,可以利用这些模块来完成所需做的工作:
1. 将两个数据总线组合起来形成一个新的总线;
2. 强迫进行包括位数和二进制点的数据类型变换;
3. 重置无符号数为符号数或符号数为无符号数;
4. 在数据位增长时提取数据的指定位。
Concat模块:
此模块执行两个位矢量的连接,模块的两个输入必须是无符号的整数,例如两个二进制点位于0的无符号数,或者利用Reinterpret模块所提供的符号数变换为无符号数的能力,达到扩展Concat模块的功能,
Convert模块:
Convert模块可以把每个输入采样变换为所需算术类型的数。
1. 一个数可以变换到2的补码的符号数或无符号的数值;
2. 总位数和二进制点由设计者规定;
3. 舍入和量化选择加到输出数值;
4. 取决于溢出和量化的选择可以利用附加的硬件,而不利用LogiCore。
在规定总位数和二进制点位置,符号或无符号的算术类型后,模块首先排齐输入和输出端口类型之间的二进制点,然后利用规定的总位数和二进制点,与利用的溢出和量化选择有关,输出可能按抛下的位相反地变化。饱和溢出改变小数的数值为得到饱和的数值。舍入量化也可能影响到二进制点左边的数值。
例:以下数值通过Convert模块导致利用不同位数和二进制点有相同的结果。
原始数值:
Fix_10_8
01.10000000
变换为:
Fix _7_4 001.1000
变换为:
Fix_6_0 000010.
(舍入)
000001.
(结尾)
Reinterpret模块:
为保持输入端表示的数值,无任何考虑地强迫其输出为新的类型。输入端总的位数等于输出端总位数,允许无符号位数据重置为符号位数据,或符号位数据重置为无符号位数据。也允许通过重新放置二进制点缩放数据。
例:重置以下的数值,迫使二进制点到位置5。
输入数据为:
Fix_10_8
01.10000000 = +1.5
输出数据为:
Fix_10_5 01100.00000 = +12
Slice 模块
Slice模块允许从输入数据移位出一系列的位,产生一个新的数据值,输出数据是无符号数,二进制点在位置0处。
例: 取Fix_10_8符号数的4位移动,偏置最低位5位。
输入数据为:Fix_10_8
01.10000000 = +1.5
输出数据为1100 = 12
较高位位置 + 宽度:从MSB的顶位 = 0偏置,宽度 = 4
输出数据为
01100.00000 = 6
两个位置定位:从MSB的顶位 = -1偏置, 从LSB的位 = 5偏置
输出数据为
01100.00000 = 12
模块通用属性
双击Xilinx的模块,在弹出的参数设置对话窗中,有一些参数的设置是具有普遍性的。
(1)Arithmetic Type运算数据类型:指定输出信号是无符号或带符号(二进制补码)。
(2)Implement with Xilinx Smart-IP Core (if possible)采用Xilinx Smart-IP核实现:复选项,选中则用实现核例示的VHDL代码来实现该模块,否则只生成可综合的VHDL代码。如果不能完成核的例示,则自己生成可综合的VHDL代码。
(3)Generate Core生成核:见前面介绍的几个重要模块
(4)Use Placement Information for Core对核使用布局要求:选中该项通常会加快核的实现,但由于添加了约束,可能导致布局布线失败。
(5)Latency延迟:输出延迟周期。
(6)Precision精度:缺省情况下为“Full”,保证有足够的精度不致出错;用户也可以选择“User-Defined”来自己设定。
(7)Number of Bits位数:设置定点数的位长,其中包括“Binary Point”,设定二进制小数点的位置。设置不合理,会导致溢出和量化错误。
(8)Overflow and Quantization溢出和量化错误处理:用户对定点数设置不当,会导致溢出和量化错误。发生溢出时,出错处理可以是“Saturate”(输出可表示的最大正值或最小负值)、“Warp”(截顶)或“Error”(直接报错)。发生量化错误时,出错处理可以是“Round”(舍入)或“Truncate”(截尾)。
(9)Override with Doubles:见前面介绍的几个重要模块。
(10)Provide Reset Port提供复位端:是否为模块提供复位端口。
(11)Provide Enable Port提供使能端:是否为模块提供使能端口。
(12)Use Explicit Sample Period使用外部采样周期:选中该项可较好的解决模型中的环路时序。
(13)FPGA Area(Slices,FFs,LUTs,IOBs,Embedded Mults,TBUFs) FPGA资源使用:提供模块资源使用的估算信息,以便“Resource Estimator”模块进行系统资源耗用估算。一维数组中的数字分别对应相同位置上所指的硬件资源的耗用情况。
图7-11
计数器的各种参数选项
§7.4
设计FIR滤波器
设计描述
一个单通道、单速率滤波器的技术指标为:
· 采样频率
Sampling Frequency (Fs) = 1.5 MHz
· 截止频率1
Fstop 1 = 270 kHz
· 通带频率1
Fpass 1 = 300 kHz
· 通带频率2
Fpass 2 = 450 khz
· 截止频率2
Fstop 2 = 480 kHz
· 通带两边衰减
Attenuation on both sides of the passband = 54 dB
· 通带起伏
Pass band ripple = 1
两个不同的信源利用来仿真此滤波器:
· 线性调频 chirp 模块,它在6 KHz 和 10 KHz 规定的频率之间扫描,不考虑瞬时输出频率。
· 随机信源发生器,它在-1.9到 1.9的范围内输出均匀分布的随机信号,均匀分布是驱动定点滤波器更好的选择,因为滤波器是受限的。
一
产生FIR滤波器的系数
利用MATLAB console 窗口,从d:/DSP/ lab4目录打开bandpass_filter.mdl 模块,从Xilinx Blockset ( DSP 模块集添加FDATool模块到设计中。在 d:/DSP/lab4 目录中利用FDATool 模块为以下的技术指标产生FIR滤波器的系数。
· 采样频率
Sampling Frequency (Fs) = 1.5 MHz
· 截止频率1
Fstop 1 = 270 KHz
· 通带频率1
Fpass 1 = 300 KHz
· 通带频率2
Fpass 2 = 450 Khz
· 截止频率2
Fstop 2 = 480 KHz
· 通带两边衰减
Attenuation on both sides of the passband = 54 dB
· 通带波纹
Pass band ripple = 1
1.
双击桌面上MATLAB图标或Start Menu ( All Programs ( MATLAB( R2006a打开MATLAB 指令窗口。
2.在指令窗口键入cd d:/DSP/ lab4/ ,将目录转到所设目录下。
3.从MATLAB的控制台窗口打开bandpass_filter.mdl模块。
4.从Xilinx Blockset ( DSP添加滤波器设计分析工具FDATool 到设计中。
5.在FDATool Design Filter 窗口 (图7-12)输入以下的滤波器参数。
· Filter Type: Bandpass
· Units: KHz
· Sampling Frequency (Fs) = 1.5 MHz
· Fstop 1 = 270 KHz
· Fpass 1 = 300 KHz
· Fpass 2 = 450 Khz
· Fstop 2 = 480 KHz
· Attenuation on both sides of the passband = 54 dB (Astop1 and Astop2 parameters)
· Pass band ripple = 1 (Apass)
图7-12
在FDATool中设计一个滤波器.
6. 点击 Design Filter 按钮确定滤波器的阶数。
频谱窗口将被更新,如图7-13所示。
图7-13
所设计滤波器的幅度和相位响应
问题:根据所定义的技术指标,最小滤波器的阶数是多少?
7. 利用File ( Save Session以fda格式保存系数文件在coefficients.fda中。
注意:这是一个可选的步骤。系数对于设计仍然是有效的。如果把系数保存在fda文件中,则系数在以后可以通过FDATool 模块参数对话框加载。
8. 利用 File ( Export输出系数以Num为名称到Workspace中。(图7-14 )
注意:在 MATLAB workspace中将添加Num变量。对于FIR 滤波器,Num表示在设计中利用的系数。这也是一个可选的步骤,因为系数通过FDATool模块仍然是有效的。
图7-14
输出系数到Workspace
9. 在MATLAB 控制台窗口键入Num,观察系数清单。
10. 在MATLAB 控制台窗口键入max(Num),确定最大的系数值,它相应地规定系数的宽度和二进制点数。
问题:填写与系数有关的以下信息:
Maximum value:
________________
Minimum value:
二
把系数与FIR滤波器联系起来
从 Xilinx Blockset ( DSP库添加DAFIR v9.0滤波器模块,并与产生的系数联系起来。
1. 从 Xilinx Blockset ( DSP库添加DAFIR v9.0滤波器模块到设计中。
2. 双击Xilinx DAFIR v9.0滤波器模块,在模块参数窗口输入以下的参数。(图 7-15)
· Coefficients : xlfda_numerator(‘FDATool’)
· Coefficient Structure : 选择 Inferred from Coefficients
· Number of bits per Coefficients : 12
· Binary Point for Coefficients : 12
· Number of Channels : 1
· Provide Valid Ports : 不选
图7-15
FIR 滤波器模块参数
3. 点击OK 接受这些设置。
4.
连接此模块,使设计类似于图7-16。
图7-16 FIR 滤波器模块基本设计准备仿真
三
在Simulink中仿真FIR滤波器
设置采样输入为FIX_8_6,输入采样周期为1/1500000,连接FIR 模块到 Gateway In 和 Gateway Out 端口,利用频谱仪研究它对线性调频和噪声信号的输出。
1
。 双击Gateway In模块,设置格式format 为 FIX_8_6, 采样周期为1/1500000。
2. 选择线性调频Chirp 信源,启动仿真。
注意:以下的警告信息出现,因为Simulink计算不同的采样率,需要更新它。
图7-17
警告信息指示计算的采样率
3.
点击Update 接受采样率的变更,并返回仿真。
4. 将频谱的屏幕放到前台,检查由FIR滤波器输出的信号已经被衰减,如图7-18和图7-19所示。
图7-18
在通带中没有衰减(频谱屏幕)
图7-19
在止带中衰减(频谱屏幕)
5。
停止仿真。
注意:当停止仿真时,一个关于滤波器滞后的错误被报告。此时可以不考虑此错误。
图7-20
对于滞后不兼容的错误报告
6.
点击Close 。
7.
选择Random Source,运行仿真。
图7-21
随机信源(频谱屏幕)
8.停止仿真。
四
完成FIR滤波器设计
从 Xilinx Blockset ( Basic Elements 库添加convert模块以得到FIX_8_6 的输出,从 Xilinx Blockset ( Basic Elements库添加delay元件到输出端改善性能,从 Xilinx Blockset ( Index 库添加Resource Estimator模块。
1.
从 Xilinx Blockset ( Basic Elements 库添加convert模块到FIR输出端使得出为FIX_8_6。
2
从 Xilinx Blockset ( Basic Elements库添加delay元件到输出端,提供流水线和改善性能,因为添加的流水线级将在输出焊盘中实现。
确认DAFIR v9.0 系数的尺寸被设置为FIX_12_12 和 Gateway In 尺寸设置为 FIX_8_6。
改变输入 (Gateway In)的 quantization 为 Truncate ,改变Overflow 为 Wrap。
3.从 Xilinx Blockset ( Index 库添加Resource Estimator模块到设计中。
注意:设计应该如图7-22所示。
图7-22
完成的FIR 滤波器设计
五
实现FIR滤波器
设置FIR 硬件过采样率为(Hardware Over-Sampling Rate)为9, FIR Core Latency 为14,运行仿真。这将更新采样率为7.407e-008。利用 System Generator 标记产生编码和以下的技术条件。在 Project Navigator中打开bandpass_filter.npl项目,