使用 Moku 云编译,您可以轻松地在 Moku FPGA 上部署您自定义的字信号处理 (DSP)。FPGA 编程通常使用硬件描述语言 (HDL) 完成。与软件编程语言相比,HDL 编码的学习曲线可能更高,因此在本教程中,我们将介绍如何使用 MATLAB 和 Simulink 编程和构建 DSP 行为/算法,以自动生成 VHDL 代码,以便在 Moku 平台上实现。在本教程的第一部分,我们将演示如何将 MATLAB 脚本转换为 VHDL 代码,以及 部分2 本教程的下半部分将演示如何将 Simulink 模型转换为 VHDL 代码。


概述

Moku 云编译

Liquid Instruments 的 Moku Cloud Compile (MCC) 工具使用户能够设计定制仪器,并在 Moku 平台上实现。与基于 CPU 和专用集成电路 (ASIC) 的 DSP 方法相比,FPGA 提供 ASIC 级的输入到输出延迟,同时具有软件定义和可像 CPU 一样重新编程的特性。FPGA 编程通常使用硬件描述语言 (HDL) 完成。与软件编程语言相比,HDL 编码的学习曲线可能更高,但有一些工具可以将其他编程语言的脚本转换为 HDL。在本教程中,我们将演示如何使用 MathWorks HDL Coder 将 MATLAB 代码转换为 HDL 代码,以便在 Moku:Pro 上实现。

在本教程的第一部分中,我们将仅关注使用 MATLAB HDL Coder 生成 VHDL 代码。建议已熟悉 MATLAB 编程的用户使用此方法。 部分2 本教程将介绍如何从 Simulink 模型生成 VHDL 代码。Simulink 模型的框图格式可以更轻松地实现系统和数据流的可视化,用户还可以将 MATLAB 函数块添加到设计中。对于更复杂的系统,同时使用这两种工具可以显著简化设计流程。

MATLAB HDL Coder 方法的设计过程可以分解为图 4 中的 1 个阶段:DSP 设计、浮点仿真、HDL 生成以及 DSP 部署和验证。 我们将按照以下步骤使用 MATLAB HDL Coder 创建可以部署在 Moku:Pro 上的数字施密特触发器。

图 1:Moku 云编译 + HDL Coder DSP 设计的建议操作流程。

图 1:Moku 云编译 + HDL Coder DSP 设计的建议操作流程。

施密特触发器

施密特触发器是比较器电路的一种变体。它根据输入是高于还是低于特定电压阈值来提供 1 位数字输出。基于运算放大器的标准比较器只有一个阈值。对于噪声输入信号,当输入接近或超过阈值时,它可能会在阈值电压附近跳变,并产生不稳定的输出。施密特触发器有两个阈值:一个用于开启的较高阈值和一个用于关闭的较低阈值。在这种情况下,即使噪声输入超过开启阈值并跳回,较高阈值和较低阈值之间的间隙也会形成一个“保护区”,使数字输出保持不变。该器件通常用作设备触发器或正弦波转方波转换器。

图 2:比较器和施密特触发器的比较图。
图 2:比较器和施密特触发器的比较图。

申请条件

在开始构建和实现施密特触发器之前,请确保您的系统满足以下要求。要从 MATLAB 脚本生成 VHDL 代码,您需要安装带有 HDL Coder 和定点转换器的 MATLAB。如果您希望在本教程的第二部分中使用 Simulink 构建系统,您还需要安装 Simulink。注意:Mac 用户还需要安装 XCode 才能使用 HDL Coder。要编译 VHDL 代码,您需要访问 Liquid Instruments Cloud Compile。要实现编译后的仪器比特流,您需要拥有运行固件版本 2 或更高版本的 Moku:Pro、Moku: 应用程序以及 多仪器并行模式 在您的 Moku:Pro 上。

DSP 设计

原理设计

施密特触发器具有单个输入和输出端口。 模拟输入信号将与上限和下限阈值进行比较。 在此示例中,上限阈值是整个正值输入范围的 1/10,下限阈值是整个负值输入范围的 1/10。 如果输入信号高于上限阈值,则输出设置为2^15-1(输出可以产生的最大16位有符号整数); 如果输入信号低于下限阈值,则输出设置为 0; 或者,如果这两个条件都不满足,则它会保持前一个输出状态。

浮点 DSP 设计

在本节中,我们使用持久变量和 if-elseif 结构将上述原理设计转换为 MATLAB 函数。

在施密特触发器 DSP 功能中,我们只需要一个输入通道 (InputA) 和一个输出通道 (OutputA)。 我们将创建一个具有单一输入和输出的 MATLAB ‘DSP’。 请注意 DSP 模块必须以函数格式设计。

浮点DSP设计一线

函数 OutputA = DSP(InputA)

然后我们可以使用持久变量 out0 和用于逻辑操作的 if-elseif 语句填充该函数。

浮点DSP设计全功能

浮点仿真

