Hallo! Ich weiß zwar nicht, ob sich jemand von euch die Mühe machen will, meinen Code durchzuschauen, aber ich poste ihn trotzdem mal im Anhang. Ich habe ein 3*4 Tastenfeld, das ich entprellen will und bei dem ich die gedrückten Tasten ermitteln will. Letzteres funtioniert zwar, aber nur mit dem Takt "clock", einem 100MHz Takt einer PLL. Ich teile den 100MHz Takt, sodass ich einen von etwa 100Hz bekomme ("clock_debounce"). Bei der ersten steigenden Flanke von clock_debounce lese ich die Werte der Tasten-Reihen und Spalten ein. Bei der zweiten mache ich das nochmal und vergleiche sie mit den alten und wenn sie übereinstimmen, hab ich einen neuen gültigen Wert. Mein Problem ist, das das Ganze mit dem neuen Takt "clock_debounce" nicht funktioniert. Die Signale: deb_state, previous_tst_r0, previous_tst_r1, previous_tst_r2, previous_tst_r3, previous_tst_c0, previous_tst_c1, previous_tst_c2, taste0_9, taste_enter, taste_operation sollten eigentlich beim Reset (in einem anderen Process) zurüchgestzt werden, tun es aber nicht. Die Behavioral Simulation zeigt sie als "U" uninitialisiert an und sie ändern ihren Wert auch später nicht, wenn sie es eigentlich sollten. Das Ganze funktioniert allerdings wie schon gesagt mit der normalen clock schon. Wäre echt toll, wenn mir jemand weiterhelfen könnte. Ich bin ziemlich ratlos. Viele Grüße, Stefan
Mach deine Takterzeugung anders. Deine Version:
1 | taktteiler_fuer_debounceing: process(clock, reset) ---------- reset unnötig, weil synchron |
2 | begin
|
3 | if rising_edge(clock) then |
4 | :
|
5 | :
|
6 | if takt_counter < (TOPVALUE/2) then |
7 | clock_debounce <= '0'; |
8 | takt_counter <= takt_counter + 1; |
9 | elsif (takt_counter >= (TOPVALUE/2) AND takt_counter < TOPVALUE) then |
10 | clock_debounce <= '1'; |
11 | takt_counter <= takt_counter + 1; |
12 | else
|
13 | clock_debounce <= '0'; |
14 | takt_counter <= 1; |
15 | end if; |
16 | end if; |
17 | end if; |
18 | end process; |
19 | |
20 | |
21 | entprellung: process(clock_debounce) |
22 | begin
|
23 | if rising_edge(clock_debounce) then |
24 | if(syncreset != RESETVALUE) then |
25 | :
|
26 | :
|
Schreib das besser als Clock-Enable:
1 | taktteiler_fuer_debounceing: process(clock) |
2 | begin
|
3 | if rising_edge(clock) then |
4 | :
|
5 | :
|
6 | clockenable_debounce <= '0'; |
7 | if (takt_counter = TOPVALUE) then -- Ueberlauf |
8 | clockenable_debounce <= '1'; |
9 | takt_counter <= 0; |
10 | else
|
11 | takt_counter <= takt_counter + 1; |
12 | end if; |
13 | end if; |
14 | end if; |
15 | end process; |
16 | |
17 | |
18 | entprellung: process(clock) |
19 | begin
|
20 | if rising_edge(clock_debounce) then |
21 | if (syncreset != RESETVALUE) then |
22 | if (clockenable_debounce='1') then |
23 | :
|
24 | :
|
Dann hast du im ganzen Design nur 1 Takt. Und das ist gut so. > Die Signale: deb_state, previous_tst_r0, previous_tst_r1, .... > sollten eigentlich beim Reset (in einem anderen Process) zurüchgestzt > werden, tun es aber nicht. Die Behavioral Simulation zeigt sie als "U" > uninitialisiert an und sie ändern ihren Wert auch später nicht, wenn sie > es eigentlich sollten. Wie lange ist dein Reset-Impuls? Initialisiere die Signale mit Werten:
1 | :
|
2 | signal takt_counter : integer := 0; |
3 | signal syncreset: std_logic := '0'; -- sollten sowieso 2 FFs sein |
4 | signal clock_debounce: std_logic := '0'; |
5 | :
|
6 | :
|
BTW: Das eine FF zum Einsynchronisieren des Resets reicht noch nicht aus:
1 | process(clock) |
2 | begin
|
3 | if rising_edge(clock) then |
4 | syncreset <= reset; |
5 | end if; |
6 | end process; |
zum Einsynchronisieren solltest du (mindestens) 2 FFs hintereinander schalten. Hier eine Erklärung zu dem Thema: http://www.lothar-miller.de/s9y/archives/41-Einsynchronisieren-von-asynchronen-Signalen.html Brauchst du überhaupt einen Reset? Xilinx sagt dazu: >>>> Reset costs more than you think <<<< Siehe dazu den Beitrag "Re: Fläche des Designs optimieren" und dort insbesondere auch den letzten Post ;-)
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.