跳转到主要内容

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

judy 提交于

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

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

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

调用的MATLAB函数必须遵循以下三条基本规则:
<li>所有的输入和输出必须是Xilinx的定点数据类型(xfix);</li>
<li>至少包含一个输出;</li>
<li>M文件应在MATLAB的搜索路径下,或与slx模型文件在同一目录。</li>

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

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

2.所支持的MATLAB函数及其功能列在下表:
<center><img src="http://xilinx.eetrend.com/files-eetrend-xilinx/blog/201808/13265-38659-…; alt="" width="670"></center>

<strong>xfix数据类型</strong>
xfix有三种数据类型:无符号定点数(xlUnsigned)、带符号定点数(xlSigned)、布尔值(xlBoolean)。使用xl_arith()判断数据类型时分别返回1、2、3。需要注意几点:
<li>使用关系运算符得到的结果是布尔类型;</li>
<li>布尔变量不能进行算术操作;</li>
<li>逻辑运算符只能用于布尔变量</li>

编写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。

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

状态变量在MATLAB中需要用persistent关键词和xl_state函数定义,如下所示:
persistent s, s = xl_state(0, {xlSigned, 4, 0});

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

<strong>确保变量被正确转换</strong>
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。

文章来源:<a href="http://blog.csdn.net/fpgadesigner">FPGADesigner的博客</a&gt;
<font color="#FD8900">*本文由作者授权转发,如需转载请联系作者本人</font>