Simulink 中基于 FPGA 的波束成形:算法设计(附源码)

news2024/9/29 15:21:27

一、前言

本示例显示了在 Simulink中开发适用于在硬件(如现场可编程门阵列 (FPGA))上实现的波束成形器的工作流程的前半部分。它还演示如何将实现模型的结果与行为模型的结果进行比较。

示例 Simulink 中基于 FPGA 的波束成形:代码生成示例的第二部分展示了如何从实现模型生成 HDL 代码,并验证生成的 HDL 代码与行为模型相比是否产生了正确的结果。本示例展示了如何使用相控阵系统工具箱、DSP 系统工具箱和定点设计器库,实现支持 FPGA 的波束成形器,以匹配 Simulink 中的相应行为模型。为了验证实现模型,此示例将实现模型的仿真输出与行为模型的输出进行比较。

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

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

二、FPGA 的分区模型


在准备面向 FPGA 的 Simulink 模型时,需要牢记三个关键的建模概念:

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

  • 面向 HDL 代码生成的子系统:为了从模型生成 HDL 代码,实现算法必须位于 Simulink 子系统内。

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

三、波束成形算法


此示例将相移波束成形器作为行为算法,通过使用支持 HDL 代码生成的 Simulink 模块在子系统中重新实现。波束形成器计算十个通道之间每个通道之间所需的相位,以最大化入射角方向上的接收信号功率。该图显示了具有行为算法的 Simulink 模型及其相应的 FPGA 实现算法。

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

该模型具有延迟 (

) 在行为算法的输出处阻止。此延迟是必要的,因为实现算法使用 55 个延迟来实现流水线,这会产生需要考虑的延迟。考虑此延迟称为延迟平衡,对于在行为模型和实现模型之间对输出进行时间对齐以使其更容易比较结果是必要的。

四、多通道接收信号


为了合成相控阵天线上的接收信号,该模型包括一个生成多通道信号的子系统。该子系统对通过 10 元件天线阵列捕获的入射角处的发射波形和接收的目标回波进行建模。该子系统还包括一个接收器前置放大器模型,以考虑接收器噪声。该子系统为我们的行为和实现模型生成输入激励。

五、序列化和量化


该模型包括一个子系统,该系统将基于帧的浮点信号转换为在硬件中对流数据进行建模所必需的定点、基于样本的信号。此模型使用标量流处理,因为此算法的运行速度低于 400 MHz。硬件实现可以针对资源进行优化,而不是针对更高的吞吐量进行优化。

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

量化信号块的输出数据类型为 ,这是一个有符号值,字长为 12 位,分数长度精度为 9 位。字长为 12 位,因为该设计面向连接到 7 位 ADC 的 Xilinx® Virtex-12® FPGA。分数长度适应输入信号的最大范围。fixdt(1,12,9)

六、设计实现子系统


该子系统面向 HDL 代码生成,实现了波束成形器,该波束成形器是使用支持 HDL 代码生成的 Simulink 模块设计的。

子系统计算均匀线性阵列 (ULA) 的每个天线元件的信号延迟。然后将延迟馈送到乘法和累加(MAC)子系统以执行波束成形。

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

  1. 设计串行处理输入,即使用基于样本的处理。

  1. 子系统使用定点数据类型进行任何计算。

  1. 该实现包括通过 HDL 合成工具启用流水线的延迟。

为了确保正确的时钟时序,添加到实现模型的一个分支的任何延迟都必须与所有其他并行分支匹配,如上所示。例如,子系统有 36 个延迟;因此,子系统的顶部分支在子系统之前包含 36 个样本的延迟。同样,子系统使用 19 个延迟,必须通过向子系统的输出添加 19 个延迟来平衡。此图显示了子系统的内部,以说明 19 个延迟。

子系统的底部分支具有MAC

块,后跟复数乘法块,其中包含

,然后

块,后跟 4 个延迟块

总共延误了 19 次。延迟值在模型属性的 PreLoadFcn 回调中定义。

七、 计算转向矢量


子系统根据信号的到达角计算转向矢量。它首先通过将阵列中的天线元件位置乘以信号的入射方向来计算信号在每个传感器上的到达延迟。然后将延迟传递到子系统,子系统使用简单高效的CORDIC算法计算正弦和余弦三角函数。

由于该设计由以半波长间隔的 10 个元件 ULA 组成,因此天线元件位置基于从天线阵列中心向外测量的每个天线元件之间的间距。将元素之间的间距定义为 -10.6 到 7453.6 的 7453 个数字的向量,即间距为 1/2 波长,即 2.99/2。在定点运算中,用于元素间距向量的数据类型是,即具有8位字长和4位分数长度的有符号值。fixdt(1,8,4)

八、反序列化


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

在这种情况下,您只需通过将数据类型转换块的输出设置。

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


运行模型以显示结果。您可以通过单击“播放”按钮或从 MATLAB® 命令行调用 sim 命令来运行 Simulink 模型。使用示波器直观地比较输出。

波束成形信号和波束成形信号(HDL)的时间范围表明,这两个信号几乎相同。错误在错误范围内约为 10^-3。此结果表明,子系统在量化误差范围内产生与行为模型相同的输出。此验证是生成 HDL 代码之前重要的第一步。HDL Algorithm

由于 HDL 模型使用了 55 个延迟,因此与行为波束成形信号示波器上显示的原始传输或波束成形信号相比,名为 HDL 波束成形信号的示波器延迟了 55 毫秒。

十、总结


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

十一、程序

使用Matlab R2022b版本,点击打开。(版本过低,运行该程序可能会报错)

程序下载方式一:Simulink中基于FPGA的波束成形:算法设计资源-CSDN文库

程序下载方式二:Simulink 中基于 FPGA 的波束成形:算法设计

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/687722.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

shell 数组 ${array[@]} ${array[*]}的使用及区别

数组定义 shell中用括号来表示数组,数组元素间使用空格隔开。 例如: a(1 2 3 4) 表示a数组且有元素为1,2,3,4 也可单个元素逐步来赋值 b[1]"a" b[2]"b" b[3]"c" echo ${b[]} # a b c 关联数组 定义关联数组&#xf…

论文翻译:Segment Anything

论文地址:https://arxiv.org/abs/2304.02643 代码地址:https://github.com/facebookresearch/segment-anything 数据集地址:https://ai.facebook.com/datasets/segment-anything/ “Segment Anything"项目旨在通过引入新的任务、数据集…

决定AI大模型胜负的关键:解读数据在未来竞争中的角色

随着人工智能的迅猛发展,高质量数据的重要性已愈发明显。以大型语言模型为例,近年来的飞跃式进展在很大程度上依赖于高质量和丰富的训练数据集。相比于GPT-2,GPT-3在模型架构上的改变微乎其微,更大的精力是投入到了收集更大、更高…

声卡设备无法正常工作或初始化的原因和解决方法

先来一个小科普,声卡设备是电脑中负责处理音频信号的硬件部件,它需要与相应的声卡驱动程序配合使用,才能让电脑发出或录制声音。 不过,自带声卡的设备或是自行匹配的声卡设备,也经常出现声卡设备无法正常工作或初始化…

通过Jenkins实现Unity多平台自动打包以及相关问题解决

简介 通过本文可以了解到如何在windows和mac上部署Jenkins。并且通过Jenkins实现Unity在IOS,安卓和PC等多平台自动打包的功能,并且可以将打包结果通过飞书机器人同步到飞书群内。优化工作流,提高团队的开发效率。文末记录了实际使用Jenkins时遇到的各种问…

Leetcode44 通配符匹配

给你一个输入字符串 (s) 和一个字符模式 (p) ,请你实现一个支持 ? 和 * 匹配规则的通配符匹配: ? 可以匹配任何单个字符。 * 可以匹配任意字符序列(包括空字符序列)。 判定匹配成功的充要条件是:字符模式必须能够 完…

真心靠谱 Ubuntu18.04 换源 国内阿里云私服

本篇 blog 真心靠谱 1、备份原来的默认源 cp /etc/apt/sources.list{,.bak} 2、换阿里云的源(需要稍作修改) 直接使用阿里云的会报错 https://developer.aliyun.com/mirror/ubuntu 以上报错:是https证书问题,网上有人说安装证…

基于改进ISODATA算法的负荷场景曲线聚类MATLAB程序