仿真和验证是 FPGA 设计中的关键步骤。通常的做法是通过构建一个“测试平台”来验证数字系统的响应,该平台输入模拟信号来观察系统的响应。将浮点设计转换为定点设计需要测试平台。对于原生定点设计,测试平台是可选的。但是,强烈建议对任何设计都运行测试平台仿真。

构建测试台

在 MATLAB 中,测试台也可是以 MATLAB 脚本形式出现,它在一系列输入端口范围内循环调用函数(例如本教程中的 DSP 函数)。 在本教程中,我们将进行三轮测试台验证:浮点设计、定点设计和 HDL 设计。 第一个测试台是验证浮点模型,第二个是验证定点转换后的系统行为,最后是通过 EDA 软件中的 VHDL 仿真来验证 HDL 模型。

前两轮测试台验证在 MATLAB 中进行,并使用相同的测试台脚本和仿真用的输入信号。 仿真用的输入信号在动态范围和精度上应该非常接近真实的输入信号。 这将有助于 MATLAB 的定点设计工具确定最适合定点模型的精度。

DSP 函数测试平台的工作原理是加载一组示例数据作为输入信号。该信号与本教程第二部分中的 Simulink 模型一致。然后在 for 循环中调用该 DSP 函数,其输出如图 2 所示。输出结果确认该 DSP 函数与我们想要设计的施密特触发器匹配,因此我们现在可以使用 MATLAB HDL Coder 生成 HDL 代码。

浮点DSP测试台图 3:MATLAB 仿真输出
图 3:MATLAB 仿真输出

HDL 代码生成

MATLAB HDL Coder 使用 Workflow Advisor 指导用户完成完整的 HDL 代码生成过程,其中包括定点转换、HDL 代码生成和 HDL 测试台代码生成过程。 要启动整个过程来将我们的 DSP 函数转换为 HDL 代码的话,我们首先在 MATLAB 中启动 HDL Coder App 并创建一个新项目。 或者,您可以在 MATLAB 的命令行窗口中键入“hdlcoder”。

图 4:可以在 App 选项卡中找到 HDL Coder 应用选项卡以创建新的 HDL Coder 项目。

图 4:可以在 App 选项卡中找到 HDL Coder 应用选项卡以创建新的 HDL Coder 项目。

一旦 HDL 代码生成窗口弹出,我们就可以添加 MATLAB 函数(DSP)和相对应的测试台。 我们可以在这里使用“Autodefine types”来定义函数的输入变量类型,也可以在 Workflow Adviser 中完成。 在大多数情况下,输入变量可以定义为 double,因为我们的模型此时是浮点数。

图 5:DSP.m 和 DSP_tb.m 用作 HDL 生成的源文件。

图 5:DSP.m 和 DSP_tb.m 用作 HDL 生成的源文件。

我们现在将打开 Workflow Advisior 生成施密特触发器的 HDL 代码。

定点转换

软件模型和 FPGA 模型之间的一个主要区别是软件计算通常使用浮点数,而大多数 FPGA 计算需要定点数。 MATLAB 的原生格式是浮点数; 因此,我们需要将浮点设计转换为用于 HDL 代码生成的定点模型。

MathWorks 的定点工具根据测试台输入数据范围执行自动浮点模型到定点模型的转换。 如果需要,用户可以手动重选自动定义的范围。 对于 Moku 云编译,Input、Output 和 Control 信号类型必须与 Moku 云编译接口适配,它们是带符号的 16 位数字。 MATLAB 将其表示为 numerictype(1,16,0),其中“1”将信号指定为有符号数,“16”将字长指定为 16 位,“0”表示我们未指定二进制小数点缩放。

要开始定点转换,我们首先单击“Analyze”,让 HDL Coder 根据测试台文件确定数据类型和范围。 如果建议的类型与硬件接口要求(例如 numerictype(1,16,0)不匹配,请通过单击变量的建议类型并输入 numerictype(1,16,0) 手动重新选择输入和输出数据类型)。然后,单击“Validate Types”以验证数据类型并生成定点模型。

图 6:1. 使用测试平台输入信号分析数据类型。2. 必要时手动覆盖数据类型。3. 验证设计并生成定点模型。

图 6:1. 使用测试台输入信号分析数据类型。 2. 如有必要,手动重新输入数据类型。 3. 验证设计并生成定点模型。

定点模型验证

定点模型转换后,我们需要运行一次仿真来验证定点模型是否按预期运行并评估精度损失。 定点模型验证是通过“Test Numerics”按钮完成的。 确保选择“Log inputs and outputs for comparison plots”,因为这将生成图形来比较浮点模型与定点模型中的同一个变量。

图 7:浮点模型和定点模型之间变量 OutputA 的比较

图 7:浮点模型和定点模型之间变量 OutputA 的比较

如果观察到不理想的精度损失,则增加可变精度,然后重复定点转换过程。 请注意输入、输出和控制信号的精度必须与硬件接口适配。

一旦定点模型通过测试台的验证,我们就可以继续为施密特触发器模型生成 VHDL 代码。

VHDL 代码生成

