www.mikrocontroller.net

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


Autor: Fred S. (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Rick Dangerus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Fred S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: H.Ullmann (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Fred S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Rick Dangerus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
State: auf Flanke warten
State: Ausgabe machen

So ungefähr?

Rick

Autor: Fred S. (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Rick Dangerus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Fred:
Du darfst den Prozessen auch Namen geben. Das erhöht die Lesbarkeit:
begin 
  do_whatever: process(clk, newdata, newdatal)
  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:
  edge_detect:process(clk)
     begin
      if rising_edge(clk) then
        nwrite_old <= nwrite;
        nwrite_falling_edge <= (not nwrite) and nwrite_old;
      end if;
     end if;
  end process;

> wenn die Ausgabe komplett ist?
Da steht es doch. Du generierst ein Signal für einen Takt:
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.

Autor: Fred S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Fred S. (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Rick Dangerus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Fred S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Fred S. (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Ich konnte das Bild an das obige Posting nicht mehr anhängen, deshalb 
jetzt hier.

Antwort schreiben

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

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.