主要内容

Simulink中基于FPGA的波束形成:第1部分-金宝app算法设计

本教程是两部分系列的第一部分,将指导您如何在Simulink®中开发适合在硬件上实现的波束形成器,例如现场可编程门阵列(FPGA)。金宝app它还将展示如何比较实现模型的结果与行为模型的结果。教程的第二部分Simulink中基于FPGA的波束形成:第2部分-金宝app代码生成演示如何从实现模型生成HDL代码,并验证生成的HDL代码与行为模型相比产生了正确的结果。

本教程展示了如何使用相控阵系统工具箱™、DSP系统工具箱™和定点设计器™在Simulink®中设计一个可用于FPGA实现的波束形成器,以匹配相应的行为模型。金宝app为了验证实现模型,它将实现模型的仿真输出与行为模型的输出进行比较。

使用相控阵系统工具箱™设计并验证了浮点函数算法,提供了行为参考模型。然后使用行为模型验证用于生成HDL代码的定点实现模型的结果。

定点设计器(Fixed-Point Designer™)提供用于开发定点和单精度算法的数据类型和工具,以优化嵌入式硬件的性能。您可以执行位真模拟来观察有限范围和精度的影响,而无需在硬件上实现设计。

FPGA分区模型

在准备以fpga为目标的Simulink®模型时,需要记住三个关键的建模概念:金宝app

  • 纸浆包处理:通常也称为串行处理,是硬件设计中的一种有效的数据处理技术,使您能够在资源和吞吐量之间进行权衡。

  • 针对HDL代码生成的子系统:为了从模型中生成HDL代码,实现算法必须在Simulink子系统中。金宝app

  • 行为和实现模型的时间对齐输出:为了比较行为模型和FPGA实现模型的输出,必须通过向行为模型添加延迟来调整它们的输出。

波束形成算法

在本例中,我们使用相移波束形成器作为行为算法,它在HDL算法子系统中使用支持HDL代码生成的Simulink块重新实现。金宝app金宝app波束形成器的工作是计算十个通道之间所需的相位,以使接收到的信号功率在入射角方向上达到最大。下面是Simulink模型金宝app和行为算法以及相应的FPGA实现算法。

modelname =“金宝appSimulinkBeamformingHDLWorkflowExample”;open_system (modelname);确保模型是可见的,没有被范围阻碍。。open_system (modelname);集(allchild (0)“可见”“关闭”);

Simu金宝applink模型有两个分支。顶部分支是我们算法的行为的浮点模型,底部分支是使用支持HDL代码生成的块的功能等效的定点版本。金宝app除了绘制两个分支的输出来比较两者之外,我们还计算并绘制两个输出之间的差异或误差。

注意有一个延迟(美元Z ^ {-55} $)作为行为模型的输出。这是必要的,因为实现算法使用55个延迟来启用管道,这会产生需要考虑的延迟。考虑这种延迟被称为延迟平衡,对于行为模型和实现模型之间的输出进行时间对齐是必要的,以便更容易地比较结果。

多路接收信号

为了综合相控阵天线接收到的信号,该模型包括一个产生多通道信号的子系统。基带多通道信号子系统模拟发射波形和接收到的目标回波在入射角通过一个10元天线阵列捕获。该子系统还包括一个接收机前置放大器模型,以考虑接收机噪声。这个子系统为我们的行为和实现模型生成输入刺激。

打开产生接收到的多路信号的子系统。open_system ([modelname/基带多路信号]);

序列化和量化

该模型包括一个序列化和量化子系统,它将浮点、基于帧的信号转换为硬件流数据建模所需的定点、基于样本的信号。选择基于样本的处理是因为我们的系统运行速度低于400 MHz;因此,我们正在优化资源而不是吞吐量。

