Anfängerproblem: Prozess einmal ablaufen lassen

Gast #790856
Lesenswert?

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
Angehängte Dateien:
Gast #790863
Lesenswert?

> 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
Gast #790889
Lesenswert?

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.
Gast #790894
Lesenswert?

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.
Gast #790904
Lesenswert?

@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
Gast #791000
Lesenswert?

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
Angehängte Dateien:
Gast #791031
Lesenswert?

@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.
Gast #791077
Lesenswert?

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
Gast #791511
Lesenswert?

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
Angehängte Dateien:
Gast #791573
Lesenswert?

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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren