MATLAB到FPGA的5步
工程师使用MATLAB®为信号处理、无线通信、图像视频处理等应用开发算法。为了开发概念验证,工程师需要在FPGA评估或原型板上实现他们的设计。使用HDL Coder™工作流,发现将MATLAB算法转换和进化为可在fpga上实现的可读和优化的HDL代码所必需的关键步骤。
大家好,欢迎参加MathWorks网络研讨会“MATLAB到FPGA的5步”,介绍HDL编码器工作流程。
我是Raghu Sivakumar,是印度海得拉巴产品营销团队的一员,负责FPGA, ASIC和SoC开发的MathWorks解决方案。
快速概述一下本次网络研讨会的议程,我将谈谈本次网络研讨会的动机,然后以MATLAB中的脉冲检测器算法为例,然后演示设计工作流程。
在本次网络研讨会中,我将从MATLAB中的脉冲检测器算法开始,在网络研讨会结束时,我们将有一个定义良好的可读HDL代码,其输入和输出定义及其数据类型定义在定点。为了得到这段代码,我不需要写任何HDL。在这次网络研讨会上,我将展示如何逐步从MATLAB到HDL代码。
这让我很好地回到了这次网络研讨会的目的。我们有许多客户从事信号处理、无线通信和图像/视频处理等应用程序,主要使用MATLAB。他们问我们如何将他们的MATLAB算法应用到FPGA评估板上!他们要么对FPGA编程知之甚少,要么他们的硬件设计工程师太忙了。如果这种情况与你有关,我请求你花30分钟观看这个网络研讨会MATLAB到FPGA的5步。
现在让我们在MATLAB中使用脉冲检测器算法。我选择脉冲检测器,因为它是许多应用中常用的算法,而且它为广大观众所熟悉。关键是步骤,而不是算法,算法可以是一个滤波器,一个啁啾信号OFDM等。
脉冲探测器算法在MATLAB中,我定义了脉冲,将它插入到发射信号中。对于真实的接收信号,我在发射信号中添加噪声。现在,为了找到脉冲,我让它通过一个定义了系数的滤波器,并通过一个max函数来检测脉冲。你们可以看到,在MATLAB中我可以处理整个坐标系。但在硬件中,这个帧将是一个输入的数据流,在此数据流上执行操作,同时管理并行路径的时间。Simulink在这方面做得很好。我们可以想象平行路径;它具有内置的计时感,我们可以通过操作可视化数据类型传播。
MATLAB和Simulink都可以无缝地工作,甚至可以在Simulink中包含MATLAB代码。我将在网络研讨会上演示这一点。
我们向客户推荐的设计工作流程是利用MATLAB和Simulink的文本编程和可视化建模,并在仿真环境中构建基于时间的系统。
使用MATLAB,我们将创建我们的黄金参考。我们想要在硬件上实现的部分算法,这将是我们的第一步。在第二步中,我们将在Simulink中建模一个基于样本的硬件实现。我们将在第3步优化我们的硬件,我们将优化速度和资源使用。在第4步中,我们将把数据类型量化为定点。最后在步骤5中生成HDL代码。在每一步中,我们将确保功能和正确性是根据MATLAB黄金参考进行验证的。
在第2步中,我们将在Simulink环境中建模峰值检测器。
将基于MATLAB框架的黄金算法转换为基于样本的Simulink模型。
在MATLAB中,我们使用滤波器并将信号通过max函数来检测峰值。在Simulink中,我们将设计我们的模型来处理传入的数据流,并通过在最后11个样本上滑动一个窗口来检测峰值。为了检测峰值,我们将使用三个阶段,过滤传入流秒计算max函数,并检测局部峰值。
让我们来看看演示。
我们将使用Simulink的HDL优化库,其中包含250多个块来建模硬件实现
“来自工作区的信号”块用于创建数据流,然后通过一个离散的FIR FILTER块发送这个样本数据。块参数为MATLAB算法中的变量值。我们只是重复使用了我们在MATLAB中所做的工作。
在Simulink中,当数据在模式中移动时,可以可视化数据的结构和流。我们将记录特定的信号,稍后将使用MATLAB黄金参考来验证Simulink模型。
在MATLAB中,我们能够找到整个信号的全局最大值,该函数使用了复杂的操作,如平方根。在硬件中,当信号输入时,我们将计算局部最大值。为了节省资源,我们不使用像平方根这样复杂的运算,而是将其设计为信号的实部和虚部的平方和。
接下来,我们计算最近11个样本的最大值。这在MATLAB中很容易做到,我们将使用MATLAB函数块在模型中包含ML代码。通过检查中间样本是否比其他样本大,也大于最小阈值来找到峰值。
这种方法可以立即检测脉冲,因为它可以处理到达的流信号。
峰值由延迟启用块保持,并在检测到的信号变高时显示。
为了验证这个Simulink模型的功能是否符合我们的MATLAB黄金参考,我们将在Simulink设计的记录信号与黄金参考之间进行比较。在整个过程中,我们将使用MATLAB测试平台脚本进行验证。
在MATLAB和Simulink中检测到的峰值位置相同,相关误差在-17 eps范围内。
通过这一步,我们已经在Simulink中建模了硬件实现,并建立了MATLAB和Simulink这两个环境无缝地一起工作,因为我们甚至在Simulink中包含了MATLAB代码。
这一步的结论是
- 通过使用Simulink的250个和更多HDL优化块,我们创建了峰值检测器的硬件实现。
- 可以可视化来自不同操作的数据流
- 记录感兴趣的Simulink信号,稍后用于验证黄金参考…
- 包括MATLAB在Simulink环境下的代码。
在Simulink中建模了我们的硬件实现之后,我们将专注于优化我们的架构——使其高效和优化硬件设计。
我们将首先为HDL代码生成准备我们的模型,然后使用优化技术来控制硬件设计中的速度和面积权衡。此外,我们将在硬件设计中添加一个信号有效性检查。
运行HDLSETUP命令,调用一系列指令,这些指令将在后台运行,并配置几个模型参数。这将模型求解器设置为离散的固定步长时间求解器,每个采样tick将对应于FPGA的一个时钟周期-数据通过并行路径的时钟速度和信号的计时。块上的采样率时间用颜色表示,红色表示最快的采样率。
脉冲检测实现被分组在一个子系统中,我们称之为脉冲检测器。这个子系统也称为待测设备(DUT),将在硬件目标上实现(HDL将从Simulink模型的这一部分生成)。现在,我们可以将重点放在脉冲检测器子系统内部的各个块上,以优化硬件。
我们将用离散FIR滤波器HDL硬件优化块替换离散FIR滤波器块。该块提供了滤波器架构和管道寄存器放置,被设计为DSP块资源高效。Simulink提供了一系列针对硬件设计进行优化的HDL优化块。
离散过滤器块有一个内置的信号有效性检查选项。使用数据有效检查是一个很好的实践,在与非连续数据源接口的硬件设计中也经常使用。在这个演示中,我将接收信号设置为true,作为滤波器有效信号的输入。
在决定FPGA上的时钟周期/离散时间固定步长有多快的因素中,是在给定的时钟周期中需要完成多少操作或计算。沿着并行路径插入管道寄存器可以提高时钟速度。HDL Coder提供了多种方法来在代码生成期间插入管道阶段,以缩短路径,以便您可以以更高的频率运行。其延迟平衡特性在并行路径上插入匹配的管道级。在这里,我将通过手动插入它们来进行说明,这也使我能够在高层次上模拟这种行为。
为了可视化管道的效果,我们将在并行路径上手动插入它们,并模拟硬件设计模型。并行路径是FIR FILTER块的输入,来自LOCAL Peak子系统和filter_valid信号路径的输出。
我们将确保对Simulink模型所做的更改不会影响其功能,并根据黄金参考验证记录的信号。运行验证测试,我们可以看到MATLAB和Simulink环境的位置是相同的,而且相关误差在-17 eps范围内。
从步骤3中得到的关键结论
- 我们使用HDLSETUP命令来为代码生成准备模型,了解了Simulink的求解器如何与fpga时钟速率相关。
- 使用硬件高效块,增加有效信号检查。我们使用流水线方法来提高时钟速率——这是决定功能设计中时钟速度的关键因素
- 此外,通过在没有数据类型量化的情况下验证我们的硬件优化,确保量化噪声不会隐藏您的设计错误。
到目前为止,我们已经将基于框架的MATLAB算法转换为基于样本的Simulink模型,演示了MATLAB和Simulink环境如何无缝地协同工作。我们采用了基于Simulink模型的样本,对其进行了代码生成优化,并为有效使用硬件资源添加了细节。
在第4步中,我们将量化数据类型到固定点,并根据黄金参考验证它。
在MATLAB中,数据类型默认为64位双精度浮点,而在数字硬件中,数据类型由定点表示,因为它是资源高效的,也降低了功耗。在MATLAB中,不动点表示为有符号或无符号,后跟由整数部分和分数部分组成的字长。
因此,在本节中,我们将利用Simulink通过操作可视化数据类型传播的能力,并使用数据类型转换块将数据转换为固定点。在这个演示中,我预定义了我的定点数据变量,以确保表示接收信号的整个范围。我们将使用数据类型转换块在模型中输入定点变量。我们将更新模型,通过运算来可视化定点数据的字长,以表明Simulink能够自动传播定点并保持精度。当我们进行乘法操作时,我们建议将信号转换为18位字长,并在添加操作后类似地将字长转换为18位。我们这样做的原因是为了将乘法和加法操作映射到FPGA硬件上的单个DSP块。
对于这个演示,可以定义定点变量并转换数据类型,但是对于大型和复杂的模型,我们可以使用定点设计器工具。该工具通过运行模型来收集数据范围,然后提出定点数据类型,我们可以应用建议的值或设置自己的值。最后,我们可以运行模型,查看量化的效果,并在必要的地方进行更改。这允许使用多个量化选项重新运行模拟,并提供关于数据溢出、下溢的可视化信息。
测试设备现在量化为定点,我们将验证所做的更改是否给我们提供了根据黄金参考所需的结果。运行验证测试时,量化错误将突出显示为警告。由于数据类型的饱和和伸缩,这是一种预期的行为。硬件设计量化的整体思想是在效率和精度之间找到平衡。虽然MATLAB和Simulink的峰值位置相同,但由于量化,相关误差增大。
在第4步中,我们讨论了以下主题……
- 我们看到了Simulink在操作中传播和保持数据类型精度的能力,
- 管理比特增长。将字长转换为18位,以便将乘法-加法操作映射到单个DSP块
- 定点设计器是一种图形用户界面工具,可以收集数据范围,提出定点,并让您模拟和比较结果。
- 并以黄金基准对量化模型进行了验证。
在最后的步骤5中,我们将生成和合成我们的HDL代码。为了演示目的,我们将选择Xilinx Zynq设备,为了在生成HDL代码后进行合成,我们在MATLAB路径上包含了Xilinx Vivado合成工具。
在本节中,我们将看到HDL Workflow advisor的功能,并演示在生成的代码和Simulink模型之间跟踪的报告。
首先,我们将使用HDL代码顾问运行一系列检查。这将检查模型、端口和块设置,以确保代码生成的兼容性。此外,这还允许您检查本机浮点数和行业标准检查的兼容性。由于这两个不适用,我们将跳过这些。当运行这些检查时,如果检查中有错误,您可以直接在模型中进行建议的更改,或者选择“修改设置”自动进行更改。
检查完模型后,我们将使用HDL Advisor,它将带我们完成一系列任务和设置选择。在这里,我们将输入我们的目标设备,设备包,目标频率和合成工具的详细信息。在HDL代码生成设置中,在优化部分下,我们选择自适应流水线,为了获得报告和选择时钟设置,我们将选择必要的选项。
做出选择后,我们现在可以通过运行任务“生成RTL代码和测试工作台”来生成HDL代码。当所有的任务都成功完成时,您已经生成了结构良好,注释和可读的HDL代码。我们选择的报告为我们提供了有关资源利用和估计乘数的信息,DSP块利用率。优化报告链接到在最终模型中插入额外寄存器的地方,例如在计算功率子系统块中,您可以看到HDL Coder已经自动添加了管道寄存器,以提高整体时钟速度。可追溯性是双向的,可以使用生成的HDL代码导航到Simulink模型,也可以从模型中的块跟踪其HDL代码。在这个演示中,我选择了乘法块,我将向您展示如何从代码到模型,以及从模型回到代码。
使用生成的HDL代码,您可以使用支持第三方合成工具的HDL工作流顾问进行合成,否则您可以使用您选择的合成工具。使用HDL工作流,该工具创建必要的文件和文件夹,并在后台运行合成,此外还提供模型上关键时序路径的报告。这种设计工作流使用户能够在更高的抽象级别上探索设计,并快速找到满足其目标的最佳硬件架构。OROLIA公司是一家为国防和太空应用提供定位、导航和授时(PNT)解决方案的客户,必须为他们的第二代信标开发接收器硬件。在此之前,他们使用模拟设计,很少有设计和实现数字接收机的经验。利用MATLAB和Simulink设计了专用SDR,并在Analog Devices射频系统模块上实现了该设计。使用HDL Coder生成可合成的HDL。这使得工程师能够专注于设计智能算法,通过采用这种设计方法,工程师能够将开发时间缩短8个月,并将FPGA实现时间缩短50%。
通过HDL Coder,我们可以将我们的MATLAB算法和系统设计连接到FPGA原型硬件。使用HDL Coder,您可以从MATLAB函数,Simulink模型和状态流程图生成可合成的VHDL或Verilog。花时间在Simulink中构建基于样本的模型,添加硬件架构,转换为固定点,并根据黄金参考验证每个步骤,让您可以控制资源利用,并以系统的步骤在FPGA上定位算法。生成的HDL代码是独立于目标且可移植的,如果您必须在其他设备上尝试该代码,也可以这样做。
我希望我们今天讨论和展示的内容能引起大家的兴趣。要了解更多信息,请使用以下资源链接,其中提供了关于验证代码、定点转换等主题的信息,我鼓励您尝试MathWorks文件交换上提供的HDL自我指导教程。如果您对评估HDL Coder工具感兴趣,并希望开始使用,请访问我们的入门页面或与MathWorks销售联系人联系。
谢谢大家的聆听,接下来的时间我们就讨论的主题回答问题。
了解更多
また,以下のリストからWebサescトを選択することもできます。
最適なサ▪▪トパフォ▪▪マンスの取得方法
中国のサ▪▪ト(中国語または英語)を選択することで,最適なサ▪▪トパフォ▪マンスが得られます。その他の国のMathWorksのサescトは,お客様の地域からのアクセスが最適化されていません。