Forum: FPGA, VHDL & Co. Grundlegende Frage zu VHDL-Struktur und Automatengrpahen?


von Olli R. (downunderthunder42)


Lesenswert?

Hallo,
ich heute schon seit einiger Zeit dabei eine konkrete Aufgabe in VHDL zu 
lösen.
Es geht dabei um die einfache Entwicklung eines "Spiels" auf einem 
Spartan 3 E FPGA.

Nun, da ich mein Konzept schon des Öfteren verworfen und neu aufgerollt 
habe, ist mir auf gefallen, dass ich wohl grundlegend einen Fehler 
machen. Deshalb wollte einfach mal nach einem Grundlegenden Tipps zum 
Umsetzen in VHDL erfragen.

Und zwar:

Ich habe einen Automatengraphen, der z.B. 10 Zustände hat. In jedem 
Zustand wird etwas ausgegeben (im Konkreten Fall af einem LCD).
Jetzt ist es so, dass ich im Automatengraph in bestimmten Zuständen 
Zählvariablen nur um 1 erhöhen will, und dann wieder zurücksetzen.
Z.B. wenn der Automat 3mal durchgelaufen ist gehe permanent in Zustand 6 
(ok blödes Beispiel) aber wie (besser wo) inkrementiert man dann z.B. so 
ein "Laufvariablen-Signal" "Durchläufe"?) und wo bzw. wie setzt man es 
am besten zurück.

Meine bisherige Herangehensweise war, einen eigenen getaktenen Prozess 
für das Rücksetzen und Inkrementieren dieser Laufvariablen anzulegen und 
dann dieses Inkrementieren in meiner "Folgezustandsberechung" über 
ENable und Acknowledge-Signale zu steuern. Aber irgendwie ist mir das zu 
sehr verschachtelt und man verliert leicht den Überblick ?

wie kann man soetwas den geschickter Lösen? gibt es gute Beispiel dafür?


Dann Gute Nacht oder besser Guten Morgen

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Olli R. schrieb:
> wie kann man soetwas den geschickter Lösen? gibt es gute Beispiel dafür?
Ich mache das gern mit der Ein-Prozess-Methode, da können Zähler einfach 
so "mitten im Zustand" hochgezählt werden:
http://www.lothar-miller.de/s9y/archives/43-Ein-oder-Zwei-Prozess-Schreibweise-fuer-FSM.html

So "seltsame" Nebeneffekte wie Latency lernt man im Laufe der Zeit 
kennen und beherrschen. Man muß einfach "einen Takt voraus" denken... 
;-)

von Olli R. (Gast)


Lesenswert?

Cool vom Prinzip her ist mir das jetzt klar...
man geht also mit solchen Variable genauso wie mit der 
Zustandsberechnung

----
also in der Zustandsübernahme steht
counter <= next_counter;
und in der Folgezustandsberechnung steht dann
when work  => if (stop='1') then
               next_state <= done;
               end if;
               next_counter <= counter+1;


oh man das ist mir ja jetzt trotz Müdigkeit klar...
Danke dann kann ja jetzt in Zukunft einfacherere Designs machen!!
und so komisch mit etlichen "CACHE-Prozessen" etc. ;)

Aber erstmal versuche ich das auf mein Prob anzuwenden.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Olli R. schrieb:
> man geht also mit solchen Variable genauso wie mit der
> Zustandsberechnung
>
> ----
> also in der Zustandsübernahme steht
> counter <= next_counter;
> und in der Folgezustandsberechnung steht dann
> when work  => if (stop='1') then
>                next_state <= done;
>                end if;
>                next_counter <= counter+1;
Ja, eigentlich schon, nur würde ich das dann gleich (ohne die 
next_...) so machen:
1
if rising_edge(clk) then
2
:
3
:
4
  when work  => if (stop='1') then
5
                   state <= done;
6
                end if;
7
                counter <= counter+1;

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.