自恋狂vip 发表于 2016-1-29 13:58:24

(五) System Generator 之 MCode 模块

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赋值语句,运算符左边只能有一个数值变量;lif/else/elseifend 条件语句;lswitch语句;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类型的特征函数有:2xl_nbits():数的二进制比特数;2xl_binpt():数的小数点位置;2xl_arith():数的算术类型。ü按位逻辑运算函数:2xl_and():按位与;2xl_or():按位或;2xl_xor():按位异或;2xl_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的元素赋值valuef= v.front;               对队列首元素进行读取v.push_front(value);      在队列首位插入元素valuev.pop_front;            将队列首元素弹出b= v.back();            返回队列尾元素v.push_back(value);      在队列末尾插入valuev.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;endMaxValue = TempMax;
GatewayOut输入设置为8位无符号定点数,我们为了对结果进行可视化验证,采用Display来进行结果显示。可以看得出我们代码的正确性,在此我们便熟悉了MCode的使用流程和方式。
2.代码的生成我们双击SystemGenerator模块,进入参数设置界面,在设置好参数以后,点击Generate 就可以生成 Verilog代码,为此MCode里编写的函数便变成了Verilog代码。

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

在项目的路径下
页: [1]
查看完整版本: (五) System Generator 之 MCode 模块