HDLCoder 浮点模型教程 教程
背景
在算法建模与仿真阶段,我们往往习惯使用浮点数(Floating-Point)来描述系统行为。浮点数具有表示范围大、精度高、使用灵活等优点,非常适合在 PC 上进行算法验证与性能评估。例如在 MATLAB / Simulink 中,几乎所有模型默认都基于浮点数运行,工程师可以专注于算法本身,而不必过多考虑数值溢出、量化误差等问题。 然而,当算法需要被部署到 FPGA 上实现时,情况会发生根本性的变化。FPGA 本质上是一种由查找表(LUT)、触发器(FF)、DSP 和存储资源构成的硬件并行计算平台,并不天然适合直接高效地处理浮点运算。虽然现代 FPGA 支持浮点 IP 核,但浮点运算通常会带来以下问题
- 资源占用大(LUT / DSP / BRAM 消耗高)
- 运算延迟长,时序压力大
- 功耗较高,不利于高频或大规模并行实现
相比之下,定点数(Fixed-Point)采用固定的小数位宽来表示数值,其本质更接近于整数运算,更符合 FPGA 的硬件结构特点。通过合理选择位宽和小数位位置,定点运算可以在保证系统性能的同时,大幅降低资源消耗,并提升运行速度和确定性。 因此,如果对于模型运行步长没有那么高,比如500ns~2us甚至以上,可以采用单精度浮点(Single)建模的方式搭建FPGA模型。对于开关电路的仿真分析,通常要求仿真步长<开关周期的1/200,否则步长太长无法计算准确,因此这种模型通常能够满足10kHz及以下开关频率的电路仿真分析。 而对于模型运行步长要求比较高的场景,比如<100ns,则推荐采用定点数建模的方式搭建FPGA模型。 总结一下如下表格所示:
| 对比维度 | 浮点数(Floating-Point) | 定点数(Fixed-Point) |
|---|---|---|
| 数值表示 | 指数 + 尾数,表示范围大 | 固定整数位 + 小数位 |
| FPGA 资源占用 | 高(LUT / DSP / BRAM 消耗大) | 低,更贴合 FPGA 硬件结构 |
| 运算延迟 | 较大,流水级数多 | 较小,易于高频运行 |
| 典型模型步长 | 500 ns ~ 2 µs 及以上 | 10ns~100 ns |
| 适用开关频率 | ≤ 10 kHz(步长 < Ts / 200) | 10kHz~200kHz高频模型 |
本教程将以PMSM电机模型为例讲解基于浮点数的FPGA建模流程。
2. 搭建PMSM模型
2.1 创建空白模板
点击Simulink,选择FPGA模板文件

模型中为示例的模型,这里我们先删除模板内的内容,插入PMSM HDL(HDL coder自带模块),并创建子系统,如下图所示

2.2 设置端口类型与步长
在FPGA建模中,使用rate transition模块和data type conversion模块可以分别设置模型端口的步长和数据类型,PMSM HDL模型推荐的步长为1us,因此这里我们设置步长为1us,如下图所示。由于整体模型步长都是1e-6(单步长模型),因此整体模型显示为红色。

然后添加Data type conversion模块并设置为single。注意,默认类型为double(HDL不支持),需要专门转换为single。模型输入类型设置为single之后,模型内部将自动推断出所有类型均为single,因此内部不需要再专门做类型处理。

2.3 添加测试激励
这里搭建的模型是Simulink自带的模型,是准确无误的,但是用户也可以自己搭建自定义的模型,为了测试自己搭建的模型的正确性,通常需要连接测试激励,先在离线环境下验证模型的正确性,然后再进入后面的步骤。因此这里简单说明一下如何添加激励进行测试。 子系统的输入端口Config为电机的参数配置,可以通过PMSM Configuration模块进行配置,PhaseVolt为电机的相电压,接收三个电压输入,LdTrq/Spd为转矩输入或者速度输入,这里可以按照测试需求给定。

然后即可以在模型的输出添加Scope查看离线仿真的结果了。通过比对理论输出与离线仿真输出波形,用户即可自己验证模型的正确性。
2.4 添加delay模块
由于FPGA主频通常较高,比如100MHz(10ns),而该浮点模型步长较大(1us),因此为了保证在1us计算过程中所有输入不发生变化(否则会导致计算错乱),需要在所有的输入端口添加unit delay模块维持输入稳定。同时,输出结果也需要添加unit delay来锁存模型每个1us计算的结果。如下图所示

2.5 Simulink浮点设置
除了《HDLCoder使用方法》教程中提到的软件设置之外,针对浮点模型还需要进行相应的配置。如下图所示为HDL Coder的浮点设置,需要将Library选择为Native Floating Point
Latency Strategy中有MIN/MAX/ZERO三个选项,这里是Simulink模型生成的流水线设置,初次接触理解可能会比较困难,这里建议先选择ZERO。
2.6 DAC输出配置
参考《HDLCoder使用方法》中的端口配置相关内容,如果端口为int16,将被识别为DAC端口。因此需要将需要输出到DAC的信号转换为int16,在InsRealm的库中提供了DAC gain模块可以实现这一功能,用户添加该模块即可(模块需要放在顶层子系统内部),如下图所示。

3 生成Bit文件并实时运行
以上步骤完成之后,即可以完整的HDLCoder使用流程的方法编译bit文件并实时运行,这里不赘述。