1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
| module fir_parallel #( parameter IDATA_WIDTH = 12, parameter OUT_WIDTH = 27 ) ( input clk, input rst, input [IDATA_WIDTH-1:0] fir_in, output reg [ OUT_WIDTH-1:0] fir_out ); parameter PDATA_WIDTH = 13; parameter FIR_TAP = 8; parameter FIR_TAPHALF = FIR_TAP / 2; parameter COEFF_WIDTH = 12;
parameter cof1 = 12'd41; parameter cof2 = 12'd132; parameter cof3 = 12'd341; parameter cof4 = 12'd510;
reg [ IDATA_WIDTH-1:0] fir_in_reg; reg [ PDATA_WIDTH-1:0] shift_buf [FIR_TAP-1:0]; 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) begin if (rst) begin fir_in_reg <= 12'd0; end else begin fir_in_reg <= fir_in; end end
always @(posedge clk or negedge rst) begin if (rst) begin for (i = 0; i <= FIR_TAP - 1; i = i + 1) begin shift_buf[i] <= 13'd0; end end else begin for (j = 0; j <= FIR_TAP - 1; j = j + 1) begin shift_buf[j+1] <= shift_buf[j]; end 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];
mult_gen u_mult_gen_1 (.CLK(clk), .A(cof1), .B(add07), .P(mul1)); mult_gen u_mult_gen_2 (.CLK(clk), .A(cof2), .B(add16), .P(mul2)); mult_gen u_mult_gen_3 (.CLK(clk), .A(cof3), .B(add25), .P(mul3)); mult_gen u_mult_gen_4 (.CLK(clk), .A(cof4), .B(add34), .P(mul4));
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) begin if (rst) begin fir_out <= 27'd0; end else begin fir_out <= {add_mul12[25], add_mul12} + {add_mul34[25], add_mul34}; end end endmodule
|