System Generator系列之使用MCode进行建模控制

时间:2024-05-19 08:11:48

前言
前些天通过创建数字滤波器的设计,对System Generator做了一些简单的使用介绍,今天将分享一下如何在System Generator中使用MATLAB中编写的M代码进行建模控制。



开始

老样子,先打开System Generator,启动MATLAB完成后,再打开Simulink进行仿真模型的设计,再添加以下的一些基本模块:
Repeating Sequence Stair:用于重复产生离散时间序列,也是本次设计的输入。
Gateway In、Gateway Out、System Generator以及Scope
添加完成后,可以简单先进行连接,如下:
System Generator系列之使用MCode进行建模控制
中间留着的空白区就是用于今天的核心,用于和M代码进行链接的模块即MCode,所在菜单为:Xilinx Blockset/Index,如下:
System Generator系列之使用MCode进行建模控制
将其添加到自己的模型文件中,先不用连接,需要自己编辑好M文件后再使用,双击MCode模块,然后点击Edit M-File:
System Generator系列之使用MCode进行建模控制
然后会在MATLAB的代码编辑区打开默认的M文件:
System Generator系列之使用MCode进行建模控制
可以看到该文件就是一个函数,因此只需要自行编辑一个function定义的函数即可在MCode中使用,创建一个新的M文件,然后输入如下所示的代码,其中:
函数名:state_machine
输入:din
输出:matched
System Generator系列之使用MCode进行建模控制System Generator系列之使用MCode进行建模控制
以上的代码表示的是一个状态机(FSM—Finite State Machine),有5个状态,能够检测连续的序列(1011),状态图如下:
System Generator系列之使用MCode进行建模控制
然后将代码保存到与模型文件同一文件夹下面,然后可以关掉之前打开的xlmax.m,并且在MCode这个模块中点击Browse:
System Generator系列之使用MCode进行建模控制
在弹出的界面选择刚刚保存的state_machine.m,点击OK保存并关闭,然后在模型文件下可以看到此时的MCode已经只有一个输入和输出端口,并且名字已经变成刚刚创建的函数名,如下所示:
System Generator系列之使用MCode进行建模控制
不过这时候的代码并没有编写完成,还需要添加一些变量,首先是state需要设置一个变量声明,不然相当于未定义,要报错,添加以下一句代码即可:
persistent state, state = xl_state(0,{xlUnsigned, 3, 0});
System Generator系列之使用MCode进行建模控制
这部分的代码使用persistent将state在该M文件中做了一个变量的声明,可以在该M文件中进行使用,xl_state()这个则是对state进行赋值,该函数的简单用法就是
xl_state(init, precision),直接就是如括号里面的意思,第一个init就是初始化的值,precision就是其精度;
而代码中的{xlUnsigned, 3, 0}属于一个单元阵列,其中xlUnsigned代表数据类型是无符号的定点数;3代表数据的位宽,因为代码中的state需要达到4,所以至少要3bit的位宽;0代表的是二进制点的位置,该部分代码不需要有小数,所以直接设置为0。
xl_state 以及Percision也都还有其他用法,可以自行对MCode使用help进行研究。
不过代码中其实存在一些缺陷,就是状态机还不能正常进入,需要添加一个otherwise使得状态机开始运行,具体添加如下:
System Generator系列之使用MCode进行建模控制
以上步骤的内容都完成后,就可以保存,在运行前还需要对Repeating Sequence Stair这个模块做下简单的配置,使得输出的序列值有包含状态机检测的序列的:
System Generator系列之使用MCode进行建模控制
然后因为变量序列值比较多了,默认设置的运行时间也需要做一定的改变,弄个足够把序列值全部能采集到,直接设置20,然后再点击Run进行运行,并且在示波器观察结果:
System Generator系列之使用MCode进行建模控制
可以看到只要出现了“1011”的序列,输出检测就会置1,反之保持为0。



----------------------------------------------------END-----------------------------------------------------