【FPGA-DSP】第七期:Mcode调用

news2025/1/16 14:01:51

目录

1. 有限状态机设计

1.1 FSM代码编写

1.2 输入序列代码编写

1.3. mcode概念

2. Simulink 

2.1. 输入部分

2.2. Mcode模块

2.3. 完整模块

总结 


参考博客【R1】,参考视频资料【R2】

设计中经常用到一些控制逻辑,如有限状态机(FSM),如果用各种block搭建一个FSM比较麻烦。System Generator支持调用MATLAB代码,通常可以编写MATLAB代码来实现FSM等控制逻辑,通过MCode block调用到System Generator设计中。

本文将使用MATLAB代码设计一个FSM,对“1010”这个序列进行检测。序列检测应该是很多Verilog/VHDL学习者在学习FSM时接触到的一个简单设计。本文将以该设计在System Generator中的实现为主题,介绍MCode的使用。
 

1. 有限状态机设计

1.1 FSM代码编写

FPGA相关知识点14——有限状态机FSM设计 - 哔哩哔哩 (bilibili.com)icon-default.png?t=N2N8https://www.bilibili.com/read/cv7207512?spm_id_from=333.999.0.0其实,我们在写if/else语句和switch/case语句的时候,就是在跟状态机打交道。如果可以把整个系统模型抽象成一个有限状态机,那么代码就会逻辑特别清晰,结构特别规整。

序列检查状态机设计:
这是一个非常常见的状态机应用,本次设计用来检测序列“1010”

本人设计流程如下:

1.    确定有效状态:

本次需要检测序列“1010”,那么就应该会出现5个有效状态,为:

“初始状态”  ->  “检测到1”  ->  “检测到10”  ->  “检测到101”  ->  “检测到1010”

那么状态变量需要的数据宽度就是3,此时最多能表示8个状态。

我们的有效状态只有5个,剩下的都归为异常状态。  

状态机如下:

对着图写程序,把每一个状态变化的情况编写出来。使用到的语法就是switch/case语法。

% mcode只能调用function函数文件
function Match = state_machine_1010(Din)

% 在mcode文件中,状态变量state需要由下式定义
persistent state, state = xl_state(0,{xlUnsigned, 3, 0});

switch state
    case 0
        if Din == true %表示输入为1(1真,0假)布尔型输入
            state = 1;
        else
            state = 0;
        end
        Match = 0; %每一个状态都要有一个输出,因为FPGA是并行运算的
    case 1
        if Din == true
            state = 1;
        else
            state = 2;
        end
        Match = 0;
    case 2 
        if Din == true
            state = 3;
        else 
            state = 0;
        end
        Match = 0;
    case 3
        if Din == true
            state = 1;
        else 
            state = 4;
        end
        Match = 0;
    case 4
        if Din == true
            state = 3;
        else
            state = 0;
        end
        Match = 1;

%要注意的是,异常状态也是要设计的,一般会让它们回归到状态0 
    otherwise
        state = 0;
        Match = 0;
end

在MATLAB中,persistent变量是函数中的局部变量,它在函数调用之间保留其值。当MATLAB首次遇到特定的persistent语句时,它将persistent变量初始化为空矩阵([])。当您清除或修改内存中的函数时,MATLAB会清除persistent变量。要保留函数在内存中,请使用mlock。

在我的例子中,xl_state是一个persistent变量,它被初始化为0,并且在每次调用函数时保留其值。{xlUnsigned, 3, 0}是一个单元阵列,其中xlUnsigned代表数据类型是无符号的定点数;3代表数据的位宽,因为代码中的state需要达到4,所以至少要3bit的位宽;0代表的是二进制点的位置,该部分代码不需要有小数,所以直接设置为0。

注意,因为本文与FPGA视频“Mcode调用流程”相关联,因此这里是用matlab编写的程序。如果是Verilog语言会有些不同。同时matlab中的状态机功能会受到限制,不能使用matlab所有功能函数,如FFT等就不能放在状态机中

