MATLAB生成Verilog代码——HDL Coder使用初探

这篇具有很好参考价值的文章主要介绍了MATLAB生成Verilog代码——HDL Coder使用初探。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

有关用HDL Coder生成Verilog的资料实在太少,且大多是由Simulink搭建模块生成。笔者经过初步探索,将MATLAB代码直接通过HDL Coder生成Verilog代码的过程总结于此。
以一个最大值为15可加减计数器为例
在MATLAB上方的APP里找到HDL Coder,HDL Coder需要MATLAB Function和MATLAB Testbench两个文件,第一个即纯粹的函数or算法,第二个需要对其进行调用并保证能现在MATLAB上成功运行。
这里已经将两个文件添加了进去,添加完毕后再Workflow Advisor里设置生成的代码为Verilog,再运行即可。里面还可以设置仿真工具并生成testbench,但笔者尝试用生成的testbench进行仿真,并不能成功运行,且代码本身就杂乱非常。
matlab转verilog,matlab,fpga开发,开发语言,fpga
这里给出counter.m和counter_tb.m两段代码

function [count] = counter(clk, rst)
    persistent state
    
    if isempty(state) || ~rst
        state = 0;
    elseif clk
        state = state + 1;
        if state == 16
            state = 1;
        end
    end
    
    count = state;
end
function counter_tb
    % 创建时间和输入信号
    time = 0:19;
    clk = [0, ones(1, 9), 0, ones(1, 9)]; % 50% 占空比,10个时钟周期
    rst = [0, ones(1, 19)]; % 第一个周期的复位信号高
    
    % 初始化用于存储输出的数组
    count_out = zeros(size(time));
    
    % 模拟计数器
    for i = 1:length(time)
        count_out(i) = counter(clk(i), rst(i))
    end
    
end

在Workflow Advisor中运行后会生成.v文件,保存的路径可以在左侧选HDL Code Generation下查看,这里给出生成的verilog代码,可以发现可读性比较差,自己在分析时加了些中文注释。

// -------------------------------------------------------------
// Generated by MATLAB 9.7, MATLAB Coder 4.3 and HDL Coder 3.15
// 
// 
// 
// -- -------------------------------------------------------------
// -- Rate and Clocking Details
// -- -------------------------------------------------------------
// Design base rate: 1
// 
// 
// Clock Enable  Sample Time
// -- -------------------------------------------------------------
// ce_out        1
// -- -------------------------------------------------------------
// 
// 
// Output Signal                 Clock Enable  Sample Time
// -- -------------------------------------------------------------
// count                         ce_out        1
// -- -------------------------------------------------------------
// 
// -------------------------------------------------------------


// -------------------------------------------------------------
// 
// Module: counter_fixpt
// Source Path: counter_fixpt
// Hierarchy Level: 0
// 
// -------------------------------------------------------------

//生成的是可加可减的计数器
// reset置0, rst置1, clk_enable置1 时可用,clk_1为1时加,为0时减

