FPGA DSP:Vivado 中带有 DDS 的 FIR 滤波器

本文使用 DDS 生成三个信号,并在 Vivado 中实现低通滤波器。低通滤波器将滤除相关信号。

介绍

用DDS生成三个信号,并在Vivado中实现低通滤波器。低通滤波器将滤除较快的信号。

本文分为几个主要部分:

  • 信号生成:展示如何使用DDS(直接数字合成)IP生成测试信号 - 10 MHz 信号和 500 kHz 信号,然后将它们组合起来创建混合信号进行测试。

  • FIR 滤波器设计:解释影响 FIR 滤波器性能的关键因素,包括:

  • 抽头数量及其对滤波器响应的影响

  • 量化和系数位宽设计

  • 权衡资源利用

  • 设计:演示使用 Vivado 进行设计,包括

设置FIR IP

使用 MATLAB 生成的系数配置滤波器参数

设置适当的位宽和时钟频率

添加必要的组件,如时钟源和 ILA(集成逻辑分析仪)

  • 测试和验证:显示如何通过以下方式验证滤波器的操作:

仿真结果显示高频分量的滤波

FPGA 板上的硬件实现

使用基于计数器的脉冲发生器观察滤波器脉冲响应的特殊技术

第 1 部分:DDS 设置,用于生成两个信号和混合信号

首先为测试台生成信号:

在BD设计中添加 DDS IP。在配置选项卡中,将系统时钟设置为 100 MHz。

由于我们只需要生成正弦波,因此在Implementation选项卡中,选择输出为Sine选项,并取消选择相位输出选项。在Output Frequency选项卡中,将Channel 1的频率设置为 500 kHz。

在BD设计中添加另一个 DDS IP。重复相同的设置,但这次将输出频率设置为 10 MHz。

在BD设计中添加一个加法器。将其输入位宽设置为 8,将其输出位宽设置为 9。

将两个 DDS 编译器的输出连接到加法器的输入。这将生成混合信号。

在设计中添加一个模拟时钟发生器,并将其频率设置为 100MHz。该频率也是设计的采样率

DDS编译器仿真结果:

如仿真结果所示:

第一个正弦波的周期为 2000 ns,这是一个 500 kHz 的信号。

第二个正弦波的周期为 100 ns,这是一个 10 MHz 信号。

还可以观察混合信号,其中较快信号的幅度以较慢信号的频率波动,从而显示了两个频率的组合。

Vivado FIR 滤波器仿真

FIR 滤波器配置:FIR 滤波器的性能受几个因素影响:

  • 抽头数量:

增加抽头数量可改善滤波器响应,从而使通带更平坦,波纹更少,振铃减少。

更多的抽头数还会增强截止频率的衰减,从而提高滤波器的精度。 然而,更多的抽头会引入更大的延迟,这可能不适合某些 DSP 系统。

不同抽头数的FIR滤波器响应比较
  • 量化和滤波器系数位宽:

量化-通过将数字映射到由分配的位宽决定的一组固定的离散值来降低数字的精度。

使用较少的位数进行量化会降低滤波器系数的准确性,从而对滤波器的性能产生负面影响。

  • 资源权衡:

滤波器性能和 FPGA 资源利用率之间存在权衡。

增加抽头数量或系数的位宽需要更多的 DSP 资源,这可能会消耗 FPGA 很多资源。

两种不同FIR滤波器所需的FPGA资源

通过平衡这些因素,可以优化 FIR 滤波器以满足应用程序的特定要求。

在 Matlab 中生成量化 FIR 滤波器抽头

为了简化工作,提供了一个可以轻松生成量化 FIR 滤波器的 Matalab 代码,可以在 Vivado 中直接使用它:

close all
clear all
clc
%% setup the parameters here
Sample_Rate = 50e6;
cutoff_frequency = 5e6;
number_of_filter_taps = 191;% must be odd number!
filter_taps_bitwidth = 10;
lowpass_highpass = 'low'; % should be low or high
%% Caluculate the taps
Nyquist_frequency =Sample_Rate/2 ;
Wn = cutoff_frequency/(Nyquist_frequency);
%Generate a row vector b containing the n+1 coefficients 
filter_taps = fir1(number_of_filter_taps-1,Wn,lowpass_highpass);
%% Quantization 
% one bit for sign
filter_taps=floor(filter_taps/max(filter_taps)*(2^(filter_taps_bitwidth-1)-1));
%% plot the filter response
N = 1024; % Number of points for the frequency response
[H, f] = freqz(filter_taps, 1, N, Sample_Rate); % Calculate the frequency response
% Magnitude and phase response
magnitude = abs(H); % Magnitude response% Plot the filter response
% Magnitude response plot
figure;
plot(f, 20*log10(magnitude),'linewidth',1.3); % Plot magnitude in dB
grid on;
title('Magnitude Response (dB)',FontSize=22);
xlabel_txt = 'Frequency (Hz)';
xlabel(xlabel_txt,FontSize=22);
ylabel('Magnitude (dB)',FontSize=22);
%xlim([0 30e6])
figurefreqz(filter_taps,1)
figure
stem(filter_taps,'linewidth', 1.3)
grid on;

