Reset Problem

Gast #2310017
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
Gast #2310096
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...
Moderator (Firma: Titel) Persönliche Seite #2310510
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...
#2311123
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren