前言
本节讲解如何讲讲代码(Matlab、HDL、C/C++)导入到 System Generator 并使用。
一、步骤 1:用 M-Code 建模控制
1、引言
在这一步中,你将使用 MCode 块创建一个简单的有限状态机(FSM)来检测二进制值 1011 的序列。FSM 也需要能够检测到多个传输,例如 10111011
2、目标
完成本实验后,你将能够使用 System Generator 中的 MCode 块创建有限状态机。
3、步骤
在本练习中,你将使用 M-code 为有限状态机创建控制逻辑。然后,你将模拟最终设计以确认正确的操作
①、启动 System Generator 并打开 Simulink 将 Lab2\M_code\Lab2_1.slx 打开,您可以看到下面这个不完整的图表
②、从 Xilinx Blockset/Index 库中添加一个 MCode 块。
③、双击 MCode 块,单击 “编辑m文件”,如下图所示
下图显示了 MATLAB 文本编辑器中的默认 m 代码
⑤、新建 state_machine.m 文件,使其包含函数名 state_machine 以及匹配的输入和输出。
⑥、编辑完成后,使用另存为将 MATLAB 文件保存为 state_machine.m 到 Lab2_1 文件夹。在 MCode 属性编辑器中,使用 Browse 按钮确保 MCode 块引用了本地的 M-code 文件(state_machine.m)。
⑦、在 MCode 属性编辑器中,单击 OK。您将看到 MCode 块使用了新的端口和函数名,现在将 MCode 块连接到下图中:
现在可以开始对状态机进行编码了。这个状态机的气泡图如下图所示。该 FSM 具有五种状态,能够连续检测两个序列
⑧、编辑 M-code 文件 state_machine。使用 Xilinx xl_state 数据类型定义状态变量,如下所示。这要求你将变量声明为持久变量。xl_state 函数需要两个参数:初始条件和一个定点声明。因为你需要数到 4,你需要 3 位
persistent state, state = xl_state(0,{xlUnsigned, 3, 0});
这部分的代码使用 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 进行研究。
⑨、使用 switch-case 语句定义所显示的 FSM 状态。下面提供了一个小示例来帮助您入门
注意:你需要一个 otherwise 语句作为最后一个 case
switch state case 0 if din == 1 state = 1; else state = 0; end matched = 0; case 1 if din == 0 state = 2; else state = 0; end matched = 0; case 2 if din == 1 state = 3; else state = 0; end matched = 0; case 3 if din == 1 state = 4; else state = 2; end matched = 0; case 4 if din == 0; state = 0; else state = 1; end matched = 1; otherwise state = 0; matched = 0; end
⑩、保存 M-code 文件并运行仿真。波形应该如下图所示。
可以看到只要出现了 “1011” 的序列,输出检测就会置 1,反之保持为 0。
System Generator学习——将代码导入System Generator(二)https://developer.aliyun.com/article/1472313