MATLAB到FPGA的5步
工程师使用MATLAB®为信号处理、无线通信和图像视频处理等应用开发算法。为了开发概念验证,工程师需要在FPGA评估或原型板上实现他们的设计。使用HDL Coder™工作流程,发现必要的关键步骤,以转换和演变MATLAB算法为可读和优化的HDL代码,可以在fpga上实现。
大家好,欢迎参加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中,我定义了脉冲,把它插入到发射信号中。对于真实的接收信号,我在发射信号中添加了噪声。现在为了找到脉冲,我让它通过一个定义了系数的滤波器然后通过一个极大值函数来检测脉冲。你们可以在MATLAB中看到,我可以在整个坐标系中工作。但在硬件中,这个帧将是一个输入的数据流,对其执行操作,同时管理并行路径的时间。Simulink在这方面很好。我们可以想象平行路径;它具有内置的计时功能,我们可以通过操作可视化数据类型的传播。
MATLAB和Simulink都可以无缝地工作,你甚至可以在Simulink中包含MATLAB代码。我将在网络研讨会上对此进行演示。
我们向客户推荐的设计工作流程是利用MATLAB和Simulink的文本编程和可视化建模,在仿真环境中构建一个基于时间的系统。
使用MATLAB,我们将创建我们的黄金参考。我们想在硬件上实现的那部分算法,这是我们的第一步。在第二步中,我们将在Simulink中建模一个基于样本的硬件实现。我们将在步骤3中优化硬件,在那里我们将优化速度和资源使用。在步骤4中,我们将把数据类型量化为定点数据。最后在步骤5中生成HDL代码。在每个步骤中,我们将确保根据MATLAB黄金参考验证功能和正确性。
在第2步中,我们将在Simulink环境中建模峰值检测器。
将基于MATLAB框架的黄金算法转化为基于样本的Simulink模型。
在MATLAB中,我们使用滤波器将信号通过max函数进行峰值检测。在Simulink中,我们将设计我们的模型来处理传入的数据流,并通过在最后11个样本上滑动窗口来检测峰值。为了检测峰值,我们将采用三个阶段,对传入的流进行秒过滤,计算最大值函数,并检测局部峰值。
让我们来看看演示。
我们将使用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信号,稍后用于验证黄金参考…
- 包括Simulink环境下的MATLAB代码。
在Simulink中对我们的硬件实现建模之后,我们将专注于优化我们的体系结构——使其高效和优化硬件设计。
我们将首先为HDL代码生成准备我们的模型,然后使用优化技术来控制硬件设计中的速度和面积权衡。此外,我们将在硬件设计中增加一个信号有效性检查。
运行HDLSETUP命令,调用一系列将在后台运行的指令,并配置几个模型参数。这将模型求解器设置为一个离散的固定步长时间求解器,每个采样tick将对应于FPGA的一个时钟周期-数据的时钟速度和信号通过并行路径的计时。块上的采样速率时间用颜色表示,红色表示最快的采样速率。
脉冲检测实现被分组在一个子系统中,我们称之为脉冲检测器。该子系统也称为被测设备(DUT),将在硬件目标上实现(HDL将从Simulink模型的这一部分生成)。现在,我们可以将重点放在脉冲探测器子系统中的各个块上,以优化硬件。
我们将用一个离散FIR滤波器HDL硬件优化块替换离散FIR滤波器块。该块提供过滤器架构和管道寄存器位置,设计为DSP块资源高效。Simulink提供了一系列这样的HDL优化块,为硬件设计进行了优化。
离散FILTER块有一个内置的信号有效性检查选项。使用数据有效性检查是一种很好的实践,也常用于与非连续数据源接口的硬件设计中。对于这个演示,我已经将接收信号设置为真,作为滤波器有效信号的输入。
在决定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代码后进行合成,我们将Xilinx Vivado合成工具包含在MATLAB路径上。
在本节中,我们将看到HDL工作流顾问的功能,并演示在生成的代码和Simulink模型之间跟踪的报告。
首先,我们将使用HDL代码顾问运行一系列检查。它检查模型、端口和块设置,以确保代码生成的兼容性。此外,这还使您能够检查与本机浮点和工业标准检查的兼容性。由于这两个不适用,我们将跳过这两个。当运行这些检查时,如果检查中有错误,您可以直接进行模型中推荐的更改,或者选择“MODIFY SETTINGS”自动进行更改。
检查完我们的模型后,我们将使用HDL Advisor,它将带我们完成一系列任务和设置选择。在这里,我们将进入我们的目标设备,设备包,目标频率和合成工具的细节。在HDL代码生成设置中,在优化部分我们选择自适应流水线,为了获得报告和选择时钟设置,我们将选择必要的选项。
做出选择后,我们现在可以通过运行“generate RTL Code and Testbench”任务来生成HDL代码。当所有的任务都成功完成时,您已经生成了结构良好、注释和可读的HDL代码。我们选择的报告为我们提供了关于资源利用和估计乘数、DSP块利用率的信息。优化报告链接到在最终模型中插入额外寄存器的位置,例如在计算功率子系统块中,您可以看到HDL Coder已经自动添加了管道寄存器,以提高整体时钟速度。可跟踪性是双向的,可以使用生成的HDL代码导航到Simulink模型,也可以从模型中的块跟踪它的HDL代码。在这个演示中,我选择了乘法块,我将向您展示如何从代码追溯到模型,又从模型追溯到代码。
使用生成的HDL代码,您可以使用支持第三方合成工具的HDL工作流顾问进行合成,或者您可以使用您选择的合成工具。使用HDL工作流,该工具创建必要的文件和文件夹,并在后台运行合成,此外还提供关于模型上关键计时路径的报告。该设计工作流使用户能够在更高的抽象级别上探索设计,并快速找到满足其目标的最佳硬件架构。其中一个客户OROLIA公司为国防和空间应用提供定位、导航和授时(PNT)解决方案,必须为他们的第二代信标开发接收器硬件。在此之前,他们使用模拟设计,在设计和实现数字接收器方面几乎没有经验。利用MATLAB和Simulink设计了专用的SDR,并在模拟器件射频系统的模块上实现了设计。利用HDL编码器生成可合成的HDL。这使得工程师能够专注于智能算法的设计,通过采用这种设计方法,工程师能够将开发时间缩短8个月,并将FPGA实现时间减少50%。
使用HDL Coder,我们可以将我们的MATLAB算法和系统设计连接到FPGA原型硬件。使用HDL Coder,您可以从MATLAB函数、Simulink模型和状态流图生成可合成的VHDL或Verilog。花时间在Simulink中构建基于样本的模型,添加硬件架构,转换为定点,并根据黄金参考验证每个步骤,让您控制资源利用,并在系统化步骤中针对FPGA上的算法。生成的HDL代码是独立于目标的和可移植的,如果您必须在另一个设备上尝试代码,您可以这样做。
我希望大家对我们今天讨论和展示的内容感兴趣。要了解更多信息,请使用以下资源链接,其中提供了关于验证代码、定点转换等主题的信息,我还鼓励您尝试MathWorks文件交换上的HDL自我指导教程。如果您对评估HDL Coder工具感兴趣,并希望开始访问我们的入门页面或与您的MathWorks销售联系人联系。
谢谢大家的聆听,现在我们可以用剩下的时间回答关于讨论主题的问题。
了解更多
您也可以从以下列表中选择网站:
如何获得最佳的网站性能
选择中国网站(中文或英文)以获得最佳的网站表现。其他MathWorks国家网站没有针对从您的位置访问进行优化。