HDLCoder 使用方法 教程
注意使用HDLCoder需要满足如下前置条件
- 预先安装Vivado 2018.3版本软件,其他版本不兼容
- matlab需要安装HDLCoder模块:
完整的使用流程如下

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

然后模型外部为FPGA模型的输入和输出,内部则是需要用户按照需求自己搭建的数学模型,需要使用HDLCoder支持的基本模块来搭建,比如下图所示为一个ADC采样并乘以增益,最后输出到DAC的模型。通过此模型,用户可以熟悉模型搭建流程并熟悉DAC和ADC通道的使用,最后将可以实现一个简单的波形实时调幅功能。
1.2 搭建模型注意点
搭建好的模型顶层为

!!!!有几点需要注意!!!!:
- 模型本身需要被放置到一个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位,比如可以配置为
- 外部输入的数字io信号(比如PWM输入信号)需要添加一个delay模块,以避免亚稳态问题
- 模型保存的路径不能太长,且不能含有中文路径。否则后续FPGA的比特流生成会出错。推荐路径长度(含模型名字)应该少于40个字符。
1.3 模型说明
如下所示为模型内部

模型中adc_in为int16(设置为该类型之后软件将自动识别为AI端口)的数据类型,通过强制类型转换转换为sfix16_en15的定点数(标识范围为-1~1),乘以10之后则可以将实际的adc能够采样-10V~10V转换为正确的定点数。然后乘以一个来自外部的gain端口即可实现信号的调制。 然后为了将调制的信号再转换为DAC输出,只需要将adc的步骤反过来(即先乘以1/10,然后强制类型转换为int16即可)。
1.4 离线仿真验证
模型搭建好了之后,可以在外围接入一定的控制信号以及激励信号。并且按照离线仿真的方式,点击Run看一下波形是否正确。

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

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

1.5.2 步长设置
由于此模型将运行在FPGA上,因此这里设置的步长为FPGA的仿真步长。与普通的模型仿真略有不同,FPGA的模型往往一个模型中有多种步长,推荐使用rate transition模块来手动指定模型路径的步长。比如如下图所示,此时绿色部分就是转换过后的步长1e-7,红色的模型为1e-8。内部也将通过自动推断来确定步长。

通常如果模型是浮点运算,往往需要设置步长为100ns~1us,具体要视模型中的延迟长度来决定。如果是定点运算,则直接设置为最短步长1e-8即可。此外如果是浮点数模型,还需要设置过采样系数,设置位置如下图所示。

Oversample factor设置:
- 单一步长模型:如果整个模型只使用一种步长,则设置
Oversample factor = 步长 / FPGA主频周期 - 例如:FPGA主频100M,步长为5e-7s时,Oversample factor = 5e-7 / 10e-9 = 50
- 例如:FPGA主频100M,步长为1e-7s时,Oversample factor = 1e-7/ 10e-9 = 10
- 多步长模型:如果模型中同时存在多种步长,则设置
Oversample factor = 最小步长 / FPGA主频周期。例如:FPGA主频100M,模型中同时有1e-7s和1e-8s,则选择最小的1e-8s,Oversample factor = 1e-8 / 10e-9 = 1。
2. RTL代码生成
首先选中需要转换为HDL代码的模块,如下图所示。然后点击Generate HDL,等待HDLCoder的代码生成。

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

3. Bitstream生成
此时,第一次使用会弹窗提示输入vivado.bat的路径
需要安装Vivado2023.2版本,安装好后,填入vivado.bat的路径。比如:C:\Xilinx\Vivado\2023.2\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的则无法配置。
配置完了之后点击右下角Process,即可开始bit生成。此过程视电脑性能,大概需要十几分钟到一个小时。综合过程中,命令行窗口中会打印综合过程中vivado软件的输出。
4. 模型运行
回到simulink,创建一个CPU模型(实时运行模型)。

保存模型之后,添加FPGA Solver模块,然后点击Link solver,选择刚刚搭建的simulink模型,程序会自动完成链接操作,并创建对应的输入和输出端口。
这里我们添加了一个DAC输出到DAC1(对应AO9),然后通过外部接线,从AO9连接到AI1上,在FPGA Solver模块的Mask中配置了运算结果输出到AO1。

点击编译以监控编译模型,然后点击连接,之后点运行即可实时运行仿真模型。

如下图所示为scope的波形和示波器的实时运行波形

接着我们把输入的gain换成正弦,查看运行结果,可以看到,实现了对adc输入信号的正弦调制。
