FIR滤波器的Verilog实现

这篇具有很好参考价值的文章主要介绍了FIR滤波器的Verilog实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

简介

FIR滤波器是非递归型滤波器的简称,又叫有限长单位冲激响应滤波器。带有常系数的FIR滤波器是一种LTI(线性时不变)数字滤波器。冲激响应是有限的意味着在滤波器中没有发反馈。长度为N的FIR输出对应于输入时间序列x(n)的关系由一种有限卷积和的形式给出,具体形式如下:
y ( n ) = Σ k = 0 N − 1 h ( k ) × x ( n − k ) y(n)=\Sigma_{k=0}^{N-1}h(k)\times x(n-k) y(n)=Σk=0N1h(k)×x(nk)
其运算过程可以采用如下图所示的流程:
FIR滤波器的Verilog实现

代码

设计部分(采用移位寄存器+并行乘法阵列+加法树实现)

`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date: 2022/07/12 14:23:22
// Design Name: 
// Module Name: my_fir
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//


module my_fir
#(parameter F=10)
(
input logic clk,
input logic rst,
input logic signed [15:0] filter_in,
output logic signed [31:0] filter_out
    );
//
logic signed [15:0] shift_regs [0:16];
logic signed [15:0] coes [0:16];
logic signed [31:0] mults [0:16];
logic signed [31:0] psum [0:4-1];
logic signed [31:0] sum;
//shift_regs
always@(posedge clk,posedge rst)
if(rst)
   for(int i=0;i<=16;i++)
     shift_regs[i]<=0;
else
begin
   shift_regs[0]<=filter_in;
   for(int i=0;i<16;i++)
      shift_regs[i+1]<=shift_regs[i];
end
//coes
assign coes[0]=-17;
assign coes[1]=62;
assign coes[2]=456;
assign coes[3]=1482;
assign coes[4]=3367;
assign coes[5]=6013;
assign coes[6]=8880;
assign coes[7]=11129;
assign coes[8]=11983;
assign coes[9]=11129;
assign coes[10]=8880;
assign coes[11]=6013;
assign coes[12]=3367;
assign coes[13]=1482;
assign coes[14]=456;
assign coes[15]=62;
assign coes[16]=-17;
//mults
always@(posedge clk,posedge rst)
if(rst)
   for(int i=0;i<=16;i++)
      mults[i]<=0;
else
begin
   for(int i=0;i<=16;i++)
      mults[i]<=coes[i]*shift_regs[i];
end
//psum
always@(posedge clk,posedge rst)
if(rst)
for(int i=0;i<4;i++)
   psum[i]<=0;
else
for(int i=0;i<4;i++)
   psum[i]<=mults[4*i]+mults[4*i+1]+mults[4*i+2]+mults[4*i+3];
//sum
always@(posedge clk,posedge rst)
if(rst)
   sum<=0;
else
   sum<=psum[0]+psum[1]+psum[2]+psum[3]+mults[16];
//
assign filter_out=(sum>>>F);
endmodule

测试平台

`timescale 1ns / 1ps


// Company:  
// Engineer: anxu chan
// 
// Create Date:    16:17:14 08/02/2017 
// Design Name:    FIR filter
// Module Name:    fir 
// Project Name:   FirDesign
// Target Devices: Xilinix V5
// Description: test bench
// Revision: 1.0
// Revision 0.01 - File Created
// Additional Comments: 
//


module fir_tb;

	// Inputs
	reg clk;
	reg rst;
	reg signed [15:0] filter_in;

	// Outputs
	wire signed [31:0] filter_out;

	// Instantiate the Unit Under Test (UUT)
	my_fir uut (
		.clk(clk), 
		.rst(rst), 
		.filter_in(filter_in), 
		.filter_out(filter_out)
	);

	// define reset time
	initial begin
		rst = 1;
		#15;
		rst = 0;
	end

	// define clock
	initial begin
		clk = 0;
		forever #10 clk = ~clk;	
	end

	// define a ram store input signal
	reg signed[15:0] mem[241:0];
	// read data from disk
	initial begin
		$readmemb("E:\\rtl_project\\fir\\src\\project\\databin.mem" , mem);
	end

	// send data to filter
	integer i=0;
	initial begin
		#15;
		for(i = 0 ; i < 242 ; i = i+1) begin
			filter_in = mem[i];
			#20;
		end	
	end

	// write data to txt File
	integer file;
	integer cnt=0;
	initial begin
		file = $fopen("dataout1.txt" , "w");
	end

	// write data was filtered by fir to txt file 
	always @(posedge clk) begin
		$fdisplay(file , filter_out);
	end

	always @(posedge clk) begin
		$display("data out (%d)------> : %d ," , cnt, filter_out);
		cnt = cnt + 1;
		if (cnt == 250) begin
			#20 $fclose(file);
			rst = 0;
			#20 $stop;
		end
	end
	
endmodule


结果

