提示:基於Altera的FIR數字濾波器設計 2021


文章目錄

  • 前言
  • 一、FIR濾波器
  • 二、Altera FPGA實現過程
  • 1.抽頭係數
  • 2.IP核配置
  • 3.代碼
  • 4.關於數據截斷問題
  • 總結




前言

使用軟件版本 quartus ii 18.0


基於Altera的FIR數字濾波器設計

一、FIR濾波器

FIR濾波器是有限長單位衝激響應濾波器,又稱為非遞歸型濾波器,是數字信號處理系統中最基本的元件,它可以在保證任意幅頻特性的同時具有嚴格的線性相頻特性,同時其單位抽樣響應是有限長的,因而濾波器是穩定的系統。

二、Altera FPGA實現過程

1.抽頭係數

  • 打開Matlab,輸入fdatool打開濾波器設計工具


    (根據自己設計要求選取參數)
  • 然後導出抽頭係數。

2.IP核配置

在配置界面配置好時鐘與抽頭係數的形式,然後導入之前生成好的抽頭係數。

fpga圖像處理 中值濾波器ip核_fpga圖像處理 中值濾波器ip核


輸出的配置暫時不用動,之後在代碼中實現數據位的截斷。

3.代碼

  • 高速ADC
    我這裏使用的ADC是8位ADC,ADC的時鐘設置50KHz。
  • 高速DAC
    DAC是10位DA,DA的時鐘設置50KHz。
//`配置AD  DA模塊
always @(posedge sys_clk or negedge sys_rst_n)
 begin
  if(!sys_rst_n)
   begin
    AD_Clk<=1'b0;
    clk_cnt<=32'd0;
   end
  else
    if(clk_cnt==32'd499)//sample 50K
     begin
      AD_Clk<=~AD_Clk;
      DA_Clk<=~DA_Clk;
      clk_cnt<=32'd0;
     end
    else
     clk_cnt<=clk_cnt+1'b1;
 end
	always @ (posedge sys_clk or negedge sys_rst_n)
	begin
		if(sys_rst_n == 1'b0)
			cnt <= 6'd0;
		else if(cnt == 6'd999)
			cnt <= 6'd0;
		else
			cnt <= cnt + 1'b1;
	end
  • IP核配置代碼
    FIR IP的例化程序代碼

4.關於數據截斷問題

//`
 fir_ip fir_ip_inst(
 . clk (sys_clk),
 . reset_n (sys_rst_n),
 . ast_sink_data (AD_Dat_tmp),
 . ast_sink_valid (fs_pulse),
 . ast_sink_error (2’b0),
 . ast_source_data (ast_source_data),
 . ast_source_valid (ast_source_valid),
 . ast_source_error (ast_source_error)
 );

關於信號ast_source_data數據位的截斷

可以在singaltap裏面觀察ast_source_data波形,然後選擇保留兩三個符號位剩下的為數據位

例如這個,選擇[27:18]就可以(根據不同的DA芯片的位數不同,選擇的截斷長度也不同,這裏只是給出一個參考)

fpga圖像處理 中值濾波器ip核_IP_02


fpga圖像處理 中值濾波器ip核_數據_03

總結

以上就是設計FPGA數字濾波器的全過程,很簡單。如果上板成功得到的波形是正弦階梯波的形式,你還需要做一個模擬低通濾波器過濾高頻諧波,進行波的整形。