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
Vous devez vous connecter pour publier un commentaire.
Zone et efficace de l'énergie FIR/IIR filtres sont le saint-graal pour certains.
À l'aide de générer des déclarations que vous avez instancié 13 multiplicateurs. Les multiplicateurs de prendre beaucoup de domaine. Il est courant de les instancier l'un et l'heure multiplex (TDM). Dans ce cas, fournir une horloge (cochez la case) 13 fois plus rapide que le taux de sortie.
Votre additionneur de la chaîne tout en regardant à nouveau valides va être très grande et pourrait conduire à des problèmes de timing car il pourrait être très longue ondulation des chaînes. Faire sur plusieurs cycles pourrait entraîner une baisse de la zone et de la puissance.
Si vous combinez la multiplication d'un échantillon avec la plus vous disposerez d'un plus typique de l'architecture MAC (Multiplier Accumuler).
Je voudrais aussi éviter l'initialisation des constantes dans une
always @*
que pas de à droite, d'arguments, de changer ce qui peut ne pas déclencher la sensibilité de la liste.Pour ces je voudrais utiliser
localparams
, ou si vous allez en bas de la TDM route je voudrais créer un Look up table (LUT).OriginalL'auteur Morgan
En supposant que votre choix de réponse du filtre est justifiée (5.2 dB ondulation!)
Ensuite une approche de compromis certains précision de réponse pour la réduction de la puce de ressources en utilisant Canonique signé la représentation chiffres [http://en.wikipedia.org/wiki/Canonical_signed_digit] rapprochant chaque coefficient. Cette réduction de la Résistance [http://en.wikipedia.org/wiki/Strength_reduction] (compilateur terme) permet efficace changements ie de routage et ajoute à être utilisé à la place de cher multiplie les.
Ensuite, en raison de la symétrie des coefficients respectifs des échantillons peut être résumé avant d'appliquer le coefficient, ce qui a considérablement gouttes nécessaires à puce ressources.[1]
Mais alors il est probablement être des facteurs communs dans les coefficients de mise en œuvre, ce qui, pour une puce de la cible peuvent obtenir certains d'optimisation, mais pour le firmware d'importantes améliorations peuvent être apportées.
[1] = DSP Astuces: Une drôle de façon de construire simplifié filtre FIR de la structure de Richard G. Lyon
essayer http://www.embedded.com/design/embedded/4008837/DSP-Tricks-An-odd-way-to-build-a-simplified-FIR-filter-structure
OriginalL'auteur chip_wrangler