在提供的Matlab代码中,需要配置以下参数:

  • 采样率: 这是采样频率,在我们的设计中它对应于驱动系统的时钟频率。

  • 截止频率: 指定滤波器的截止频率。

  • 抽头数: 设置滤波器的抽头数,决定滤波器的精度和性能。

  • 抽头位宽: 定义滤波器系数的位宽,影响量化精度。

  • 滤波器类型: 选择需要的滤波器类型。此代码目前仅支持高通和低通滤波器。

Vivado 中的 FIR 编译器 IP 设置:

借助 Matlab 代码,生成截止频率为 1MHz、量化为 16 位的 21 个滤波器抽头。需要进行少许修改才能使生成的值在 Vivado 中可用。

复制 FIR 滤波器抽头并将其粘贴到“滤波器选项”选项卡 下的“系数向量”字段中。

请注意,一旦更新滤波器系数,实施选项卡中的输出宽度将自动调整。

在“通道规范”选项卡中,设置采样率和时钟频率匹配连接到 FIR 滤波器的时钟。在本教程中,我们使用 100 MHz 时钟。

在“实施”选项卡中,配置“输入位宽”以匹配输入信号的位宽。例如,由于此设计中加法器的输出有 9 位,因此将输入位宽设置为 9。

这样FIR 滤波器现已配置完毕并可以使用。

请注意,FIR 滤波器的输入和输出位宽与正确的字节数对齐。例如,当我们将输入位宽设置为 9 位时,滤波器的实际输入位宽会调整为 2 个字节(16 位)。

仿真结果

仿真就会观察到 FIR 滤波器表现为低通滤波器,衰减频率更高的信号。

Vivado 综合

上诉设计都是可综合的,在系统内为设计添加时钟后就可以进行综合和实现了。

最后,需要在设计中加入一个 ILA 来监控和研究目标信号。移除所有额外的端口,并将它们连接到 ILA。

使用上面的架构需要使用SDK或者Vitis运行一个简单的“HelloWorld!”程序。

如果使用板载时钟就按照需求进行修改。

运行后,应该能看到与仿真相同的结果:

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

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

相关文章

MessageAuthenticator

MessageAuthenticator https://coova.github.io/JRadius/ https://coova.github.io/JRadius/ import org.tinyradius.packet.RadiusPacket; import org.tinyradius.util.RadiusUtil; import java.nio.charset.StandardCharsets;public class RadiusAuthUtils {/*** 生成 RADI…

Spring Boot嵌入式服务器深度解析:从配置到调优的全方位指南

文章目录 引言一、嵌入式服务器核心原理1.1 架构设计特点1.2 主流服务器对比 二、嵌入式服务器配置实战2.1 基础配置模板2.2 HTTPS安全配置 三、高级调优策略3.1 线程池优化(Tomcat示例)3.2 响应压缩配置3.3 访问日志配置 四、服务器切换实战4.1 切换至U…

基于CentOS7安装kubesphere和Kubernetes并接入外部ES收集日志

一、修改所有节点主机名 主节点就修改成master hostnamectl set-hostname master 然后输入bash刷新当前主机名 工作节点1就修改成node1 hostnamectl set-hostname node1 然后输入bash刷新当前主机名 二、全部节点安装依赖并同步时间 yum -y install socat conntrack ebta…

探索与Cursor协作创建一个完整的前后端分离的项目的最佳实践

探索与Cursor协作创建一个完整的前后端分离的项目的最佳实践 Cursor简介 Cursor在目前代表了AI编程技术的顶峰。在一定程度上可以说是当今AI时代的最强生产力代表。为此,不惜重金开了年费会员来紧跟时代步伐。当然cline、roo code、trae等开源或者免费产品也在紧追不舍。 C…

支持向量机(SVM)在 NLP 中的使用场景

支持向量机(Support Vector Machine, SVM)是一种强大的监督学习算法,广泛应用于分类任务中。由于其出色的分类性能和高效的计算特点,SVM 已经成为自然语言处理(NLP)领域中的一种经典模型。SVM 在 NLP 中的应用非常广泛,尤其在文本分类任务中,表现出色。 本文将探讨 SV…

nodejs:vue 3 + vite 作为前端,将 html 填入<iframe>,在线查询英汉词典

向 doubao.com/chat/ 提问: node.js js-mdict 作为后端,vue 3 vite 作为前端,编写在线查询英汉词典 后端部分(express js-mdict ) 详见上一篇:nodejs:express js-mdict 作为后端&#xff…

Jenkins 部署在 Mac 并在局域网内通过 ip 访问

Jenkins 部署在 Mac 并在局域网内通过 ip 访问 一、修改配置文件 打开文件 ~/Library/LaunchAgents/homebrew.mxcl.jenkins.plist 打开文件 /usr/local/opt/jenkins/homebrew.mxcl.jenkins.plist 两个文件目录不同&#xff0c;内容一样 <?xml version"1.0" e…

2通道12bit 10G USB高速示波器采集卡

