当前位置: 首页 > news >正文

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!”程序。

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

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

相关文章:

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

本文使用 DDS 生成三个信号,并在 Vivado 中实现低通滤波器。低通滤波器将滤除相关信号。 介绍 用DDS生成三个信号,并在Vivado中实现低通滤波器。低通滤波器将滤除较快的信号。 本文分为几个主要部分: 信号生成:展示如何使用DDS&am…...

记录此刻:历时两月,初步实现基于FPGA的NVMe SSD固态硬盘存储控制器设计!

背景 为满足实验室横向项目需求,在2024年12月中下旬导师提出基于FPGA的NVMe SSD控制器研发项目。项目核心目标为:通过PCIe 3.0 x4接口实现单盘3000MB/s的持续读取速率。 实现过程 调研 花了半个月的时间查阅了一些使用FPGA实现NVME SSD控制器的论文、…...

【计算机网络】OSI模型、TCP/IP模型、路由器、集线器、交换机

一、计算机网络分层结构 计算机网络分层结构 指将计算机网络的功能划分为多个层次,每个层次都有其特定的功能和协议,并且层次之间通过接口进行通信。 分层设计的优势: 模块化:各层独立发展(如IPv4→IPv6&#xff0c…...

正点原子[第三期]Arm(iMX6U)Linux系统移植和根文件系统构建-5.3 xxx_defconfig过程

前言: 本文是根据哔哩哔哩网站上“arm(iMX6U)Linux系统移植和根文件系统构键篇”视频的学习笔记,在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。 引用: …...

250223-Linux/MacOS如何跳过Miniconda的条款阅读,直接安装Miniconda

你可以通过将 -b 参数传递给 Miniconda 的安装脚本,来跳过条款阅读并自动同意许可条款。这样安装会自动进行到下一步的选择项。下面是具体的安装命令: bash Miniconda3-latest-Linux-x86_64.sh -b这里的 -b 代表“批量模式”(batch mode&…...

点云的几何特征

点云的几何特征是基于一个点周围的邻域对该点周围几何形状的描述。例如,位于墙面上的一个点将具有较高的平面度planarity。 基于局部点云的特征值 λ1、λ2 和 λ3 以及特征向量 e1、e2 和e3计算得到的一系列几何特征,这些特征用于描述点云中点的局部几…...

月之暗面新发布: MUON 在 LLM 训练中的可扩展性

MUON 在 LLM 训练中的可扩展性 摘要 最近,基于矩阵正交化的 Muon 优化器(K. Jordan 等人,2024 年)在训练小型语言模型方面表现出色,但其在更大规模模型上的可扩展性尚未得到验证。我们确定了 Muon 放大的两个关键技术…...

10.Docker 仓库管理

Docker 仓库管理 Docker 仓库管理 Docker 仓库管理 Docker 仓库,类似于 yum 仓库,是用来保存镜像的仓库。为了方便的管理和使用 docker 镜像,可以将镜像集中保存至 Docker 仓库中,将制作好的镜像 push 到仓库集中保存,在需要镜像…...

Deepseek存算分离安全部署手册

Deepseek大火后,很多文章教大家部署Dfiy和ollamadeepseek,但是大部分都忽略了数据安全问题,本文重点介绍Deepseek存算分裂安全架设,GPU云主机只负责计算、CPU本地主机负责数据存储,确保数据不上云,保证私有…...

【Redis原理】底层数据结构 五种数据类型

文章目录 动态字符串SDS(simple dynamic string )SDS结构定义SDS动态扩容 IntSetIntSet 结构定义IntSet的升级 DictDict结构定义Dict的扩容Dict的收缩Dict 的rehash ZipListZipListEntryencoding 编码字符串整数 ZipList的连锁更新问题 QuickListQuickList源码 SkipListRedisOb…...

Java——抽象类

在Java中,抽象类(Abstract Class) 是一种特殊的类,用于定义部分实现的类结构,同时允许子类提供具体的实现。抽象类通常用于定义通用的行为或属性,而将具体的实现细节留给子类。 1. 抽象类的定义 语法&…...

DeepSeek在初创企业、教育和数字营销领域应用思考

如今,像 DeepSeek 这样的人工智能工具正在改变企业的运营方式,优化流程并显著提高生产力。通过重复任务的自动化、大量数据的分析以及内容创建效率的提高,组织正在寻找新的竞争和卓越方式。本文介绍了 DeepSeek 如何用于提高三个关键领域的生…...

java开发——为什么要使用动态代理?

举个例子:假如有一个杀手专杀男的,不杀女的。代码如下: public interface Killer {void kill(String name, String sex);void watch(String name); }public class ManKiller implements Killer {Overridepublic void kill(String name, Stri…...

c++中,什么时候应该使用mutable关键字?

在 C 中,mutable 关键字用于修饰类的成员变量,允许在 const 成员函数中修改这些变量。它的核心作用是区分 物理常量性(对象内存不可修改)和 逻辑常量性(对象对外表现的状态不变)。以下是详细解析&#xff1…...

deepseek本地部署,ragflow,docker

先下载ollama 1.官网下载 deepseek-r1:14bhttps://ollama.com/library/deepseek-r1:14b 2.GitHub下载GitHub - ollama/ollama: Get up and running with Llama 3.3, DeepSeek-R1, Phi-4, Gemma 2, and other large language models. 两种方式 安装完后,cmd-&g…...

智能优化算法:莲花算法(Lotus flower algorithm,LFA)介绍,提供MATLAB代码

一、 莲花算法 1.1 算法原理 莲花算法(Lotus flower algorithm,LFA)是一种受自然启发的优化算法,其灵感来源于莲花的自清洁特性和授粉过程。莲花的自清洁特性,即所谓的“莲花效应”,是由其叶片表面的微纳…...

通过AI辅助生成PPT (by quqi99)

作者:张华 发表于:2025-02-23 版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本版权声明(http://blog.csdn.net/quqi99) 问题 媳妇需要将一个pdf文件中的某些部分做成PPT课件,我在想是…...

P9631 [ICPC 2020 Nanjing R] Just Another Game of Stones Solution

Description 给定序列 a ( a 1 , a 2 , ⋯ , a n ) a(a_1,a_2,\cdots,a_n) a(a1​,a2​,⋯,an​),有 m m m 个操作分两种: chmax ⁡ ( l , r , k ) \operatorname{chmax}(l,r,k) chmax(l,r,k):对每个 i ∈ [ l , r ] i \in [l,r] i∈[l,…...

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

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

QEMU源码全解析 —— 内存虚拟化(18)

接前一篇文章:QEMU源码全解析 —— 内存虚拟化(17) 本文内容参考: 《趣谈Linux操作系统》 —— 刘超,极客时间 《QEMU/KVM源码解析与应用》 —— 李强,机械工业出版社 QEMU内存管理模型...

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造,完美适配AGV和无人叉车。同时,集成以太网与语音合成技术,为各类高级系统(如MES、调度系统、库位管理、立库等)提供高效便捷的语音交互体验。 L…...

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向: 逆向设计 通过神经网络快速预测微纳结构的光学响应,替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...

【入坑系列】TiDB 强制索引在不同库下不生效问题

文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...

最新SpringBoot+SpringCloud+Nacos微服务框架分享

文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的,根据Excel列的需求预估的工时直接打骨折,不要问我为什么,主要…...

Nginx server_name 配置说明

Nginx 是一个高性能的反向代理和负载均衡服务器,其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机(Virtual Host)。 1. 简介 Nginx 使用 server_name 指令来确定…...

C++ 基础特性深度解析

目录 引言 一、命名空间(namespace) C 中的命名空间​ 与 C 语言的对比​ 二、缺省参数​ C 中的缺省参数​ 与 C 语言的对比​ 三、引用(reference)​ C 中的引用​ 与 C 语言的对比​ 四、inline(内联函数…...

Rust 异步编程

Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)

UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化&#xf…...

Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战

说明:这是一个机器学习实战项目(附带数据代码文档),如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下,风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...

pikachu靶场通关笔记19 SQL注入02-字符型注入(GET)

目录 一、SQL注入 二、字符型SQL注入 三、字符型注入与数字型注入 四、源码分析 五、渗透实战 1、渗透准备 2、SQL注入探测 (1)输入单引号 (2)万能注入语句 3、获取回显列orderby 4、获取数据库名database 5、获取表名…...