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
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... ;-)
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.