【FPGA-DSP】第七期:Mcode调用

目录

1. 有限状态机设计

1.1 FSM代码编写

1.2 输入序列代码编写

1.3. mcode概念

2. Simulink 

2.1. 输入部分

2.2. Mcode模块

2.3. 完整模块

总结 


参考博客【R1】,参考视频资料【R2

设计中经常用到一些控制逻辑,如有限状态机(FSM),如果用各种block搭建一个FSM比较麻烦。System Generator支持调用MATLAB代码,通常可以编写MATLAB代码来实现FSM等控制逻辑,通过MCode block调用到System Generator设计中。

本文将使用MATLAB代码设计一个FSM,对“1010”这个序列进行检测。序列检测应该是很多Verilog/VHDL学习者在学习FSM时接触到的一个简单设计。本文将以该设计在System Generator中的实现为主题,介绍MCode的使用。
 

1. 有限状态机设计

1.1 FSM代码编写

FPGA相关知识点14——有限状态机FSM设计 - 哔哩哔哩 (bilibili.com)icon-default.png?t=N2N8https://www.bilibili.com/read/cv7207512?spm_id_from=333.999.0.0其实,我们在写if/else语句和switch/case语句的时候,就是在跟状态机打交道。如果可以把整个系统模型抽象成一个有限状态机,那么代码就会逻辑特别清晰,结构特别规整。

序列检查状态机设计:
这是一个非常常见的状态机应用,本次设计用来检测序列“1010”

本人设计流程如下:

1.    确定有效状态:

本次需要检测序列“1010”,那么就应该会出现5个有效状态,为:

“初始状态”  ->  “检测到1”  ->  “检测到10”  ->  “检测到101”  ->  “检测到1010”

那么状态变量需要的数据宽度就是3,此时最多能表示8个状态。

我们的有效状态只有5个,剩下的都归为异常状态。  

状态机如下:

对着图写程序,把每一个状态变化的情况编写出来。使用到的语法就是switch/case语法。

% mcode只能调用function函数文件
function Match = state_machine_1010(Din)

% 在mcode文件中,状态变量state需要由下式定义
persistent state, state = xl_state(0,{xlUnsigned, 3, 0});

switch state
    case 0
        if Din == true %表示输入为1(1真,0假)布尔型输入
            state = 1;
        else
            state = 0;
        end
        Match = 0; %每一个状态都要有一个输出,因为FPGA是并行运算的
    case 1
        if Din == true
            state = 1;
        else
            state = 2;
        end
        Match = 0;
    case 2 
        if Din == true
            state = 3;
        else 
            state = 0;
        end
        Match = 0;
    case 3
        if Din == true
            state = 1;
        else 
            state = 4;
        end
        Match = 0;
    case 4
        if Din == true
            state = 3;
        else
            state = 0;
        end
        Match = 1;

%要注意的是,异常状态也是要设计的,一般会让它们回归到状态0 
    otherwise
        state = 0;
        Match = 0;
end

在MATLAB中,persistent变量是函数中的局部变量,它在函数调用之间保留其值。当MATLAB首次遇到特定的persistent语句时,它将persistent变量初始化为空矩阵([])。当您清除或修改内存中的函数时,MATLAB会清除persistent变量。要保留函数在内存中,请使用mlock。

在我的例子中,xl_state是一个persistent变量,它被初始化为0,并且在每次调用函数时保留其值。{xlUnsigned, 3, 0}是一个单元阵列,其中xlUnsigned代表数据类型是无符号的定点数;3代表数据的位宽,因为代码中的state需要达到4,所以至少要3bit的位宽;0代表的是二进制点的位置,该部分代码不需要有小数,所以直接设置为0。

注意,因为本文与FPGA视频“Mcode调用流程”相关联,因此这里是用matlab编写的程序。如果是Verilog语言会有些不同。同时matlab中的状态机功能会受到限制,不能使用matlab所有功能函数,如FFT等就不能放在状态机中

1.2 输入序列代码编写

我们也需要在matlab写出输入序列的代码

%% 系统参数
seq = {0,0,0,1,1,0,1,0,1,0,1,1,1,0,1,0};
N = length(seq);
vi = seq;

match = zeros(1,N);
for n = 1:N
    match(n) = state_machine_1010(seq(n)); %调用FSM,将每一位信号按顺序输入有限状态机
end

1.3. mcode概念

MCode用于在Simulink环境下执行MATLAB函数,经常用于实现一些简单的算法功能、有限状态机和控制逻辑。

