名称:基于FPGA的FIR数字滤波器的设计Verilog代码Quartus仿真
软件:Quartus
语言:Verilog
代码功能:利用所学知识设计并制作一个基于FPGA数字滤波器
电路装置以VHDL为描述方法,基于FPGA来实现FIR滤波器的设计,掌握FIR滤波器的原理,基本网络结构以及FIR滤波器的常见实现方法,设计FIR滤波器方案的确定,设计的总体思路,算法的分解,系数的提取以及一些关键问题的解决.
演示视频:
设计文档:
滤波器参数
采样率 f_s = 100kHz,设计截止频率为10KHz的FIR滤波器。
设计的滤波器为7阶(长度为8) ,在Matlab中输入:fir1(7, 0.2);
其归一化截止频率为 0.2(对应实际频率为 0.2 * f_s/2,其中 f_s为采样频率)
| 参数 | 值/描述 |
| 采样率 f_s | 100 kHz |
| 窗函数类型 | Hamming窗 |
| 归一化 W_n | 0.2 |
| 实际截止频率 f_c | 10 kHz |
| Nyquist 频率 | 50 kHz (f_s/2) |
参数设计方法:
使用matlab软件设计滤波器系数
滤波器系数设计:
打开Matlab软件在指令窗口中键入:m=fir1(7,0.2),即可得到如下的系数:
0.009、0.048、0.164、0.279、0.279、0.164、0.048、0.009
将系数放大1000倍即:9,48,164,279;乘加计算计算完成后再除以1000.
1、工程文件
2、程序文件
3、程序编译
4、RTL图
5、testbench
6、仿真图
整体仿真图
上图中,data_in为输入的30K和1KHz正弦波信号叠加的测试信号,输出fir_data为滤波后的信号,可以看到30KHz信号被滤除,1KHz信号被保留,验证功能正确。
分频模块
分频产生100Hz的采样信号
FIR滤波器模块
上图中,data_in为输入的30KHz和1KHz正弦波信号叠加的测试信号,输出fir_data为滤波后的信号,可以看到30KHz信号被滤除,1KHz信号被保留,验证功能正确。
噪声测试信号产生模块
上图中,sin_30K为30KHz的正弦波,sin_1K为频率1KHz的正弦波,将两个波形叠加,得到sin_and_noise信号,用于测试滤波器功能。
部分代码展示:
LIBRARY ieee; USE ieee.std_logic_1164.all; USE ieee.std_logic_unsigned.all; --分频模块,50M分频到100K,作为采样信号 ENTITY div_clk IS PORT ( clk_in : IN STD_LOGIC; clk_out : OUT STD_LOGIC ); END div_clk; ARCHITECTURE behave OF div_clk IS SIGNAL count : STD_LOGIC_VECTOR(15 DOWNTO 0) := "0000000000000000"; BEGIN PROCESS (clk_in) BEGIN IF (clk_in'EVENT AND clk_in = '1') THEN IF (count >= "0000000111110100") THEN--50_000K/100K=500 count <= "0000000000000000"; ELSE count <= count + "0000000000000001"; END IF; END IF; END PROCESS;
1556