要求
設計一個帶通濾波器,并驗證其功能。
1、使用MATLAB設計濾波器系數(shù)
MATLAB首頁找到APP后找到濾波器設計工具并打開,使用該工具可以生成數(shù)字濾波器的系數(shù)后續(xù)用于FPGA配置FIR IP核。
打開濾波器設計工具后即可輸入相關參數(shù)并設計需要的濾波器,本次設計一個帶通濾波器,所以濾波器響應類型選擇帶通;設計方案選擇FIR(有限沖激響應);濾波器階數(shù)這里選擇最小階,也可以自己指定階數(shù),階數(shù)越大濾波器的濾波效果越好但越耗費FPGA資源,階數(shù)可以根據(jù)實際情況進行取舍;密度因子默認20;頻率設定,本次設計的采樣率設置為10MHz,濾波器的頻率特性設置可以按照圖示進行填寫,圖片指示的意義很清楚,F(xiàn)stop1為下限阻帶截止頻率,這里設置為50kHz,F(xiàn)pass1為下限通帶截止頻率,這里設置為100kHz,F(xiàn)pass2為上限通道截止頻率,這里設置為400kHz,F(xiàn)stop2為上限阻帶截止頻率,這里設置為450kHz(Fpass1-Fstop1和Fstop2-Fpass2為過渡帶寬度,本次設計的過渡帶寬度為50kHz;Fpass2-Fpass1為通帶寬度,本次設計的通帶寬度為400kHz;其余為阻帶);幅值設定,其中Astop為阻帶衰減的幅度值,本次設計阻帶衰減50dB,Apass為通帶的紋波,這里限制通帶紋波不超過0.1dB。
設置好以上參數(shù)后點擊濾波器設計,等待片刻即可設計好所需濾波器,從左側(cè)窗口當前濾波器信息中可以發(fā)現(xiàn)符合本次設計需求的最小階數(shù)為483階。
點擊工具欄:
可以查看濾波器幅值響應、相位響應、零極點等。
點擊工具欄文件--導出,即可導出設計的濾波器系數(shù)。導出后可以在工作區(qū)中看到濾波器系數(shù)的變量Num。
以下為本次導出的系數(shù),一共484個。
濾波器系數(shù)在FPGA中導入時每個系數(shù)之間需要逗號隔開,所以這里將系數(shù)保存到txt并使用逗號隔開,注意最后一個數(shù)的逗號需要刪除。
生成后的系數(shù)刪除最后的逗號。
2、FPGA中FIR的實現(xiàn)
這里省略FPGA工程建立過程,新建工程后點擊Create Block Design。
添加FIR IP核。
配置FIR IP核,F(xiàn)ilter Option中Select Source選擇Vector,Coefficient Vector中粘貼之前MATLAB生成的系數(shù),其余保持默認。左邊Freq.Response窗口中可以查看頻率響應曲線。
Channel Specification中主要配置采樣率和工作時鐘,input Sampling Frequency(MHz)配置10MHz采樣率,后續(xù)DDS工作時鐘需要和采樣率保持一致;Clock Frequency(MHz)配置200MHz后續(xù)FIR IP核的工作時鐘給200MHz。
Implement配置,Coefficient With可以根據(jù)需要進行配置,本次設計時配置成24,配置成24時通過查看左邊Freq.Response窗口可以發(fā)現(xiàn)兩條紅色和藍色曲線重合較接近理想曲線Ideal,所以這里配置成24,也可以根據(jù)需要進行配置。
Interface這里配置如下:
FIR配置完后再增加一個fifo,配置如下:
配置完后將FIR和fifo相連并引出接口:
最后右擊block design先generate Output ...再Create HDL...。
3、FPGA中DDS的實現(xiàn)
這里DDS用于產(chǎn)生FIR的輸入信號。同樣點擊Create Block Design,添加DDS IP核。
Configuration配置System Clock(MHz)為10MHz即可,其余保持默認配置。
Detailed Implementation配置如下:
最后輸出頻率配置成0.15MHz即150kHz,也可以根據(jù)需要進行配置。
按照上述配置再生成50kHz、350kHz、450kHz頻率的DDS。
生成完DDS后再生成一個fifo。該fifo用于跨時鐘域,將DDS產(chǎn)生的10MHz時鐘域的信號轉(zhuǎn)到200MHz時鐘域輸入FIR進行濾波。fifo配置如下,深度16,數(shù)據(jù)位寬16bit。
最后將生成的IP核按下圖連線,該dds用于測試fir濾波器。可以外部可以將DDS生成的350kHz和150kHz進行疊加后再輸入到fifo中,最后經(jīng)過跨時鐘域后從Multi_wave_M_AXIS輸出到FIR進行濾波,疊加后的波形存在和頻(500kHz)、差頻(200kHz),經(jīng)過濾波器后只剩下差頻200kHz,如果濾波器輸出200kHz正弦波則說明設計符合預期。也可以將單頻信號(50kHz/150kHz/350kHz/450kHz)輸入濾波器查看濾波器輸出幅度情況。
4、top模塊編寫
頂層模塊例化兩個block_design ,dds產(chǎn)生50kHz、150kHz、350kHz和450kHz的正弦信號,外部將dds生成的其中兩個信號做乘法后輸入到dds的fifo接口中,使相乘的信號從10Mhz時鐘域到200Mhz時鐘域,最后輸入到FIR中進行濾波。 如果需要測試FIR單頻信號的濾波器則可以將DDS輸出的其中一個信號與常數(shù)相乘后再輸入到FIR中進行測試。 另外top模塊中還需例化一個pll產(chǎn)生10MHz時鐘用于DDS產(chǎn)生信號,以及200MHz時鐘用于FIR。
module fir_top( input pl_ref_clk_100m_p, input pl_ref_clk_100m_n ); reg [4:0] cnt; wire clk_10m,clk_200m; wire signed [7:0] M_AXIS_50k_tdata; wire M_AXIS_50k_tvalid,M_AXIS_50k_tready; wire signed [7:0] M_AXIS_150k_tdata; wire M_AXIS_150k_tvalid,M_AXIS_150k_tready; wire signed [7:0] M_AXIS_350k_tdata; wire M_AXIS_350k_tvalid,M_AXIS_350k_tready; wire signed [7:0] M_AXIS_450k_tdata; wire M_AXIS_450k_tvalid,M_AXIS_450k_tready; wire signed [15:0] Multi_wave_S_AXIS_tdata; wire Multi_wave_S_AXIS_tvalid,Multi_wave_S_AXIS_tready; wire signed [15:0] Multi_wave_M_AXIS_tdata; wire Multi_wave_M_AXIS_tvalid,Multi_wave_M_AXIS_tready; wire signed [15:0] FIR_S_AXIS_tdata; wire FIR_S_AXIS_tvalid,FIR_S_AXIS_tready; wire signed [23:0] FIR_M_AXIS_tdata; wire FIR_M_AXIS_tvalid,FIR_M_AXIS_tready; assign rst_n = locked; // Multi_wave_S_AXIS assign Multi_wave_S_AXIS_tdata = M_AXIS_450k_tdata * 8'hff/*M_AXIS_350k_tdata */; assign Multi_wave_S_AXIS_tvalid = M_AXIS_450k_tvalid & 1/*M_AXIS_350k_tvalid */; assign M_AXIS_50k_tready = Multi_wave_S_AXIS_tready; assign M_AXIS_150k_tready = Multi_wave_S_AXIS_tready; assign M_AXIS_350k_tready = Multi_wave_S_AXIS_tready; assign M_AXIS_450k_tready = Multi_wave_S_AXIS_tready; // Multi_wave_M_AXIS assign FIR_S_AXIS_tvalid = Multi_wave_M_AXIS_tvalid; assign FIR_S_AXIS_tdata = Multi_wave_M_AXIS_tdata; assign Multi_wave_M_AXIS_tready = FIR_S_AXIS_tready; assign FIR_M_AXIS_tready = (cnt == 'd19) && Multi_wave_M_AXIS_tvalid; dds_design_wrapper dds_design( .M_AXIS_150k_tdata (M_AXIS_150k_tdata ), .M_AXIS_150k_tready (M_AXIS_150k_tready ), .M_AXIS_150k_tvalid (M_AXIS_150k_tvalid ), .M_AXIS_350k_tdata (M_AXIS_350k_tdata ), .M_AXIS_350k_tready (M_AXIS_350k_tready ), .M_AXIS_350k_tvalid (M_AXIS_350k_tvalid ), .M_AXIS_450k_tdata (M_AXIS_450k_tdata ), .M_AXIS_450k_tready (M_AXIS_450k_tready ), .M_AXIS_450k_tvalid (M_AXIS_450k_tvalid ), .M_AXIS_50k_tdata (M_AXIS_50k_tdata ), .M_AXIS_50k_tready (M_AXIS_50k_tready ), .M_AXIS_50k_tvalid (M_AXIS_50k_tvalid ), .Multi_wave_M_AXIS_tdata (Multi_wave_M_AXIS_tdata ), .Multi_wave_M_AXIS_tready(Multi_wave_M_AXIS_tready), .Multi_wave_M_AXIS_tvalid(Multi_wave_M_AXIS_tvalid), .Multi_wave_S_AXIS_tdata (Multi_wave_S_AXIS_tdata ), .Multi_wave_S_AXIS_tready(Multi_wave_S_AXIS_tready), .Multi_wave_S_AXIS_tvalid(Multi_wave_S_AXIS_tvalid), .aresetn (rst_n ), .clk_10m (clk_10m ), .clk_200m (clk_200m ) ); always@(posedge clk_200m or negedge rst_n)begin if(!rst_n)begin cnt <= 'd0; end else begin cnt <= (cnt == 'd19)? 'd0 : (cnt + 1'b1); end end bandpass_fir_wrapper bandpass_fir( .FIR_M_AXIS_tdata (FIR_M_AXIS_tdata ), .FIR_M_AXIS_tready (FIR_M_AXIS_tready ), .FIR_M_AXIS_tvalid (FIR_M_AXIS_tvalid ), .FIR_S_AXIS_tdata (FIR_S_AXIS_tdata ), .FIR_S_AXIS_tready (FIR_S_AXIS_tready ), .FIR_S_AXIS_tvalid (FIR_S_AXIS_tvalid ), .aresetn (rst_n ), .clk_200m (clk_200m ) ); clk_wiz_0 pll( .clk_10m(clk_10m), .clk_200m(clk_200m), // output clk_200m .reset(1'b0), // input reset .locked(locked), // output locked .clk_100m_in(clk_100m) // input clk_100m_in ); IBUFDS clk_100m_ibufds( .O (clk_100m), .I (pl_ref_clk_100m_p), .IB (pl_ref_clk_100m_n) ); endmodule
5、功能仿真
DDS產(chǎn)生的四個信號如下:
50kHz信號,一個時鐘周期的時間為102.31-82.31=20us,剛好為50kHz。
150kHz,一個時鐘周期的時間為82.51-75.91=6.6us,頻率約為151515Hz。
350kHz,一個是時鐘周期的時間為71.21-68.31=2.9us,頻率約為344827Hz。
450kHz,一個時鐘周期的時間為91.51-89.31=2.2us,頻率約為454545Hz。
將150kHz正弦和350kHz正弦疊加后輸入到FIR,輸入信號代碼修改如下(配圖中的頻率寫錯了,實際是150kHz和350kHz相疊加,圖片的是450kHz和350kHz,圖片上的組合也不影響測試FIR,因為兩個信號的和頻以及差頻為800kHz和100kHz,經(jīng)過濾波器后100kHz信號正常輸出而800kHz信號則被濾除):
兩個光標之間的間隔為112.975-102.975=10us,每個時鐘周期為5us,所以濾波器輸出的頻率為200kHz。由于輸入的信號為150kHz正弦波疊加350kHz的正弦波,疊加后的波形存在和頻500kHz和差頻200kHz,由于500kHz在濾波器通頻帶外,所以500kHz的信號會被濾除,經(jīng)過濾波器后只剩下200kHz的正弦波。所以仿真結果符合濾波器特性。仿真波形如下圖,其中FIR_M_AXIS_tdata信號為FIR濾波輸出信號。
將50kHz正弦信號輸入FIR,輸入信號代碼修改如下:50kHz信號與常數(shù)8‘hff疊加后輸入到FIR。
由于50kHz在濾波器帶外,所以經(jīng)過濾波器后幅度應該被衰減。仿真波形如下圖,F(xiàn)IR輸出信號FIR_M_AXIS_tdata被衰減,符合預期。
將150kHz正弦信號輸入FIR,輸入信號代碼修改如下:150kHz信號與常數(shù)8‘hff疊加后輸入到FIR。
由于150kHz在濾波器帶內(nèi),所以經(jīng)過濾波器后幅度不變。仿真波形如下圖,F(xiàn)IR輸出信號FIR_M_AXIS_tdata幅度正常,符合預期。
將350kHz正弦信號輸入FIR,輸入信號代碼修改如下:350kHz信號與常數(shù)8‘hff疊加后輸入到FIR。
由于350kHz在濾波器帶內(nèi),所以經(jīng)過濾波器后幅度不變。仿真波形如下圖,F(xiàn)IR輸出信號FIR_M_AXIS_tdata幅度正常,符合預期。
將450kHz正弦信號輸入FIR,輸入信號代碼修改如下:450kHz信號與常數(shù)8‘hff疊加后輸入到FIR。
由于450kHz在濾波器帶外,所以經(jīng)過濾波器后幅度應該被衰減。仿真波形如下圖,F(xiàn)IR輸出信號FIR_M_AXIS_tdata被衰減,符合預期。
6、結論
從仿真結果可知輸入信號不管是單頻信號還是疊加后的雙頻信號,結果都符合預期。相關工程源碼請點擊閱讀原文,在原貼中下載。
歡迎將我們設為“星標”,這樣才能第一時間收到推送消息。
關注下方“汽車開發(fā)圈”,回復“Auto”,免費領取Autosar入門與實踐資料包!
掃碼添加小助手回復“進群”
和電子工程師們面對面交流經(jīng)驗
特別聲明:以上內(nèi)容(如有圖片或視頻亦包括在內(nèi))為自媒體平臺“網(wǎng)易號”用戶上傳并發(fā)布,本平臺僅提供信息存儲服務。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.