1.2 输入序列代码编写

我们也需要在matlab写出输入序列的代码

%% 系统参数
seq = {0,0,0,1,1,0,1,0,1,0,1,1,1,0,1,0};
N = length(seq);
vi = seq;

match = zeros(1,N);
for n = 1:N
    match(n) = state_machine_1010(seq(n)); %调用FSM,将每一位信号按顺序输入有限状态机
end

1.3. mcode概念

MCode用于在Simulink环境下执行MATLAB函数,经常用于实现一些简单的算法功能、有限状态机和控制逻辑。

基本规则:

  • 所有的输入和输出必须是Xilinx的定点数据类型(xfix);
  • 至少包含一个输出;
  • M文件应在MATLAB的搜索路径下,或与slx模型文件在同一目录。

*建议先设计好.m文件,再使用Mcode模块。 

支持的语法:
Mcode只支持一些在Verilog中也轻易实现的matlab代码,包括:

  • 赋值(等号左边只能有一个变量);
  • if/else/elseif end语法(条件表达式必须是判断true/false或1/0);
  • switch语法(case只能选择常量)、for语法;
  • 加法、减法、乘法、除法(除数必须是2的N次幂,因为可以转换为移位),除此之外,不支持其它算术表达式
  • 关系运算符(<、<=、>、>=、==、~=)
  • 逻辑运算符(&、|、~) 

三种数据类型:
无符号定点数(xlUnsigned)、带符号定点数(xlSigned)、布尔值(xlBoolean)。

如果在编写matlab时使用到了浮点型,需要手动转化为定点型,如,将浮点数π转换为xfix类型的matlab代码如下:

x = xfix({xlSigned, 20, 16, xlRound, xlWrap}, 3.1415926);

转换后为Fix_20_16格式,Round量化,Wrap溢出

非常需要注意的是:
Matlab代码是一种顺序执行的程序,但我们FPGA最大的特点就是并行工作。所以我们在设计matlab程序的时候一定要考虑到这一点。具体来讲,那就是要保证所有变量在运行的过程中都能得到确定的值。比如说,当我们用matlab设计了一个if else语句时,如果有一些情况你没有考虑进去,没有确定该情况下的赋值结果。那么,那些本来在顺序执行时下不会出现的情况,在并行运行时一定会冒出来,而这些情况得到的结果就都是错误的了。

2. Simulink 

2.1. 输入部分

计数器ROM

 

2.2. Mcode模块

 

2.3. 完整模块

仿真结果如下 

总结

在System Generator中,Black Box和M-Code都是用于将HDL文件导入进行设计的工具。Black Box是一种可重用的模块,它可以将HDL文件导入到System Generator中进行设计。Black Box可以使用Vivado Simulator或外部协同仿真器进行仿真。Black Box的优点是可以快速地将HDL文件导入到System Generator中进行设计,而不需要手动创建模块。但是,Black Box的缺点是它不能提供与HDL文件相同的灵活性和控制。

相比之下,M-Code可以提供更高的灵活性和控制。M-Code允许用户使用MATLAB语言编写自定义代码,并将其与System Generator模块集成在一起。M-Code的优点是可以提供更高的灵活性和控制,因为用户可以使用MATLAB语言编写自定义代码。但是,M-Code的缺点是需要更多的时间和精力来编写和调试代码。首先,M-Code需要更多的时间和精力来编写和调试代码。其次,M-Code的性能可能会受到影响,因为它需要调用MATLAB引擎来执行代码。此外,M-Code可能会受到System Generator的限制,例如,它可能无法访问System Generator中的所有变量和对象。

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/443672.html

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

相关文章

语音特征参数MFCC提取过程详解

一、MFCC概述 在语音识别&#xff08;SpeechRecognition&#xff09;和话者识别&#xff08;SpeakerRecognition&#xff09;方面&#xff0c;最常用到的语音特征就是梅尔倒谱系数&#xff08;Mel-scaleFrequency Cepstral Coefficients&#xff0c;简称MFCC&#xff09;。根据…