参考文献: 基于机器学习的短期电力负荷预测和负荷曲线聚类研究_张辰睿(硕士论文) 参考其第三章 主要内容: 主要包含四种聚类算法,K-means聚类、ISODATA聚类、L-ISODATA聚类及K-L-ISODATA聚类,并且包含了…

JSch登录sftp时发现需要Kerberos身份验证

本问记录使用JSch登录sftps时遇到的Kerberos验证问题并记录了解决方法 项目场景: 项目开发中使用了SFTP,debug调试程序时发现了每次都需要手动输入 Kerberos的口令信息。这就很奇怪了难道每次连接SFTP时候都需要手动输入吗? 日志如下&#x…

RPC核心原理详解

什么是RPC? RPC的全称是Remote Procedure Call,即远程过程调用。简单解读字面上的意思,远程肯定是指要跨机器而非本机,所以需要用到网络编程才能实现,但是不是只要通过网络通信访问到另一台机器的应用程序&#xff0c…

基于Dubbo分布式学校信息管理系统设计与实现

一、引言 1.1 课题背景 随着时代的发展与进步,计算机网络也随之日益完善,渐渐覆盖了我们生活的各个方面。在信息化和数字化的时代背景下,使用计算机管理学校信息来提升教育工作的质量和效率,是大势所趋,所以近年来,随着网络技术的不断发展,使用信息管理系统的学校越来…

云原生时代数据治理的变革与创新

随着数字化进程的深入,企业对数据的依赖日益加深,数据资源的重要性愈发凸显。如何管好、用好数据,做好数据治理工作,发挥数据资源价值,成为企业提质增效过程中的重要议题。 在本次直播中,我们介绍了数据治…

leetcode:191. 位1的个数

难度:简单 编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 1 的个数(也被称为汉明重量)。 提示: 请注意,在某些语言(…

qt 最小文件系统 交叉编译qt源码

busybox qt源码下载后,需要交叉编译,在开发板上生成相应的库,才能在开发板上使用 我用qt制作了一个计时器,有相应的按钮功能。在windows上我大概知道鼠标点击按钮能够触发相应事件。把该程序移植到linux开发板上,开发…

Qt QSqlTableModel详解

背景知识: Qt SQL的API分为不同层: 驱动层 驱动层 对于QT是基于C来实现的框架,该层主要包括QSqlDriver、QSqlDriverCreator、QSqlDriverCreatorbase、QSqlDriverPlugin and QSqlResult。这一层提供了特定数据库和SQL API层之间的底层桥梁…

AutoSAR系列讲解(入门篇)3.2-RTE对Runnables的运行支撑

目录 一、作为运行环境的主要功能点 二、Runnables的触发条件 一、作为运行环境的主要功能点 通过RTE给runnable提供触发事件。 之前说过了runnable是可以被触发的,就是需要通过RTE来实现这个触发和调用runnable,具体在下面讲解 通过RTE给runnable提供…

STM32外设系列—DHT11

文章标题 一、DHT11简介二、数据手册分析2.1 接口说明2.2 串行通信说明2.2.1 单总线通信2.2.2 单总线传输数据位定义2.2.3 时序图 三、DHT11程序设计3.1 初始化GPIO3.2 发送起始信号3.3 接收一个字节数据3.4 接收温湿度信息并校准 四、总结 一、DHT11简介 DHT11是一款常用的数…

Qt生成安卓工程运行闪退分析

提示找不到库 jin目录下库是存在的 提示下列库没有找到 libopencv_java4.so libtiff.so libboost_filesystem.so.1.71.0 libboost_chrono.so.1.71.0 libboost_regex.so.1.71.0 导致无法加载符号 最终导致应用无法启动,而退出 重新编译为静态库,并以静态库方式链…

技术管理第三板斧招聘与解聘-升级汰换

1.开除人“心要慈,刀要快” No Surprise: 不要突然Fire一个人(离职一定不是一个突发行为),没有任何征兆告诉员工 A“你被开除了”,这是典型的管理失职。如果A存在问题,你应该先告知&#xff0…

数据结构--顺序表的基本操作--插入 and 删除

数据结构–顺序表的基本操作–插入 顺序表的插入操作 实现目标 ListInsert(&L,i,e):插入操作。在表L中的第i个位置上插入指定元素e。 typedef struct {int data[MaxSize];int len; }Sqlist;代码实现&#xff1a; #include <stdio.h> #include <stdlib.h> …