www.mikrocontroller.net

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


Autor: Daniel Reitz (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Daniel Reitz (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Und hier ist das VHD-File!

Autor: Martin Kohler (mkohler)
Datum:

Bewertung
0 lesenswert
nicht 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);

Autor: Daniel Reitz (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.