Mettre en œuvre un Filtre FIR en Verilog

Je suis en train de mettre en œuvre un filtre FIR en Verilog. J'ai prédéterminé de coefficients dans MATLAB. Mais je ne suis pas sûr de savoir si les registres de propager correctement avec ce code.

module fir_filter(
  input clock,
  input reset,
  input wire[15:0] input_sample,
  output reg[15:0] output_sample);

parameter N = 13;
reg signed[15:0] coeffs[12:0];
reg [15:0] holderBefore[12:0];
wire [15:0] toAdd[12:0];

always @(*)
begin
    coeffs[0]=6375;
    coeffs[1]=1;
    coeffs[2]=-3656;
    coeffs[3]=3;
    coeffs[4]=4171;
    coeffs[5]=4;
    coeffs[6]=28404;
    coeffs[7]=4;
    coeffs[8]=4171;
    coeffs[9]=3;
    coeffs[10]=-3656;
    coeffs[11]=1;
    coeffs[12]=6375;
end

genvar i;

generate
for (i=0; i<N; i=i+1)
    begin: mult
        multiplier mult1(
          .dataa(coeffs[i]),
          .datab(holderBefore[i]),
          .result(toAdd[i]));
    end
endgenerate

always @(posedge clock or posedge reset)
begin
    if(reset)
        begin
            holderBefore[12]    <= 0;
            holderBefore[11]    <= 0;
            holderBefore[10]    <= 0;
            holderBefore[9]     <= 0;
            holderBefore[8]     <= 0;
            holderBefore[7]     <= 0;
            holderBefore[6]     <= 0;
            holderBefore[5]     <= 0;
            holderBefore[4]     <= 0;
            holderBefore[3]     <= 0;
            holderBefore[2]     <= 0;
            holderBefore[1]     <= 0;
            holderBefore[0]     <= 0;
            output_sample       <= 0;
        end
    else
        begin               
            holderBefore[12]    <= holderBefore[11];
            holderBefore[11]    <= holderBefore[10];
            holderBefore[10]    <= holderBefore[9];
            holderBefore[9]     <= holderBefore[8];
            holderBefore[8]     <= holderBefore[7];
            holderBefore[7]     <= holderBefore[6];
            holderBefore[6]     <= holderBefore[5];
            holderBefore[5]     <= holderBefore[4];
            holderBefore[4]     <= holderBefore[3];
            holderBefore[3]     <= holderBefore[2];
            holderBefore[2]     <= holderBefore[1];
            holderBefore[1]     <= holderBefore[0];
            holderBefore[0]     <= input_sample;
            output_sample <= (input_sample + toAdd[0] + toAdd[1] + 
                              toAdd[2] + toAdd[3] + toAdd[4] + toAdd[5] +
                              toAdd[6] + toAdd[7] + toAdd[8] + toAdd[9] + 
                              toAdd[10] + toAdd[11] + toAdd[12]);
        end
end



endmodule

Est-ce la meilleure façon de mettre en œuvre cette? est-il une meilleure façon de le faire le plus?

Toute aide est grandement appréciée!

Également des ressources de l'aide est grandement appréciée.

OriginalL'auteur Mat A | 2013-02-27