对接收到的信号进行序列化和量化的开放子系统。open_system ([modelname“/序列化和量化”]);set_param (modelname“SimulationCommand”“更新”

串行子系统的输入信号有10个通道,每个通道有300个样本或一个300x10大小的信号。子系统序列化或取消缓冲信号,产生一个基于采样的信号,该信号为1x10,即每个通道一个样本,然后将其量化以满足我们系统的要求。

量化信号块的输出数据类型设置为:

  • 输出数据类型= fixdt(1、12、19)

这是一个带符号的12位字长和19位分数长度精度。之所以选择这个精度,是因为我们的目标是连接到12位ADC的Xilinx®Virtex®-7 FPGA。分数长度的选择是为了适应输入信号的最大范围。

设计实现子系统

以HDL代码生成为目标的HDL算法子系统实现了波束形成器,波束形成器是使用支持HDL代码生成的Simulink块设计的。金宝app金宝app

Angle2SteeringVec子系统计算均匀线性阵列(ULA)各天线单元的信号延迟。然后将延迟馈送到乘法累积(MAC)子系统执行波束形成。

用HDL算法打开子系统。open_system ([modelname“/ HDL算法”]);

HDL算法子系统中的算法在功能上等同于相移波束形成行为算法,但可以生成HDL代码。有三个主要的区别使这个子系统能够生成高效的HDL代码:

  1. 处理是连续进行的,即使用基于样本的处理

  2. 算术是用定点数据类型执行的

  3. 延迟被添加,以支持HDL合成工具的流水线

为了确保正确的时钟计时,添加到实现模型的一个分支的任何延迟都必须匹配到所有其他并行分支,如上所示。例如,Angle2SteeringVec子系统增加了36个延迟;因此,HDL算法子系统的顶部分支在MAC子系统之前包含36个样本的延迟。同样,MAC子系统使用了19个延迟,这必须通过向Angle2SteeringVec子系统的输出添加19个延迟来平衡。让我们看看MAC子系统内部,以解释这19个延迟。

打开MAC子系统。open_system ([modelname' / HDL算法/ MAC ']);set_param (modelname“SimulationCommand”“更新”

看看MAC子系统的最下面的分支,我们看到一个美元Z ^ {2} $,后面跟着复杂的乘法块,其中包含美元Z ^ {1} $,然后有一个美元Z ^ {4} $的4个延迟块美元Z ^ {3} $总共有19次延误。延迟值在模型属性中的PreLoadFcn回调中定义。

转向矢量计算

Angle2SteeringVec子系统将任务分解为几个步骤,从信号的到达角度计算转向矢量。它首先通过矩阵将天线单元在阵列中的位置乘以信号的入射方向来计算信号在每个传感器上的到达延迟。然后,延迟被馈送到SinCos子系统,该子系统使用简单有效的CORDIC算法计算三角函数正弦和余弦。

打开Angle2SteeringVec子系统。open_system ([modelname“/ HDL算法/ Angle2SteeringVec”]);

由于我们的设计由一个间隔在半波长处的10个单元ULA组成,天线单元的位置是基于从天线阵列中心向外测量的每个天线单元之间的间距。我们可以将元素之间的间距定义为从-6.7453到6.7453的10个数字的向量,即间隔为1/2波长,即2.99/2。假设我们使用的是定点算术,元素间距向量使用的数据类型是fixdt(1,8,4),即一个带符号的8位字长和4位分数长数值数据类型。

反序列化

要比较基于样本的定点实现设计和基于浮点帧的行为设计,您需要反序列化实现子系统的输出并将其转换为浮点数据类型。或者,您可以直接将结果与基于样本的信号进行比较,但随后必须取消缓冲行为模型的输出,如下所示:

以匹配样本为基础的信号输出实现算法。在这种情况下,只需将Data Type Conversion块的输出数据类型设置为double,就可以将HDL Algorithm子系统的输出转换为浮点数。

HDL模型与行为模型输出的比较

运行模型以显示结果。您可以通过单击Play按钮或在M金宝appATLAB命令行中调用sim命令来运行Simulink模型。使用作用域来直观地比较输出。

sim (modelname);

在显示波束形成信号和波束形成信号(HDL)的时间范围中可以看到,这两个信号几乎完全相同。我们可以在error范围内看到10^-3量级的误差。这表明HDL算法子系统在量化误差范围内产生了与行为模型相同的结果。这是生成HDL代码之前重要的第一步。

由于HDL模型使用了55个延迟,与行为波束形成信号作用域上显示的原始传输或波束形成信号相比,标题为HDL波束形成信号的作用域延迟了55ms。

总结

本示例是关于如何设计FPGA可实现算法、自动生成HDL代码以及在Simulink中验证HDL代码的两部分系列教程的第一部分。金宝app这个例子展示了如何使用相控阵系统工具箱中的块来创建一个行为模型,作为一个黄金参考,以及如何使用支持HDL代码生成的Simulink块创建一个子系统来实现。金宝app金宝app并将实现模型的输出与相应行为模型的输出进行比较,验证两种算法在功能上是等价的。

一旦您验证了您的实现算法在功能上等同于您的黄金参考,您就可以使用HDL Coder™用于从Simulink生成HDL代码金宝app(高密度脂蛋白编码器)和HDL验证器™生成一个共同仿真模型(高密度脂蛋白编码器)试验台。

这是本系列教程的第2部分Simulink中基于FPGA的波束形成:第2部分-金宝app代码生成演示了如何从实现模型生成HDL代码,并验证生成的HDL代码产生与浮点行为模型和定点实现模型相同的结果。