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
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);
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.