IntelliJ IDEA全新发布v2023.1——全面增强UI体验和性能!

IntelliJ IDEA&#xff0c;是java编程语言开发的集成环境。IntelliJ在业界被公认为最好的java开发工具&#xff0c;尤其在智能代码助手、代码自动提示、重构、JavaEE支持、各类版本工具(git、svn等)、JUnit、CVS整合、代码分析、 创新的GUI设计等方面的功能可以说是超常的。 I…

javaSwingrsa和aes混合加密文件传输系统

RSA和AES加密混合文件传输系统 环境要求&#xff1a; 1、java1.8 2、socket 3、mysql 4、io流 5、swing 登录界面 客户端登录&#xff1a; 1.用户注册的账号保存到数据库中&#xff0c;用户的密码经过md5后保存到数据库中。 2.用户输入正确的账号和密码可以进入 “ …

Gulp 打包压缩 js 文件到指定目录详细流程(修改文件名与后缀)

主篇 前端 Gulp 详细介绍与案例使用。 打包 index.js 测试内容 js 包内容文件&#xff1a; // 测试属性 export const dzmName dzm export const dzmAge 18// 测试方法 export function dzmFunc (name, age) {return 名字&#xff1a;${name}&#xff0c;年龄&#xff1a;${…

Chat的提问工程师,要上线了你慌不慌?

一、什么是Prompt? (1)Prompt的概念 我们在使用GPT的时候,给GPT发送的消息就是Prompt. 例如,当我们问ChatGPT"WPS是什么软件?"时: 其中,"WPS是什么软件?"这句话就是Prompt. (2)为什么要学习Prompt? Prompt是我们和GPT交流的方式,我们需要让GPT了解…

微信小程序从零开始经验贴(含详细资料及链接)

背景: 从事微信小程序开发近3年&#xff0c;现在几乎能独当一面&#xff0c;对后台程序也有一定研究。      我学习的基础是c编程经验&#xff0c;对前端、后端没有太多涉及。微信小程序相关资料都是自己找的&#xff0c;然后在项目中看别人的代码&#xff0c;摸着石头过河…

什么是单例模式?

文章目录 01 | 什么是单例模式&#xff1f;02 | 实现懒汉式饿汉式 03 | 总结 每一次实验课都要把上一节课的实验报告打印出来&#xff0c;交作业&#xff0c;这个时候的打印店总是很多人&#xff0c;这时候打印机就那么几台&#xff0c;粥少僧多的情况下&#xff0c;打印机怎么…

动态路由的原理与配置

一.动态路由介绍 1.动态路由选择 指路由器使用路由选择协议来获悉网络并更新路由选择表。 2.路由协议分类 3.管理距离介绍 管理距离&#xff08;AD&#xff09;用于判断从邻接路由器收到的路由选择信息的可信度&#xff0c;它是 0-255的整数&#xff0c;0 表示可信度最大&#…

Android9 Settings源码导入Android Studio查看并调试

Android9 Settings源码导入Android Studio查看并调试 本次调试在已编译的工程下 1. 导入packages/app/settings 不要直接导入这个模块&#xff0c;导入上一级app目录 在选择时选择Settings相关所有目录&#xff0c;如下 如下这里的sdk配置是我已经添加的&#xff0c;后面可…

用了这几个方法,Facebook广告转化真上去了!

随着全球电商市值的猛涨&#xff0c;Facebook广告的价值再次被放大。然而&#xff0c;在Facebook上的广告资源竞争日益激烈的情况下&#xff0c;即使你有最好的广告策略和投放预算&#xff0c;如果你的广告创意不能吸引潜在客户的注意&#xff0c;那么你的广告投放也可能失败。…

at单一次任务,crontab周期性任务 rhce(21)

