学会System Generator(10)支持的MATLAB语法

本文详细介绍了在SystemGenerator中使用MCode模块的方法及注意事项,涵盖了MCode支持的MATLAB语法、数据类型、状态变量定义等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文是该系列的第10篇,上一篇介绍了在System Generator设计中使用MCode模块调用MATLAB代码来完成逻辑控制。本文将介绍System Generator支持的所有MATLAB语法。

限于篇幅,本文只记录了经常用到或相对重要的内容,更详细的信息可以参考xilinx官方文档ug958->第一章->MCode小节。


MCode block特性

MCode用于在Simulink环境下执行MATLAB函数。MCode的名称与管脚即为函数名称与函数接口。在将System Generator设计导出到FPGA时,软件会将MATLAB代码转换为对应的HDL模型。MCode经常用于实现一些简单的算法功能有限状态机控制逻辑

调用的MATLAB函数必须遵循以下三条基本规则:

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

当初次使用MCode时,会自动调用一个示例文件xlmax.m。博主建议先在slx文件目录下创建好新的m文件,再用Browse定位。


支持的MATLAB语法

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

这里写图片描述

xfix数据类型

xfix有三种数据类型:无符号定点数(xlUnsigned)、带符号定点数(xlSigned)、布尔值(xlBoolean)。使用xl_arith()判断数据类型时分别返回1、2、3。需要注意几点:

  • 使用关系运算符得到的结果是布尔类型;
  • 布尔变量不能进行算术操作;
  • 逻辑运算符只能用于布尔变量

编写MATLAB代码时,仍然可以使用整数、浮点数、布尔值来定义常量。整数和布尔值都会自动转换为xifix类型;浮点数需要用xfix()函数转换。xfix()函数还可以完成不同xifix数据类型的转换,其基本形式为:

x = xfix(type_spec, value);

value为待转换的数,type_spec为转换后的数据类型。比如将浮点数π转换为xfix类型:

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

转换后为Fix_20_16格式,Round量化,Wrap溢出(前面的文章中已经解释了这些含义)。量化方式可设置为xlTruncate、xlRound和xlRoundBBanker;溢出方式可设置为xlWrap、xlSaturate、xlThrowOverflow。


xl_state状态变量

在整个仿真过程中,一个MATLAB函数会执行多次,必须保证其中的状态变量在每次执行完时保留其值(类似与C++语言中的static静态变量),否则无法正确实现控制功能。

状态变量在MATLAB中需要用persistent关键词和xl_state函数定义,如下所示:

persistent s, s = xl_state(0, {xlSigned, 4, 0});

该函数有两个参数:第一个0表示状态初始值,必须是常数;第二个参数是状态变量的数据类型,与xfix函数中的type_spec用法相同。状态变量还可以是一个向量,并且拥有许多配套的函数,ug958中给出了多个使用xl_state完成的设计实例。


确保变量被正确转换

MATLAB是一种顺序执行代码,众所周知,HDL代码是并行执行的代码。为了能让MATLAB代码成功的转换为HDL模型,就要确保MATLAB用到的变量也能正确的转换(原文档描述为Variable Availability)。具体来讲就是要保证所有的变量在MATLAB语法的不同分支条件下都能够得到赋值。

ug958给出了一个示例代码:

function [x, y, z] = test1(a, b)
x = a;
if a>b
    x = a + b; y = a;
end
switch a
case 0
    z = a + b;
case 1
    z = a - b;
end

其中y变量只在“if a>b”的条件下赋值,而不清楚另一种情况下怎么办;z变量在switch的其它情况下也不知道该怎么办(switch没有otherwise)。在执行时MATLAB都会报错。x变量虽然也没有在if对应的else条件中赋值,但其已经提前赋值“x=a”,这样在else时会默认保留原值,该变量满足Variable Availability。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值