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
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
ifrising_edge(clk)then
4
nwrite_old<=nwrite;
5
nwrite_falling_edge<=(notnwrite)andnwrite_old;
6
endif;
7
endif;
8
endprocess;
> 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
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