Hallo zusammen,
ich versuche mich gerade in das FPGA und VHDL Thema einzuarbeiten und
bin noch am Anfang.
Die Aufgabe lautet im Moment, eine Entprellung so zu entwerfen, dass bei
einem Tastendruck ein Zähler hochzählt (10ms) und dann erst den
Tastendruck "freigibt".
Es gibt in meinem vhdl-code 2 Zähler.. der eine wird ohne Entprellung
angesteuert und der zweite mit. Beide Werte der Zähler möchte ich auf
den Siebensegmentanzeigen ausgeben.
Nur leider funktioniert dieser Code nicht da immer wahllos dieselben
Werte angezeigt werden (Wert für beide Zähler gleich). IUch hoffe ihr
könnt mir ein paar Tipps/Vorschläge geben was ich falsch mache.
Hier, das was ich bis jetzt habe.
Gruß Uwe
OutSec,OutMin, OutSecD, OutSecMin sind jeweils meine Einer- &
Zehnerstellen der beiden Zähler
1
libraryieee;
2
useieee.std_logic_1164.all;-- wg. des Datentyps std_logic_vector
Uwe_24 schrieb:> Nur leider funktioniert dieser Code nicht da immer wahllos dieselben> Werte angezeigt werden
Gerade so ein Design ist geradezu prädestiniert für eine Simulation. Was
zeigt deine an?
> use ieee.numeric_std.all;> use ieee.std_logic_unsigned.all;
Das ist kein gute Idee. Da sind dann ein paar Typdefinitionen doppelt
vorhanden, das kann ins Auge gehen wie im
Beitrag "Re: std_logic_vector auf integer umwandeln" erklärt.
Siehe dazu auch den Beitrag "IEEE.STD_LOGIC_ARITH.ALL obsolete"
Der Taster taugt halt etwas, oder ist wie auf manchen Entwicklungsboard
bereits entprellt. Dann hat du als potentielle Abweichung nur noch den
Zufall wenn du exakt eine Clockflanke erwischt, so dass der eine Zähler
es schon sieht und er andere nicht mehr.
Übrigens sollte auch für den nicht entprellten Zähler der Taster
einsynchronisiert werden, sonst spinnt der Zähler gelegentlich total.
Lothar Miller schrieb:> Uwe_24 schrieb:>> Nur leider funktioniert dieser Code nicht da immer wahllos dieselben>> Werte angezeigt werden> Gerade so ein Design ist geradezu prädestiniert für eine Simulation. Was> zeigt deine an?>
-Bis jetzt habe ich das noch nicht simuliert..da das bis jetzt in der
Uni auch noch nie gemacht wurde, muss ich mich da ersteinmal
einarbeiten. Werde ich aber bald machen müssen! Danke
>> use ieee.numeric_std.all;>> use ieee.std_logic_unsigned.all;> Das ist kein gute Idee. Da sind dann ein paar Typdefinitionen doppelt> vorhanden, das kann ins Auge gehen wie im> Beitrag "Re: std_logic_vector auf integer umwandeln" erklärt.> Siehe dazu auch den Beitrag "IEEE.STD_LOGIC_ARITH.ALL obsolete"
Danke für den Tipp - habe das auch schon in meinen Files angeglichen!
Ändert leider nichts daran dass mein vhdl Code noch nicht will.
Lattice User schrieb:> Der Taster taugt halt etwas, oder ist wie auf manchen> Entwicklungsboard> bereits entprellt. Dann hat du als potentielle Abweichung nur noch den> Zufall wenn du exakt eine Clockflanke erwischt, so dass der eine Zähler> es schon sieht und er andere nicht mehr.>> Übrigens sollte auch für den nicht entprellten Zähler der Taster> einsynchronisiert werden, sonst spinnt der Zähler gelegentlich total.
Sollte dann bei einem Entprellten Taster nicht auf dem LCD "1" angezeigt
werden. Mit meinem Zähler zähle ich ja sozusagen das "Bouncing" des
Tasters, also wie oft die Taktflanke zu viel erkannt wurde. Bei einem
Entprellten Taster müsste dies doch 1 sein? Liege ich da richtig?
Im Moment zeigen aber beide Zähler eine hohe Zahl an (Beide "85-90").
Uwe_24 schrieb:>> Sollte dann bei einem Entprellten Taster nicht auf dem LCD "1" angezeigt> werden. Mit meinem Zähler zähle ich ja sozusagen das "Bouncing" des> Tasters, also wie oft die Taktflanke zu viel erkannt wurde.
Nein, du mißt die Zeit in Einheite vom 20 ns wie lange der Taster
gedrückt ist. In deinem Zähler ist keine Flankenerkennung.
Lattice User schrieb:>> Nein, du mißt die Zeit in Einheite vom 20 ns wie lange der Taster> gedrückt ist. In deinem Zähler ist keine Flankenerkennung.
In einer Simulation waäre die das sofort ins Gesicht gesprungen!
Lattice User schrieb:> Uwe_24 schrieb:>>>>> Sollte dann bei einem Entprellten Taster nicht auf dem LCD "1" angezeigt>> werden. Mit meinem Zähler zähle ich ja sozusagen das "Bouncing" des>> Tasters, also wie oft die Taktflanke zu viel erkannt wurde.>> Nein, du mißt die Zeit in Einheite vom 20 ns wie lange der Taster> gedrückt ist. In deinem Zähler ist keine Flankenerkennung.Lattice User schrieb:> Lattice User schrieb:>>>>> Nein, du mißt die Zeit in Einheite vom 20 ns wie lange der Taster>> gedrückt ist. In deinem Zähler ist keine Flankenerkennung.>> In einer Simulation waäre die das sofort ins Gesicht gesprungen!
Oh dann bin ich auf dem gaanz falschen Fuß unterwegs! Die
Flankenerkennung ist dass was ich brauche. Ich muss einen Zähler per
Tastendruck inkrementieren, eInen mit Entprellung und einen ohne.. und
dabei sollen die Flanken gezählt werden. Dankeschön .. ich tu mich da
einfach noch sehr schwer :/ Hat jemand zufällig einen Link wo das gut
erklärt ist?
Ich würde Dir das Thema "Einsynchronisieren von externen Signalen"
empfehlen, ebenso das Thema "was macht 'rising_edge(x)'" und schon wirst
Du damit zwei große Schritte weiter sein. :)
Der Lars schrieb:> ebenso das Thema "was macht 'rising_edge(x)'"
Und ebenso das Thema:
Es gibt in einem Anfängerdesign nur 1 Takt. Der kommt vom Quarz.
Oder andersrum:
Niemals(!) wird auf einen Taster oder sonst ein Signal ein
'rising_edge() angesetzt.
Und das ist eigentlich auch nur Faulheit:
1
process(all)begin
2
ifrising_edge(clk)then
3
...
Wenn schon nur der Takt im Prozess verwendet wird, dann schreibe auch
nur den Takt in die Sensitivliste. Dieses (all) ist ziemlich die
blödsinnigste Erweiterung, die es gibt.
Lothar Miller schrieb:> Wenn schon nur der Takt im Prozess verwendet wird, dann schreibe auch> nur den Takt in die Sensitivliste. Dieses (all) ist ziemlich die> blödsinnigste Erweiterung, die es gibt.
Bei allem Respekt, aber das ist eine äußerst sinnvolle Erweiterung.
Warum soll sich der Entwickler mit etwas auseinandersetzen, was der
Compiler (und Synthesizer) viel besser kann? Außerdem ist die
Sensisivitylist eine ständige Fehlerquelle, die man mit (all) einfach
nicht hat. Es bring absolut 0,0 Vorteil statt (all) dort irgendwelche
Signale einzutragen.
Olga schrieb:> Warum soll sich der Entwickler mit etwas auseinandersetzen, was der> Compiler (und Synthesizer) viel besser kann?
Vielleicht weil der Compiler es nicht besser können sollte :-o
Ich finde der Entwickler sollte sich jede mögliche Überprüfbarkeit
seines Codes erhalten. Aber das ist natürlich Geschmackssache :-)
Olga schrieb:> Warum soll sich der Entwickler mit etwas auseinandersetzen, was der> Compiler (und Synthesizer) viel besser kann?
Weil er dann auch mal mitdenken muss?
Oder siehst du den Fehler hier sofort?
Der Lars schrieb:> Vielleicht weil der Compiler es nicht besser können sollte :-o
Ok, dann sind wir ganz schnell wieder beim Assembler. Ein ziemlich
sinnloses Argument.
Lothar Miller schrieb:> Weil er dann auch mal mitdenken muss?
Noch sinnloser. Der Compiler ist dazu da, mir stupide denkarbeit, die
mich vom eigentlichen Entwickeln abhält, abzunehmen.
Sagen wir mal so: einem Anfänger schadet es nicht, über die
Sensitivliste nachzudenken. Im einem synchronen Prozess, in dem nur der
CLK eine Rolle spielen darf, ist nicht mal Tipparbeit gespart...
Aber das Pro-contra "all" ist hier im Thread eh nicht primär das Thema.
Und einen synchronen Prozess schreibe ich sowieso ohne Sensitivliste:
http://www.lothar-miller.de/s9y/archives/16-Takt-im-Prozess.html
Lothar Miller schrieb:> Oder siehst du den Fehler hier sofort? process (all) begin> if rising_edge(clk) then> if (k = '0') then> if (einerStelle = 9) then> einerStelle <= 0;> if (zehnerStelle = 9) then> zehnerStelle <= 0;> else> zehnerStelle <= zehnerStelle + 1;> end if;> end if;> else> einerStelle <= einerStelle + 1;> end if;> else> einerStelle <= reloadEiner;> zehnerStelle <= reloadZehner;> end if;> end process;
Abgesehen von dem "..(all).." und scheinbarer semantischer
Fehler, hast du da noch etwas anderes übersehen? Meine
erste Einschätzung ist, dass das der Synthesizer nicht
übersetzen kann, zumindestens nicht der aller Hersteller.
Sigi schrieb:> Meine erste Einschätzung ist, dass das der Synthesizer nicht übersetzen> kann, zumindestens nicht der aller Hersteller.
Du liegst richtig. Oder andersrum: wenn er es könnte, dann würden nur
die letzten beiden Zuweisungen übrig bleiben, und es wäre weit&breit
kein Takt im Design...