⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 butterworth_iir_biquad.v

📁 基于butterworth的iir滤波器的verilog代码
💻 V
字号:
module butterworth_IIR_biquad (
	    reset,
	    clk,
	    clken,
	    x,
	    result,
	    feedback_fp,
	    feedback,
	    wn
	    );

   //Parameter Declaration
   //Coefficients - 10 bits
   //[a,b] = butter(FilterOrder,300/500)
   //[SOS,G] = tf2sos(b,a)
   //SOS = 
   //1.0000    0.0105   -1.0104    1.0000   -0.0002   -0.9997
   //1.0000   -0.0435    0.3372    1.0000   -0.0506    0.3245
   //1.0000    1.4736    0.6153    1.0000    1.4279    0.5720
   //1.0000    1.9564    0.9587    1.0000    1.9263    0.9291
   //1.0000   -0.8166    0.4569    1.0000   -1.0525    0.9396
   //G = 0.1067
   parameter a1 = 0;		//-0.0002
   parameter a2 = -1024;	//-0.9997
   parameter b0 = 1024;		//1.000
   parameter b1 = 11;		//0.0105
   parameter b2 = -1035; 	//-1.0104
   parameter INPUT_WIDTH = 18;
   parameter COEF_WIDTH = 10;
   parameter DLY_WIDTH = 18;
   parameter OUTPUT_WIDTH = 21;	
   parameter FEEDBACK_WIDTH = 2 * DLY_WIDTH + 1;
   parameter L_BIT = COEF_WIDTH;								// low bit 
   parameter H_BIT = L_BIT + DLY_WIDTH - 1;						// high bit
	
    //Port Declaration
   input clk;
   input clken;
   input reset;
   input [INPUT_WIDTH-1:0] x;
   output [OUTPUT_WIDTH-1:0] result;
   output [FEEDBACK_WIDTH-1:0] feedback_fp;
   output [DLY_WIDTH-1:0] wn, feedback;


   //Wire Declaration
   wire [DLY_WIDTH-1:0] coef_a1, coef_a2;
   wire [DLY_WIDTH-1:0] wn;
   wire [DLY_WIDTH-1:0] feedback;
   wire [FEEDBACK_WIDTH-1:0] feedback_fp;
   wire [DLY_WIDTH+1:0] wn_shift, wn1_shift, ff_adder1_res;
   wire [DLY_WIDTH+2:0] tmp_wn_add, wn2_shift;
   wire					wn_shift_sb, wn1_shift_sb, wn2_shift_sb;

   //Register Declaration
   reg [DLY_WIDTH-1:0] ff_reg1, ff_reg2;
   

   assign coef_a1 = -a1;										// SBF 8.10
   assign coef_a2 = -a2;										// SBF 8.10
   assign feedback = feedback_fp[H_BIT:L_BIT];					// SBF 14.4

   assign wn_shift_sb = wn[DLY_WIDTH-1];
   assign wn1_shift_sb = ff_reg1[DLY_WIDTH-1];
   assign wn2_shift_sb = ff_reg2[DLY_WIDTH-1];
   assign wn_shift = { wn_shift_sb,wn_shift_sb,wn[DLY_WIDTH-1:0] };	// SBF 16.4
   assign wn1_shift = { wn1_shift_sb,wn1_shift_sb,wn1_shift_sb,wn1_shift_sb,
						wn1_shift_sb,wn1_shift_sb,wn1_shift_sb,wn1_shift_sb,
						wn1_shift_sb,ff_reg1[DLY_WIDTH-1:7] };	// SBF 16.4
   assign tmp_wn_add = { ff_adder1_res[DLY_WIDTH+1], ff_adder1_res[DLY_WIDTH+1:0] };   	// SBF 17.4
   assign wn2_shift = { wn2_shift_sb, wn2_shift_sb, wn2_shift_sb, ff_reg2[DLY_WIDTH-1:0] } // SBF 17.4
				+ {wn2_shift_sb,wn2_shift_sb,wn2_shift_sb,wn2_shift_sb,wn2_shift_sb,
				wn2_shift_sb,wn2_shift_sb,wn2_shift_sb,wn2_shift_sb,wn2_shift_sb,
				ff_reg2[DLY_WIDTH-1:7]};	// wn2_shift=ff_reg2*1.0104

   

   always @ (posedge clk or posedge reset)
    begin
        if (reset)
          begin
	 		ff_reg1 <= 0;
			ff_reg2 <= 0;
		  end
	    else if (clken)
	      begin
			ff_reg1 <= wn;
			ff_reg2 <= ff_reg1;
		  end
    end
      
   two_mult_add	two_mult_add_inst (
	.clock0 ( clk ),
	.dataa_0 ( wn ),
	.aclr3 ( reset ),
	.datab_0 ( coef_a1 ),
	.datab_1 ( coef_a2 ),
	.ena0 ( clken ),
	.result ( feedback_fp )
	);


   fb_adder	fb_adder_inst (
	.dataa ( x ),
	.datab ( feedback ),
	.result ( wn ),
	.cout ( ),
	.overflow (  )
	);
	
	ff_adder1	ff_adder1_inst (
	.dataa ( wn_shift ),
	.datab ( wn1_shift ),
	.result ( ff_adder1_res ),
	.cout (  ),
	.overflow (  )
	);

    ff_adder2	ff_adder2_inst (
	.dataa ( tmp_wn_add ),
	.datab ( wn2_shift ),
	.clock ( clk ),
	.aclr ( reset ),
	.clken ( clken ),
	.result ( result ),
	.cout (  ),
	.overflow (  )
	);


endmodule

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -