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.pswp.cn/web/70541.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/70541.shtml
英文地址,請注明出處:http://en.pswp.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 配置相關文件 主機清單寫法