概述 USB高速示波器采集卡 2通道&#xff0c;12位&#xff0c;10GSa/s 采样率 DC~2.5GHz 带宽 USB高速示波器采集卡是一款高速12bit多通道USB数字化仪它具有2通道10GSa/s采样率&#xff0c;模拟前端带宽从DC到2.5GHz&#xff0c;板载32GB DDR4存储&#xff0c;使其能够满足长…

Python|OpenCV-实现人物眨眼检测(21)

前言 本文是该专栏的第23篇,后面将持续分享OpenCV计算机视觉的干货知识,记得关注。 通过OpenCV库来实现人物的眨眼检测,首先是需要了解眨眼检测的基本原理。一般来说,是需要通过检测眼睛的状态,比如眼睛是否闭合来判断是否眨眼。对此,如果基于OpenCV,通过Python如何去实…

Qt | Excel创建、打开、读写、另存和关闭

01 如何在Qt中使用QXlsx库进行Excel文件的读写操作,包括创建新Excel、写入数据、读取数据以及文件保存和释放资源。通过实例展示了如何加载库、编写.h和.cpp文件,并演示了使用单元格引用和行列号进行数据操作的方法。 QXlsx是一个可以读写Excel文件的库。不依赖office以及…

AMBA-CHI协议详解(十九)

文章目录 4.6 Silent cache state transitions4.7 Cache state transitions at a Requester4.7.1 Read request transactions4.7.2 Dataless request transactions4.7.3 Write request transactions4.7.4 Atomic transactions4.7.5 Other request transactions4.6 Silent cache…

常见的“锁”有哪些?

悲观锁 悲观锁认为在并发环境中&#xff0c;数据随时可能被其他线程修改&#xff0c;因此在访问数据之前会先加锁&#xff0c;以防止其他线程对数据进行修改。常见的悲观锁实现有&#xff1a; 1.互斥锁 原理&#xff1a;互斥锁是一种最基本的锁类型&#xff0c;同一时间只允…

深入理解 Python 作用域:从基础到高级应用

在 Python 编程中&#xff0c;作用域是一个至关重要的概念&#xff0c;它决定了变量和函数的可见性与生命周期。正确理解和运用作用域规则&#xff0c;对于编写结构清晰、易于维护的代码起着关键作用。无论是简单的脚本还是复杂的大型项目&#xff0c;作用域都贯穿其中&#xf…

ubuntu磁盘清理垃圾文件

大头文件排查 #先查看是否是内存满了&#xff0c;USER 很高即是满了 du -f#抓大头思想&#xff0c;优先删除大文件#查看文件目录 内存占用量并排序&#xff0c;不断文件递归下去 du --max-depth1 -h /home/ -h | sort du --max-depth1 -h /home/big/ -h | sort 缓存文件清理…

ctf网络安全题库 ctf网络安全大赛答案

此题解仅为部分题解&#xff0c;包括&#xff1a; 【RE】&#xff1a;①Reverse_Checkin ②SimplePE ③EzGame 【Web】①f12 ②ezrunner 【Crypto】①MD5 ②password ③看我回旋踢 ④摩丝 【Misc】①爆爆爆爆 ②凯撒大帝的三个秘密 ③你才是职业选手 一、 Re ① Reverse Chec…

VSCode集成deepseek使用介绍(Visual Studio Code)

VSCode集成deepseek使用介绍&#xff08;Visual Studio Code&#xff09; 1. 简介 随着AI辅助编程工具的快速发展&#xff0c;VSCode作为一款轻量级、高度可扩展的代码编辑器&#xff0c;已成为开发者首选的工具之一。DeepSeek作为AI模型&#xff0c;结合Roo Code插件&#x…

git 常用功能

以下是 Git 的常用功能及其命令&#xff1a; 初始化仓库 git init在当前目录初始化一个新的 Git 仓库。 克隆仓库 git clone <仓库地址>将远程仓库克隆到本地。 查看状态 git status查看工作区和暂存区的状态。 添加文件到暂存区 git add <文件名>将文件添…

Unity 脚本控制3D人物模型的BlendShape

有些3D角色模型带有BlendShape面部控制, 在Unity中可以通过接口访问并操作其参数可以表现不同的面部表情 在Unity中选中角色模型的指定部位,这个是由模型师定义的,不固定.但肯定是在面部建模上. 点选之后在检查器可以看到对应的BlendShapes设定项出现在SkinedMeshRenderer组件…

vscode设置终端复制快捷键(有坑!!!)

vscode的编辑页面和终端的复制粘贴快捷键是不一样的。 vscode的终端复制快捷键为ctrlshiftC&#xff0c;当然&#xff0c;自己可以自定义设置 vscode设置终端复制快捷键&#xff08;有坑&#xff01;&#xff01;&#xff01;&#xff09;_vs code 不能复制-CSDN博客文章浏览…

Ansible 学习笔记

这里写自定义目录标题 基本架构文件结构安装查看版本 Ansible 配置相关文件主机清单写法 基本架构 Ansible 是基于Python实现的&#xff0c;默认使用22端口&#xff0c; 文件结构 安装 查看用什么语言写的用一下命令 查看版本 Ansible 配置相关文件 主机清单写法