m基于FPGA的FIR低通滤波器实现和FPGA频谱分析,包含testbench和滤波器系数MATLAB计算程序

目录

1.算法仿真效果

2.算法涉及理论知识概要

​3.Verilog核心程序

4.完整算法代码文件


1.算法仿真效果

本系统进行了Vivado2019.2平台的开发,Vivado2019.2仿真结果如下:

整体仿真结果如下:

放大看,滤波效果如下:

对应的频谱如下:

FPGA的RTL结构如下:

最后用matlab对比仿真,结果如下:

可以看到,FPGA的滤波效果和频谱分析与matlab的结果一致。

2.算法涉及理论知识概要

       基于FPGA(Field-Programmable Gate Array,现场可编程门阵列)的数字低通滤波器实现和FPGA频谱分析是数字信号处理领域的重要应用,广泛应用于通信、音频处理、图像处理等多个行业。数字低通滤波器旨在允许低频信号通过而衰减高频信号,是信号处理中基础且重要的组件之一。其设计通常基于时域采样定理和滤波器设计理论,常见的实现方法有IIR(无限脉冲响应)滤波器和FIR(有限脉冲响应)滤波器。

       在FPGA上实现FIR滤波器,主要通过配置硬件逻辑资源(如查找表LUTs、触发器等)来实现上述卷积运算。具体步骤包括:

  • 系数存储:滤波器系数h[k]被存储在FPGA的块RAM中。
  • 并行处理:利用FPGA的并行处理能力,将输入信号序列分块处理,每一块与滤波器系数进行并行卷积。
  • 流水线设计:为了提高处理速度,设计中通常采用流水线技术,即每个运算步骤在不同的时钟周期完成,从而实现连续数据流处理。

      频谱分析是将信号从时域转换到频域,以观察其频率组成的技术。在FPGA上实现频谱分析,最常见的方式是使用离散傅里叶变换(DFT)或其快速版本——快速傅里叶变换(FFT)。


3.Verilog核心程序

`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date: 2024/05/27 21:38:45
// Design Name: 
// Module Name: test
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//


module test();

reg i_clk;
reg i_rst;
wire signed[15:0]o_x;
wire signed[15:0]o_y;
reg i_before_fft1;                 
reg i_last_fft1;   
reg i_enable1;  
wire             o_enable1;  
wire             o_enable2;  
wire signed[63:0]o_abs_ifft1;
wire signed[63:0]o_abs_ifft2;

tops tops_U(
.i_clk (i_clk),
.i_rst (i_rst),
.o_x   (o_x),
.o_y   (o_y),
.i_before_fft1  (i_before_fft1),
.i_last_fft1    (i_last_fft1),
.i_enable1      (i_enable1),
.o_enable1      (o_enable1),
.o_enable2      (o_enable2),
.o_abs_ifft1    (o_abs_ifft1),
.o_abs_ifft2    (o_abs_ifft2)
);

initial
begin
i_clk=1'b1;
i_rst=1'b1;
#100
i_rst = 1'b0;
end
always #5 i_clk=~i_clk;



reg [19:0]cnts2;
always @(posedge i_clk or posedge i_rst)
begin
     if(i_rst)
     begin
     cnts2        <= 20'd0;
     i_before_fft1<=1'b0;
     i_enable1    <=1'b0;
     i_last_fft1  <=1'b0;
     end
else begin
          if(cnts2==20'd25000)
          cnts2  <= cnts2;
          else
          cnts2  <= cnts2 + 20'd1;

          if(cnts2==20'd0)
          begin
             i_before_fft1<=1'b1;
             i_enable1    <=1'b0;
             i_last_fft1  <=1'b0;
          end
          if(cnts2==20'd1)
          begin
             i_before_fft1<=1'b1;
             i_enable1    <=1'b0;
             i_last_fft1  <=1'b0;
          end
          if(cnts2==20'd2)
          begin
             i_before_fft1<=1'b1;
             i_enable1    <=1'b0;
             i_last_fft1  <=1'b0;
          end
          if(cnts2==20'd3)
          begin
             i_before_fft1<=1'b1;
             i_enable1    <=1'b0;
             i_last_fft1  <=1'b0;
          end
          
          if(cnts2==20'd4)
          begin
             i_before_fft1<=1'b0;
             i_enable1    <=1'b0;
             i_last_fft1  <=1'b0;
          end
          if(cnts2>=20'd5 & cnts2<=20'd4+2047)
          begin
             i_before_fft1<=1'b0;
             i_enable1    <=1'b1;
             i_last_fft1  <=1'b0;
          end
          
          if(cnts2==20'd4+2048)
          begin
             i_before_fft1<=1'b0;
             i_enable1    <=1'b1;
             i_last_fft1  <=1'b1;
          end
          
          if(cnts2>20'd4+2048)
          begin
             i_before_fft1<=1'b0;
             i_enable1    <=1'b0;
             i_last_fft1  <=1'b0;
          end
     
     
     
     end
end



endmodule
00_065m


4.完整算法代码文件


V

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我爱C编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值