Matlab Simulink HDL Coder 时钟束信号生成

时钟束信号包括时钟、复位和时钟使能信号。在代码生成过程中,HDL Coder根据您在设计中使用的连续元素(如持久变量或延迟块)创建时钟束信号。默认情况下,单个主时钟和单个主复位驱动设计中的所有顺序元素。

MATLAB代码与时钟关系

如果在MATLAB中使用持久变量,HDL Coder生成时钟束信号。持久变量是MATLAB函数中的局部变量,它在调用函数之间在内存中保留其值。对于代码生成,如果持久变量为空,则函数必须初始化该变量。

参考下列这个使用持久变量n的MATLAB代码:

matlab 复制代码
function y = persist_fcn(u)
    persistent n
        
    if isempty(n)
        n = 1;
    end
    
    y = n;
    n = n + u; 
end

当您生成代码时,HDL Coder创建时钟、复位和时钟使能信号。这些信号在HDL代码中被命名为clk、reset和clk_enable。

这段代码显示了为模型生成的Verilog代码。为了匹配MATLAB持久变量的行为,HDL代码使用了一个always块。在时钟信号的正端,当复位为低,使能信号为高时,延迟1ns后赋值tmp给变量n。

matlab 复制代码
`timescale 1 ns / 1 ns
module persist_fcn_fixpt
          (clk, reset, clk_enable,
           u, ce_out, y);
  input   clk, reset, clk_enable;
  input   u;  // ufix1
  output  ce_out;
  output  y;  // ufix1
..
assign enb = clk_enable;
assign p4tmp_1 = {1'b0, u};
assign tmp = n + p4tmp_1;
always @(posedge clk or posedge reset)
    begin : n_reg_process
      if (reset == 1'b1) begin
        n <= 2'b01;
      end
      else begin
        if (enb) begin
          n <= tmp;
        end
      end
    end
    assign y = n[0];
    assign ce_out = clk_enable;
endmodule  // persist_fcn_fixpt

Simulink模型与时钟关系

要在Simulink中对顺序元素建模并生成时钟束信号,您可以在MATLAB函数块或MATLAB系统块中使用各种类型的延迟块、状态流图或持久变量。代码生成器将您在模型上指定的示例时间映射到HDL设计中的时钟周期。默认情况下,模型是单速率的,这意味着Simulink中的一个采样时间单位映射到HDL代码中的一个时钟周期。

例如,参考这个模型,它在两个单位采样时间后输出输入的unary_minus。

输入以int32作为输出数据类型。

当您生成代码时,HDL Coder创建时钟、复位和时钟使能信号。这些信号在HDL代码中被命名为clk、reset和clk_enable。

这段代码显示了为模型生成的Verilog代码。为了匹配Simulink延迟块行为,HDL代码为每个延迟块使用一个always块。在时钟信号的正边,当复位低,使能信号高时,经过一个单位延时后将输入传递到输出。在计算unary_minus之前,块总是将输入延迟1ns。另一个块总是计算1ns后的unary_minus。

matlab 复制代码
`timescale 1 ns / 1 ns
module unary_minus
          (clk, reset, clk_enable,
           In1, ce_out, Out1);
  input   clk, reset, clk_enable;
  input   signed [31:0] In1;  // int32
  output  ce_out;
  output  signed [31:0] Out1;  // int32
 ...
  assign enb = clk_enable;
  always @(posedge clk or posedge reset)
    begin : Delay_process
      if (reset == 1'b1) begin
        Delay_out1 <= 32'sb0;
      end
      else begin
        if (enb) begin
          Delay_out1 <= In1;
        end
      end
 ...
  always @(posedge clk or posedge reset)
    begin : Delay2_process
       if (reset == 1'b1) begin
        Delay2_out1 <= 32'sb0;
      end
      else begin
        if (enb) begin
          Delay2_out1 <= Unary_Minus_out1;
        end
      end
    end 
 ...
endmodule  // unary_minus

如果您在模型中使用不同的采样时间或启用速度和面积优化,则模型将变为多速率系统模型。

参考文档:Matlab Simulink HDL Coder官方使用文档说明

相关推荐
Saniffer_SH9 分钟前
【市场洞察】一叶知秋 - 从2026年开年Quarch公司PCIe 6.0测试工具销售状况说起
服务器·人工智能·嵌入式硬件·测试工具·fpga开发·自动化·压力测试
神仙别闹3 小时前
基于 MATLAB 实现的图像信号处理
开发语言·matlab·信号处理
Evand J3 小时前
【MATLAB程序】CV和CA模型组成的IMM(交互式多模型),基于粒子滤波PF,背景为三维目标跟踪定位。附源代码
matlab·目标跟踪·pf·粒子滤波·imm·交互式多模型
何如呢3 小时前
FIFO的IP核学习
学习·fpga开发
我爱C编程3 小时前
【3.3】FFT变换的FPGA实现整体概述以及模块划分
fpga开发·fft·多级fft·二维分治fft
星华云3 小时前
[FPGA] Spartan6 单总线协议 (One-Wire) 读取DS18B20温度传感器
fpga开发·温度传感器·ds18b20·单总线协议·one-wire bus
Gofarlic_OMS4 小时前
中小企业控制方法:中小型制造企业Creo许可证成本控制
java·大数据·运维·算法·matlab·制造
s09071364 小时前
ZYNQ 软硬件协同踩坑日记:PS写BRAM后,PL端连续4个地址读出相同数据的原因与解决办法
fpga开发·zynq·硬件设计
jghhh016 小时前
基于主从博弈的主动配电网阻塞管理:MATLAB实现
算法·matlab
周末也要写八哥19 小时前
MATLAB R2025a超详细下载与安装教程(附安装包)
开发语言·matlab