跳转到主要内容

MATLAB / Simulink HDL 快速入门

judy 提交于

本文转载自:<span id="profileBt"><a href="https://mp.weixin.qq.com/s/fErl4tEuQ2n5-9R67PqqYg">OpenFPGA微信公众号</a></s…;

我们将使用实例讲解MATLAB / Simulink HDL 使用入门。
<center><img src="https://cdn.eetrend.com/files/2023-11/%E5%8D%9A%E5%AE%A2/100575721-3236…; alt=""></center>

开始这个项目,首先需要创建一个包含 Stateflow 的新 Simulink 。只需单击画布中的任意位置并开始输入 Stateflow。
<center><img src="https://cdn.eetrend.com/files/2023-11/%E5%8D%9A%E5%AE%A2/100575721-3237…; alt=""></center>

此时应该能在画布上看到 Stateflow 图标。双击图标进行编辑。
<center><img src="https://cdn.eetrend.com/files/2023-11/%E5%8D%9A%E5%AE%A2/100575721-3237…; alt=""></center>

进入图表编辑器后,可以添加状态以及状态之间的转换。开始,我们创建两种状态并将它们命名为“idle”和“LED”。它们之间的转换还没有任何条件。
<center><img src="https://cdn.eetrend.com/files/2023-11/%E5%8D%9A%E5%AE%A2/100575721-3237…; alt=""></center>

要添加状态转换条件,可以双击转换并输入所需的条件。
<center><img src="https://cdn.eetrend.com/files/2023-11/%E5%8D%9A%E5%AE%A2/100575721-3237…; alt=""></center>

当然,状态机可以具有 Mealey 和 Moore 输出,这些输出作为当前状态 (Moore) 或当前状态和输入 (Mealey) 的函数出现。在本例中,将 LED 输出声明为 Moore 输出,并在每个状态下声明。
<center><img src="https://cdn.eetrend.com/files/2023-11/%E5%8D%9A%E5%AE%A2/100575721-3237…; alt=""></center>

最终的结果如下所示。
<center><img src="https://cdn.eetrend.com/files/2023-11/%E5%8D%9A%E5%AE%A2/100575721-3237…; alt=""></center>

使用模型浏览器,我们可以定义状态机的输入和输出。对于输入,我们将它们保留为与 Simulink 相同的类型,但需要定义输出。由于 LED 需要三位,因此我们使用类型 fixdt(0,3,0)。这意味着向量是三位宽、无符号的,并且没有数字的小数元素。
<center><img src="https://cdn.eetrend.com/files/2023-11/%E5%8D%9A%E5%AE%A2/100575721-3237…; alt=""></center>

此外,在模型资源管理器中选中“初始化时执行(输入)图表”选项。
<center><img src="https://cdn.eetrend.com/files/2023-11/%E5%8D%9A%E5%AE%A2/100575721-3237…; alt=""></center>

导航到图表上方的画布。这里我们需要添加块的 IO,我们还将添加延迟。在画布中,开始输入输入或输出以获取所需的端口。
<center><img src="https://cdn.eetrend.com/files/2023-11/%E5%8D%9A%E5%AE%A2/100575721-3237…; alt=""></center>

还可以通过双击输入和输出来命名端口,将其设置为正确的类型。
<center><img src="https://cdn.eetrend.com/files/2023-11/%E5%8D%9A%E5%AE%A2/100575721-3237…; alt=""></center>

将 sw_in 设置为与之前声明的输出类型相同的 fixdt(0,3,0)。我们使用延迟来添加寄存器。要添加额外的延迟,只需在画布中键入即可。
<center><img src="https://cdn.eetrend.com/files/2023-11/%E5%8D%9A%E5%AE%A2/100575721-3237…; alt=""></center>

要更改延迟的长度,双击延迟并将其更改为延迟 1。
<center><img src="https://cdn.eetrend.com/files/2023-11/%E5%8D%9A%E5%AE%A2/100575721-3237…; alt=""></center>

下图显示了完整的图表。
<center><img src="https://cdn.eetrend.com/files/2023-11/%E5%8D%9A%E5%AE%A2/100575721-3237…; alt=""></center>

现在我们可以将其生成 RTL,但首先我们将为它创建一个测试平台。选择画布上的所有元素,右键单击它,然后选择从选择创建子系统。
<center><img src="https://cdn.eetrend.com/files/2023-11/%E5%8D%9A%E5%AE%A2/100575721-3237…; alt=""></center>

添加阶跃函数和常数,设置子系统模块中使用的模块类型,并确保将离散采样的采样时间设置为 -1。
<center><img src="https://cdn.eetrend.com/files/2023-11/%E5%8D%9A%E5%AE%A2/100575721-3237…; alt=""></center>

右键单击感兴趣的信号并选择开始记录所选信号。
<center><img src="https://cdn.eetrend.com/files/2023-11/%E5%8D%9A%E5%AE%A2/100575721-3237…; alt=""></center>

打开模型资源管理器并将模型设置为具有固定步长的计时器的离散时间。
<center><img src="https://cdn.eetrend.com/files/2023-11/%E5%8D%9A%E5%AE%A2/100575721-3237…; alt=""></center>

运行模拟并打开数据检查器。应该能够看到 SW_ENB 被置位,并且 LED 输出在下一个时钟后变高。
<center><img src="https://cdn.eetrend.com/files/2023-11/%E5%8D%9A%E5%AE%A2/100575721-3237…; alt=""></center>

现在我们可以创建 HDL 并将其导出到 Vivado 中使用。我们可以通过右键单击子系统并选择为子系统生成 HDL 来完成此操作。
<center><img src="https://cdn.eetrend.com/files/2023-11/%E5%8D%9A%E5%AE%A2/100575721-3237…; alt=""></center>

如果要更改任何生成的 HDL 代码格式(即删除时钟启用),需要从 HDL 代码生成选项卡中选择全局设置选项。
<center><img src="https://cdn.eetrend.com/files/2023-11/%E5%8D%9A%E5%AE%A2/100575721-3237…; alt=""></center>

生成代码后,将在生成代码的 MATLAB 窗口中看到一条消息。
<center><img src="https://cdn.eetrend.com/files/2023-11/%E5%8D%9A%E5%AE%A2/100575721-3237…; alt=""></center>

然后可以将该 HDL 导入到 Vivado 项目中。生成的代码本身实际上是可读的,并且取决于我们对 Simulink 图的注释程度。例如,我可以命名状态图,这将反映在case语句名称中。

生成三个 VHDL 文件:包含声明的包、实现状态机的实际源代码以及顶级文件。

在 Vivado 中进行综合,最终设计需要三个触发器和两个 LUT。
<center><img src="https://cdn.eetrend.com/files/2023-11/%E5%8D%9A%E5%AE%A2/100575721-3237…; alt=""></center>

当然,这是一个简单的示例,但能够学习流程,以便可以将它用于更复杂的应用程序。