Matlab Simulink HDL Coder FPGA开发初体验—计数器

server/2024/12/2 18:49:59/

目录

  • 一、Simulink设计及仿真
  • 二、Verilog HDL代码转换
    • 1、参数配置
    • 2、HDL代码生成
  • 三、ModelSim仿真分析
    • 1、使用自己编写的Testbench文件进行仿真
    • 2、使用HDL Coder生成的Testbench文件进行仿真

前言

Simulink HDL Coder‌是一款将Simulink和Stateflow模型转化为可综合的Verilog和VHDL代码的工具。它支持FPGA、ASIC和SoC的高层设计,确保生成的代码与原模型保持一致,并且支持多种优化选项,如速度和面积优化、关键路径突出显示以及资源利用率估计‌。

主要功能:

  • ‌代码生成‌:Simulink HDL Coder可以将Simulink模型和Stateflow框图生成可综合的Verilog和VHDL代码,确保与原模型的一致性‌。
  • ‌优化选项‌:用户可以选择多种优化选项,如速度优化、面积优化等,突出显示关键路径,并在综合之前生成资源利用率估计值‌。
  • ‌代码验证‌:支持对生成的HDL代码进行功能验证,确保代码的正确性。此外,还可以生成仿真和综合脚本文件,方便用户进一步验证和调试‌。

Simulink HDL Coder广泛应用于各种需要FPGA、ASIC和SoC设计的应用场景。例如:

  • ‌数字信号处理‌:在通信、雷达和音频处理等领域,Simulink HDL Coder可以帮助设计高效的数字信号处理算法。
  • ‌控制系统‌:在工业自动化、航空航天等领域,可以用于设计复杂的控制系统。
  • ‌图像处理‌:在视频处理和图像识别等应用中,可以生成高效的图像处理算法。

开发环境和集成工具:
Simulink HDL Coder可以与MATLAB、Simulink和Stateflow紧密集成,提供从模型设计到代码生成再到验证的完整流程。

使用 MATLAB和 Simulink开发原型和生产应用程序,以部署在 FPGA、ASIC 和 SoC 设备上。借助 MATLAB 和 Simulink,您可以:

  • 在高度抽象级别对数字、模拟和软件进行建模和仿真。
  • 使用自动向导进行定点转换,或者为任意目标设备生成本机浮点运算。
  • 通过内存、总线和 I/O 建模对硬件和软件架构进行分析。
  • 生成经过优化、可读且可跟踪的 VHDL、Verilog®或 SystemVerilog,用于在数字逻辑中实现。
  • 生成针对处理器优化的 C/C++ 代码,以部署到嵌入式处理器。
  • 对连接到 MATLAB 或 Simulink 测试平台的 HDL 仿真器或 FPGA 或 SoC 设备上运行的算法进行验证。

基本的HDL代码生成工作流如下:
在这里插入图片描述

Simulink_30">一、Simulink设计及仿真

1、打开Matlab Simulink
在这里插入图片描述
Simulink首页里面有很多关于HDL Coder的示例:
在这里插入图片描述
2、选择Blank DUT创建一个空的模板,如下所示:
在这里插入图片描述
关于Simulink内部的各种功能控件的使用方法后续再更新。

3、系统设计

这里我在空白的模板内部更改并添加了一些新的组件,中间绿色的子系统模块就是将要转换成HDL代码的模块,用来实现从0-10的计数器,并判断当计数值大于等于5时,子系统输出1’b1,否则输出1’b0。如下图所示:
在这里插入图片描述
双击子系统模块可以进入内部查看详细设计,其中Out1输出端口是为了观察计数器的仿真,后续综合为HDL代码时需要去掉:
在这里插入图片描述
设计完成后点击保存。

4、系统功能仿真

在仿真标签页中选择Run Simulation运行仿真,可以设置仿真的时间:
在这里插入图片描述
从仿真示波器中可以看到当计数值大于等于5时,模块输出高电平,否则输出低电平,功能验证没有问题:
在这里插入图片描述
最终将要参与综合的设计如下:
在这里插入图片描述
在这里插入图片描述

二、Verilog HDL代码转换

1、参数配置

(1)选择菜单栏APP,选择HDL Coder:
在这里插入图片描述
(2)选择Settings>HDL Code Generation Settings,不同版本的Matlab该设置位置可能不一致
在这里插入图片描述
(3)点击Solver,将Solver selection_Type改为Fixed-step,其余默认,点击Apply应用:
在这里插入图片描述
(4)点击Hardware Implementation,将Device vendor设置为ASIC/FPGA,其余默认,点击Apply应用:
在这里插入图片描述
(5)点击Target,设置芯片型号及时钟频率,其余保持默认,点击Apply:
在这里插入图片描述
(6)点击Global Settings,将复位电平设置为低电平有效,其余保持默认,点击Apply:
在这里插入图片描述
(7)关联Vivado软件进行联合编译

在Matlab命令窗口输入命令:

hdlsetuptoolpath ('ToolName','…','ToolPath','…')

在这里插入图片描述

2、HDL代码生成

(1)选择HDL Code Advisor自动检查设计中的错误
在这里插入图片描述
在这里插入图片描述
检查没问题进入下一步。

