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

news2025/2/24 7:53:16

本文使用 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])
figure
 freqz(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.coloradmin.cn/o/2304283.html

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

相关文章

DeepSeek各模型现有版本对比分析

文章目录 一、基础模型系列:V1 到 V3 的演进二、专用模型系列:推理与多模态三、版本选型与商业化趋势 DeepSeek作为最近特别火爆的模型,本文将对DeepSeek现有的主要版本进行对比分析,涵盖参数规模、训练数据、功能改进、应用场景和性能表现等…

ASP.NET Core Clean Architecture

文章目录 项目地址一、项目主体1. CQRS1.1 Repository数据库接口1.2 GetEventDetail 完整的Query流程1.3 创建CreateEventCommand并使用validation 2. EFcore层2.1 BaseRepository2.2 CategoryRepository2.3 OrderRepository 3. Email/Excel导出3.1 Email1. Email接口层 4. 定义…

紫光同创开发板使用教程(二):sbit文件下载

sbit文件相当于zynq里面的bit文件,紫光的fpga工程编译完成后会自动生成sbit文件,因工程编译比较简单,这里不在讲解工程编译,所以我这里直接下载sbit文件。 1.工程编译完成后,可以看到Flow列表里面没有报错&#xff0c…

1. 自定义组件基础

相关资源: 📎day10 图片素材.zip 1. 自定义组件基础 概念:在ArkUI中由框架直接提供的称为系统组件 -> Column,Button等,由开发者定义的称为自定义组件 作用:自定义组件可以对 UI和业务逻辑进行封装&…

MySQL MHA 部署全攻略:从零搭建高可用数据库架构

文章目录 1.MHA介绍2.MHA组件介绍3.集群规划4.服务器初始化5.MySQL集群部署5.1 安装MySQL集群5.2 配置一主两从5.3 测试MySQL主从5.4 赋予MHA用户连接权限 6.安装MHA环境6.1 安装MHA Node6.2 安装MHA Manager 7.配置MHA环境8.MySQL MHA高可用集群测试8.1 通过VIP连接MySQL8.2模…

Spring Boot3+Vue2极速整合:10分钟搭建DeepSeek AI对话系统

前言 在生成式AI技术蓬勃发展的今天,大语言模型已成为企业智能化转型和个人效率提升的核心驱动力。作为国产大模型的优秀代表,DeepSeek凭借其卓越的中文语义理解能力和开发者友好的API生态,正在成为构建本土化AI应用的首选平台。 本文将以S…

浅谈 Redis 主从复制原理(二)

大家好,我是此林。 【浅谈 Redis 主从集群原理(一) 】 上一篇文章中,说到了 Redis 主从复制的全量同步和增量同步,repl_baklog 复制缓冲区,以及 slave 挂掉之后数据同步的措施。 下面介绍的上一篇遗留问…

elf_loader:一个使用Rust编写的ELF加载器

本文介绍一个使用Rust实现的ELF加载器。 下面是elf_loader的仓库链接: github: https://github.com/weizhiao/elf_loaderhttps://github.com/weizhiao/elf_loader crates.io: https://crates.io/crates/elf_loaderhttps://crates.io/cra…

连接Sql Server时报错无法通过使用安全套接字层加密与 SQL Server 建立安全连接

文章目录 一. 前言二. 解决方案 方案1方案2 三. 总结 一. 前言 在《数据库原理》这门课的实验上,需要使用SQL Server,然后使用jdbc连接sql server突然报错为:SQLServerException: “Encrypt”属性设置为“true”且 “trustServerCertific…

Qt常用控件之日历QCalendarWidget

日历QCalendarWidget QCalendarWidget 是一个日历控件。 QCalendarWidget属性 属性说明selectDate当前选中日期。minimumDate最小日期。maximumDate最大日期。firstDayOfWeek设置每周的第一天是周几(影响日历的第一列是周几)。gridVisible是否显示日历…

超级详细Spring AI运用Ollama大模型

大模型工具Ollama 官网:https://ollama.com/ Ollama是一个用于部署和运行各种开源大模型的工具; 它能够帮助用户快速在本地运行各种大模型,极大地简化了大模型在本地运行的过程。用户通过执行几条命令就能在本地运行开源大模型,如Lama 2等; 综上&#x…

0083.基于springboot+uni-app的社区车位租赁系统小程序+论文

一、系统说明 基于springbootuni-app的社区车位租赁系统小程序,系统功能齐全, 代码简洁易懂,适合小白学编程。 现如今,信息种类变得越来越多,信息的容量也变得越来越大,这就是信息时代的标志。近些年,计算机科学发展…

计算机视觉行业洞察--影像行业系列第一期

计算机视觉行业产业链的上下游构成相对清晰,从基础技术研发到具体应用场景的多个环节相对成熟。 以下是我结合VisionChina经历和行业龙头企业对计算机视觉行业产业链上下游的拆解总结。 上下游总结 上游产业链分为软硬件两类,视觉的硬件主要指芯片、…

【深度学习量化交易15】基于miniQMT的量化交易回测系统已基本构建完成!AI炒股的框架初步实现

我是Mr.看海,我在尝试用信号处理的知识积累和思考方式做量化交易,应用深度学习和AI实现股票自动交易,目的是实现财务自由~ 目前我正在开发基于miniQMT的量化交易系统——看海量化交易系统。 AI怎么炒股?就是通过量化交易。 近期D…

使用大语言模型(Deepseek)构建一个基于 SQL 数据的问答系统

GitHub代码仓库 架构 从高层次来看,这些系统的步骤如下: 将问题转换为SQL查询:模型将用户输入转换为SQL查询。 执行SQL查询:执行查询。 回答问题:模型根据查询结果响应用户输入。 样本数据 下载样本数据&#xf…

JAVA最新版本详细安装教程(附安装包)

目录 文章自述 一、JAVA下载 二、JAVA安装 1.首先在D盘创建【java/jdk-23】文件夹 2.把下载的压缩包移动到【jdk-23】文件夹内,右键点击【解压到当前文件夹】 3.如图解压会有【jdk-23.0.1】文件 4.右键桌面此电脑,点击【属性】 5.下滑滚动条&…

网络安全之探险

🍅 点击文末小卡片 ,免费获取网络安全全套资料,资料在手,涨薪更快 因为工作相关性,看着第三方公司出具的网络安全和shentou测试报告就想更深入研究一下,于是乎开始探索网络安全方面的知识,度娘、…

基础dp——动态规划

目录 一、什么是动态规划? 二、动态规划的使用步骤 1.状态表示 2.状态转移方程 3.初始化 4.填表顺序 5.返回值 三、试题讲解 1.最小花费爬楼梯 2.下降路径最小和 3.解码方法 一、什么是动态规划? 动态规划(Dynamic Programming&…

(四)趣学设计模式 之 原型模式!

目录 一、 啥是原型模式?二、 为什么要用原型模式?三、 原型模式怎么实现?四、 原型模式的应用场景五、 原型模式的优点和缺点六、 总结 🌟我的其他文章也讲解的比较有趣😁,如果喜欢博主的讲解方式&#xf…

会话对象 Cookie 四、Cookie的路径

1.Cookie的path属性 Cookie还有一个path属性,可以通过Cookie#setPath(String)方法来设置。你可以使用HttpWatch查看响应中的Set-Cookie中是否存在路径。下面是通过Chrome查看Cookie信息。 也就是说,就算你不设置Cookie的path,Cookie也是有路…