我需要钱在System Generator中搭建一个分段函数的系统,有些问题需要请教

第1节 System Generator的简介与安装--FPGA开发实用教程_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
第1节 System Generator的简介与安装--FPGA开发实用教程
上传于||暂无简介
阅读已结束,如果下载本文需要使用1下载券
想免费下载本文?
下载文档到电脑,查找使用更方便
还剩2页未读,继续阅读
你可能喜欢system&generator
3.System Generator标志
每个System Generator应用框图都必须至少包含一个System
Generator标志,如图8-11所示,否则会提示错误。标志模块用来驱动整个FPGA实现过程,不与任何模块相连。双击标志模块,可以打开属性编辑框,能够设置目标网表、器件型号、目标性能以及系统时钟频率等指标。
<img ALT="" src="/blog7style/images/common/sg_trans.gif" real_src ="http://www.openhw.org/data/08-03/007/.jpg" WIDTH="377" HEIGHT="229"
TITLE="system&generator" />
图7-11 System Generator标志模块示意图
4.建立简易的DSP设计
一旦定义了FPGA边界就可以通过Xilinx
DSP模块集合来建立各种DSP设计,包括滤波器、存储器、算术运算器、逻辑和比特操作器等丰富资源,每个模块都有详细的工作频率和比特宽度定义。标准的Simulink模块不能在“Gateway
In”和“Gateway
Out”之间使用,但常用来产生测试数据以及对FPGA的输出数据进行处理和分析。下面给出一个简单的FPGA系统设计实例。
例7-2 使用System
Generator建立一个3输入(a、b、c)的DSP4模块的计算电路,使得输出p=c+a*b,并利用标准的Simulink模块对延迟电路进行功能验证。
1)打开Simulink库浏览器并建立一个新的Simulink模型,并保存为mydsp.mdl。
2)在浏览器中选择Xilinx
DSP48模块,并将其拖拽到mydspmydelay.mdl;按照同样的方法添加边界定义模块以及System
Generator标志模块。
3)为了测试DSP计算电路,添加Simulink标准库中的常数模块(Constant)和显示器(Display)模块。其中常数模块用于向DSP计算电路灌数据,作为测试激励;显示器则用于观测输出数据。
4)连接模块,将所有的独立模块连成一个整体。其中Xilinx模块之间的端口可以直接相互连接,直接从一个端口拖拽鼠标到另一个端口来完成,或选中目标模块,按住Ctrl键,再点击要连接的模块,Simulink即可自动将两个模块连接起来;而Xilinx模块和非Xilinx模块之间的连接则需要边界模块(Gateway)来衔接。经过连接的设计如图7-12所示。
<img ALT="" src="/blog7style/images/common/sg_trans.gif" real_src ="http://www.openhw.org/data/08-03/007/.jpg" WIDTH="503" HEIGHT="299"
TITLE="system&generator" />
图7-12 延迟模块以及测试平台的组成架构
5)设定系统参数。双击“System
Generator”模块,会出现系统设定对话框,如图8-13所示。其中“Compilation”栏选择编译生成对象,包括HDL网表、FPGA配置比特流、NGC网表、EDK导出工具、硬件协仿真类型以及时序分析文件等6种类型,本例选择HDL网表类型,会生成ISE工程以及相应的HDL代码;“Part”栏用于选择芯片型号,本例选择Spartan3E
xc4vsx55-12ff1148。“Target”栏用于选择目标文件存放路径,本例使用默认值,则会在mydelay.mdl所在文件夹中自动生成一个netlist的文件夹,用于存放相应的输出文件。综合工具选择XST,HDL语言选择Verilog类型,系统时钟设的周期为100ns,即为10MHz。
“Clock Pin
Location”栏的文本框中输入系统时钟输入管脚,则会自动生成管脚约束文件(由于本例只是演示版,所以该项空闲)。此外,可选中“Create
testbench”选项,自动生成设计的测试代码。各项参数确认无误后,单击“OK”键,保存参数。
<img ALT="" src="/blog7style/images/common/sg_trans.gif" real_src ="http://www.openhw.org/data/08-03/007/.jpg"
TITLE="system&generator" />
图7-13 系统参数设定对话框
6)设置关键模块参数。双击“Gataway In”、“Gataway Out”模块,会弹出图8-14和图
8-15所示的对话框。Gataway In模块属性可查看输入数据位宽和量化规则。
<img ALT="" src="/blog7style/images/common/sg_trans.gif" real_src ="http://www.openhw.org/data/08-03/007/.jpg" WIDTH="580" HEIGHT="299"
TITLE="system&generator" />
图7-14 Gataway In模块属性对话框 图7-15 Gataway Out模块属性对话框
7)运行测试激励。当参数设置完成后,点击工具栏的“
”按键,即可运行Simulink仿真,可以看到显示器输出为18,表明设计的功能是正确的。
8)生成HDL代码。单击图7-13中的“Generate”按键,System
Generator可自动将设计转化成HDL代码。整个转化过程的起始和结束提示界面分别如图7-16和图 7-17所示。
<img ALT="" src="/blog7style/images/common/sg_trans.gif" real_src ="http://www.openhw.org/data/08-03/007/.jpg" WIDTH="567" HEIGHT="126"
TITLE="system&generator" />
图7-16 自动生成代码过程的起始提示标志 图7-17 自动生成代码过程的结束提示标志
读者可在相应的文件夹的“netlist
sysgen”子目录中打开“nonleaf_results.v”文件,查看相应的代码,如下所示(为了节约篇幅,分栏显示),用户可将其作为子模块直接使用。
<img ALT="" src="/blog7style/images/common/sg_trans.gif" real_src ="http://www.openhw.org/data/08-03/007/.jpg" WIDTH="532" HEIGHT="1223"
TITLE="system&generator" />
7.3.2 System Generator中的信号类型
Generator是面向硬件设计的工具,因此数据类型只能是定点的,而Simulink中的基本数据类型是双精度浮点型,因此Xilinx模块和Simulink模块连接时需要通过边界模块来转换。“Gateway
In”模块把浮点数转换成定点数,“Gateway
Out”把定点数转换成浮点数。此外,对于Simulink中的连续时间信号,还必须经过“Gateway
In”模块的采样转换才能使用。
Generator中的数据类型命名规则是非常简易且便于记忆的形式,如Fix_8_6表示此端口为8比特有符号数,其中6比特为小数部分。如果是无符号数,则带有“Ufix”前缀。在System
Generator中,可通过选择 “Format” 菜单中的“Port/Signal Display Port Data
Types”命令,来显示所有端口的数据类型,形象显示整个系统的数据精度。
Xilinx模块基本上都是多形态的,即可根据输入端口的数据类型来确定输出数据类型,但在有些情况下需要扩展信号宽度来保证不丢失有效数据。此外,也允许设计人员自定义模块的输入、输出数据的量化效果以及饱和处理。在图8-14所示的“Gateway
In”模块属性对话框中,“Output type”选择数据为布尔型、有符号数还是无符号数;“Number of
bits”即为定点数的位宽;“Binary
point”为小数部分的宽度;“Quantization”选择定点量化模式;“Overflow”用于设定饱和处理模式;“Sample
period”用于对连续时间信号的采样。因此按照System Generator的数据形式命名规则,“Gateway
In”模块的数据类型为Fix/Ufix_(Number of bits)_(Binary point )。
此外,还有DSP48
instruction,显示为“UFix_11_0”,是Xilinx针对数字信号处理的专用模块,用于实现乘加运算。
7.3.3 自动代码生成
Generator能够自动地将设计编译为低级的HDL描述,且编译方式多样,取决于System
Generator标志中的设置。为了生成HDL代码,还需要生成一些辅助下载的文件工程文件、约束文件等,和用于验证的测试代码(HDL
testbench)。
1.编译并仿真System Generator模块
前面已经提到要对一个System Generator的设计进行仿真或者将其转化成硬件,则设计中必须包含一个System
Generator生成标志。也可以将多个生成标志分布于不同的层中(一层一个),在层状结构中,处于别的层下的称为从模块,不属于从模块的则为主模块。但是特定的参数(如系统时钟频率)只能在主模块中设置。
对于任一添加的模块,都可以在System
Generator模块中指定其代码生成方式和仿真处理形式,要编译整个系统,在顶层模块中利用System
Generator模块生成代码即可。
不同编译类型的设定将会产生不同的输出文件,可选的编译类型包括两个网表文件类型(HDL网表和NGC网表)、比特流文件类型、EDK导出工具类型以及时序分析类型等4类。
HDL网表类型是最常用的网表结构,其相应的输出结果包括HDL代码文件、EDIF文件和一些用于简化下载过程的辅助文件。设计结果可以直接被综合工具(如XST等)综合,也可以反馈到Xilinx物理设计工具(如ngdbuild、map、par和bitgen等)来产生配置FPGA的比特流文件。编译产生的文件类型如ISE中是一致的。NGC网表类型的编译结果和HDL网表类似,只是用NGC文件代替了HDL代码文件。
比特流文件类型的编译结果是直接能够配置FPGA的二进制比特流文件,并能直接在FPGA硬件平台上直接运行的。如果安装了硬件协仿真平台,可以通过选择“Hardware
Co-simulation & XtremeDSP Development Kit
& PCI and USB”,生成适合XtremeDSP开发板的二进制比特流文件。
EDK导出工具类型的编译结果是可以生成直接导入Xilinx嵌入式开发工具(EDK)的工程文件以及不同类型的硬件协仿真文件。
时序分析类型的编译结果是该设计的时序分析报告。
2.编译约束文件
在编译一个设计时,System
Generator会根据用户的配置产生相应的约束文件,通知下载配置工具如何处理设计输入,不仅可以完成更高质量的实现,还能够节省时间。
约束文件可控的指标包括:
系统时钟的周期;
系统工作速度,和系统时钟有关、设计的各个模块必须运行的速度;
管脚分配;
各个外部管脚以及内部端口的工作速度。
约束文件的格式取决于System
Generator模块的综合工具:对于XST,其文件为XCF格式;对于Synplify/Synplify
Pro,则使用NCF文件格式。
系统时钟在System
Generator标志中设定,编译时将其写入约束文件,在实现时将其作为头等目标。在实际设计中,常常包含速度不同的多条路径,其中速度最高的采用系统时钟约束,其余路径的驱动时钟只能通过系统时钟的整数倍分频得到。当把设计转成硬件实现时,“Gateway
In”和“Gateway
Out”模块就变成了输入、输出端口,其管脚分配和接口数据速率必须在其参数对话框中设定,编译时会将其写入I/O时序约束文件中。
3.HDL测试代码
通常System
Generator设计的比特宽度和工作频率都是确定的,因此Simulink仿真结果也要在硬件上精确匹配,需要将HDL仿真结果和Simulink仿真结果进行比较,才能确认HDL代码的正确性。特别当其包含黑盒子模块时,这样的验证显得格外重要。System
Generator提供了自动生成测试代码的功能,并能给出HDL代码仿真正确与否的指示。
假设设计的名字是&design&,双击顶层模块的System
Generator标志,将Compilation选项设为HDL Netlist,选中Create
Testbench选项,然后点击Generate选项,不仅可以生成常用的设计文件,还有下面的测试文件:
&design&_tb.vhd/.v文件,包含完整的HDL测试代码;
Various.dat文件,包含了测试代码仿真时的测试激励向量和期望向量;
脚本Scripts
vcom.do和vsim.do文件,用于在Modelsim中完成测试代码的编译和仿真,并将其结果和自动编译产生的HDL测试向量进行比较。
Various.dat文件是System Generator将通过“Gataway
In/Out”模块的数据保存下来而形成的,其中经过输入模块的数据是测试激励,而通过输出模块的数据就是期望结果。测试代码只是简单的封装器,将测试激励送进生成的HDL代码,然后对输出结果和期望结果完成比较,给出正确指示。
7.3.4 编译MATLAB设计生成FPGA代码
Xilinx公司提供了两种方法将MATLAB设计.m文件转化为HDL设计,一种就是利用AccelDSP综合器;另一种就是直接利用MCode模块。前者多应用于复杂或高速设计中,常用来完成高层次的IP核开发;而后者使用方便,支持MATLAB语言的有限子集,对实现算术运算、有限状态机和逻辑控制是非常有用的。本节内容以介绍MCode模块为主。
MCode模块实现的是装载在里面的.m函数的功能。此外,还能够使用Xilinx的定点类型数对.m函数进行评估。该模块使用回归状态变量以保证内部状态稳定不变,其输入、输出端口都由.m函数确定。
要使用MCode模块,必须实现编写.m函数,且代码文件必须和System
Generator模型文件放在同一个文件夹中,或者处于MATLAB路径上的文件夹中。下面用两个实例来说明如何使用MCode模块。
例8-3 使用MATLAB编写一个简单的移位寄存器完成对输入数据乘8以及除以4的操作,并使用MCode将其编译成System
Generator直接可用的定点模块。
1.相关的.m函数代码为:
function [lsh3, rsh2] = xlsimpleshift(din)
% [lsh3, rsh2] = xlsimpleshift(din) does a left shift 3 bits and
% right shift 2 bits. The shift operation is accomplished by
% multiplication and division of power of two constant.
lsh3 = din * 8;
rsh2 = din / 4;
2.将.m函数添加到下列三个位置之一:
模型文件存放的位置;
模型目录下名字为private的子文件夹;
MATLAB路径下。
然后,新建一个System
Generator设计,添加MCode模块,双击模块,在弹出页面中,通过Browse按键将.m函数和模型设计关联起来,如图7-18所示。
<img ALT="" src="/blog7style/images/common/sg_trans.gif" real_src ="http://www.openhw.org/data/08-03/007/.jpg" WIDTH="420" HEIGHT="461"
TITLE="system&generator" />
图7-18 MCode模块关联界面示意图
3.添加边界模块、Sytem Generator模块、正弦波测试激励以及示波器模块构成完整的设计,如图8-19所示。
<img ALT="" src="/blog7style/images/common/sg_trans.gif" real_src ="http://www.openhw.org/data/08-03/007/.jpg" WIDTH="460" HEIGHT="277"
TITLE="system&generator" />
图7-19 简单移位模块设计示意图
4.运行仿真,得到的结果如图7-20所示,从中可以看出,设计是正确的,正确实现了.m文件的功能。左图将信号放大了8倍,右图将信号缩小了4倍。
<img ALT="" src="/blog7style/images/common/sg_trans.gif" real_src ="http://www.openhw.org/data/08-03/007/.jpg"
TITLE="system&generator" />
图7-20 简单移位模块仿真结果示意图
5.自动生成代码,得到的Verilog文件如下所列。
module myshift (
input [15:0]
output [15:0] dout1;
output [15:0] dout2;
wire [15:0] din_
wire [15:0] dout1_
wire [15:0] dout2_
assign din_net =
assign dout1 = dout1_
assign dout2 = dout2_
mcode_6b mcode (
.lk(1'b0),
.lr(1'b0),
.in(din_net),
.sh3(dout1_net),
.sh2(dout2_net)
7.3.5 子系统的建立和使用
System Generator设计经常作为大型HDL设计的一部分,本节就介绍如何使用System
Generator来建立子系统模块,以及如何在整个系统中对其进行仿真。
1.子系统的建立以及仿真方法
子系统就是HDL语言中的模块,也类似于C++语言中的函数,是有效执行自顶向下设计的必备手段。如果将一个复杂设计完全在一个单独设计中实现,则该设计的验证和复查工作将是设计人员的噩梦。此外,从设计复用的角度讲,子系统可以IP核的方式为多个设计使用,具有高的可重用性,能节省大系统的开发时间。
建立子系统最简单的方法就是利用NGC二进制网表文件,将System
Generator设计封装成一个单独的二进制模块,这样综合工具将其作为黑盒子看待。在建立子系统时,管脚约束不能在Gataway模块中定义,同样时钟管脚也不能在System
Generator模块中定义,应通过网表编辑器来指定物理约束,这是因为NGC网表中不仅包括了逻辑设计,还包括了设计的约束信息。在复杂系统中建立子系统的设计流程如下所示:
<img ALT="" src="/blog7style/images/common/sg_trans.gif" real_src ="http://www.openhw.org/data/08-03/007/.jpg" WIDTH="257" HEIGHT="243"
TITLE="system&generator" />
图7-21 建立子系统的设计流程
1)NGC网表文件
如图7-21所示,生成NGC网表是建立子系统的第一步。在System Generator标志中将编译生成文件类型选为NGC
List,如图7-22所示。如果设计中有时钟驱动电路,点击Generate后,会在目标文件夹生成“&design&_cw.ngc”文件,否则会生成“&design&.ngc”文件,其中&design&就是设计的名字。NGC网表文件包括设计中所有的逻辑和约束信息,这意味着将System
Generator生成的所有HDL文件、内核以及约束等文件封装成一个单独的文件。
<img ALT="" src="/blog7style/images/common/sg_trans.gif" real_src ="http://www.openhw.org/data/08-03/007/.jpg" WIDTH="407" HEIGHT="549"
TITLE="system&generator" />
图7-22 选择编译生成文件类型
2)设计规则
在复杂系统中使用子模块时,必须遵循下面两条规则。
首先,不能在子模块设计文件中出现“Gateway In”、“Gateway Out”以及System
Generator标志模块,否则NGDBuild工具会产生下面的警告:
WARNING: NgdBuild:483 - Attribute "LOC" on "clk" is on the wrong
object. Please see the Constraints Guide for more information on
attribute.
其次,不能在综合的时候往NGC网表文件中插入I/O缓存器,否则会报错。I/O缓存器只能在顶层模块中使用。
3)逻辑综合
当使用子系统的NGC网表文件综合时,其流程如图8-23所示。NGC模块可在顶层模块中以黑盒子的方式直接例化。为了简化该过程,当通过NGC目标编译后,System
Generator提供了HDL例化模板,保存在设计路径,且以“&design&_cw.veo”命名。当选择VHDL语言时,则其模板名为“&design&_cw.vho”。
<img ALT="" src="/blog7style/images/common/sg_trans.gif" real_src ="http://www.openhw.org/data/08-03/007/.jpg"
TITLE="system&generator" />
图8-23 综合时的流程图
Generator模型编译成NGC目标后,生成的HDL文件却只能完成HDL仿真,不能在ISE中综合。由于HDL文件不能包含在工程中,如果要在HDL仿真器中运行整个设计,就必须指定用户.do文件。除了HDL文件之外,还需要将内存初始化文件(.mif)和系数文件(.coe)和HDL文件放在同一文件夹中。
2.可配置子系统的建立
可配置子系统是一类可以作为标准元件使用的Simulink模块,但又和标准元件模块不同,其存在多种可选功能,每一种功能都可以实现,可以让用户灵活选择。以可配置FIR滤波器为例,实现快速滤波器需要很多资源,而许多低速的滤波器却只需要相对很少的资源,将其做成可配置的模块,就可以允许用户根据实际情况在速度和硬件代价之间做出最优平衡。这体现了可配置子模块最大的优势。
1)定义一个可配置子模块
可通过新建Simulink库来定义可配置子系统,且可选模块的实现也由库来管理。下面给出新建建库的具体步骤:
(1)新建一个空白库,如图7-24所示。
<img ALT="" src="/blog7style/images/common/sg_trans.gif" real_src ="http://www.openhw.org/data/08-03/007/.jpg" WIDTH="407" HEIGHT="254"
TITLE="system&generator" />
图7-24 新建空白库
(2)在库里添加基本实例模块,如图7-25所示。基本实例模块可以是System Generator中的任意组件。
<img ALT="" src="/blog7style/images/common/sg_trans.gif" real_src ="http://www.openhw.org/data/08-03/007/.jpg" WIDTH="409" HEIGHT="254"
TITLE="system&generator" />
图7-25 添加基本实例模块
(3)在库里面添加可配置子系统模版,如图7-26所示。模版可以在Simulink库浏览器中找到,其具体位置为“Simulink/Ports
& Subsystems/Configurable
Subsystem”。如果有需要,用户可以修改该模版的名字。
<img ALT="" src="/blog7style/images/common/sg_trans.gif" real_src ="http://www.openhw.org/data/08-03/007/.jpg" WIDTH="285" HEIGHT="253"
TITLE="system&generator" />
图7-26 添加可配置子系统模块
(4)保存库文件,然后双击模版模块,会弹出如图7-27所示的属性配置界面。根据实现的需要选中相关模块的检验框。最后单击“OK”再次保存库文件。
<img ALT="" src="/blog7style/images/common/sg_trans.gif" real_src ="http://www.openhw.org/data/08-03/007/.jpg" WIDTH="448" HEIGHT="254"
TITLE="system&generator" />
图7-27 属性配置界面
2)使用可配置子系统
要在设计中使用可配置子系统,先按照上面的步骤定义子系统,然后打开库,将需要的模版模块拖到设计中合适的位置,这样设计中就有了可配置子系统的实例,如图8-28所示的FIR滤波器模块。
<img ALT="" src="/blog7style/images/common/sg_trans.gif" real_src ="http://www.openhw.org/data/08-03/007/.jpg" WIDTH="377" HEIGHT="254"
TITLE="system&generator" />
图7-28 可配置子系统实例
在实例模块上点击右键,然后选择Block Choice选项中的Xilinx DA
FIR,将实例作为基础实现模块使用。如图8-29所示。
<img ALT="" src="/blog7style/images/common/sg_trans.gif" real_src ="http://www.openhw.org/data/08-03/007/.jpg" WIDTH="497" HEIGHT="273"
TITLE="system&generator" />
图7-29 将实例作为基础实现模块
3)在可配置子模块中添加和删除实例模块
添加和删除子系统是编辑、修改可配置子系统的基本操作,按照下面的步骤可以从可配置子系统中删除实例模块:
(1)打开并解锁子系统的库;双击模版模块,然后在弹出的用户界面中取消相应模块检验框的选定,单击“OK”就可以删除掉相应的子模块,如图7-30所示;再保存库,重新编译即可;最后仍需要在设计更新子系统。
对于添加实例模块的步骤如下:首先,打开并解锁子系统的库;然后将实例模块拖到子系统设计中,双击模版模块;在弹出的用户界面中选中所需模块检验框,单击“OK”即可,如图7-31所示;再保存库,重新编译;在已有的设计中更新子系统。
<img ALT="" src="/blog7style/images/common/sg_trans.gif" real_src ="http://www.openhw.org/data/08-03/007/.jpg" WIDTH="610" HEIGHT="232"
TITLE="system&generator" />
图7-30 删除子模块 图7-31 添加子系统
(2)生成可配置子模块的硬件电路
Generator中,模块可用于仿真和产生硬件。有时对于一个可配置子系统,最佳的方式是其既可以成为仿真基础模块,也可以用来生成硬件电路。例如将可配置子系统在仿真时作为普通的模块来产生仿真结果,在实现时作为黑盒子产生功能电路的HDL代码,就是一种常用方式。System
Generator提供了可配置子系统管理模块来达到上述目的,其使用方法如下:
首先,打开、解锁可配置子系统的库文件(除了模版模块),然后双击该模块;
其次,将可配置子系统管理模块拖到打开的库中,该管理模块可以在“Xilinx Blockset/Tools/ Configurable
Subsystem Manager”路径中找到,如图8-32所示。
<img ALT="" src="/blog7style/images/common/sg_trans.gif" real_src ="http://www.openhw.org/data/08-03/007/.jpg"
TITLE="system&generator" />
图7-32 可配置子系统管理模块
最后,双击管理模块打开其属性配置GUI,选择可配置子系统中生成硬件电路的模块,如图8-33所示。单击“OK”保存子系统和库文件退出即可。
<img ALT="" src="/blog7style/images/common/sg_trans.gif" real_src ="http://www.openhw.org/data/08-03/007/.jpg" WIDTH="287" HEIGHT="161"
TITLE="system&generator" />
图7-33 选择可配置子系统的硬件模块
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。使用MATLAB为System Generator for DSP创建IP_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
使用MATLAB为System Generator for DSP创建IP
上传于||文档简介
&&使&#8203;用&#8203;M&#8203;A&#8203;T&#8203;L&#8203;A&#8203;B&#8203;为&#8203;S&#8203;y&#8203;s&#8203;t&#8203;e&#8203;m&#8203; &#8203;G&#8203;e&#8203;n&#8203;e&#8203;r&#8203;a&#8203;t&#8203;o&#8203;r&#8203; &#8203;f&#8203;o&#8203;r&#8203; &#8203;D&#8203;S&#8203;P&#8203;创&#8203;建&#8203;I&#8203;P
阅读已结束,如果下载本文需要使用1下载券
想免费下载本文?
下载文档到电脑,查找使用更方便
还剩3页未读,继续阅读
你可能喜欢system generator
system generator
system generator&&
19:23:21|&&分类:
发表评论:
TA的最新馆藏热搜TAGS:
第3节 基于System Generator的DSP系统设计[第七章](2)
7.3.2 System Generator中的信号类型SystemGenerator是面向硬件设计的工具,因此数据类型只能是定点的,而Simulink中的基本数据类型是双精度浮点型,因此Xilinx模块和Simulink模块连接时需要通过边界模块来转换。“Gateway In”模块把浮点数转换成定点数,“GatewayOut”把定点数转换成浮点数。此外,对于Simulink中的连续时间信号,还必须经过“Gateway In”模块的采样转换才能使用。SystemGenerator中的数据类型命名规则是非常简易且便于记忆的形式,如Fix_8_6表示此端口为8比特有符号数,其中6比特为小数部分。如果是无符号数,则带有“Ufix”前缀。在System Generator中,可通过选择 “Format” 菜单中的“Port/SignalDisplay Port Data Types”命令,来显示所有端口的数据类型,形象显示整个系统的数据精度。Xilinx模块基本上都是多形态的,即可根据输入端口的数据类型来确定输出数据类型,但在有些情况下需要扩展信号宽度来保证不丢失有效数据。此外,也允许设计人员自定义模块的输入、输出数据的量化效果以及饱和处理。在图8-14所示的“Gateway In”模块属性对话框中,“Outputtype”选择数据为布尔型、有符号数还是无符号数;“Number of bits”即为定点数的位宽;“Binarypoint”为小数部分的宽度;“Quantization”选择定点量化模式;“Overflow”用于设定饱和处理模式;“Sampleperiod”用于对连续时间信号的采样。因此按照System Generator的数据形式命名规则,“GatewayIn”模块的数据类型为Fix/Ufix_(Number of bits)_(Binary point )。此外,还有DSP48 instruction,显示为“UFix_11_0”,是Xilinx针对数字信号处理的专用模块,用于实现乘加运算。7.3.3 自动代码生成SystemGenerator能够自动地将设计编译为低级的HDL描述,且编译方式多样,取决于SystemGenerator标志中的设置。为了生成HDL代码,还需要生成一些辅助下载的文件工程文件、约束文件等,和用于验证的测试代码(HDLtestbench)。1.编译并仿真System Generator模块前面已经提到要对一个SystemGenerator的设计进行仿真或者将其转化成硬件,则设计中必须包含一个SystemGenerator生成标志。也可以将多个生成标志分布于不同的层中(一层一个),在层状结构中,处于别的层下的称为从模块,不属于从模块的则为主模块。但是特定的参数(如系统时钟频率)只能在主模块中设置。对于任一添加的模块,都可以在System Generator模块中指定其代码生成方式和仿真处理形式,要编译整个系统,在顶层模块中利用System Generator模块生成代码即可。不同编译类型的设定将会产生不同的输出文件,可选的编译类型包括两个网表文件类型(HDL网表和NGC网表)、比特流文件类型、EDK导出工具类型以及时序分析类型等4类。HDL网表类型是最常用的网表结构,其相应的输出结果包括HDL代码文件、EDIF文件和一些用于简化下载过程的辅助文件。设计结果可以直接被综合工具(如XST等)综合,也可以反馈到Xilinx物理设计工具(如ngdbuild、map、par和bitgen等)来产生配置FPGA的比特流文件。编译产生的文件类型如ISE中是一致的。NGC网表类型的编译结果和HDL网表类似,只是用NGC文件代替了HDL代码文件。比特流文件类型的编译结果是直接能够配置FPGA的二进制比特流文件,并能直接在FPGA硬件平台上直接运行的。如果安装了硬件协仿真平台,可以通过选择“Hardware Co-simulation > XtremeDSP Development Kit > PCI andUSB”,生成适合XtremeDSP开发板的二进制比特流文件。EDK导出工具类型的编译结果是可以生成直接导入Xilinx嵌入式开发工具(EDK)的工程文件以及不同类型的硬件协仿真文件。时序分析类型的编译结果是该设计的时序分析报告。2.编译约束文件在编译一个设计时,System Generator会根据用户的配置产生相应的约束文件,通知下载配置工具如何处理设计输入,不仅可以完成更高质量的实现,还能够节省时间。约束文件可控的指标包括:系统时钟的周期;系统工作速度,和系统时钟有关、设计的各个模块必须运行的速度;管脚分配;各个外部管脚以及内部端口的工作速度。约束文件的格式取决于System Generator模块的综合工具:对于XST,其文件为XCF格式;对于Synplify/Synplify Pro,则使用NCF文件格式。系统时钟在SystemGenerator标志中设定,编译时将其写入约束文件,在实现时将其作为头等目标。在实际设计中,常常包含速度不同的多条路径,其中速度最高的采用系统时钟约束,其余路径的驱动时钟只能通过系统时钟的整数倍分频得到。当把设计转成硬件实现时,“Gateway In”和“GatewayOut”模块就变成了输入、输出端口,其管脚分配和接口数据速率必须在其参数对话框中设定,编译时会将其写入I/O时序约束文件中。3.HDL测试代码通常SystemGenerator设计的比特宽度和工作频率都是确定的,因此Simulink仿真结果也要在硬件上精确匹配,需要将HDL仿真结果和Simulink仿真结果进行比较,才能确认HDL代码的正确性。特别当其包含黑盒子模块时,这样的验证显得格外重要。SystemGenerator提供了自动生成测试代码的功能,并能给出HDL代码仿真正确与否的指示。假设设计的名字是,双击顶层模块的System Generator标志,将Compilation选项设为HDLNetlist,选中Create Testbench选项,然后点击Generate选项,不仅可以生成常用的设计文件,还有下面的测试文件:_tb.vhd/.v文件,包含完整的HDL测试代码;Various.dat文件,包含了测试代码仿真时的测试激励向量和期望向量;脚本Scripts vcom.do和vsim.do文件,用于在Modelsim中完成测试代码的编译和仿真,并将其结果和自动编译产生的HDL测试向量进行比较。Various.dat文件是System Generator将通过“GatawayIn/Out”模块的数据保存下来而形成的,其中经过输入模块的数据是测试激励,而通过输出模块的数据就是期望结果。测试代码只是简单的封装器,将测试激励送进生成的HDL代码,然后对输出结果和期望结果完成比较,给出正确指示。7.3.4 编译MATLAB设计生成FPGA代码Xilinx公司提供了两种方法将MATLAB设计.m文件转化为HDL设计,一种就是利用AccelDSP综合器;另一种就是直接利用MCode模块。前者多应用于复杂或高速设计中,常用来完成高层次的IP核开发;而后者使用方便,支持MATLAB语言的有限子集,对实现算术运算、有限状态机和逻辑控制是非常有用的。本节内容以介绍MCode模块为主。MCode模块实现的是装载在里面的.m函数的功能。此外,还能够使用Xilinx的定点类型数对.m函数进行评估。该模块使用回归状态变量以保证内部状态稳定不变,其输入、输出端口都由.m函数确定。要使用MCode模块,必须实现编写.m函数,且代码文件必须和System Generator模型文件放在同一个文件夹中,或者处于MATLAB路径上的文件夹中。下面用两个实例来说明如何使用MCode模块。例8-3 使用MATLAB编写一个简单的移位寄存器完成对输入数据乘8以及除以4的操作,并使用MCode将其编译成System Generator直接可用的定点模块。1.相关的.m函数代码为:function [lsh3, rsh2] = xlsimpleshift(din)% [lsh3, rsh2] = xlsimpleshift(din) does a left shift 3 bits and a% right shift 2 bits. The shift operation is accomplished by% multiplication and division of power of two constant.lsh3 = din * 8;rsh2 = din / 4;2.将.m函数添加到下列三个位置之一:模型文件存放的位置;模型目录下名字为private的子文件夹;MATLAB路径下。然后,新建一个System Generator设计,添加MCode模块,双击模块,在弹出页面中,通过Browse按键将.m函数和模型设计关联起来,如图7-18所示。<a href="javascript:;" onclick="showimg('http://rmation on this<img src="http://rmation on thisattribute.其次,不能在综合的时候往NGC网表文件中插入I/O缓存器,否则会报错。I/O缓存器只能在顶层模块中使用。3)逻辑综合当使用子系统的NGC网表文件综合时,其流程如图8-23所示。NGC模块可在顶层模块中以黑盒子的方式直接例化。为了简化该过程,当通过NGC目标编译后,SystemGenerator提供了HDL例化模板,保存在设计路径,且以“_cw.veo”命名。当选择VHDL语言时,则其模板名为“_cw.vho”。图8-23 综合时的流程图4)仿真把SystemGenerator模型编译成NGC目标后,生成的HDL文件却只能完成HDL仿真,不能在ISE中综合。由于HDL文件不能包含在工程中,如果要在HDL仿真器中运行整个设计,就必须指定用户.do文件。除了HDL文件之外,还需要将内存初始化文件(.mif)和系数文件(.coe)和HDL文件放在同一文件夹中。2.可配置子系统的建立可配置子系统是一类可以作为标准元件使用的Simulink模块,但又和标准元件模块不同,其存在多种可选功能,每一种功能都可以实现,可以让用户灵活选择。以可配置FIR滤波器为例,实现快速滤波器需要很多资源,而许多低速的滤波器却只需要相对很少的资源,将其做成可配置的模块,就可以允许用户根据实际情况在速度和硬件代价之间做出最优平衡。这体现了可配置子模块最大的优势。1)定义一个可配置子模块可通过新建Simulink库来定义可配置子系统,且可选模块的实现也由库来管理。下面给出新建建库的具体步骤:(1)新建一个空白库,如图7-24所示。图7-24 新建空白库(2)在库里添加基本实例模块,如图7-25所示。基本实例模块可以是System Generator中的任意组件。图7-25 添加基本实例模块(3)在库里面添加可配置子系统模版,如图7-26所示。模版可以在Simulink库浏览器中找到,其具体位置为“Simulink/Ports& Subsystems/Configurable Subsystem”。如果有需要,用户可以修改该模版的名字。图7-26 添加可配置子系统模块(4)保存库文件,然后双击模版模块,会弹出如图7-27所示的属性配置界面。根据实现的需要选中相关模块的检验框。最后单击“OK”再次保存库文件。图7-27 属性配置界面2)使用可配置子系统要在设计中使用可配置子系统,先按照上面的步骤定义子系统,然后打开库,将需要的模版模块拖到设计中合适的位置,这样设计中就有了可配置子系统的实例,如图8-28所示的FIR滤波器模块。图7-28 可配置子系统实例在实例模块上点击右键,然后选择Block Choice选项中的Xilinx DA FIR,将实例作为基础实现模块使用。如图8-29所示。图7-29 将实例作为基础实现模块3)在可配置子模块中添加和删除实例模块添加和删除子系统是编辑、修改可配置子系统的基本操作,按照下面的步骤可以从可配置子系统中删除实例模块:(1)打开并解锁子系统的库;双击模版模块,然后在弹出的用户界面中取消相应模块检验框的选定,单击“OK”就可以删除掉相应的子模块,如图7-30所示;再保存库,重新编译即可;最后仍需要在设计更新子系统。对于添加实例模块的步骤如下:首先,打开并解锁子系统的库;然后将实例模块拖到子系统设计中,双击模版模块;在弹出的用户界面中选中所需模块检验框,单击“OK”即可,如图7-31所示;再保存库,重新编译;在已有的设计中更新子系统。图7-30 删除子模块图7-31 添加子系统(2)生成可配置子模块的硬件电路在SystemGenerator中,模块可用于仿真和产生硬件。有时对于一个可配置子系统,最佳的方式是其既可以成为仿真基础模块,也可以用来生成硬件电路。例如将可配置子系统在仿真时作为普通的模块来产生仿真结果,在实现时作为黑盒子产生功能电路的HDL代码,就是一种常用方式。SystemGenerator提供了可配置子系统管理模块来达到上述目的,其使用方法如下:首先,打开、解锁可配置子系统的库文件(除了模版模块),然后双击该模块;其次,将可配置子系统管理模块拖到打开的库中,该管理模块可以在“Xilinx Blockset/Tools/ Configurable Subsystem Manager”路径中找到,如图8-32所示。图7-32 可配置子系统管理模块最后,双击管理模块打开其属性配置GUI,选择可配置子系统中生成硬件电路的模块,如图8-33所示。单击“OK”保存子系统和库文件退出即可。图7-33 选择可配置子系统的硬件模块
文章热词:dsp系统设计
下一篇:没有了
延伸阅读:
PIC单片机是一种用来开发去控制外围设备的集成电路(IC)。Periphe

我要回帖

更多关于 我需要钱 的文章

 

随机推荐