使用 Simulink 模板进行 HDL 代码生成
R2026bSimulink® 中的 HDL Coder™ 模型模板为您提供用于 HDL 代码生成的模型的设计模式和最佳做法。从 HDL Coder 模型模板之一创建的模型已针对 HDL 代码生成设置其配置参数和求解器设置。要针对 HDL 代码生成配置现有模型,请使用 hdlsetup。
使用 HDL Coder 模型模板创建模型
要创建用于高效 HDL 代码生成的硬件模型,请使用 HDL Coder 模型模板创建一个模型。
打开 Simulink 起始页。在 MATLAB® 的“主页”选项卡中,选择 Simulink 按钮。或者,在命令行中输入:
simulink
在 HDL Coder 部分中,您会看到针对 HDL 代码生成预配置的模板。选择该模板会打开 Simulink 编辑器中的空白模型。要保存模型,请选择文件 > 另存为。
要打开 Simulink 库浏览器并且然后打开 HDL Coder 模块库,请在 Simulink 编辑器中选择库浏览器按钮。或者,在命令行中输入
slLibraryBrowser
要对 Simulink 库浏览器进行过滤以显示支持 HDL 代码生成的模块库,请使用
hdllib函数:hdllib
HDL Coder 模型模板
复数乘法器
复数乘法器模板说明如何对复数乘法器-累加器进行建模,并手动流水线化中间阶段。复数乘法的硬件实现使用四个乘法器和两个加法器。
该模板应用以下最佳做法:
在“配置参数”对话框中,在 HDL 代码生成 > 全局设置中,复位类型设置为同步。
为提高速度,Delay 模块(映射到硬件中的寄存器)位于乘法器和加法器的输入和输出处。
为支持全精度复数乘法器的输出数据,输出数据字长手动指定为 (
operand_word_length* 2) + 1。例如,在模板中,操作数字长为 18,输出字长为 37。


MATLAB 算术
MATLAB 算数模板包含在硬件中推断 DSP48 的 MATLAB 算术运算。


例如,ml_mul_acc MATLAB Function 模块说明如何在 MATLAB 中编写乘法-累加运算。hdlfimath 应用用于 HDL 代码生成的定点数学设置。
function y = fcn(u1, u2) % design of a 6x6 multiplier % same reset on inputs and outputs % followed by an adder nt = numerictype(0,6,0); nt2 = numerictype(0,12,0); fm = hdlfimath; persistent u1_reg u2_reg mul_reg add_reg; if isempty(u1_reg) u1_reg = fi(0, nt, fm); u2_reg = fi(0, nt, fm); mul_reg = fi(0, nt2, fm); add_reg = fi(0, nt2, fm); end mul = mul_reg; mul_reg = u1_reg * u2_reg; add = add_reg; add_reg(:) = mul+add; u1_reg = u1; u2_reg = u2; y = add;
ROM
ROM 模板是一种映射到硬件中的 ROM 的设计模式。
该模板应用以下最佳做法:
在查找表的输出处,存在
ResetType=none的 Delay 模块。查找表的结构使得断点之间的间距是 2 的幂。
使用作为 2 的幂的表维度使 HDL Coder 能够生成移位运算而不是除法运算。如有必要,用零填充表。
查找表条目数是 2 的幂。对于某些综合工具,条目数是 2 的幂的查找表能更好地映射到 ROM。如有必要,用零填充表。


寄存器
寄存器模板说明如何对硬件寄存器进行建模:
在 Simulink 中,使用 Delay 模块。
在 MATLAB 中,使用持久变量。
此设计模式还说明如何使用
cast自动传播数据类型。


MATLAB Function 模块中的 MATLAB 代码使用持久变量对寄存器进行建模。
function y = fcn(u) % Unit delay implementation that maps to a register in hardware persistent u_d; if isempty(u_d) % defines initial value driven by unit delay at time step 0 u_d = cast(0, 'like', u); end % return delayed input from last sample time hit y = u_d; % store the current input u_d = u;
SRL
SRL 模板说明如何实现映射到硬件中 SRL16 的移位寄存器。您可以使用类似的模式映射到 SRL32。


在移位寄存器子系统中,Tapped Delay 实现移位运算,MATLAB Function、select_tap 实现输出复路。
在 select_tap 中,从 0 开始的地址 addr 递增 1,因为 MATLAB 索引是从 1 开始的。
function dout = fcn(addr, tdelay) %#codegen addr1 = fi(addr+1,0,5,0); dout = tdelay(addr1);
该模板还应用以下最佳做法以映射到硬件中的 SRL16:
对于 Tapped Delay 模块:
在“模块参数”对话框中,将当前输入包含在输出向量中未启用。
在“HDL 模块属性”对话框中,ResetType 设置为无。
对于 Subsystem 模块,在“HDL 模块属性”对话框中,FlattenHierarchy 设置为 on。
Simulink 硬件模式
Simulink 硬件模式模板包含常见硬件操作的设计模式:
串行到并行移位寄存器
检测上升沿
检测下降沿
SR 锁存
RS 锁存


例如,上升沿检测和下降沿检测的设计模式:


MATLAB 中的状态机
MATLAB 中的状态机模板说明如何使用 MATLAB Function 模块实现米利和摩尔状态机。

要了解有关状态机建模最佳做法的更多信息,请参阅Model a State Machine for HDL and High-Level Synthesis Code Generation。
单精度累加器
自 R2026a 起
单精度累加器模板对原生浮点输入的单周期累加进行建模。您可以手动插入中间流水线阶段以满足高频设计需求。在吞吐量和时序收敛至关重要的应用中使用此模板,例如深度学习层或矩阵乘法。
Accumulator 子系统在 data_in 端口接收 single 类型输入数据以进行累加。当 reset_sum 端口上的信号为 false 时,Accumulator 子系统在单个时钟周期内将 data_in 端口处的每个传入值添加到滚动总和中。当 reset_sum 端口上的信号为 true 时,Accumulator 子系统将滚动总和重置为零,无论 data_in 端口处的值如何。您可以使用此行为在操作期间重新初始化或清除累加器。
此模板支持资源复用、层次结构展平和时钟频率流水线等优化。
