MCode 算法编写模块 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代码。
|