[X]关闭

(五) System Generator 之 MCode 模块

文档创建者:自恋狂vip
浏览次数:9505
最后更新:2020-11-03
MCode 算法编写模块
针对Xilinx器件,我们有两种方式将MATLAB设计的.M 文件转化为HDL语言设计文件,一种是利用AccelDSP综合器;另一种是直接利用MCode模块来实现,前者多应用于复杂或高速设计场合,常用来完成高层次的IP核开发,这里是关于AccelDSP综合器的介绍:http://www.xilinx.com/support/documentation/sw_manuals/acceldsp_user.pdf,有需要的可以进一步查看;而使用Mcode模块则比较方便使用,支持MATLAB语言的有限子集,对实现算术运算、有限状态机和逻辑控制是非常方便的。
1.算法编写
我们在XilinxBlockset里找到Control Logic,在其里面选择MCode模块,下图右侧为MCode模块。
   

我们双击MCode模块,下面为其参数配置界面图:
系统默认的函数名为xlmax,函数名会显示在模块上,我们可以更改函数,通过Browse来选择我们需要的函数,或直接选择M-File 来编辑我们的函数。MCode模块的实现是由装载在里面的.m函数来完成的,该模块的输入和输出端口都是由.M函数来决定的。

这里载入的.m文件是MATLAB函数格式的,首先我们必须新建.M 函数文件,然后在里面编写.M函数,而且该.M 文件必须和SystemGenerator模型文件放在同一个文件夹中。我们选择新建Function,然后将其根据函数功能来命名。
这里需要注意的是,在编写.M 文件时,并不是任何语句都能使用,其必须是Xilinx子集。
MCode支持的MATLAB语言包括:
l  赋值语句,运算符左边只能有一个数值变量;
l  if/else/elseifend 条件语句;
l  switch语句;
l  算术加法、减法、乘法以及除数为2的幂次的除法;
l  比较运算;
l  逻辑运算。
MCode支持的MATLAB函数包括:
ü  数值类型转换。MCode只支持的一种数值类型就是xfix(Xilinxfix-point,Xilinx定点数),此类型数值还可以分成三类:无符号定点数(xlUnsigned)、有符号定点数(xlSigned)、布尔数(xlBoolean)。我们可以通过xfix函数将MATLAB中的整型、浮点数转化为Xilinx定点数,但是无法将其转换为数组。

类型声明函数xfix的使用:x= xfix(data_type, value), data_type可以参考GatewayIn模块里的数据类型。
我们用xfix({xlSigned, 20, 15, xlRound, xlWrap}, 0.618)来举例,它的意思是按4舍5入近似原则和截断原则来将0.618转化为整数部分5位,小数部分15位的有符号定点数。
返回xfix类型的特征函数有:
2  xl_nbits():数的二进制比特数;
2  xl_binpt():数的小数点位置;
2  xl_arith():数的算术类型。
ü  按位逻辑运算函数:
2  xl_and():按位与;
2  xl_or():按位或;
2  xl_xor():按位异或;
2  xl_not():按位取反。
ü  移位操作:xl_lsh()——左移; xl_rsh()——右移;
ü  位截取函数:xl_slice();
ü  连接函数:xl_concat();
ü  强制类型转换函数:xl_force();
ü  内部状态变量:xl_state();
ü  其他常用的函数:disp()、error()、isnan()、NaN()、num2str()、 ones(1,N)、pi()、zeros(1,N)。
MCode模块有一个很重要的特点是,它可以保存当前仿真时刻的数据。在下一时刻来使用,这样变量称为回归状态变量,其声明格式为:
persistentv, v = xl_state(value, data_type, max_length)
其中 value为状态变量v的初始值,其跟C++里面的向量或容器很相近,我们将其可以看作为一个双端队列,队列第一个元素的地址为0,队列尾元素地址为队列长度减一,data_type是我们前面讲过的数据类型,max_length为队列的最大长度。
对于队列的操作,有如下函数:
value= v(index);          返回地位为index处的元素值
v(index)= value;          对地址为index的元素赋值value
f= v.front;               对队列首元素进行读取
v.push_front(value);        在队列首位插入元素value
v.pop_front;              将队列首元素弹出
b= v.back();              返回队列尾元素
v.push_back(value);        在队列末尾插入value
v.pop_back;              将队列末尾的值压出
v.push_front_pop_back(value);    将value插入队首,同时将队尾元素弹出
full=v.full;               判断队列是否为满
empty= v.empty          返回队列是否为空
len= v.length;            读取当前队列长度
MCode对函数要求比较严格,在MCode里只能使用上面提到的函数,而不可以使用其余MATLAB中的函数。
习惯使用C语言这类结构化语言的程序员,需要熟悉下MCode的编写,下面我们举例说明其使用方式:

寻找数据流中的最大值,模型如下:
我们选择FromWorkspace模块来进行数据的模拟,这里因为是离散采样,也就是一个时钟采样一次,因为我们要按照这种时间格式来模拟数据:前面是采样时钟时序,后面是数据值,注意这里的时钟数从0开始计算,下面是FromWorkspace 的配置和初始化赋值:
我们设置GatewayIn输出为8位无符号定点数,并新建function,然后将其命名为xlmax,其编写函数如下:
function MaxValue =max_value(din)
persistent TempMax,TempMax =xl_state(0,{xlUnsigned,8,0});
if din > TempMax
    TempMax = din;
else
    TempMax =TempMax;
end
MaxValue = TempMax;

GatewayOut输入设置为8位无符号定点数,我们为了对结果进行可视化验证,采用Display来进行结果显示。可以看得出我们代码的正确性,在此我们便熟悉了MCode的使用流程和方式。

2.代码的生成
我们双击SystemGenerator模块,进入参数设置界面,在设置好参数以后,点击Generate 就可以生成 Verilog代码,为此MCode里编写的函数便变成了Verilog代码。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

发表评论已发布 3

wing

发表于 2016-2-23 19:28:24 | 显示全部楼层

那怎么找到并打开相应的文件?

自恋狂vip

发表于 2016-2-28 11:36:11 | 显示全部楼层

wing 发表于 2016-2-23 19:28
那怎么找到并打开相应的文件?

都是自己写的,肯定可以打开了

LouisLIU刘浩

发表于 2020-11-3 16:20:49 | 显示全部楼层

在项目的路径下
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则