进入菜单中的“Select Code Generation Target”,我们将其保留为“Generic ASIC/FPGA”。

在“HDL Code Generation”步骤中,我们需要配置“Target”和“Clocks & Ports”:

  • Target:
    • 语言VHDL
  • Clocks & Ports:
    • Reset typeSynchronous
    • 确保 Minimize clock enables 已被勾选
    • Input data typesigned/unsigned
    • Output data typesigned/unsigned

单击“Run”后,系统的 VHDL 代码将出现在 …\codegen\DSP\hdlsrc文件夹中。

图 8:选择 VHDL 的目标语言并运行代码生成

图 8:选择 VHDL 的目标语言并运行代码生成

使用第三方工具进行 VHDL 仿真(可选)

HDL Coder 还可以生成 HDL 测试台文件,用于在 EDA 软件上运行仿真。 使用第三方 HDL 仿真器验证模型可为设计提供额外的验证并确认。 此步骤不是必须的,但强烈建议用于复杂的系统。 测试台文件可以在“HDL Verification”步骤下的 Workflow Advisor 这一步生成。

图 9:(a) HDL 测试台文件可以在 HDL Coder 中生成。 (b) 使用 Xilinx Vivado 进行 HDL 层面的仿真

图 9:(a) 可以在 HDL Coder 中生成 HDL 测试台文件。(b) 使用 Xilinx Vivado 进行 HDL 级仿真。

编译和部署

现在我们有了施密特触发器的 VHDL 代码,我们准备好使用 Moku 云编译来对自定义功能进行编译,然后部署在 Moku:Pro 上。

仪器功能封装

Moku Cloud Compile 有一个标准 包装纸 内置功能允许自定义仪器与 Moku 的其他部分交互。标准包装器会使用仪器的全部 4 个输入通道和输出通道,这与我们的施密特触发器示例不匹配,该示例只有 1 个输入和 1 个输出。因此,我们需要为该仪器创建一个自定义包装器。

MATLAB 为本教程提供 VHDL 代码的封装器模板。 这里有三种不同的封装器模板,一种设计使用 MATLAB HDL Coder 生成的 VHDL 代码(即本篇内容),一种设计使用 Simulink 生成的 VHDL 代码(即本系列教程的第 2 部分),最后一种用于您的代码包含一个 ce-out 端口的情况。 在继续选择适合您的应用的封装器模板之前,请检查 VHDL 代码的端口定义部分。

下面是我们将用于编译施密特触发器的自定义封装器。

定制包装器

编译和部署施密特触发器

有关如何使用 Moku 云编译创建自定义仪器 bitstream 和如何部署的详细说明,请参见我们的 Moku 云编译入门指南.

要编译施密特触发器,请在 Liquid Instruments 的 Moku Cloud Compile 上创建一个新项目。在此项目中,创建一个 DSP_fixpt.vhd 文件,该文件是施密特触发器的 VHDL 代码;同时,为上一节中的自定义包装器创建一个包装器文件。选择带有 4 个插槽的 Moku:Pro 作为目标设备,并构建项目。比特流构建完成后,您就可以使用网页界面和 Moku: 应用程序在您的 Moku:Pro 上部署施密特触发器了。

为了证明施密特触发器从一开始就能像我们的概念设计那样正常工作,我们使用 Moku: App 的多仪器模式将编译好的 DSP 放入系统中。在插槽 1 中,我们放置了一个任意波形发生器,以生成与测试台上相同的信号作为施密特触发器的输入信号。在插槽 2 中,我们放置了施密特触发器。在插槽 3 中,我们放置了一个示波器,输入 1 显示施密特触发器的输出,输入 2 显示任意波形发生器的信号输出,以便比较两个信号。我们可以看到,当信号超过 110 mV 时,施密特触发器的输出切换到高电平,并保持高电平直到信号降至 -110 mV 以下。这证实了施密特触发器的工作正常。

图 10:(a) 多仪器并行系统界面。 (b) 验证施密特触发器是否按设计运行的示波器测量界面。

图 10:(a) 多仪器并行系统界面。 (b) 验证施密特触发器是否按设计运行的示波器测量界面。

结语

本教程涵盖了将 MATLAB 脚本转换为编译后可以部署在 Moku 硬件上的 VHDL 代码的详细过程。 该过程涉及 4 个过程:DSP 设计、浮点仿真、HDL 生成以及 DSP 部署和验证。 这个过程消除了学习 HDL 编程的需要,并使用户能够直接进入设计和创建自己的自定义仪器。

获取源代码

该项目的源代码可以下载 开始.


问题或意见?

请联系我们 support@liquidinstruments.com.


在演示模式下试用 Moku

您可以下载适用于 macOS 和 Windows 的 Moku: 应用程序 开始.


获取常见问题的答案

在我们的网站上查找有关设备和仪器的问题和答案 知识库.


与 Moku 用户联系

即刻加入 用户论坛 请求新功能、分享支持提示并与我们的全球用户社区联系。

其他推荐的应用笔记

返回所有应用笔记