`timescale 1 ns / 1 ns

module counter_fixpt
          (clk,
           reset,
           clk_enable,
           clk_1,
           rst,
           ce_out,
           count);


  input   clk;
  input   reset;
  input   clk_enable;
  input   clk_1;  // ufix1
  input   rst;  // ufix1
  output  ce_out;
  output  [3:0] count;  // ufix4


  wire enb;
  wire state_not_empty;
  reg  state_not_empty_1;
  wire tmp;
  wire tmp_1;
  wire tmp_2;
  wire tmp_3;
  wire [4:0] state;  // ufix5
  wire [4:0] state_1;  // ufix5
  reg [4:0] state_2;  // ufix5
  wire [4:0] state_3;  // ufix5
  wire tmp_4;
  wire [4:0] tmp_5;  // ufix5
  wire [4:0] tmp_6;  // ufix5
  wire [4:0] tmp_7;  // ufix5


  // HDL code generation from MATLAB function: counter_fixpt_trueregionp7
  assign state_not_empty = 1'b1;



  assign enb = clk_enable;

  // %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  // 
  //                                                                          %
  // 
  //           Generated by MATLAB 9.7 and Fixed-Point Designer 6.4           %
  // 
  //                                                                          %
  // 
  // %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  assign tmp =  ! state_not_empty_1 || ( ! (rst != 1'b0));  // rst为0或state_not_empty_1为0时,temp为1,都为1时temp为0



  assign tmp_1 = (tmp == 1'b0 ? state_not_empty_1 :
              state_not_empty);  // 永远为1



  always @(posedge clk or posedge reset)
    begin : state_not_empty_reg_process
      if (reset == 1'b1) begin
        state_not_empty_1 <= 1'b0;
      end
      else begin
        if (enb) begin   // clk_enable置1时有效,state_not_empty_1为1
          state_not_empty_1 <= tmp_1;
        end
      end
    end



  assign tmp_2 =  ! state_not_empty_1 || ( ! (rst != 1'b0)); // 都1时为0,正常运作时两参数为1,tmp_2为0



  assign tmp_3 = clk_1 != 1'b0;  // clk_1为1时加,为0时减————tmp_3也为1、0



  // HDL code generation from MATLAB function: counter_fixpt_trueregionp13
  assign state = 5'b00001;



  // HDL code generation from MATLAB function: counter_fixpt_trueregionp2
  assign state_1 = 5'b00000;



  // HDL code generation from MATLAB function: counter_fixpt
  assign state_3 = state_2 + 5'b00001;



  assign tmp_4 = state_3 == 5'b10000; // 代表计数器是否满15,是为1



  // HDL code generation from MATLAB function: counter_fixpt_trueregionp10
  assign tmp_5 = (tmp_4 == 1'b0 ? state_3 :
              state); // 若超过01111则置00001,代表计数从15回到1,否则正常加一



  always @(posedge clk or posedge reset) // reset高电平复位
    begin : state_reg_process
      if (reset == 1'b1) begin
        state_2 <= 5'b00000;
      end
      else begin
        if (enb) begin
          state_2 <= tmp_6;
        end
      end
    end



  // HDL code generation from MATLAB function: counter_fixpt_falseregionp2
  assign tmp_7 = (tmp_3 == 1'b0 ? state_2 :
              tmp_5); // tmp_3 == 0时为减法,执行state_2 即tmp_6,此时正常运转tmp_2为0,执行tmp_7(??)tmp_3 == 1时为加法,执行tmp_5。



  assign tmp_6 = (tmp_2 == 1'b0 ? tmp_7 :
              state_1); 



  assign count = tmp_6[3:0];



  assign ce_out = clk_enable;

endmodule  // counter_fixpt

自己编写一个testbench在Modelsim上进行仿真,发现结果是可靠的,reset置0, rst置1, clk_enable置1 时可用,clk_1为1时加,为0时减。

`timescale 1 ps/ 1 ps
module counter_fixpt_tb();
// constants                                           
// general purpose registers
reg eachvec;
// test vector input registers
reg clk;
reg clk_1;
reg clk_enable;
reg reset;
reg rst;
// wires                                               
wire ce_out;
wire [3:0]  count;

parameter clk_period = 10;

// assign statements (if any)                          
counter_fixpt i1 (
// port map - connection between master ports and signals/registers   
	.ce_out(ce_out),
	.clk(clk),
	.clk_1(clk_1),
	.clk_enable(clk_enable),
	.count(count),
	.reset(reset),
	.rst(rst)
);
// reset置0, rst置1, clk_enable置1 时可用,clk_1为1时加,为0时减

initial  
    clk = 0;  
always #(clk_period/2) clk = ~clk;  // 时钟

initial begin
    reset = 1;
	# 10 reset = 0;
end  // 使能

initial begin
    rst = 0;
	# 10 rst = 1;
end  // 使能

initial begin
    clk_enable = 0;
	# 10 clk_enable = 1;
end  // 使能

initial clk_1 = 0;
always #(clk_period) clk_1 = {$random} % 2; //clk_1为随机的0或1
                                            
endmodule

matlab转verilog,matlab,fpga开发,开发语言,fpga
这里与自己编写同样功能的计数器效果进行对比,自己写的verilog代码就简单易懂了许多,同样编写testbench仿真结果一致。

module counter(
    input clk,
    input rst,
    input add_sub,  // 0 for subtract, 1 for add
    output reg [3:0] count
);

