Hi, mit VHDL bin ich totaler Anfänger, bitte seid also gnädig mit mir! Ich versuche Folgendes auf einem CoolRunner XCR3128 zu implementieren: Bei '1'->'0' von "nwrite" soll eine Zahl von den Eingängen "value" gelesen werden. "value" gibt vor, wie viele Impulse mit halber Taktfrequenz über eine der 64 Leitungen, deren Adresse in "CPaddr" spezifiziert wird, ausgegeben werden sollen. Das klappt soweit, aber ich möchte bei jeder fallenden Flanke an "nwrite" nur einmal "value" Impulse ausgeben. Der Ausgang "busy" soll '1' sein, solange Impulse ausgegeben werden. "nwrite" soll danach beliebig lange auf '0' bleiben dürfen. Erst bei der nächsten fallenden Flanke von "nwrite" (würde erst erfolgen, wenn "busy" '0' ist, also klassisches Handshaking) soll der Prozeß erneut beginnen. Alle meine bisherigen Versuche, die Impulsfolge nur 1x auszugeben, haben zu Quatsch geführt (d.h. zu mehreren Prozessen, die das gleiche Signal zu verändern suchen). Welche andere Möglichkeit gibt es? StateMachine - wie? Würde es helfen, nwrite wie ein Clock-Signal zu behandeln und mit falling_edge() abfragen und: wäre das akzeptabel? Danke! Gruß Fred
> Würde es helfen, nwrite wie ein Clock-Signal zu behandeln und mit > falling_edge() abfragen und: wäre das akzeptabel? Nein. Sowas macht man nicht. Such mal nach Flankenerkennung. Und Überlege Dir erstmal, wieviel (und welche) Zustände Dein System einnehmen kann. Dann überlegst Du Dir, welche Ereignisse auftreten müssen, um eine Zustandsänderung hervorzurufen. Dann brauchst Du nur noch die richtigen Prozesse um die Ereignisse zu erzeugen. Rick
Danke, Rick. Das mit der Flankenerkennung ist jetzt klar. Es bleibt allerdings mein Hauptproblem, wie ich es schaffe, die serielle Ausgabe pro fallender Flanke an "nwrite" nur einmal zu machen. Meine jetzigen Prozesse stehen im Quellcode.
Würde man sich mal endlich klarmachen, daß es in FPGAs keine Prozesse gibt, die ausdrücklich definiert werden und daß dieses statement rein für Simulationen eine Bedeutung hat, kämen solche Fragen nicht auf.
@H.Ullmann: Ich hatte um gnädige Behandlung gebeten, komme nun mal aus der Microcontroller-Welt; parallele Prozesse und HDL sind Neuland für mich. Deine Antwort hilft mir zwar, mich noch blöder zu fühlen, bringt mich ansonsten allerdings nicht weiter. Gruß Fred
State: auf Flanke warten State: Ausgabe machen So ungefähr? Rick
Hi, danke, Rick. > State: auf Flanke warten siehe Code (ganz unten), Signalerkennung jetzt mit Clock synchronisiert. > State: Ausgabe machen Siehe Code; nur: wie setze ich den State zurück, wenn die Ausgabe komplett ist? Ich meine programmiertechnisch? State = Signal? Der State kann sich ja wieder durch das nwrite Signal zu "neue Daten warten" ändern. Gruß Fred
@Fred: Du darfst den Prozessen auch Namen geben. Das erhöht die Lesbarkeit:
1 | begin
|
2 | do_whatever: process(clk, newdata, newdatal) |
3 | begin
|
Außerdem kommt bei synchroner Logik (das hast Du hier) nur der clk und der asynchrone Reset in die sensitivity list. Der asynchrone Reset entfällt bei Dir. Ich würde so auf eine Flanke warten:
1 | edge_detect:process(clk) |
2 | begin
|
3 | if rising_edge(clk) then |
4 | nwrite_old <= nwrite; |
5 | nwrite_falling_edge <= (not nwrite) and nwrite_old; |
6 | end if; |
7 | end if; |
8 | end process; |
> wenn die Ausgabe komplett ist?
Da steht es doch. Du generierst ein Signal für einen Takt:
1 | ausgabe_komplett <= '1'; |
Und schaltest damit in der state machine wieder auf warten. Schau Dir an, wie mit Deinem Synthesewerkzeug (Xilinx xst?) state machines codiert werden sollen. Rick P.S.: Deine for-Schleifen dienen irgendwie nicht der Lesbarkeit.
Hi Rick, danke für Deine konstruktive Kritik und Deine Vorschläge! Die for Schleife im Code hilft mir, nicht 64 Bedingungen (Adressen, die dekodiert werden) einzeln hinschreiben zu müssen. > Schau Dir an, wie mit Deinem Synthesewerkzeug (Xilinx xst?) state > machines codiert werden sollen. Das ist wahrscheinlich der Knackpunkt; im Gegensatz zur Mikrocontroller-Programmierung fehlt mir bei VHDL einfach die Übersicht, was wie am besten machbar ist. Ich werde das eruieren und meine Änderungen dann hier wieder vorstellen. Ja, ich verwende Xilinx (Webpack 6.3). Die Menge an Infos sind da anfangs etwas überwältigend. Habe heute ModelSim installiert und zum ersten Mal benutzt. Viele Grüße Fred
Hi, dank Ricks Hilfe (vor allem der Hinweis auf die Beispiele im XST User Manual war sehr hilfreich!) habe ich eine State Machine implementiert - siehe Anlage. Jeder abgeschlossene Prozess erzeugt ein Signal, dass die State Machine in den nächsten Zustand versetzt. In der Simulation funktioniert es auch. Gruß Fred
Das sieht zwar immer noch etwas wirr aus, aber es wird besser :-) Weiter so. Hast Du zum Simulieren eine Testbench? Wie sieht die aus? Rick
Danke , Rick!
> ... Hast Du zum Simulieren eine Testbench? Wie sieht die aus?
Ich kann mit dem WebPack Testdaten erzeugen und dann das Ergebnis mit
ModelSim anzeigen lassen: siehe Anlage.
Viele Grüße
Fred
Ich konnte das Bild an das obige Posting nicht mehr anhängen, deshalb jetzt hier.
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.