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

📄 iir_6_filter.v

📁 使用MATLAB工具
💻 V
📖 第 1 页 / 共 2 页
字号:
/*
   Module      : iir_6_filter 
   Description : Low Pass Filter(4 IIR) + High Pass Filter(2 IIR)
                 At least 36 Clock Needed.
                 Maximun Sample Rate < 1/(36*clock_period)                  
   Author      : Yu Caogang
   Company     : Beken  
   History     : 2005.9.29  First Version
*/

`define udly 3 

module  iir_6_filter ( 
                      din    ,
                      dout   ,
                      clk    ,
                      fltsel ,
                      ce_50k ,
                      ce_25k ,
                      rstn
                      );

input [17:0]  din     ;  
output[17:0]  dout    ;
input         clk     ;
input         fltsel  ; // Used to select iir_2
input         ce_50k  ;
input         ce_25k  ;
input         rstn    ;

//////////////////////////////////////////////////////
reg [17:0]  x1  , x1_z1, x1_z2,
            x2  , x2_z1, x2_z2,
            x3  , x3_z1, x3_z2,
            x4  , x4_z1, x4_z2,
            x5  , x5_z1, x5_z2,
            x6  , x6_z1, x6_z2;

reg [17:0]  y1  ,
            y2  ,
            y3  ,
            y4  ,
            y5  ,
            y6  ;

reg[2:0]    tap_cnt    ;                  
reg[2:0]    iir_state  ;
reg         iir_2_enable;
wire        iir_xc0_st = (iir_state == 3'b001) ;
wire        iir_xc1_st = (iir_state == 3'b010) ; 
wire        iir_xc2_st = (iir_state == 3'b011) ;
wire        iir_yc2_st = (iir_state == 3'b100) ;
wire        iir_yc1_st = (iir_state == 3'b101) ;
wire        iir_add_st = (iir_state == 3'b110) ;
wire        iir_ext_st = (iir_state == 3'b111) ;
wire        iir_done   = iir_add_st &  iir_2_enable & (tap_cnt == 3'b101) |
                         iir_add_st & !iir_2_enable & (tap_cnt == 3'b011) ;

always @(posedge clk or negedge rstn )
if (!rstn )
     iir_2_enable <= #`udly 1'b0   ;
else if(iir_ext_st )
     iir_2_enable <= #`udly 1'b0   ;
else if(ce_25k )
     iir_2_enable <= #`udly 1'b1   ;

always @(posedge clk or negedge rstn )
if (!rstn )
     iir_state    <= #`udly 3'b000 ;
else 
begin
    case(iir_state[2:0])
    3'b000 :
    if (ce_50k )
        iir_state <= #`udly 3'b001 ;
    else 
        iir_state <= #`udly 3'b000 ;
    3'b001 : // X(n)   * Cx(n)   = XC(n)
        iir_state <= #`udly 3'b010 ;
    3'b010 : // X(n-1) * Cx(n-1) = XC(n-1)
        iir_state <= #`udly 3'b011 ;
    3'b011 : // X(n-2) * Cx(n-2) = XC(n-2)
        iir_state <= #`udly 3'b100 ;        
    3'b100 : // Y(n-2) * Cy(n-2) = YC(n-2)
        iir_state <= #`udly 3'b101 ;
    3'b101 : // Y(n-1) * Cy(n-1) = YC(n-1) 
        iir_state <= #`udly 3'b110 ;
    3'b110 : // XC(n) + XC(n-1) + XC(n-2) + YC(n-2) + YC(n-1) = Y(n)   
    if (iir_done  )
        iir_state <= #`udly 3'b111 ;
    else 
        iir_state <= #`udly 3'b001 ;
    3'b111 :
        iir_state <= #`udly 3'b000 ;
    default :
        iir_state <= #`udly 3'b000 ;             
    endcase
end     

always @(posedge clk or negedge rstn )
if (!rstn )
    tap_cnt  <= #`udly 3'b000 ;
else if(iir_ext_st )
    tap_cnt  <= #`udly 3'b000 ;
else if(iir_add_st & !iir_done )
    tap_cnt  <= #`udly tap_cnt + 1'b1 ;

//////////////////////////////////////////////////////////////////////////

