5)设定系统参数。双击“System Generator”模块,会出现系统设定对话框,如图1-4所示。其中“Compilation”栏选择编译生成对象,包括HDL网表、FPGA配置比特流、NGC网表、EDK导出工具、硬件协仿真类型以及时序分析文件等6种类型,本例选择HDL网表类型,会生成ISE工程以及相应的HDL代码;“Part”栏用于选择芯片型号,本例选择Zynq 7020。“Target”栏用于选择目标文件存放路径,本例使用默认值,则会在mydelay.mdl所在文件夹中自动生成一个netlist的文件夹,用于存放相应的输出文件。综合工具选择XST,HDL语言选择Verilog类型,系统时钟设的周期为100ns,即为10MHz。 “Clock Pin Location”栏的文本框中输入系统时钟输入管脚,则会自动生成管脚约束文件(由于本例只是演示版,所以该项空闲)。此外,可选中“Create testbench”选项,自动生成设计的测试代码。各项参数确认无误后,单击“OK”键,保存参数。
1-4 系统参数设定对话框
6)设置关键模块参数。双击“Gataway In”、“Gataway Out”模块,会弹出图1-5和图 1-6所示的对话框。Gataway In模块属性可查看输入数据位宽和量化规则。
图1-5 Gataway In模块属性对话框/图1-6Gataway Out模块属性对话框
7)运行测试激励。当参数设置完成后,点击工具栏的“run ”按键,即可运行Simulink仿真,可以看到显示器输出为46,表明设计的功能是正确的。
8)生成HDL代码。单击 system Generator 窗口的“Generate”按键,System Generator可自动将设计转化成HDL代码。整个转化过程的起始和结束提示界面分别如图1-6和图 1-7所示。
图1-6 自动生成代码过程的起始提示标志/图1-7 自动生成代码过程的结束提示标志
读者可在相应的文件夹netlist 里的 sysgen 子目录中打开“my_dsp.v”文件,查看相应的代码,用户可将其作为子模块直接使用。
二、System Generator中的信号类型
System Generator是面向硬件设计的工具,因此数据类型只能是定点的,而Simulink中的基本数据类型是双精度浮点型,因此Xilinx模块和Simulink模块连接时需要通过边界模块来转换。“Gateway In”模块把浮点数转换成定点数,“Gateway Out”把定点数转换成浮点数。此外,对于Simulink中的连续时间信号,还必须经过“Gateway In”模块的采样转换才能使用。
System 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针对数字信号处理的专用模块,用于实现乘加运算。
三、 自动代码生成
System 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代码仿真正确与否的指示。
假设设计的名字是,双击顶层模块的System Generator标志,将Compilation选项设为HDL Netlist,选中Create Testbench选项,然后点击Generate选项,不仅可以生成常用的设计文件,还有下面的测试文件:
_tb.vhd/.v文件,包含完整的HDL测试代码;
Various.dat文件,包含了测试代码仿真时的测试激励向量和期望向量;
脚本Scripts vcom.do和vsim.do文件,用于在Modelsim中完成测试代码的编译和仿真,并将其结果和自动编译产生的HDL测试向量进行比较。
Various.dat文件是System Generator将通过“Gataway In/Out”模块的数据保存下来而形成的,其中经过输入模块的数据是测试激励,而通过输出模块的数据就是期望结果。测试代码只是简单的封装器,将测试激励送进生成的HDL代码,然后对输出结果和期望结果完成比较,给出正确指示。
四、 编译MATLAB设计生成FPGA代码
Xilinx公司提供了两种方法将MATLAB设计.m文件转化为HDL设计,一种就是利用AccelDSP综合器;另一种就是直接利用MCode模块。前者多应用于复杂或高速设计中,常用来完成高层次的IP核开发;而后者使用方便,支持MATLAB语言的有限子集,对实现算术运算、有限状态机和逻辑控制是非常有用的。本节内容以介绍MCode模块为主。
MCode模块实现的是装载在里面的.m函数的功能。此外,还能够使用Xilinx的定点类型数对.m函数进行评估。该模块使用回归状态变量以保证内部状态稳定不变,其输入、输出端口都由.m函数确定。
要使用MCode模块,必须实现编写.m函数,且代码文件必须和System Generator模型文件放在同一个文件夹中,或者处于MATLAB路径上的文件夹中。下面用两个实例来说明如何使用MCode模块。
例1-1 使用MATLAB编写一个简单的移位寄存器完成对输入数据乘8以及除以4的操作,并使用MCode将其编译成System Generator直接可用的定点模块。
.m 函数的生成是比较简单的,我们只需要 new function ,然后将相应的函数代码输入,并且保存即可。
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函数和模型设计关联起来,如图1-8所示。 当我们想修改MCode 代码时候,我们只需要双击该模块,然后弹出属性窗口,选择 Edit M-File 即可。
图1-8 MCode模块关联界面示意图
3.添加边界模块、Sytem Generator模块、正弦波测试激励以及示波器模块构成完整的设计,如图1-9所示。
图1-9 简单移位模块设计示意图
4.运行仿真,得到的结果如图1-10所示,从中可以看出,设计是正确的,正确实现了.m文件的功能。左图将信号放大了8倍,右图将信号缩小了4倍。
图1-10 简单移位模块仿真结果示意图
5.自动生成代码,得到的Verilog文件如下所列。
module myshift (
din,
dout1,
dout2
);
input [15:0] din;
output [15:0] dout1;
output [15:0] dout2;
wire [15:0] din_net;
wire [15:0] dout1_net;
wire [15:0] dout2_net;
assign din_net = din;
assign dout1 = dout1_net;
assign dout2 = dout2_net;
mcode_6b96190926 mcode (
.e(1'b0),
.lk(1'b0),
.lr(1'b0),
.in(din_net),
.sh3(dout1_net),
.sh2(dout2_net)
);
endmodule
评论
查看更多