H
hoangthanhtung
Guest
Dette er koden til at gennemføre FIR ved Verilog til FPGA.
Jeg har simuleret det ved qu (at) rtus 4.0 og konstatere, at resultatet ikke er rettet i den første etape, men korrigeret i den anden cyklus.Jeg kan ikke forklare hvorfor?
Jeg lægger min simulation filen og markerer fejl i to runder.
Alle kan hjælpe mig?//************************************************ *********
/ / IEEE STD 1364-1995 Verilog fil: fir_gen.v
/ / Forfatter-email: Uwe.Meyer-Baese (at) ieee.org
//************************************************ *********
/ / Dette er en generisk FIR filter generator
/ / Det bruger W1 bit data / koefficienter bits
modul fir_gen (CLK, Load_x, x_in, c_in, y_out);
//------------------------------------------------ ---------
parameter W1 = 9, / / Input bit bredde
W2 = 18, / / Multiplikator bit bredde 2 * W1
L = 4 / / Filter længde eller antallet af hanen
W3 = 19, / / adder width = W2 log2 (L) -1
W4 = 11, / / Output bit bredde
Mpipe = 3 / / Pipeline trin i multiplikatoreffekter
input CLK, Load_x / / std_logic
input [W1-1: 0] x_in, c_in / / Indgange = 9 bits
output [W4-1: 0] y_out / / Resultater output 11 bits = 10 bits data
1 bits signal
reg [W1-1: 0] x;
wire [W3-1: 0] y;
/ / 2D array typer dvs memories ikke understøttes af MaxPlusII
/ / i Verilog, brug derfor enkelt vektorer
reg [W1-1: 0] C0, C1, C2, C3; / / Koefficient array
wire [W2-1: 0] P0, P1, P2, P3; / / Produkt array
reg [W3-1: 0] A0, A1, A2, A3 / / adder array
wire [W2-1: 0] sum; / / Auxilary signaler
wire clken, aclr;
//----> Lastelinjer Data eller Koefficient
altid @ (posedge CLK)
begynder: Load
if (Load_x == 0)
begynd
/ / Koefficienter flytte en
/ / Store koefficient i register
C3 <= c_in;
c2 <= C3;
c1 <= c2;
C0 <= c1;
ende
anden
begynd
x <= x_in / / Få en stikprøve på et tidspunkt
ende
ende
//----> Compute sum-of-produkter
altid @ (posedge CLK)
begynder: SOP
/ / Compute den omsat filter tilføjelser
/ / W2 = 18: Multiplikator bit bredde 2 * W1
A0 <= (p0 [W2-1], p0) A1;
a1 <= (p1 [W2-1], p1) A2;
A2 <= (p2 [W2-1], p2) a3;
a3 <= (P3 [W2-1], p3) 19'd00000; / / First TAP har kun et register
ende
tildele y = A0;
/ / Instantiate L pipelined multiplikatoreffekter
lpm_mult mul_0 / / Multiplicer x * C0 = p0
(. ur (CLK). dataa (x),. datab (C0),. resultat (p0));
defparam mul_0.lpm_widtha = W1;
defparam mul_0.lpm_widthb = W1;
defparam mul_0.lpm_widthp = W2;
defparam mul_0.lpm_widths = W2;
defparam mul_0.lpm_pipeline = Mpipe;
defparam mul_0.lpm_representation = "underskrevet";
lpm_mult mul_1 / / Multiplicer x * c1 = p1
(. ur (CLK). dataa (x),. datab (C1). resultat (p1));
defparam mul_1.lpm_widtha = W1;
defparam mul_1.lpm_widthb = W1;
defparam mul_1.lpm_widthp = W2;
defparam mul_1.lpm_widths = W2;
defparam mul_1.lpm_pipeline = Mpipe;
defparam mul_1.lpm_representation = "underskrevet";
lpm_mult mul_2 / / Multiplicer x * c2 = p2
(. ur (CLK). dataa (x),. datab (c2). resultat (p2));
defparam mul_2.lpm_widtha = W1;
defparam mul_2.lpm_widthb = W1;
defparam mul_2.lpm_widthp = W2;
defparam mul_2.lpm_widths = W2;
defparam mul_2.lpm_pipeline = Mpipe;
defparam mul_2.lpm_representation = "underskrevet";
lpm_mult mul_3 / / Multiplicer x * C3 = p3
(. ur (CLK). dataa (x),. datab (C3). resultat (p3));
defparam mul_3.lpm_widtha = W1;
defparam mul_3.lpm_widthb = W1;
defparam mul_3.lpm_widthp = W2;
defparam mul_3.lpm_widths = W2;
defparam mul_3.lpm_pipeline = Mpipe;
defparam mul_3.lpm_representation = "underskrevet";
tildele y_out = y [W3-1: W3-W4];
endmodule
Jeg har simuleret det ved qu (at) rtus 4.0 og konstatere, at resultatet ikke er rettet i den første etape, men korrigeret i den anden cyklus.Jeg kan ikke forklare hvorfor?
Jeg lægger min simulation filen og markerer fejl i to runder.
Alle kan hjælpe mig?//************************************************ *********
/ / IEEE STD 1364-1995 Verilog fil: fir_gen.v
/ / Forfatter-email: Uwe.Meyer-Baese (at) ieee.org
//************************************************ *********
/ / Dette er en generisk FIR filter generator
/ / Det bruger W1 bit data / koefficienter bits
modul fir_gen (CLK, Load_x, x_in, c_in, y_out);
//------------------------------------------------ ---------
parameter W1 = 9, / / Input bit bredde
W2 = 18, / / Multiplikator bit bredde 2 * W1
L = 4 / / Filter længde eller antallet af hanen
W3 = 19, / / adder width = W2 log2 (L) -1
W4 = 11, / / Output bit bredde
Mpipe = 3 / / Pipeline trin i multiplikatoreffekter
input CLK, Load_x / / std_logic
input [W1-1: 0] x_in, c_in / / Indgange = 9 bits
output [W4-1: 0] y_out / / Resultater output 11 bits = 10 bits data
1 bits signal
reg [W1-1: 0] x;
wire [W3-1: 0] y;
/ / 2D array typer dvs memories ikke understøttes af MaxPlusII
/ / i Verilog, brug derfor enkelt vektorer
reg [W1-1: 0] C0, C1, C2, C3; / / Koefficient array
wire [W2-1: 0] P0, P1, P2, P3; / / Produkt array
reg [W3-1: 0] A0, A1, A2, A3 / / adder array
wire [W2-1: 0] sum; / / Auxilary signaler
wire clken, aclr;
//----> Lastelinjer Data eller Koefficient
altid @ (posedge CLK)
begynder: Load
if (Load_x == 0)
begynd
/ / Koefficienter flytte en
/ / Store koefficient i register
C3 <= c_in;
c2 <= C3;
c1 <= c2;
C0 <= c1;
ende
anden
begynd
x <= x_in / / Få en stikprøve på et tidspunkt
ende
ende
//----> Compute sum-of-produkter
altid @ (posedge CLK)
begynder: SOP
/ / Compute den omsat filter tilføjelser
/ / W2 = 18: Multiplikator bit bredde 2 * W1
A0 <= (p0 [W2-1], p0) A1;
a1 <= (p1 [W2-1], p1) A2;
A2 <= (p2 [W2-1], p2) a3;
a3 <= (P3 [W2-1], p3) 19'd00000; / / First TAP har kun et register
ende
tildele y = A0;
/ / Instantiate L pipelined multiplikatoreffekter
lpm_mult mul_0 / / Multiplicer x * C0 = p0
(. ur (CLK). dataa (x),. datab (C0),. resultat (p0));
defparam mul_0.lpm_widtha = W1;
defparam mul_0.lpm_widthb = W1;
defparam mul_0.lpm_widthp = W2;
defparam mul_0.lpm_widths = W2;
defparam mul_0.lpm_pipeline = Mpipe;
defparam mul_0.lpm_representation = "underskrevet";
lpm_mult mul_1 / / Multiplicer x * c1 = p1
(. ur (CLK). dataa (x),. datab (C1). resultat (p1));
defparam mul_1.lpm_widtha = W1;
defparam mul_1.lpm_widthb = W1;
defparam mul_1.lpm_widthp = W2;
defparam mul_1.lpm_widths = W2;
defparam mul_1.lpm_pipeline = Mpipe;
defparam mul_1.lpm_representation = "underskrevet";
lpm_mult mul_2 / / Multiplicer x * c2 = p2
(. ur (CLK). dataa (x),. datab (c2). resultat (p2));
defparam mul_2.lpm_widtha = W1;
defparam mul_2.lpm_widthb = W1;
defparam mul_2.lpm_widthp = W2;
defparam mul_2.lpm_widths = W2;
defparam mul_2.lpm_pipeline = Mpipe;
defparam mul_2.lpm_representation = "underskrevet";
lpm_mult mul_3 / / Multiplicer x * C3 = p3
(. ur (CLK). dataa (x),. datab (C3). resultat (p3));
defparam mul_3.lpm_widtha = W1;
defparam mul_3.lpm_widthb = W1;
defparam mul_3.lpm_widthp = W2;
defparam mul_3.lpm_widths = W2;
defparam mul_3.lpm_pipeline = Mpipe;
defparam mul_3.lpm_representation = "underskrevet";
tildele y_out = y [W3-1: W3-W4];
endmodule