wire        xc1_z0_sel = (tap_cnt == 3'b000) & iir_xc0_st ;
wire        xc1_z1_sel = (tap_cnt == 3'b000) & iir_xc1_st ;
wire        xc1_z2_sel = (tap_cnt == 3'b000) & iir_xc2_st ;
wire        yc1_z2_sel = (tap_cnt == 3'b000) & iir_yc2_st ;
wire        yc1_z1_sel = (tap_cnt == 3'b000) & iir_yc1_st ;
wire        xc2_z0_sel = (tap_cnt == 3'b001) & iir_xc0_st ;
wire        xc2_z1_sel = (tap_cnt == 3'b001) & iir_xc1_st ;
wire        xc2_z2_sel = (tap_cnt == 3'b001) & iir_xc2_st ;
wire        yc2_z2_sel = (tap_cnt == 3'b001) & iir_yc2_st ;
wire        yc2_z1_sel = (tap_cnt == 3'b001) & iir_yc1_st ;
wire        xc3_z0_sel = (tap_cnt == 3'b010) & iir_xc0_st ;
wire        xc3_z1_sel = (tap_cnt == 3'b010) & iir_xc1_st ;
wire        xc3_z2_sel = (tap_cnt == 3'b010) & iir_xc2_st ;
wire        yc3_z2_sel = (tap_cnt == 3'b010) & iir_yc2_st ;
wire        yc3_z1_sel = (tap_cnt == 3'b010) & iir_yc1_st ; 
wire        xc4_z0_sel = (tap_cnt == 3'b011) & iir_xc0_st ;
wire        xc4_z1_sel = (tap_cnt == 3'b011) & iir_xc1_st ;
wire        xc4_z2_sel = (tap_cnt == 3'b011) & iir_xc2_st ;
wire        yc4_z2_sel = (tap_cnt == 3'b011) & iir_yc2_st ;
wire        yc4_z1_sel = (tap_cnt == 3'b011) & iir_yc1_st ; 
wire        xc5_z0_sel = (tap_cnt == 3'b100) & iir_xc0_st ;
wire        xc5_z1_sel = (tap_cnt == 3'b100) & iir_xc1_st ;
wire        xc5_z2_sel = (tap_cnt == 3'b100) & iir_xc2_st ;
wire        yc5_z2_sel = (tap_cnt == 3'b100) & iir_yc2_st ;
wire        yc5_z1_sel = (tap_cnt == 3'b100) & iir_yc1_st ; 
wire        xc6_z0_sel = (tap_cnt == 3'b101) & iir_xc0_st ;
wire        xc6_z1_sel = (tap_cnt == 3'b101) & iir_xc1_st ;
wire        xc6_z2_sel = (tap_cnt == 3'b101) & iir_xc2_st ;
wire        yc6_z2_sel = (tap_cnt == 3'b101) & iir_yc2_st ;
wire        yc6_z1_sel = (tap_cnt == 3'b101) & iir_yc1_st ; 

wire[17:0]  y1_z1 = x2    ;
wire[17:0]  y1_z2 = x2_z1 ;    
wire[17:0]  y2_z1 = x3    ;
wire[17:0]  y2_z2 = x3_z1 ;    
wire[17:0]  y3_z1 = x4    ;
wire[17:0]  y3_z2 = x4_z1 ;    
reg [17:0]  y4_z1 ;
reg [17:0]  y4_z2 ;   
wire[17:0]  y5_z1 = x6    ;
wire[17:0]  y5_z2 = x6_z1 ;    
reg [17:0]  y6_z1 ;
reg [17:0]  y6_z2 ;    

wire[17:0]  a_mul    = {18{xc1_z0_sel}} & x1        |
                       {18{xc1_z1_sel}} & x1_z1     |
                       {18{xc1_z2_sel}} & x1_z2     |
                       {18{yc1_z2_sel}} & y1_z2     |
                       {18{yc1_z1_sel}} & y1_z1     |                       
                       {18{xc2_z0_sel}} & x2        |
                       {18{xc2_z1_sel}} & x2_z1     |
                       {18{xc2_z2_sel}} & x2_z2     |
                       {18{yc2_z2_sel}} & y2_z2     |
                       {18{yc2_z1_sel}} & y2_z1     |
                       {18{xc3_z0_sel}} & x3        |
                       {18{xc3_z1_sel}} & x3_z1     |
                       {18{xc3_z2_sel}} & x3_z2     |
                       {18{yc3_z2_sel}} & y3_z2     |
                       {18{yc3_z1_sel}} & y3_z1     |
                       {18{xc4_z0_sel}} & x4        |
                       {18{xc4_z1_sel}} & x4_z1     |
                       {18{xc4_z2_sel}} & x4_z2     |
                       {18{yc4_z2_sel}} & y4_z2     |
                       {18{yc4_z1_sel}} & y4_z1     |
                       {18{xc5_z0_sel}} & x5        |
                       {18{xc5_z1_sel}} & x5_z1     |
                       {18{xc5_z2_sel}} & x5_z2     |
                       {18{yc5_z2_sel}} & y5_z2     |
                       {18{yc5_z1_sel}} & y5_z1     |
                       {18{xc6_z0_sel}} & x6        |
                       {18{xc6_z1_sel}} & x6_z1     |
                       {18{xc6_z2_sel}} & x6_z2     |
                       {18{yc6_z2_sel}} & y6_z2     |
                       {18{yc6_z1_sel}} & y6_z1     ;
                      
// Coefficent Selection                       
wire[17:0]  b_mul    = {18{xc1_z0_sel}} & 18'h03fb5 |
                       {18{xc1_z1_sel}} & 18'h07177 |
                       {18{xc1_z2_sel}} & 18'h03fb5 |
                       {18{yc1_z2_sel}} & 18'h321cb |
                       {18{yc1_z1_sel}} & 18'h0ed53 |                       
                       {18{xc2_z0_sel}} & 18'h02895 |
                       {18{xc2_z1_sel}} & 18'h00328 |
                       {18{xc2_z2_sel}} & 18'h02895 |
                       {18{yc2_z2_sel}} & 18'h3c684 |
                       {18{yc2_z1_sel}} & 18'h0e528 |
                       {18{xc3_z0_sel}} & 18'h0445e |
                       {18{xc3_z1_sel}} & 18'h0348b |
                       {18{xc3_z2_sel}} & 18'h0445e |
                       {18{yc3_z2_sel}} & 18'h360f6 |
                       {18{yc3_z1_sel}} & 18'h0e1c2 |
                       {18{xc4_z0_sel}} & 18'h047a6 |
                       {18{xc4_z1_sel}} & 18'h3f197 |
                       {18{xc4_z2_sel}} & 18'h047a6 |
                       {18{yc4_z2_sel}} & 18'h39d2c |
                       {18{yc4_z1_sel}} & 18'h0e1f0 |
                       {18{xc5_z0_sel}} & 18'h0FA7B |  // 18'h0F64C |
                       {18{xc5_z1_sel}} & 18'h20B0A |  // 18'h2136A |
                       {18{xc5_z2_sel}} & 18'h0FA7B |  // 18'h0F64C |
                       {18{yc5_z2_sel}} & 18'h30AE9 |  // 18'h312FB |
                       {18{yc5_z1_sel}} & 18'h1F4D9 |  // 18'h1EC45 |
                       {18{xc6_z0_sel}} & 18'h0FA7B |  // 18'h0F64C |
                       {18{xc6_z1_sel}} & 18'h20B0A |  // 18'h2136A |
                       {18{xc6_z2_sel}} & 18'h0FA7B |  // 18'h0F64C |
                       {18{yc6_z2_sel}} & 18'h30AE9 |  // 18'h312FB |
                       {18{yc6_z1_sel}} & 18'h1F4D9 ;  // 18'h1EC45 ;                     

wire[16:0]  a_value  = a_mul[17] ? {~a_mul[16:0] + 1'b1} : a_mul[16:0] ;
wire[16:0]  b_value  = b_mul[17] ? {~b_mul[16:0] + 1'b1} : b_mul[16:0] ;
wire[33:0]  ab_value = a_value * b_value ;                        
wire        ab_sign  = a_mul[17] ^ b_mul[17] ;
                        
wire[35:0]  data_mul = (ab_value == 34'h0_0000_0000) ? 36'h0_0000_0000 :
                       ab_sign ? {2'b11, {~ab_value[33:0] + 1'b1}} : {2'b00, ab_value[33:0]};

⌨️ 快捷键说明

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