Forum: FPGA, VHDL & Co. Reset Problem


von Mel (Gast)


Lesenswert?

Hallo Leute,

Ich habe mir ein schönes Programm zusammengestoppselt, dass den Scancode 
einer ps/2 tastatur ausliest, richtig decodiert und am DE2 Board als 
Wert an der 7 Segmentanzeige ausgibt (also die Tasten von NUMPAD 
0,...,9).

Mein Problem: Ich habe als asynchronen Reset den KEY1 am DE2 Board 
hergenommen. Wird dieser gedrückt, sollte die 7Segmentanzeige auf 0 
gehen. Dieses tut sie aber nur während ich den Knopf gedrückt habe! 
Danach verfällt die Anzeige in den letzten Wert, der eingegeben wurde.

Als Reset verwende ich immer den typischen storage process:
1
state_storage: process(reset,clock)
2
begin
3
  if reset='1' then 
4
    state <=IDLE;
5
   char_code<=(others=> '0');
6
   char_ready<='0';
7
  elsif (rising_edge(clock)) then 
8
      state <= next_state;
9
      char_ready <= char_ready_next;
10
      char_code<=char_code_next;
11
  
12
  end if;
13
end process state_storage;

Auch die negative Logik wird berücksichtigt! Was könnte mein Fehler 
sein?

LG Mel

von Dimi S. (ilovespeccy)


Lesenswert?

Hallo,

beim Reset soll wahrscheinlich "next_state" auch IDLE werden,
sonnst springt nach dem Reset deine FSM in letzte State.
Mehr kann man ohne vollständige Source Code nicht erkennen

MfG

von Mel (Gast)


Lesenswert?

Nur state wird in der State_Machine dann auch verwendet, deshalb müsste 
er sowieso ins IDLE springen:
1
next_state_func: process (keytrigger_next, state)
2
begin
3
case state is
4
5
when IDLE =>

Der sourcecode ist weit über 100 Zeilen lang, dass will ich euch 
wirklich nicht zumuten...

von C. E. (Firma: Student) (mrpink35)


Lesenswert?

... sorry hatte was falsches gepostet

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


Lesenswert?

Mel schrieb:
> Dieses tut sie aber nur während ich den Knopf gedrückt habe!
> Danach verfällt die Anzeige in den letzten Wert, der eingegeben wurde.
Lies mal deinen (gekürzten) Code durch:
1
   if reset='1' then 
2
       char_code <= (others=> '0'); -- hier wird er 0
3
   elsif (rising_edge(clock)) then 
4
       char_code <= char_code_next; -- und hier kommt wieder der alte Wert?
5
   end if;

Mel schrieb:
> Der sourcecode ist weit über 100 Zeilen lang, dass will ich euch
> wirklich nicht zumuten...
Komm doch, rück ihn raus... ;-)
Häng das Ding als *.vhd Datei an deinen Post an, dann gibts 
Syntax-Highlighting gratis...

von Harald F. (hfl)


Lesenswert?

Hallo Mel,

das Problem lässt sich vielleicht auch durch Nachdenken lösen. Wenn die 
FSM beim Loslassen des Resets in den alten Zustand springt, dann hast Du 
offentichtlich ein Speicherelement in deiner Logik, von dem Du nichts 
weißt. Das kann eigentlich nur ein Latch sein, und das ist vermutlich 
entstanden, weil Du bei der Berechung des Folgezustands das 
obligatorische
next_state <= state;
vergessen hast. Stimmt's?

Grüße,
Harald

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.