数学模型教程(HDLCoder) FPGA模型教程
本章介绍基于 HDLCoder 的 FPGA 模型开发流程,包括 HIL 模型搭建、RTL 代码生成、Bitstream 生成与实时运行四个步骤。通过本章,你将能在不掌握 FPGA 知识的前提下,把自己的数学模型部署到 FPGA 上实时运行。
注意使用HDLCoder需要满足如下前置条件
- 预先安装Vivado 2018.3版本软件,其他版本不兼容
- matlab需要安装HDLCoder模块 完整的使用流程如下

用户需要先基于FPGA模板创建一个FPGA模型(非实时运行,仅用来生成FPGA的比特流文件),然后创建实时模型,并导入FPGA模块,连接端口实现实时运行。
HIL模型
模型搭建
首先启动simulink,选择FPGA模板。

然后模型外部为FPGA模型的输入和输出,内部则是需要用户按照需求自己搭建的数学模型,需要使用HDLCoder支持的基本模块来搭建。
搭建模型注意点
搭建仿真模型之后,需要基于Simulink/HDLCoder支持的模型库搭建数学模型,有如下几点需要注意:
- 模型本身需要被放置到一个subsystem内部,并且按照需求创建对应的输入输出端口。
-
数据类型规则。
-
数据端口的数据类型位宽目前支持最大为32位,比如可以配置为
fixdt(1,32,16),表示32位的有符号定点数,小数部分为16位,或者配置为single,即单精度浮点数 - 类型为
boolean的输入端口将自动映射为digital input类型,可以分配DI (Digital input)端口。 - 类型为
boolean的输出端口将自动映射为digital output类型,可以分配DO(Digital output)端口。 - 类型为
int16的输入端口将自动映射为adc类型,可以分配AI(ADC)端口 - 类型为
int16的输出端口将自动映射为dac类型,可以分配AO(DAC)端口。
-
数据端口的数据类型位宽目前支持最大为32位,比如可以配置为
- 由于FPGA模型有可能计算周期不是一个主频周期(10ns),为了防止在计算周期内模型输入发生变化,也为了保证模型输出在计算周期内部保持稳定,需要在模型所有的输入输出端口都添加 unit delay 模块,在子系统的顶层添加即可。
- 模型保存的路径不能太长,且不能含有中文路径。否则后续FPGA的比特流生成会出错。推荐路径长度(含模型名字)应该少于40个字符。
模型说明
如下所示为永磁同步电机模型顶层,输入端口包含PWM输入、直流电压输入、工作模式、转矩输入,输出端口包含三相电流输出、角度、速度输出、电磁转矩输出。

内部模型如下所示:左侧为三相桥臂模型(内部为白盒模型,可以自行查看),接收PWM信号作为输入,产生三相桥臂电压作为输出。右侧为电机本体模型,以三相电压、转矩、运行模式作为输入,输出三相电流、电机角度与速度等。

如下图所示为电机本体模型

电机本体模型基于电方程,比如如下图所示为d轴电方程
根据此方程即可搭建d轴的电方程模型

机械方程
基于此方程即可搭建如下图所示的机械方程模型

其余部分模型可以自行打开进行查看。
离线仿真验证
模型搭建好了之后,可以在外围接入一定的控制信号以及激励信号。并且按照离线仿真的方式,点击Run看一下波形是否正确。

其他软件设置
辅助信息显示设置
如下图所示,勾选调试/叠加信息下面的颜色、时间图例和基本数据类型等。

这样可以在模型上看到步长、数据类型等信息。如下图所示,右侧的时间图例就写明了每种步长对应的颜色。左侧模型中连线上面则写了数据类型。方便用户debug。

步长设置
由于此模型将运行在FPGA上,因此这里设置的步长为FPGA的仿真步长。与普通的模型仿真略有不同,FPGA的模型推荐使用rate transition模块来手动指定模型路径的步长。本模型中,我们通过rate transition模块设置仿真步长为100ns。
RTL代码生成
首先选中需要转换为HDL代码的模块,如下图所示。然后点击生成HDL(Generate HDL),等待HDLCoder的代码生成。

RTL代码生成结束之后,会弹框提示是否要继续生成bit文件,点是(yes)继续下一步

Bitstream生成
此时,第一次使用会弹窗提示输入vivado.bat的路径

需要安装Vivado2018.3版本,安装好后,填入vivado.bat的路径。比如:C:\Xilinx\Vivado\2018.3\bin\vivado.bat

点击OK之后会弹出下图所示的界面。用户只需要修改channel列即可,不需要引出至外部的端口,其channel选择N/A即可。
表格中各列说明如下
port_name:端口名字port_type:端口类型,比如cpu, digital, dac等data_type:端口的数据类型direction:端口方向,输入或者输出channel:硬件通道,比如AO、DI等
各类channel类型说明
- 数字输入信号,在channel中选择需要使用的DI通道。
- 数字输出信号,在channel中选择需要使用的DO通道。
- 模拟输出信号,可以在channel中选择对应的AO通道,其中 1~8对应转接板上F1~F8(10MHz超高速DAC),9~24对应转接板上DAC1~DAC16(1MHz高速DAC)。
-
模拟输入信号,在channel中选择需要使用的AI,总共有24个1Msps的AI通道可供使用。
需要注意的是,此步骤的通道选择仅作为后续步骤运行的默认值,生成比特流之后,后续实时运行时还支持任意修改通道,因此这一步选错了也没有关系,但是如果选择N/A的则无法配置。该界面中的
Plugins按钮用于配置插件,插件系统的说明与可用插件列表见《FPGA 插件系统》章节。
配置完了之后点击右下角Process,即可开始bit生成。此过程视电脑性能,大概需要十几分钟到一个小时。综合过程中,命令行窗口中会打印综合过程中vivado软件的输出。
实时仿真模型搭建
回到simulink,创建一个CPU模型(实时运行模型)。

保存模型之后,添加FPGA Solver模块,然后点击Link solver,选择刚刚搭建的simulink模型,程序会自动完成链接操作,并创建对应的输入和输出端口。
如下图所示,link之后根据模型的输入输出端口创建了相应的输入输出端口。

双击FPGA Solver模块,打开模块的引脚配置,这里配置三相桥臂PWM信号分别来自1~6通道

为了实现电机的闭环控制,我们可以在此模型中搭建控制算法模型,实现控制算法与电机本体模型同时仿真。如下图所示为我们的闭环控制模型。

如下图所示为FOC控制框图内部模型

实时仿真模型运行
点击编译,simulink将自动把模型翻译为可执行文件,随后点击connect连接模型,最后点击开始按钮启动模型。此时点击模型中的scope即可查看波形。
转矩模式
转速为500时的稳态波形:

转速从500加速到2000动态波形:

加载波形:

恒转速模式
加速波形

总结
本教程以永磁同步电机模型为例,完整介绍了基于HDLCoder的FPGA实时仿真模型开发流程,主要步骤包括:
- HIL模型搭建:基于FPGA模板,使用HDLCoder支持的基本模块搭建电机数学模型,注意数据类型、端口映射规则以及路径长度等限制,并通过离线仿真验证模型正确性。
- RTL代码生成:选中目标模块,一键生成HDL代码。
- Bitstream生成:配置端口通道映射后,调用Vivado自动完成综合与比特流生成,注意检查综合后的WNS时序指标。
- 实时仿真运行:创建CPU实时模型,通过
FPGA Solver模块链接FPGA模型,搭建控制算法,实现闭环实时仿真。
整个流程无需用户掌握FPGA开发知识,即可实现高精度模型实时仿真。