Hallo, ich soll in der Uni eine Ampelsteuerung mit vhdl umsetzen und auf ein FPGA laden. Dafür habe ich unterschiedliche Zustände die immer unterschiedlich lang laufen sollen. Wie lange ein Zustand läuft wird über einen Counter definiert der jede Sekunde hochzählt. Mein Problem ist jetzt, dass ich wenn ein Zustandsübergang stattfindet diesen Counter zurücksetzen möchte, also das reset-signal auf '1' setzen. Leider muss das Signal damit dann angefangen werden kann zu zählen auch wieder auf '0' zurückgesetzt werden und genau das kriege ich nicht hin. Gibt es eine einfache Möglichkeit ein Signal für etwa eine Clockperiode auf '1' zu setzen und es automatisch danach wieder zurückzusetzen? Im Vorraus schon mal vielen Dank.
Nils S. schrieb: > Gibt es eine einfache Möglichkeit ein Signal für etwa eine Clockperiode > auf '1' zu setzen und es automatisch danach wieder zurückzusetzen? Also ich würde zwischen dem Zustand Grün und Rot dann einen Zustand Rot+CntrReset einführen, indem dein Zähler rückgesetzt wired, die Ampel noch rot anzeigt und sobald du in Grün bist steht dein Zähler für die neue Aufgabe bereit. case currentState is redCntrReset => nextState <= green; ....
Nils S. schrieb: > Gibt es eine einfache Möglichkeit ein Signal für etwa eine Clockperiode > auf '1' zu setzen und es automatisch danach wieder zurückzusetzen? Ja. Das ist ganz normales synchrones Design: dort werden laufend Valid-Signale erzeugt, die für 1 Taktzyklus lang aktiv sind und Aktionen auslösen. Oder andersrum: es gibt nur 1 Takt im gesamten Design. Der Rest sind Clock-Enables, die von diesem Takt abgeleitet werden... Wie das gemeint ist, das kannst du z.B. im Beitrag "Ampelsteuerung mit Schematics Basys2" sehen. Oder eigentlich ist eine Ampel erst mal nichts Anderes als ein spezialisiertes Lauflicht http://www.lothar-miller.de/s9y/archives/61-Lauflicht.html
:
Bearbeitet durch Moderator
Du berechnest ja irgendwo einen Folgezustand für Deine State Machine, der im nächsten Takt in das State Register übernommen wird. Du könntest einfach abfragen ob Folgezustand != aktueller Zustand ist, und falls ja, Reset=1 setzen. Dann wird bei jedem Wechsel in einen andere Zustand der Reset für einen Takt gesetzt.
Nils S. schrieb: > mit vhdl umsetzen und auf ein FPGA laden. Dafür habe ich unterschiedliche > Zustände die immer unterschiedlich lang laufen sollen. Lass doch mal sehen...
Wenn du eine schnelle Lösung brauchst, dann so:
1 | signal latch : std_logic; |
2 | signal latch_dl : std_logic; |
3 | |
4 | ...
|
5 | |
6 | (in deinem Prozess, der in dem Fall getaktet sein muss) |
7 | process(clk) |
8 | begin
|
9 | |
10 | if rising_edge(clk) then |
11 | latch_dl <= latch; |
12 | if(latch_dl /= latch) then |
13 | reset_sig = '1'; |
14 | else
|
15 | reset_sig = '0'; |
16 | end if; |
17 | end if; |
18 | |
19 | end process; |
Somit erreichst du, dass dein "Reset"-Signal für einen Takt high ist. Aber vorsicht: Wenn du latch high und dann wieder low setzt hast du zwei resets ausgelöst. Es wird daher empfohlen das signal latch mit not invertieren zu lassen. Vllt suchst du danach.
Warum nicht einfach sowas?
1 | when green => |
2 | if s_cntr = XYZ THEN |
3 | state <= rot; |
4 | s_cntr <= 0; |
5 | else
|
6 | s_cntr <= s_cntr + 1; |
7 | end if; |
Damit hast Du beim Übergang in den nächsten State deinen cntr wieder auf Null und kann ihn dort neu hochzählen mit einem anderen Grenzwert.
ich bringe mal den Vorschlag:
1 | process (clk) is |
2 | begin
|
3 | if rising_edge(clk) then |
4 | signal <= '0'; |
5 | case state is |
6 | when state1 => |
7 | signal <= '1'; |
8 | state <= state2; |
9 | |
10 | when state2 => |
11 | state <= state3; |
12 | ...
|
Das setzt das signal "signal" beim Uebergang genau fuer eine Taktperiode. Ralf
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.