Forum: FPGA, VHDL & Co. Anfängerproblem: Prozess einmal ablaufen lassen


von Fred S. (Gast)


Angehängte Dateien:

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

von Rick Dangerus (Gast)


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

von Fred S. (Gast)


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.

von H.Ullmann (Gast)


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.

von Fred S. (Gast)


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

von Rick Dangerus (Gast)


Lesenswert?

State: auf Flanke warten
State: Ausgabe machen

So ungefähr?

Rick

von Fred S. (Gast)


Angehängte Dateien:

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

von Rick Dangerus (Gast)


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.

von Fred S. (Gast)


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

von Fred S. (Gast)


Angehängte Dateien:

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

von Rick Dangerus (Gast)


Lesenswert?

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

von Fred S. (Gast)


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

von Fred S. (Gast)


Angehängte Dateien:

Lesenswert?

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
Noch kein Account? Hier anmelden.