Forum: FPGA, VHDL & Co. Simulationsproblem bei XOR-Verknüpfung


von Daniel Reitz (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,
ich habe ein Problem mit der Vorzeichenbildung in meinem
2D-IDCT-Modul.

Der Hammer ist, dass ich, nachdem ich die Koeffizienten-Vorzeichen mit
dem DCT-Eingangsdatenstrom-Vorzeichen „XOR“-verknüpfe, einen
undefinierten Zustand erhalte und ich Stunden gebraucht habe, bis ich
drauf gekommen bin, warum er beim anschließenden if-else-Zweig für die
etwaige Zweierkomplementbildung nach der Multiplikation für
„product_x_o“ immer negative Zahlen ausgibt (außer beim ersten
Array-Element -?)!.

Das beigefügte Bild zeigt im unteren Teil „sign_data_o“ und
„sign_coeff_o“. Diese beiden Signale werden xor-verknüpft und auf
„sign_o“ gelegt. Das Ergebnis ist für die Koeffizienten 2 bis 8 falsch,
das erste Element(0) weist einen definierten Zustand(0) auf, der sogar
richtig ist (da der erste Koeffizient immer positiv ist).

Simulationszeit nur über die ersten 250 ns betrachten!

Könnte der Simulator (Modelsim) daran schuld sein?
Das Problem ist, dass der ISE Simulator aber auch gar nicht zu
gebrauchen ist, beim Probieren hat er mir nicht einmal alle Signale
angezeigt, deshalb konnte kein Vergleich herangezogen werden.

Ich verwende den Xilinx Project Navigator ISE 8.1i – hat recht viele
Bugs, aber das weiß ich ja aus diesem Forum, Service Pack für diese
Version hab ich nicht installiert, ob das auch daran liegt (ich habe
keine schnelle ADSL-Internetanbindung, daher ist ein Download in einer
vertretbaren Zeit nicht möglich)?

Man kann sich nicht auf die eigentlichen Probleme stürzen, wenn solche
Fehler auftreten. :-)

Wäre schön, wenn mir jemand hierbei helfen könnte. Vielleicht kann das
jemand von euch einmal versuchen zu simulieren?

Gruss, Daniel

von Daniel Reitz (Gast)


Angehängte Dateien:

Lesenswert?

Und hier ist das VHD-File!

von Martin K. (mkohler)


Lesenswert?

Versuchs mal mit der Sensitivity-Liste.
Ein Beispiel aus deinem Code:
------------------------
data_adding_final_p: process(clk,reset)  --2 clk
begin
if(reset='1') then
  idct_2d_adder_1 <= (others => '0');
  idct_2d_adder_2 <= (others => '0');
  idct_2d_adder_3 <= (others => '0');
  idct_2d_adder_4 <= (others => '0');
  idct_2d_adder_final <= (others => '0');
elsif(clk'event and clk='1') then
  idct_2d_adder_1 <= product_b_reg(0) + product_b_reg(1);
  idct_2d_adder_2 <= product_b_reg(2) + product_b_reg(3);
  idct_2d_adder_3 <= product_b_reg(4) + product_b_reg(5);
  idct_2d_adder_4 <= product_b_reg(6) + product_b_reg(7);
  idct_2d_adder_final <= idct_2d_adder_1 + idct_2d_adder_2 +
idct_2d_adder_3 + idct_2d_adder_4;  --22 bits
end if;
end process data_adding_final_p;
-------------------------------------
Hier müsste zusätzlich zu clk und reset auch noch product_b_reg in die
Liste.
Ich hatte auch schon Probleme mit Modelsim, wenn nicht ALLE
Eingangssignale eines process in der Sensitivity List standen.

Und noch was:
Am Ende deines Codes machst du Zuweisungen der Art:
sign_o(0)<=sign_mult_a_reg(0);
sign_o(1)<=sign_mult_a_reg(1);
sign_o(2)<=sign_mult_a_reg(2);
sign_o(3)<=sign_mult_a_reg(3);
sign_o(4)<=sign_mult_a_reg(4);
sign_o(5)<=sign_mult_a_reg(5);
sign_o(6)<=sign_mult_a_reg(6);
sign_o(7)<=sign_mult_a_reg(7);

Das könnte doch einfacher geschrieben werden:
sign_o(7 downto 0)<= sign_mult_a_reg(7 downto 0);

von Daniel Reitz (Gast)


Lesenswert?

Danke Martin für den Hinweis mit der Sensitivity-List.
(Ich habe gleich alle Ein- und Ausgänge :-) in der Sensitivity-List
angeführt)

Ich habe jetzt nur den ersten Teil des Codes noch einmal in ein eigenes
File kopiert und simuliert.
Das hat anfangs nicht funktioniert, dann doch – es ist zum Verzweifeln,
aber jetzt funktioniert es zumindest im Codeausschnitt, wenn ich
dasselbe im ursprünglichen Gesamtmodul ausprobiere, bekomme ich wieder
diesen schönen, undefinierten Zustand (diesmal für alle Koeffizienten)
– unglaublich!

=> hier wurde wohl ein Bug gefunden, wie ich das beheben (besser:
umgehen) kann, weiß ich noch nicht, die Ursachen, d.h. welche
Bedingungen zu diesem Problem führen, sind mir auch noch nicht klar.

Naja, ich gebe nicht auf und werde es weiterhin versuchen!

Gruss, Daniel

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.