always @(posedge clk or negedge rst) begin
    if (rst == 0) begin
        count <= 4'b0000;  // Reset the counter to 0
    end else if (add_sub) begin
        if (count == 4'b1111) begin
            count <= 4'b0000;  // Wrap around to 0 if max value reached
        end else begin
            count <= count + 1;  // Increment the counter
        end
    end else begin
        if (count == 4'b0000) begin
            count <= 4'b1111;  // Wrap around to max value if 0 reached
        end else begin
            count <= count - 1;  // Decrement the counter
        end
    end
end

endmodule

matlab转verilog,matlab,fpga开发,开发语言,fpga
尽管仿真显示二者的功能一致,但从代码来看区别还是很大的,用QuartusII对.v文件进行编译再生成RTL电路图,可以更加直观地发现区别,前者明显更繁琐且消耗资源更多。若是在面向具体项目的实际设计中,或者在更加负责的系统或算法的设计中,HDL Coder生成的代码便可能不合适。
matlab转verilog,matlab,fpga开发,开发语言,fpga
matlab转verilog,matlab,fpga开发,开发语言,fpga文章来源地址https://www.toymoban.com/news/detail-739975.html

到了这里,关于MATLAB生成Verilog代码——HDL Coder使用初探的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 随机生成矩阵,在0~10之间,matlab代码

    你可以使用 rand 函数来随机生成矩阵。rand 函数会生成一个指定行列数的矩阵,里面的数字都在 0 到 1 之间。例如,下面的代码会生成一个 3 行 4 列的矩阵: 如果你想要生成 0 到 10 之间的随机数,你可以将 rand 函数和数学运算符结合使用。例如,下面的代码会生成一个 3 行

    2024年02月13日
    浏览(41)
  • 【MIMO】两种空间相关信道生成方式的记录(公式+MATLAB代码)

    关于MIMO空间相关信道的生成,《MIMO-OFDM wireless communications with MATLAB》中给出了“complex correlation”和“power (field) correlation”两种方式(P89),之前就没有理解两者的区别。 今天在进行5G NR空间相关信道仿真时又遇到了这一问题,这里进行记录和讨论。 5G NR空间相关信道仿真

    2023年04月08日
    浏览(41)
  • MATLAB将二维数据生成一维是按列排序,矩阵操作笔记,附代码

    matlab和Fortran二维数组按列优先存储 学习一定要敢想敢做!

    2024年02月07日
    浏览(42)
  • 如何使用MATLAB生成随机矩阵

    如何使用MATLAB生成随机矩阵 MATLAB是一种强大的数值计算和科学编程软件,它提供了许多功能强大的工具来生成和处理矩阵。在MATLAB中,要生成随机矩阵,可以使用内置的随机数函数。本文将向您展示如何使用MATLAB生成随机矩阵,并提供相应的源代码示例。 使用rand函数生成随

    2024年02月08日
    浏览(48)
  • 简单使用_matlab生成数据帧

    代码如下,代码很简单,有几点要注意, 较高版本的MATLAB中支持0x的写法 使用bitand进行位运算 使用strcat函数进行字符串拼接时,如果需要插入空格,要使用双引号

    2024年02月10日
    浏览(33)
  • 【场景生成与削减】基于蒙特卡洛法场景生成及启发式同步回带削减风电、光伏、负荷研究(Matlab代码实现)

      💥💥💞💞 欢迎来到本博客 ❤️❤️💥💥 🏆博主优势: 🌞🌞🌞 博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️ 座右铭: 行百里者,半于九十。 📋📋📋 本文目录如下: 🎁🎁🎁 目录 💥1 概述 📚2 运行结果 🎉3 参考文献 🌈4 Matlab代码实现 相关知

    2023年04月19日
    浏览(43)
  • 使用MATLAB生成任何需要的伪随机码(PN码)

    目录 一. 引言 二. 用matlab生成伪随机序列                 伪随机码(PN码),只包含0和1,是一种人为随机创造的随机序列。应用范围广,通信中经常使用到,比如伪码测距等。为了验证所给的生成函数是否正确,经常需要使用matlab仿真查看所生成的随机序列。         下

    2024年02月11日
    浏览(51)
  • 鲁棒优化入门(4)-两阶段鲁棒优化及行列生成算法(C&CG)超详细讲解(附matlab代码)

            本文的主要参考文献: Zeng B , Zhao L . Solving Two-stage Robust Optimization Problems by A Constraint-and-Column Generation Method[J]. Operations Research Letters, 2013, 41(5):457-461.         鲁棒优化是应对数据不确定性的一种优化方法,但单阶段鲁棒优化过于保守。为了解决这一问题,引入

    2024年02月12日
    浏览(45)
  • matlab中zeros函数的使用方法详细介绍(附matlab代码)

    X = zeros (返回标量 0) X = zeros(n) (返回一个 n×n 的全零矩阵) X = zeros(sz1,…,szN) (返回由零组成的 sz1×…×szN 数组,其中 sz1,…,szN 指示每个维度的大小。例如,zeros(2,3) 将返回一个 2×3 矩阵) X = zeros(sz) (返回一个由零组成的数组,其中大小向量 sz 定义 size(X)。例如,zero

    2023年04月08日
    浏览(88)
  • 【安全密钥交换协议】基尔霍夫定律-约翰逊噪声(KLJN)方案的随机数生成器攻击研究(Matlab代码实现)

     💥💥💞💞 欢迎来到本博客 ❤️❤️💥💥 🏆博主优势: 🌞🌞🌞 博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️ 座右铭: 行百里者,半于九十。 📋📋📋 本文目录如下: 🎁🎁🎁 目录 💥1 概述 📚2 运行结果 2.1 算例1 2.2 算例2  2.3 算例3 🎉3 参考文

    2024年02月04日
    浏览(56)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包