(2)选中要转换的子系统点击右键,选择HDL Code>HDL Workflow Advisor
在这里插入图片描述
弹出如下窗口:
在这里插入图片描述
(3)点击Set Target确认设置的目标器件型号以及时钟频率准确无误,在1、(5)的步骤中的设置会自动填充到下图中
在这里插入图片描述
右键点击Set Target,点击Run All完成该部分设置:
在这里插入图片描述
运行完成后会显示绿色√

(4)同理右键点击Prepare Model For HDL Code Generation,点击Run All完成该部分设置:
在这里插入图片描述
(5)选择HDL Code Generation>3.2 Generate RTL Code and Testbench,勾选Generate RTL Code与Generate Testbench选项,然后点击Apply
在这里插入图片描述
随后同上选中HDL Code Generation,点击Run All完成此部分设置:
在这里插入图片描述
(6)最后右键点击FPGA Synthesis and Analysis,选择Run All,生成最后的文件以及Vivado工程
在这里插入图片描述
最后会弹出代码生成报告:
在这里插入图片描述
最后生成有两个目录:
在这里插入图片描述
可以打开生成的counter.v文件看看:
在这里插入图片描述
生成的Testbench文件:
在这里插入图片描述

三、ModelSim仿真分析

下面用自己编写的Testbench文件和使用HDL Coder生成的Testbench文件进行仿真对比:

1、使用自己编写的Testbench文件进行仿真

打开自动生成的Vivado工程
在这里插入图片描述
将自己写的Testbench文件添加到工程
在这里插入图片描述
然后运行仿真,这里我用的是Vivado和ModelSim的联合仿真:
在这里插入图片描述
在这里插入图片描述

2、使用HDL Coder生成的Testbench文件进行仿真

打开Modelsim仿真工具,将工作区目录切换到HDL Coder生成的仿真文件所在文件夹下:
在这里插入图片描述
在这里插入图片描述
HDL Coder生成的仿真文件所在文件夹下有两个文件:

  • xxx_tb_compile.do:ModelSim编译脚本(vcom命令)。该脚本编译并加载要测试的实体和Testbench代码。
  • xxx_tb_sim.do:ModelSim脚本初始化模拟器,设置波窗口信号显示,并运行仿真。

在这里插入图片描述
首先在ModelSim Transcript窗口运行 xxx_tb_compile.do文件:
在这里插入图片描述
然后运行xxx_tb_sim.do文件:
在这里插入图片描述
查看仿真波形:
在这里插入图片描述
可以看出仿真基本没问题,和我们自己写的仿真文件结果基本一致,后续就可以自己上板调试抓取波形看看,上板是否和仿真基本一致。

建议:如果要将Simulink生成的Verilog代码上板验证的话建议重新创建一个Vivado工程,直接使用Simulink生成的Vivado工程的话可能会出问题。


http://www.ppmy.cn/server/146804.html

相关文章

从开机到 Linux 内核执行的完整过程:深入解析

在嵌入式开发、操作系统学习和调试中,理解从硬件上电到内核执行的整个启动过程至关重要。本文将详细梳理这一过程,从设备开机的第一刻到 Linux 内核代码的执行,帮助你理解各个阶段的细节,以及每个环节所涉及的技术组件。 1. 开机至…

前端js面试知识点思维导图(脑图)

如果看着不清晰可以去https://download.csdn.net/download/m0_73761441/90058523访问下载,无需积分 使用百度脑图制作,可以一键导入下面的文本生成自己的脑图 js相关面试题、知识点 数据类型 1. 数据类型分类?分别包含&#xff…

http的文件上传和下载原理

目录 一:上传 1:http请求格式 2:文件上传类型分析 1:md5秒传 2:分片上传 1. 什么是分片上传 2. 分片上传的场景 3:断点续传 1. 什么是断点续传 2. 应用场景 3. 实现断点续传的核心逻辑 4. 实现流…

uniapp实现小程序的版本更新

参考官方文档:uni.getUpdateManager() | uni-app官网 uni.getUpdateManager()是uniapp框架提供的一个API,用于管理小程序的版本更新。这个API返回一个全局唯一的版本更新管理器对象,该对象可以用于检测新版本、下载新版本以及提示用户重启应…

VC++网络安全编程范例(12)-PKI编程

PKI(Public Key Infrastructure ) 即"公钥基础设施",是一种遵循既定标准的密钥管理平台,它能够为所有网络应用提供加密和数字签名等密码服务及所必需的密钥和证书管理体系,简单来说,PKI就是利用公钥理论和技…

试题转excel;试题整理;试卷转Excel,word试题转excel

一、问题描述 我父亲是一名教师,偶尔会需要整理一些高质量的题目到excel中 以往都是手动复制搬运,几百道题几乎需要一个下午的时间 关键这些事,枯燥无聊费眼睛,实在是看起来就很蠢的工作 就想着做一个工具,可以自动…

【vue】响应式(object.defineProperty)、可配置的参数、vue渲染机制

Vue 2的响应式原理主要是基于Object.defineProperty来实现的。 数据劫持 当一个Vue实例被创建时,它会遍历data选项中的所有属性。对于每个属性,使用Object.defineProperty来进行数据劫持。这个方法允许精确地定义一个对象的属性,包括属性的值…

Linux驱动开发第3步_INPUT子系统框架下的外部中断

1、了解WKUP唤醒引脚 1)、打开STM32MP157数据手册,搜索“WKUP”,见下表: 由表可知,PA0,PA2,PC13,PI8,PI11和PC1均具有唤醒功能。 2)、打开STM32MP157参考手册,了解GIC中…