本节将介绍如何通过Model Composer构建数字信号处理模型,内容包括Model Composer工具概述、打开Model Composer工具、创建一个矩阵运算实现模型、修改设计中模块的参数、执行仿真并分析结果,以及产生输出。
本节将简要介绍Model Composer工具的功能和设计流程。
1.Model Composer工具的功能
Model Composer工具是Xilinx Vivado 2018版本提供的新设计工具,它也是基于模型的设计工具。通过该设计工具,可以在MathWorks Simulink环境中进行快速的设计探究。通过自动代码生成方法,进一步加速Xilinx可编程器件的使用效率。
前面提到Simulink是MATLAB内集成的一个工具,它提供了一个可交互的、图形化的环境,用于建模、仿真、分析和验证系统设计。而Model Composer工具作为Xilinx 工具箱嵌入到MathWorks Simulink环境中,允许算法人员充分利用Simulink图形化环境的所有能力来设计和验证算法。
算法人员可以在Simulink环境中使用来自Model Composer库的块,以及用户定制导入的块来表示算法。通过使用自动优化和利用Vivado HLS的高级综合技术,Model Composer工具可以将算法人员的算法规范转换为真正使用的IP实现。通过Vivado集成开发环境提供的IP集成器特性,算法人员可以将IP集成在一个平台(如Zynq器件)上。
Model Composer提供了超过80个优化模块的库用于Simulink工具,包括用于描述类似算术、线性代数、逻辑和按位操作的算法。此外,还包含了大量用于图像处理和计算机视觉的专用模块,如表4.3所示。
表4.3 Model Composer工具中的模块列表
2.Model Composer工具设计流程
Model Composer模块库与标准的Simulink模块库兼容,并且可以一起使用这些模块在Simulink中建立一个模型。然而,Model Composer只支持某些Simulink模块产生代码。在Model Composer模块库中,可以找到与来自Model Composer输出生成兼容的Simulink模块。
Model Composer也可以让读者用C/C++代码创建自己定制的模块。此外,Model Composer可以让读者探索自己系统级设计的算法方法,定义一个应用模块来产生输出,连接额外的Simulink模块使能仿真,以及定义设计的输出特性。读者可以将设计模型编译为C++代码,用于Vivado HLS的高级综合,或者创建System Generator块,或者创建用于Vivado设计套件的封装IP。Model Composer工具的设计流程如图4.47所示。
图4.47 Model Composer工具的设计流程
注 :(1)在安装Vivado 2018设计套件时,必须勾选“Model Composer”前面的复选框,如图4.48所示。
图4.48 Vivado 2018设计套件安装界面截图
(2)在使用Model Composer工具之前,必须获取该工具的授权文件。
本节将通过Model Composer创建信号处理模型,主要步骤包括:
(1)在Windows 7操作系统下,选择开始->所有程序->Xilinx Design Tools->Model Composer 2018.1->Model Composer 2018.1,打开MATLAB R2017b软件工具。
(2)在MATLAB主界面的工具栏中找到并单击“Simulink”按钮,出现“Simulink Start Page”对话框。
(3)在“Simulink Start Page”对话框右侧的窗口中找到并展开“Simulink”。在展开项中,找到并单击名字为“Blank Model”的图标,出现“Untitled-Simulink sponsored use”对话框。
(4)在“Unititled-Simulink sponsored use”对话框中,找到并单击 按钮,出现“Simulink Library Browser”界面。
(5)在“Simulink Library Browser”界面中,找到并展开“Xilinx Model Composer”,如图4.49所示,从图中可以看到该库中所有的模块。
图4.49 Xilinx Model Composer库中的模块
本节将使用Model Composer工具实现矩阵的运算操作,如图4.50所示。具体实现步骤主要包括:
图4.50 矩阵的运算操作模型
(1)在“Simulink Library Browser”界面左侧的窗口中,找到并展开“Xilinx Model Composer”。在展开项中,找到并展开“Source”。在右侧窗口中,找到并选中名字为“Constant”的模块符号,将其分两次拖入“Untitled-Simulink sponsored use”对话框中(后面统称为空白设计界面),如图4.51所示。
(2) 在 “Simulink Library Browser” 界面左侧的窗口中,找到并展开 “Xilinx Model Com-poser”。在展开项中,找到并展开 “Math Functions”。在展开项中,找到并选择 “Matrices and Linear Algebra”。在右侧窗口中,分别选择名字为 “Matrix Multiply” 和 “Transpose” 的模块符号,并将其分别拖入空白设计界面中,如图4.51所示。
(3)在“Simulink Library Browser”界面左侧的窗口中,找到并展开“Xilinx Model Composer”。在展开项中,找到并选择“Signal Attributes”。在右侧窗口中,选择名字为“Data Type Conversion”的模块符号,并将其拖入空白设计界面中,如图4.51所示。
(4)在“Simulink Library Browser”界面左侧的窗口中,找到并展开“Xilinx Model Composer”。在展开项中,找到并展开“Sinks”。在右侧窗口中,找到并选中名字为“Display”的模块符号,将其分两次拖入空白设计界面中,如图4.51所示。
(5)在“Simulink Library Browser”界面左侧的窗口中,找到并展开“Xilinx Model Composer”。在展开项中,找到并展开“Tools”。在右侧窗口中,找到并选中名字为“Model Composer Hub”的模块符号,将其拖入空白设计界面中,如图4.51所示。
图4.51 设计中所包含的模块
注 :在图4.51中,根据显示数据的要求,读者可以适当调整模块符号的大小。
(6)按图4.52所示将设计模型中的所有模块连接在一起。
图4.52 将设计中的所有模块连接在一起
本节将修改设计中模块的参数,主要步骤包括:
(1)双击图4.52中名字为“Constant”的模块符号,打开“Block Parameters:Constant”对话框。在该对话框的“Constant value:”标题下的文本框中输入下面的常数,作为A 3×3 矩阵的初始值:
[1.1,2.2,3.3;4.4,5.5,6.6:7.7,8.8,9.9]
即
(2)单击“OK”按钮,退出对话框。
(3)双击图4.52中名字为“Constant1”的模块符号,打开“Block Parameters:Constant”对话框。在该对话框的“Constant value:”标题下的文本框中输入下面的常数,作为B 3×3 矩阵的初始值:
(4)单击“OK”按钮,退出对话框。
(5)双击图4.52中名字为“Data Type Conversion”的元件符号,打开“Block Parameters:Data Type Conversion”对话框。在该对话框中,按如下所示设置参数。
① Output data type:fixed。
② Word length:16。
③ Fractional length:5。
④ Round:Trunction to zero。
⑤ Overflow:Sign-Magnitude wrap Around。
(6)单击“OK”按钮,退出对话框。
(7) 将设计文件保存在E:\fpga_dsp_example\model_composer路径下,该设计文件的名字为 “matrix_multiply”。
本节将对该设计执行仿真,并对仿真结果进行分析,主要步骤包括:
(1) 在当前设计界面的工具栏中单击 按钮,开始对设计进行仿真。
(2) 仿真结果如图4.53所示。
图4.53 仿真结果
思考与练习4-8 :分析浮点和定点表示矩阵相乘结果之间的误差。
思考与练习4-9 :通过修改定点数的位数宽度和精度,分析定点数的长度和精度对计算结果的影响。
(3)退出Simulink工具。
(4)在MATLAB主界面的控制台下输入下面的命令更新可用的FPGA器件和开发板。
(5)在MATLAB主界面的控制台下输入下面的命令列出可用的FPGA开发板。
本节将来自Model Composer库的模型转换为不同的输出结果,具体步骤主要包括:
(1)重新打开Model Composer设计工具。
(2)将前面的设计保存为“matrix_multiply_1.slx”。
(3)删除名字为“Display1”的元件符号和相关的连线,如图4.54所示。
图4.54 去掉Display1元件符号和连线后的系统模型
(4)通过单击鼠标左键和同时拖动鼠标,选中名字为“Matrix Multiply”、“Transpose”和“Data Type Conversion”的模块符号和连线,如图4.55所示。
图4.55 选中模型中的3个模块
(5)单击鼠标右键,出现浮动菜单。在浮动菜单内,选择Create Subsystem from Selection,生成名字为“Subsystem”的子系统,如图4.56所示,将该子系统的名字改为“Matrixoperation”。
图4.56 生成名字为“Subsystem”的子系统
(6)双击图4.56中的Model Composer Hub模块符号,出现该模块的参数设置界面,如图4.57所示。从图4.57中可知,Model Composer提供了3种输出类型(Export type),即IP Catalog、System Generator和C++code。
图4.57 Model Composer Hub模块的参数设置界面
(7)单击“Device”标签。在“Device”标签页中,单击 按钮,选择型号为xc7a75tfgg484-1的FPGA。
(8)单击“Clocking”标签。在“Clocking”标签页中,将“FPGA clock frequency(MHz)”设置为“100”。
(9)再次单击“Compilation”标签。
1.输出IP Catalog
输出IP Catalog的过程,其主要步骤包括:
(1)在“Target directory:”的下面设置输出路径为“E:/fpga_dsp_example/model_composer/ip”。
(2)在“Export type:”右侧的下拉框中选择“IP Catalog”。
(3)勾选“Create and execute testbench”前面的复选框。
(4)单击“Apply”按钮。
(5)单击“Generate”按钮,产生IP Catalog。
注 :生成的IP Catalog可以在Vivado设计套件中导入IP Catalog,如图4.58和图4.59所示,也可以导入Vivado HLS工具中。
图4.58 在Vivado设计套件中添加IP到IP Catalog的方法
图4.59 将Matrixoperation导入IP Catalog后的界面
2.输出System Generator
本部分将介绍输出System Generator的过程,主要步骤包括:
(1)在“Target directory:”下面设置输出路径为“E:/fpga_dsp_example/model_composer/sysgen”。
(2)在“Export type:”右侧的下拉框中选择“System Generator”。
(3)勾选“Create and execute testbench”前面的复选框。
(4)单击“Apply”按钮。
(5)单击“Generate”按钮,产生System Generator。
注 :可以在System Generator中通过Vivado HLS模块符号导入,如图4.60和图4.61所示。
图4.60 System Generator导入Vivado HLS符号的参数设置界面
图4.61 导入Vivado HLS元件符号的接口
3.输出C++代码
本部分将介绍输出C++代码的过程,其主要步骤包括:
(1)在“Target directory:”下面设置输出路径为“E:/fpga_dsp_example/model_composer/cplus”。
(2)在“Export type:”右侧的下拉框中选择“C++code”。
(3)勾选“Create and execute testbench”前面的复选框。
(4)单击“Apply”按钮。
(5)单击“Generate”按钮,产生C++代码。