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

📄 fir_160_tap.v

📁 使用MATLAB工具
💻 V
字号:

`define  udly 3 
`define  TAP  160

module  fir_160_tap(  
                   din  ,
                   dout ,
                   clk  ,
                   rstn
                   );  

input [11 : 0]  din  ;
output[31 : 0]  dout ;
input         clk  ;
input         rstn ;


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

reg[7:0]     count ;
always @(posedge clk or negedge rstn)
if (!rstn )
    count  <= #`udly 8'h00 ;
else if(count == `TAP - 1)
    count  <= #`udly 8'h00 ;    
else 
    count  <= #`udly count + 1'b1 ;      

//===============================
reg  comp_z_1 ;
reg  comp_z_2 ;
reg  comp_z_3 ;
reg  comp_z_4 ;

always @(posedge clk or negedge rstn )
if (!rstn )
    comp_z_1  <= #`udly 1'b0 ;
else if(count == 8'h00)
    comp_z_1  <= #`udly 1'b1 ;
else 
    comp_z_1  <= #`udly 1'b0 ;

always @(posedge clk or negedge rstn )
if (!rstn )
    comp_z_2  <= #`udly 1'b0 ;
else 
    comp_z_2  <= #`udly comp_z_1 ;
        
always @(posedge clk or negedge rstn )
if (!rstn )
    comp_z_3  <= #`udly 1'b0 ;
else 
    comp_z_3  <= #`udly comp_z_2 ;
        
always @(posedge clk or negedge rstn )
if (!rstn )
    comp_z_4  <= #`udly 1'b0 ;
else 
    comp_z_4  <= #`udly comp_z_3 ;

wire    load_en = (count == `TAP - 1);
wire    done_en = comp_z_2 ;
      
//==========================

reg [11:0]  din_z   ;
reg [11:0]  asr_z_1 ;
wire[11:0]  asr_do  ;

always @(posedge clk or negedge rstn)
if (!rstn )
    din_z  <= #`udly 12'h000;
else 
    din_z  <= #`udly din     ;     

fir_asr asr(
           .addr(count[7:0]       ) ,
           .d   (din_z[11:0]      ) ,
           .q   (asr_do           ) ,
           .clk (clk              ) ,
           .en  (load_en          ) ,
           .rstn(rstn             )
           );
           
always @(posedge clk or negedge rstn )
if (!rstn )
    asr_z_1  <= #`udly 12'h000 ;
else 
    asr_z_1  <= #`udly asr_do  ;

//============================
 
reg [11:0]  rom_z_1 ;
wire[11:0]  rom_do  ;                   
fir_rom rom( 
           .clk (clk          ) , 
           .addr(count[7:0]   ) , 
           .dout(rom_do[11:0] ) 
           );
           
always @(posedge clk or negedge rstn )
if (!rstn )
     rom_z_1 <= #`udly 12'h000 ;
else 
     rom_z_1 <= #`udly rom_do  ;
                     
//============================

wire [31:0] mac_dout ;
fir_mac mac(
           .a   (asr_z_1[11:0] ),
           .b   (rom_z_1[11:0] ),
           .q   (mac_dout      ),
           .rst (done_en       ),
           .clk (clk           )
           );

//===========================

reg[31:0]  dout ;
always @(posedge clk or negedge rstn )
if (!rstn )
    dout  <= #`udly 32'h0000_0000 ;
else if(done_en)
    dout  <= #`udly mac_dout[31:0] ;    
        
//////////////////////////////////////////////
endmodule

 
module fir_mac ( a, b, q, rst, clk);
input [11:0]  a ;
input [11:0]  b ;
output[31:0]  q ;  
input         rst ;
input         clk ;

reg [31:0]    q ;

wire[10:0]    a_val   = a[11] ? (~a[10:0] + 1'b1) : a[10:0] ;
wire[10:0]    b_val   = b[11] ? (~b[10:0] + 1'b1) : b[10:0] ;

wire          ab_sig  =  a[11] & ~b[11] |
                        ~a[11] &  b[11] ;
wire[21:0]    ab_val  = a_val * b_val   ;
wire[31:0]    abe     = (ab_val == 22'h000000) ? 32'h0000_0000 : 
                        {{10{ab_sig}}, ab_sig ? (~ab_val[21:0] + 1'b1) : ab_val[21:0]};
wire[31:0]    abr     = abe + q ;

always @(posedge clk) 
if (rst )
     q <= #`udly abe ;
else 
     q <= #`udly abr ;  

endmodule 

   
module fir_asr( addr, d, q, clk, en, rstn ) ;
input [7:0]  addr ;
input [11:0] d    ;
output[11:0] q    ;
input        clk  ;
input        en   ;
input        rstn ;

/////
reg[7:0]     waddr ;
wire         waddr_clear = en & (waddr == `TAP) ;
always @(posedge clk or negedge rstn)
if (!rstn )
    waddr  <= #`udly 8'h00 ;
else if(waddr_clear )
    waddr  <= #`udly 8'h00 ;
else if(en          )
    waddr  <= #`udly waddr + 1'b1 ; 

reg[7:0]     waddr_back ;
always @(posedge clk or negedge rstn )
if (!rstn )
    waddr_back <= #`udly 8'h00 ;
else if(addr == `TAP - 1)
    waddr_back <= #`udly waddr ;

wire[7:0]    raddr = (waddr_back[7:0] > addr[7:0]) ? (waddr_back[7:0] - addr[7:0] - 1   )
                                                   : (waddr_back[7:0] + `TAP - addr[7:0] - 1 ) ; 
          
asr_ram  ram ( 
             .din  (d[11:0]    ),
             .dout (q[11:0]    ),
             .clk  (clk        ),
             .wren (en         ),
             .waddr(waddr[7:0] ),
             .raddr(raddr[7:0] ),
             .oen  (1'b1       )
             );

endmodule

     
module asr_ram (din, dout, clk , wren, waddr, raddr, oen);
input [11:0]  din  ;
output[11:0]  dout ;
input         clk  ;
input         wren ;
input [7:0]   waddr;
input [7:0]   raddr;
input         oen  ;

reg[11:0]     dout ;
reg[11:0]     mem[0:`TAP - 1] ;

integer       i    ;

initial 
begin
   for (i = 0 ; i <`TAP ; i = i + 1 ) 
       mem[i]  = 12'h000 ;
end      

always @(posedge clk )
if (wren )
    mem[waddr] <= #`udly din[11:0] ;

always @(posedge clk )
    dout       <= #`udly mem[raddr] ;
    
endmodule      
      
module fir_rom ( addr, dout, clk);
input [7:0]  addr ;
output[11:0] dout ;
input        clk  ;

reg [11:0]   dout ;
reg [11:0]   data[0:159] ;
initial 
begin
    $readmemh ("rom.txt",data,0,159);
end

always @(posedge clk )
   dout  <= #`udly data[addr] ;

endmodule   

⌨️ 快捷键说明

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