基本规则:

  • 所有的输入和输出必须是Xilinx的定点数据类型(xfix);
  • 至少包含一个输出;
  • M文件应在MATLAB的搜索路径下,或与slx模型文件在同一目录。

*建议先设计好.m文件,再使用Mcode模块。 

支持的语法:
Mcode只支持一些在Verilog中也轻易实现的matlab代码,包括:

  • 赋值(等号左边只能有一个变量);
  • if/else/elseif end语法(条件表达式必须是判断true/false或1/0);
  • switch语法(case只能选择常量)、for语法;
  • 加法、减法、乘法、除法(除数必须是2的N次幂,因为可以转换为移位),除此之外,不支持其它算术表达式
  • 关系运算符(<、<=、>、>=、==、~=)
  • 逻辑运算符(&、|、~) 

三种数据类型:
无符号定点数(xlUnsigned)、带符号定点数(xlSigned)、布尔值(xlBoolean)。

如果在编写matlab时使用到了浮点型,需要手动转化为定点型,如,将浮点数π转换为xfix类型的matlab代码如下:

x = xfix({xlSigned, 20, 16, xlRound, xlWrap}, 3.1415926);

转换后为Fix_20_16格式,Round量化,Wrap溢出

非常需要注意的是:
Matlab代码是一种顺序执行的程序,但我们FPGA最大的特点就是并行工作。所以我们在设计matlab程序的时候一定要考虑到这一点。具体来讲,那就是要保证所有变量在运行的过程中都能得到确定的值。比如说,当我们用matlab设计了一个if else语句时,如果有一些情况你没有考虑进去,没有确定该情况下的赋值结果。那么,那些本来在顺序执行时下不会出现的情况,在并行运行时一定会冒出来,而这些情况得到的结果就都是错误的了。

2. Simulink 

2.1. 输入部分

计数器ROM

 

2.2. Mcode模块

 

2.3. 完整模块

仿真结果如下 

总结

在System Generator中,Black Box和M-Code都是用于将HDL文件导入进行设计的工具。Black Box是一种可重用的模块,它可以将HDL文件导入到System Generator中进行设计。Black Box可以使用Vivado Simulator或外部协同仿真器进行仿真。Black Box的优点是可以快速地将HDL文件导入到System Generator中进行设计,而不需要手动创建模块。但是,Black Box的缺点是它不能提供与HDL文件相同的灵活性和控制。

相比之下,M-Code可以提供更高的灵活性和控制。M-Code允许用户使用MATLAB语言编写自定义代码,并将其与System Generator模块集成在一起。M-Code的优点是可以提供更高的灵活性和控制,因为用户可以使用MATLAB语言编写自定义代码。但是,M-Code的缺点是需要更多的时间和精力来编写和调试代码。首先,M-Code需要更多的时间和精力来编写和调试代码。其次,M-Code的性能可能会受到影响,因为它需要调用MATLAB引擎来执行代码。此外,M-Code可能会受到System Generator的限制,例如,它可能无法访问System Generator中的所有变量和对象。

 

 

 

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
LaTeX是一种用于排版文档的强大工具,而mcode是一个用于在LaTeX中插入代码的宏包。 mcode宏包提供了一系列命令和选项,使得在LaTeX中插入各种编程语言的代码变得更加简单和美观。使用mcode,我们可以为代码添加行号、设置不同的字体和颜色、调整代码块的格式、添加注释等。此外,mcode还支持导入外部代码文件。 在LaTeX文档中使用mcode宏包非常简单。首先,需要在导言区通过\usepackage命令加载该宏包。然后,在正文中通过\lstset命令设置代码块的一些属性,比如字体、颜色等。接下来,使用\begin{lstlisting}和\end{lstlisting}环境将代码段包裹起来,就可以在文档中插入代码了。 以下是一个示例,展示了如何使用mcode宏包在LaTeX中插入一段Matlab代码: \begin{lstlisting}[language=Matlab, caption=示例代码, label=code:example] % 这是一个示例的Matlab代码 function result = myFunction(a, b) if a > b result = a - b; else result = b - a; end end \end{lstlisting} 在上面的例子中,我们使用了\begin{lstlisting}[language=Matlab]命令指定了代码的语言Matlab,使得代码块中的关键字可以正确高亮显示。另外,还可以使用\caption和\label命令为代码块添加标题和标签,以便在文档中引用。 总之,mcode宏包是LaTeX中非常实用的一个插件,它可以帮助我们在文档中插入各种编程语言的代码,使得代码展示更加美观和专业。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值