目录 1.atd和crond两个任务管理程序的区别 2.指定在2023/08/26 09:00将时间写入testmail.txt文件中 3.指定在每天凌晨4:00将该时间点之前的系统日志信息备份到个目录下&#xff08;/var/log/messages&#xff09;&#xff0c;备份后日志文件名显示格式logfileYY-MM-DD HH-MM…

08-java之io流基础

io流学习流程 说白了&#xff0c;本节的目的就是对 文件增删改查&#xff0c;先说一下学习顺序吧 定位文件 File类可以定位文件&#xff1a;可以进行删除文件内容&#xff0c;读取文件本身信息等操作&#xff0c;但是不能读写文件内容 字符集 想要读取文件中的数据&#xff0…

Nginx+Tomcat负载均衡、动静分离

1.Tomcat多实例部署 Tomcat的多实例部署简单的讲就是基于端口的虚拟主机设置 步骤一&#xff1a;安装jdk (1&#xff09;关闭防火墙和selinux&#xff0c;防止其对安装过程的干扰 &#xff08;2&#xff09;将准备好的软件包拖入/opt目录下&#xff0c;进行安装 #某rpm包尚未…

【HCIP】BGP实验(联邦,路由反射器,手工汇总)

目录 需求&#xff1a; Ⅰ、IP规划 Ⅱ、配置IP与做通IGP(用的ospf) Ⅲ、开启BGP协议 Ⅳ、AS1、AS3的10...环回互相通讯 Ⅴ、对路由表进行汇总 Ⅵ、回望需求 需求&#xff1a; 1.AS1存在两个环回&#xff0c;一个地址为192.168.1.0/24该地址不能在任何协议中宣告 AS3存在两…

马斯克的Starship,除了“大”还有什么呢?

‍数据智能产业创新服务媒体 ——聚焦数智 改变商业 种种迹象表明&#xff0c;由ChatGPT引发的算力军备竞赛已经悄然而至了。 终于&#xff0c;到了检验人类最大火箭发射的时候了。 2023年4月17日&#xff0c;SpaceX将其大型深空火箭Starship发射升空&#xff0c;发射地点为Sp…

CANoe使用记录(三):CANoe发送报文设置

目录 1、概述 2、报文发送 2.1、interactive generators&#xff08;交互生成器&#xff09; 2.2、重命名发送报文 2.3、增加报文 2.4、触发方式 2.5、从DBC导入报文 2.6、设置信号值 1、概述 很大一部分时候&#xff0c;在控制零部件时候&#xff0c;需要发送报文到下…

辉煌优配|军工板块逆市上涨,16只概念股已披露一季度业绩预喜

今日&#xff0c;军工股逆市上涨。 4月21日&#xff0c;A股三大股指低开低走&#xff0c;半导体、AI使用、信创工业、软件等科技属性概念领跌&#xff0c;国防军工、食品饮料和电力设备等板块上涨。 工业互联网中心工业规模超1.2万亿元 据央视新闻报道&#xff0c;本年是《工业…

玩转ChatGPT:论文翻译润色

一、写在前面 首先还是让小Chat推销下自己&#xff1a; 嘿&#xff01;你是否在写论文的过程中感到头疼&#xff0c;无从下手&#xff1f;你是否在担心自己的语言表达不够专业、不够流畅&#xff0c;影响了论文的质量&#xff1f;不要担心&#xff0c;ChatGPT的润色服务可以帮…

JavaScript的基础语法学习

文章目录 一、JavaScript let 和 const二、JavaScript JSON三、javascript:void(0) 含义四、JavaScript 异步编程总结 一、JavaScript let 和 const let 声明的变量只在 let 命令所在的代码块内有效。 const 声明一个只读的常量&#xff0c;一旦声明&#xff0c;常量的值就不…

React Native 组件基础

基于组件的架构模式&#xff0c;或许是现在重展示、重交互应用的最好选择 拆组件要准守一个原则&#xff0c;单一责任原则。 这也是 React 官方倡导的原则&#xff0c;这个原则的意思是每个组件都应该只有一个单一的功能&#xff0c;并且这个组件和其他组件没有相互依赖。当然…