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

📄 fir.v

📁 书籍“无线通信fpga设计”里的源代码实例
💻 V
字号:
`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company: 
// Engineer: 
// 
// Create Date:    16:53:06 09/12/2007 
// Design Name: 
// Module Name:    fir 
// Project Name: 
// Target Devices: 
// Tool versions: 
// Description: 
//
// Dependencies: 
//
// Revision: 
// Revision 0.01 - File Created
// Additional Comments: 
//
//////////////////////////////////////////////////////////////////////////////////
module fir(clk,rst_n,fir_in,fir_out);

parameter IDATA_WIDTH = 12;   //输入数据位宽
parameter PDATA_WIDTH = 13;   //处理数据位宽
parameter FIR_TAP = 8;   //FIR抽头
parameter FIR_TAPHALF = 4;   //FIR抽头的一半
parameter COEFF_WIDTH = 12;   //系数位宽
parameter OUT_WIDTH = 27;    //输出位宽

parameter cof1 = 12'd41;
parameter cof2 = 12'd132;
parameter cof3 = 12'd341;
parameter cof4 = 12'd510;

input clk, rst_n;
input [IDATA_WIDTH-1 : 0] fir_in;
output [OUT_WIDTH-1 : 0] fir_out;

reg [OUT_WIDTH-1 : 0] fir_out;
reg [IDATA_WIDTH-1 : 0] fir_in_reg;
reg [PDATA_WIDTH-1 : 0] shift_buf[FIR_TAP-1 : 0];   //定义一个8位的移位寄存器
wire [PDATA_WIDTH-1 : 0] add07;
wire [PDATA_WIDTH-1 : 0] add16;
wire [PDATA_WIDTH-1 : 0] add25;
wire [PDATA_WIDTH-1 : 0] add34;

wire [PDATA_WIDTH+COEFF_WIDTH-1 : 0] mul1;
wire [PDATA_WIDTH+COEFF_WIDTH-1 : 0] mul2;
wire [PDATA_WIDTH+COEFF_WIDTH-1 : 0] mul3;
wire [PDATA_WIDTH+COEFF_WIDTH-1 : 0] mul4;
integer i,j;

always @ (posedge clk or negedge rst_n)
begin
   if(!rst_n)
      fir_in_reg <= 12'b0000_0000_0000;
   else
      fir_in_reg <= fir_in;
end

always @ (posedge clk or negedge rst_n)
begin
   if(!rst_n)
      for(i=0; i<=FIR_TAP-1; i=i+1)
         shift_buf[i] <= 13'b0000_0000_00000;
   else
      begin
         for(j=0; j<FIR_TAP-1; j=j+1)
            shift_buf[j+1] <= shift_buf[j];
         shift_buf[0] <= {fir_in_reg[IDATA_WIDTH-1],fir_in_reg};
      end
end

assign add07 = shift_buf[0] + shift_buf[7];
assign add16 = shift_buf[1] + shift_buf[6];
assign add25 = shift_buf[2] + shift_buf[5];
assign add34 = shift_buf[3] + shift_buf[4];

mult1 mult1(.a(cof1),.b(add07),.q(mul1), .clk(clk));
mult1 mult2(.a(cof2),.b(add16),.q(mul2), .clk(clk));
mult1 mult3(.a(cof3),.b(add25),.q(mul3), .clk(clk));
mult1 mult4(.a(cof4),.b(add34),.q(mul4), .clk(clk));

wire [25 : 0] add_mul12 = {mul1[24],mul1}+{mul2[24],mul2};
wire [25 : 0] add_mul34 = {mul3[24],mul3}+{mul4[24],mul4};

always @ (posedge clk or negedge rst_n)
begin
   if(!rst_n)
      fir_out <= 27'b0;
   else
      fir_out <= {add_mul12[25],add_mul12}+{add_mul34[25],add_mul34};
end

endmodule

⌨️ 快捷键说明

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