Forum: FPGA, VHDL & Co. reset signal zurücksetzen


von Nils S. (max_muster_m)


Lesenswert?

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.

von Andreas (Gast)


Lesenswert?

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;
....

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


Lesenswert?

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
von Vancouver (Gast)


Lesenswert?

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.

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


Lesenswert?

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...

von Dajana K. (hummer90)


Lesenswert?

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.

von Marc M. (bench)


Lesenswert?

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.

von Ra;f (Gast)


Lesenswert?

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