Hi Leute,
Ich bastele gerade an einem größeren Projekt rum. Es soll auf dem Xilinx
Spartan 3E FPGA Board ein SPI-zu-servotaugliches-PWM - Konverter
implementiert werden. Nach einiger Arbeit funktioniert der Code in der
behavioral simulation, aber auf dem FPGA tut sich sehr wenig (und was
sich tut, tut es falsch). Schon die post-translate simulation funzt
nicht mehr. Eins der Fehler hab ich schon isolieren können - ein
3-Bit-Zähler initialisiert sich immer mit einer 7, wobei im Quellcode
explizit der Init-Wert 0 steht. Also entweder hab ich einen Fehler
gemacht oder die Maschinen fangen schon an, sich gegen die Menschen zu
stellen. Könnte jemand mal meinen Code anschauen? Hier ist es:
Viktor B. schrieb:> Könnte jemand mal meinen Code anschauen? Hier ist es:
Bitte die vhdl Tags um den Sourcecode Rum machen....
> clk_ersatz ist der Zählinput.
Wo kommt der her? Ist der synchron zum FPGA Takt?
> Könnte jemand mal meinen Code anschauen?
Dein Problem liegt nicht im geposteten Code...
Die VHDL-Tags gibt es auch? Cool, merke ich mir. Also, der clk_ersatz
ist an den SCL-Port des SPI angeschlossen, deswegen asynchron (ansonsten
würde er immer an der Flanke erfasst werden, vllt keine so gute Idee).
Wenn der Code hier fehlerfrei ist, was könnte sonst den Reset-Wert des
Zählers beeinflussen?
Es kann auch sein, das mein ISE Webpack spinnt, ich versuche mal das
übliche force reparse + cleanup
Viktor B. schrieb:> nicht mehr. Eins der Fehler hab ich schon isolieren können - ein> 3-Bit-Zähler initialisiert sich immer mit einer 7, wobei im Quellcode> explizit der Init-Wert 0 steht.
Nein da steht der "Reset"-Wert 0, kein "Init"-Wert. Ein explizites Init
-also eine Wertzuweisung bei der Signaldeklaration- findet sich nicht im
Code.
Dann nimmt VHDL den linken Wert des ranges und das ist 7.
Viktor B. schrieb:> Also, der clk_ersatz ist an den SCL-Port des SPI angeschlossen,> deswegen asynchron
Dann solltest du den SCL erst mal über 1-2 Flipflops einsynchronisieren.
Sonst tut das Design immer wieder mal "seltsame" Dinge...
Siehe http://www.lothar-miller.de/s9y/categories/35-Einsynchronisieren
Eine Flankenerkennung geht übrigens einfacher:
http://www.lothar-miller.de/s9y/categories/18-Flankenerkennung> Wenn der Code hier fehlerfrei ist
Wenn die Simulation läuft (und nicht solche seltsamen unvollständigen
Sensitivlisten hat, die dann aber der Synthesizer anmeckert), dann ist
der Code fehlerfrei.
> was könnte sonst den Reset-Wert des Zählers beeinflussen?
Wenn du den Zähler eigentlich nie verwendest, wird der auf den nötigen
Wert zurechtoptimiert. Wenn du z.B. 100 Eingänge aufwändig miteinander
verknüpfst und verrechnest aber das Ergebnis auf keine Art ausgibst,
dann wird alles wegoptimiert. Denn der Synthesizer realisiert nur das in
Hardware, was tatsächlich Auswirkung auf Ausgänge hat.
> Es kann auch sein, das mein ISE Webpack spinnt
Das ist die Hoffnung des Anfängers, aber sehr unwahrscheinlich
(<0,0001%).
Welche Infos, Warnungen und Fehler werden beim Übersetzen des Codes
ausgegeben?
> Eins der Fehler hab ich schon isolieren können - ein 3-Bit-Zähler> initialisiert sich immer mit einer 7, wobei im Quellcode explizit der> Init-Wert 0 steht.
Da steht gar nix (und deshalb wird wie erwähnt defaultmäßig der linke
Rangewert genommen):
signal value: integer range width-1 downto 0;
Schreib doch einfach mal:
signal value: integer range width-1 downto 0 := 0;
BTW: warum definierst du die Zähler abfallend? Ein Integer ist als
steigender Wert definiert. Evtl. haut es dich da schon auf die Nase.
Probier es mal wie der Rest der Welt so:
signal value: integer range 0 to width-1;
Dann hat sich mit ein wenig Mitdenken auch die Sache mit dem Initwert
erledigt. Und dir wird klar, warum der Rest der Welt dieses Problem
nicht hat...
Nach dem Hinzufügen eines expliziten Inits (:= 0) scheint alles sogar in
der post-route simulation zu funktionieren! Vielen Dank für die
Hilfestellung, sonst hätte ich den Fehler noch etliche Monate gesucht.
Trotzdem komisch, dass der Zähler sich auch nicht unter Reset
zurückgesetzt hat. Dann wende ich mich als nächstes der
Einsynchronisierung hin.
Und wegen der Definition des Zählers: Ich hab einfach stumpf alle
Vektoren als abfallend definiert, weil es für mich (eben Anfänger) ein
Leichtes ist, sich in den Definitionen zu verheddern und dann ein paar
Vektoren spiegelverkehrt zuzuweisen. Das hatte ich schon durch und würde
es nur ungerne nochmal tun.
Viktor B. schrieb:> Ich hab einfach stumpf alle Vektoren als abfallend definiert
Vektoren schon, denn durch das downto wird da eine absteigende
Wertigkeit der Bits von links nach rechts abgebildet.
Bei einem Integer ist das so nicht darstellbar. Der zählt einfach.von
unten nach oben...
Viktor B. schrieb:> Und wegen der Definition des Zählers: Ich hab einfach stumpf alle> Vektoren als abfallend definiert, weil es für mich (eben Anfänger) ein> Leichtes ist, sich in den Definitionen zu verheddern und dann ein paar> Vektoren spiegelverkehrt zuzuweisen. Das hatte ich schon durch und würde> es nur ungerne nochmal tun.
Man kann ein paar "Fehler" mit den Zählern umgehen, wenn man statt die
"Eckwerte" des counters -also der Grösste und der Kleinste- als Zahlen
anzugeben (bei dir 0 und 7) die Attribute 'high und 'low verwendet.
Dazu muss man -wie du bereits getan hast- den Zähler als integer range
definieren und (was bei dir nicht der Fall ist) diese integer range als
eigenen Typ deklarieren.
Beispielschnipsel:
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