比特流文件类型的编译结果是直接能够配置FPGA的二进制比特流文件,并能直接在FPGA硬件平台上直接运行的。如果安装了硬件协仿真平台,可以通过选择“Hardware Co-simulation > XtremeDSP Development Kit > PCI and USB”,生成适合XtremeDSP开发板的二进制比特流文件。
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模块。 例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所示。图7-18 MCode模块关联界面示意图3.添加边界模块、Sytem Generator模块、正弦波测试激励以及示波器模块构成完整的设计,如图8-19所示。图7-19 简单移位模块设计示意图4.运行仿真,得到的结果如图7-20所示,从中可以看出,设计是正确的,正确实现了.m文件的功能。左图将信号放大了8倍,右图将信号缩小了4倍。图7-20 简单移位模块仿真结果示意图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五、子系统的建立和使用System Generator设计经常作为大型HDL设计的一部分,本节就介绍如何使用System Generator来建立子系统模块,以及如何在整个系统中对其进行仿真。 1.子系统的建立以及仿真方法 子系统就是HDL语言中的模块,也类似于C++语言中的函数,是有效执行自顶向下设计的必备手段。如果将一个复杂设计完全在一个单独设计中实现,则该设计的验证和复查工作将是设计人员的噩梦。此外,从设计复用的角度讲,子系统可以IP核的方式为多个设计使用,具有高的可重用性,能节省大系统的开发时间。 建立子系统最简单的方法就是利用NGC二进制网表文件,将System Generator设计封装成一个单独的二进制模块,这样综合工具将其作为黑盒子看待。在建立子系统时,管脚约束不能在Gataway模块中定义,同样时钟管脚也不能在System Generator模块中定义,应通过网表编辑器来指定物理约束,这是因为NGC网表中不仅包括了逻辑设计,还包括了设计的约束信息。在复杂系统中建立子系统的设计流程如下所示:图7-21 建立子系统的设计流程1)NGC网表文件 如图7-21所示,生成NGC网表是建立子系统的第一步。在System Generator标志中将编译生成文件类型选为NGC List,如图7-22所示。如果设计中有时钟驱动电路,点击Generate后,会在目标文件夹生成“<design>_cw.ngc”文件,否则会生成“<design>.ngc”文件,其中<design>就是设计的名字。NGC网表文件包括设计中所有的逻辑和约束信息,这意味着将System Generator生成的所有HDL文件、内核以及约束等文件封装成一个单独的文件。图7-22 选择编译生成文件类型2)设计规则在复杂系统中使用子模块时,必须遵循下面两条规则。 首先,不能在子模块设计文件中出现“Gateway In”、“Gateway Out”以及System Generator标志模块,否则NGDBuild工具会产生下面的警告: WARNING: NgdBuild:483 - Attribute "LOC" on "clk" is on the wrong type of object. Please see the Constraints Guide for more information on this attribute. 其次,不能在综合的时候往NGC网表文件中插入I/O缓存器,否则会报错。I/O缓存器只能在顶层模块中使用。3)逻辑综合 当使用子系统的NGC网表文件综合时,其流程如图8-23所示。NGC模块可在顶层模块中以黑盒子的方式直接例化。为了简化该过程,当通过NGC目标编译后,System Generator提供了HDL例化模板,保存在设计路径,且以“<design>_cw.veo”命名。当选择VHDL语言时,则其模板名为“<design>_cw.vho”。图8-23 综合时的流程图4)仿真 把System Generator模型编译成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)生成可配置子模块的硬件电路在System Generator中,模块可用于仿真和产生硬件。有时对于一个可配置子系统,最佳的方式是其既可以成为仿真基础模块,也可以用来生成硬件电路。例如将可配置子系统在仿真时作为普通的模块来产生仿真结果,在实现时作为黑盒子产生功能电路的HDL代码,就是一种常用方式。System Generator提供了可配置子系统管理模块来达到上述目的,其使用方法如下: 首先,打开、解锁可配置子系统的库文件(除了模版模块),然后双击该模块; 其次,将可配置子系统管理模块拖到打开的库中,该管理模块可以在“Xilinx Blockset/Tools/ Configurable Subsystem Manager”路径中找到,如图8-32所示。图7-32 可配置子系统管理模块最后,双击管理模块打开其属性配置GUI,选择可配置子系统中生成硬件电路的模块,如图8-33所示。单击“OK”保存子系统和库文件退出即可。图7-33 选择可配置子系统的硬件模块 来源:机器视觉的博客