FIR滤波器的Verilog实现
完整工程见链接文章来源地址https://www.toymoban.com/news/detail-504785.html

到了这里,关于FIR滤波器的Verilog实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • FPGA 的 DSP:Verilog 中的简单 FIR 滤波器

    本项目介绍如何用 Verilog 实现一个带有预生成系数的简单 FIR 滤波器。 简陋的 FIR 滤波器是 FPGA 数字信号处理中最基本的构建模块之一,因此了解如何利用给定的抽头数和相应的系数值组装一个基本模块非常重要。因此,在这个关于在 FPGA 上入门 DSP 基础知识的实用方法迷你系

    2024年03月17日
    浏览(42)
  • 基于FPGA的FIR滤波器的实现(5)— 并行结构FIR滤波器的FPGA代码实现

    并行结构,并行实现滤波器的累加运算,即并行将具有对称系数的输入数据进行相加,而后采用多个乘法器并行实现系数与数据的乘法运算,最后将所有乘积结果相加输出。这种结构具有最高的运行速度,因不需要累加运算,因此系数时钟频率可以与数据输出时钟频率保持一

    2024年02月03日
    浏览(56)
  • STM32 FIR实时数字滤波器实现

    首先是生成不同周期的正弦波:         由于定时器设置为250us进入一次中断,每秒可进入中断4000次,为了生成25HZ的正弦信号,一个周期内生成160个数据;为了生成200HZ的正弦信号,一个周期内生成20个数据,故代码如下:     sin_1=arm_sin_f32(3.141592654*i/80)+1;//25HZ 信号   

    2024年02月14日
    浏览(45)
  • 滤波器设计:FIR和IIR高、低、带通滤波器的实现及Matlab代码

    滤波器设计:FIR和IIR高、低、带通滤波器的实现及Matlab代码 引言: 滤波器作为信号处理中非常重要的一部分,广泛应用于数字信号处理、音频处理、图像处理等领域。本文主要讨论FIR(有限长冲激响应)和IIR(无限长冲激响应)两种常见滤波器的设计及其实现。 FIR滤波器

    2024年02月09日
    浏览(44)
  • FIR内插滤波器的FPGA实现(一)-matlab实现

    FIR内插滤波器是一种基本的插值方法,主要有两个步骤: 1)在输入的每一个初始采样中间插入L个零点; 2)插零后的数据经过低通滤波器。 运行结果如图(时域、频域): 我们的目标是把采样频率提升五十倍。 得到的频域图: 可以看出内插零点在频域会实现频谱扩展,因此

    2024年02月03日
    浏览(57)
  • FIR滤波器的FPGA实现【IP核实现版】

    本文使用FPGA来实现FIR滤波器设计,设计中使用的DDS、乘法器与FIR滤波器均采用IP core进行实现,实现效果是将3MHz和4MHz的正弦信号混频后使用FIR低通滤波器滤除7MHz信号得到1MHz的信号。 首先用两个DDS核生成3MHz以及4MHz的正弦波信号。 注意:此处的dds的命名要和代码中对应,系统

    2024年02月04日
    浏览(53)
  • 利用FPGA实现全串行低通FIR滤波器

    设计一个15阶(长度为16)的具有线性相位低通FIR滤波器,采用布拉克曼窗函数设计,截止频率为500HZ,抽样频率为2000HZ;采用FPGA实现全串行FIR滤波器,系数的量化位数为12比特,输入数据位数为12比特,输出数据位数为29比特,系统时钟为16KHZ 设计思路 :首先采用MATLAB根据要

    2024年02月07日
    浏览(50)
  • 用C语言实现一个FIR低通滤波器算法

    +v hezkz17进数字音频系统研究开发交流答疑    以下是一个基于C语言的FIR低通滤波器算法的实现: #include stdio.h #include stdlib.h #define N 5     // 滤波器长度 #define M 100   // 输入数据长度 double h[N] = {0.2, 0.3, 0.4, 0.1, 0.0};  // 滤波器系数 int main() {     double x[M], y[M];     // 生成输入信

    2024年02月16日
    浏览(42)
  • 解析使用FPGA逻辑实现FIR滤波器的几种架构

    有限脉冲响应(finite impulse response,FIR)数字滤波器         FIR滤波器的实质就是输入序列与系统脉冲响应的卷积,即:         其中,N为滤波器的阶数,也即抽头数;x(n)为第n个输入序列;h(n)为FIR滤波器的第n级抽头系数。         FIR滤波器基本结构如下:      

    2024年02月08日
    浏览(42)
  • 数字信号处理-10-并行FIR滤波器MATLAB与FPGA实现

    本文介绍了设计滤波器的FPGA实现步骤,并结合杜勇老师的书籍中的并行FIR滤波器部分进行一步步实现硬件设计,对书中的架构做了复现以及解读,并进行了仿真验证。 FIR滤波器的结构形式时,介绍了直接型、级联型、频率取样型和快速卷积型4种。在FPGA实现时,最常用的是最

    2023年04月09日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包