主要内容

使用 Simulink 模板进行 HDL 代码生成

R2026b

Simulink® 中的 HDL Coder™ 模型模板为您提供用于 HDL 代码生成的模型的设计模式和最佳做法。从 HDL Coder 模型模板之一创建的模型已针对 HDL 代码生成设置其配置参数和求解器设置。要针对 HDL 代码生成配置现有模型,请使用 hdlsetup。

使用 HDL Coder 模型模板创建模型

要创建用于高效 HDL 代码生成的硬件模型,请使用 HDL Coder 模型模板创建一个模型。

  1. 打开 Simulink 起始页。在 MATLAB® 的“主页”选项卡中,选择 Simulink 按钮。或者,在命令行中输入:

    simulink

  2. 在 HDL Coder 部分中,您会看到针对 HDL 代码生成预配置的模板。选择该模板会打开 Simulink 编辑器中的空白模型。要保存模型,请选择文件 > 另存为。

  3. 要打开 Simulink 库浏览器并且然后打开 HDL Coder 模块库,请在 Simulink 编辑器中选择库浏览器按钮。或者,在命令行中输入

    slLibraryBrowser

    要对 Simulink 库浏览器进行过滤以显示支持 HDL 代码生成的模块库,请使用 hdllib 函数:

    hdllib

HDL Coder 模型模板

复数乘法器

复数乘法器模板说明如何对复数乘法器-累加器进行建模,并手动流水线化中间阶段。复数乘法的硬件实现使用四个乘法器和两个加法器。

该模板应用以下最佳做法:

  • 在“配置参数”对话框中,在 HDL 代码生成 > 全局设置中,复位类型设置为同步。

  • 为提高速度,Delay 模块(映射到硬件中的寄存器)位于乘法器和加法器的输入和输出处。

  • 为支持全精度复数乘法器的输出数据,输出数据字长手动指定为 (operand_word_length * 2) + 1。

    例如,在模板中,操作数字长为 18,输出字长为 37。

Simulink Template of Complex Multiplier.

Complex multiplier model. The model contains four multiplier blocks, top two multiplier blocks computes multiplication of real part and bottom two multiplier computes multiplication of imaginary part.

MATLAB 算术

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

Simulink Template of MATLAB Arithmetic System

MATLAB Arithmetic model that has five MATLAB Function blocks.

例如,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 template of Read-Only Memory System

LUT Based Read only memory system, which has a Direct Lookup Table block followed by a Delay block.

寄存器

寄存器模板说明如何对硬件寄存器进行建模:

  • 在 Simulink 中,使用 Delay 模块。

  • 在 MATLAB 中,使用持久变量。

    此设计模式还说明如何使用 cast 自动传播数据类型。

Simulink Template of Register

Simulink model that has MATLAB Function block and Unit Delay block.

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。

Simulink template for SRL system

SRL Subsystem that has MATLAB function block named select_tap.

在移位寄存器子系统中,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);
在生成代码中,HDL Coder 自动省略该递增,因为 Verilog®、SystemVerilog 和 VHDL® 是从 0 开始的。

该模板还应用以下最佳做法以映射到硬件中的 SRL16:

  • 对于 Tapped Delay 模块:

    • 在“模块参数”对话框中,将当前输入包含在输出向量中未启用。

    • 在“HDL 模块属性”对话框中,ResetType 设置为无。

  • 对于 Subsystem 模块,在“HDL 模块属性”对话框中,FlattenHierarchy 设置为 on。

Simulink 硬件模式

Simulink 硬件模式模板包含常见硬件操作的设计模式:

  • 串行到并行移位寄存器

  • 检测上升沿

  • 检测下降沿

  • SR 锁存

  • RS 锁存

Simulink Hardware Pattern Template

Simulink Hardware Pattern Subsystem. A subsystem contains five subsystems named, shift_reg, detect_rising_edge, detect_falling_edge, SR_latch, and RS_latch.

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

detect_rising_edge subsystem

detect_falling_edge subsystem

MATLAB 中的状态机

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

Simulink Template for State Machine

要了解有关状态机建模最佳做法的更多信息,请参阅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 端口处的值如何。您可以使用此行为在操作期间重新初始化或清除累加器。

此模板支持资源复用、层次结构展平和时钟频率流水线等优化。

HDL Coder template for Single Precision Accumulator

另请参阅

|

主题