本文使用 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 系統。

-
量化和濾波器系數位寬:
量化-通過將數字映射到由分配的位寬決定的一組固定的離散值來降低數字的精度。
使用較少的位數進行量化會降低濾波器系數的準確性,從而對濾波器的性能產生負面影響。
-
資源權衡:
濾波器性能和 FPGA 資源利用率之間存在權衡。
增加抽頭數量或系數的位寬需要更多的 DSP 資源,這可能會消耗 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!”程序。
如果使用板載時鐘就按照需求進行修改。

運行后,應該能看到與仿真相同的結果:
