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

news2024/12/27 8:36:30

目录

  • 一、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设计及仿真

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.coloradmin.cn/o/2251975.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C语言】扫雷游戏(一)

我们先设计一个简单的9*9棋盘并有10个雷的扫雷游戏。 1,可以用数组存放,如果有雷就用1表示,没雷就用0表示。 2,排查(2,5)这个坐标时,我们访问周围的⼀圈8个位置黄色统计周围雷的个数是1。排查(8,6)这个坐标时&#xf…

实现点名神器的pyqt6实现

利用python gui创建点名神器,包含加分、导出加分记录、清除加分记录。 点名页面 首先导入学生信息 导入成功 开始点名 点击停止 点过之后,点击加分 加完分 查看加分记录 可以直接进入导出记录和清除历史。 此文到此结束,想要源码的请私聊我&a…

【UE5 C++】判断两点连线是否穿过球体

目录 前言 原理 代码 测试 结果 前言 通过数学原理判断空间中任意两点的连线是否穿过球体,再通过射线检测检验算法的正确性。 原理 (1)设球体球心的坐标为 ,半径为r; (2)设线段中A点的坐…

【AI】数据,算力,算法和应用(3)

三、算法 算法这个词,我们都不陌生。 从接触计算机,就知道有“算法”这样一个神秘的名词存在。象征着专业、权威、神秘、高难等等。 算法是一组有序的解决问题的规则和指令,用于解决特定问题的一系列步骤。算法可以被看作是解决问题的方法…

计算机的错误计算(一百七十一)

摘要 探讨 MATLAB 中秦九韶(Horner)多项式的错误计算。 例1. 用秦九韶(Horner)算法计算(一百零七)例1中多项式 直接贴图吧: 这样,MATLAB 给出的仍然是错误结果,因为准…

Ubuntu20.04运行R-VIO2

目录 1.环境配置2.构建项目3. 运行 VIO 模式4.结果图 1.环境配置 CMakeLists.txt中 C 使用 14、opencv使用4 2.构建项目 克隆代码库: 在终端中执行以下命令克隆项目:git clone https://github.com/rpng/R-VIO2.git编译项目: 使用 catkin_m…

【Maven系列】深入解析 Maven 常用命令

前言 在当今的软件开发过程中,项目管理是至关重要的一环。项目管理包括了项目构建、依赖管理以及发布部署等诸多方面。而在Java生态系统中,Maven已经成为了最受欢迎的项目管理工具之一。Maven 是一套用于构建、依赖管理和项目管理的工具,主要…

深度学习的python基础(1)

一.tensor创建 1.张量的定义 张量在形式上就是多维数组,例如标量就是0维张量,向量就是一维张量,矩阵就是二维张量,而三维张量就可以想象RGB图片,每个channel是一个二维的矩阵,共有三个channel&#xff0…

【Python爬虫实战】轻量级爬虫利器:DrissionPage之SessionPage与WebPage模块详解

🌈个人主页:易辰君-CSDN博客 🔥 系列专栏:https://blog.csdn.net/2401_86688088/category_12797772.html ​ 目录 前言 一、SessionPage (一)SessionPage 模块的基本功能 (二)基本使…

Linux——自定义简单shell

shell 自定义shell目标普通命令和内建命令(补充) shell实现实现原理实现代码 自定义shell 目标 能处理普通命令能处理内建命令要能帮助我们理解内建命令/本地变量/环境变量这些概念理解shell的运行 普通命令和内建命令(补充) …

Vue进阶之单组件开发与组件通信

书接上篇,我们了解了如何快速创建一个脚手架,现在我们来学习如何基于vite创建属于自己的脚手架。在创建一个新的组件时,要在新建文件夹中打开终端创建一个基本的脚手架,可在脚手架中原有的文件中修改或在相应路径重新创建&#xf…

Webman中实现定时任务

文章目录 Webman中实现定时任务一、引言二、安装与配置1、安装Crontab组件2、创建进程文件3、配置进程文件随Webman启动4、重启Webman5、Cron表达式(补充)例子 三、使用示例四、总结 Webman中实现定时任务 一、引言 在现代的后端开发中,定时…

Android笔记(三十四):封装带省略号图标结尾的TextView

背景 项目需求需要实现在文本末尾显示一个icon,如果文本很长时则在省略号后面显示icon,使用TextView自带的drawableEnd可以实现,但是如果文本换行了则会显示在TextView垂直居中的位置,不满足要求,于是有了本篇的自定义…

多线程篇-8--线程安全(死锁,常用保障安全的方法,安全容器,原子类,Fork/Join框架等)

1、线程安全和不安全定义 (1)、线程安全 线程安全是指一个类或方法在被多个线程访问的情况下可以正确得到结果,不会出现数据不一致或其他错误行为。 线程安全的条件 1、原子性(Atomicity) 多个操作要么全部完成&a…

Day1 生信新手笔记

生信新手笔记 生信学习第一天笔记打卡。 转录组学中: 上游分析-基于linux,包括质控、过滤、比对、定量; 下游分析-基于R语言,包括差异分析、富集分析、可视化。 1. 级别标题 一个井号加空格 就是一级标题,两个井号加…

Git远程仓库操作

文章目录 远程仓库连接Gitee克隆代码 多人协同问题说明 🏡作者主页:点击! 🤖Git专栏:点击! ⏰️创作时间:2024年12月1日13点10分 远程仓库 Git 是分布式版本控制系统,同一个 Git …

virtualbox给Ubuntu22创建共享文件夹

1.在windows上的操作,创建共享文件夹Share 2.Ubuntu22上的操作,创建共享文件夹LinuxShare 3.在virtualbox虚拟机设置里,设置共享文件夹 共享文件夹路径:选择Windows系统中你需要共享的文件夹 共享文件夹名称:挂载至wi…

人工智能-深度学习-BP算法

BP算法的核心思想是通过计算损失函数对网络参数的梯度,然后使用梯度下降法来更新网络参数,从而最小化损失函数。 误差反向传播算法(BP)的基本步骤: 前向传播:正向计算得到预测值。 计算损失:通过损失函数计算预测值和真实值的差…

(免费送源码)计算机毕业设计原创定制:Apache+JSP+Ajax+Springboot+MySQL Springboot自习室在线预约系统

摘 要 远程预约是一种全新的网络租用方式,它通过互联网突破了时间和空间限制,实现了便捷快速的预约与管理功能。在对数据信息有效组织并整合了一定使用功能后,远程预约系统可以方便地实现预约与取消,以及信息查询等功能。经过本人…

【51单片机】程序实验910.直流电机-步进电机

主要参考学习资料:B站【普中官方】51单片机手把手教学视频 前置知识:C语言 单片机套装:普中STC51单片机开发板A4标准版套餐7 码字不易,求点赞收藏加关注(•ω•̥) 有问题欢迎评论区讨论~ 目录 程序实验9&10.直流电机-步进电机…