Hallo,
habe bereits eine Uhr mit dem Kit gemacht und möchte jetzt diese Uhr
anstatt über die LED´s über das Display angezeigt bekommen.
Dabei bekomme ich nur recht schnell das Problem die verschiedenen
Wartezeiten zu realsisieren. Kennt sich damit jemand aus und kann mir
ein paar Tipps geben?
Muss aber ohne Picoblace oder so von Xilinx funktionieren, da ich davon
Null Ahnung habe. Das müsste man aus meiner Sicht mit einfachen Zählern
hinbekommen. Weiß aber nicht, ob das wirklich geht...
das geht am einfachsten über simple Zähler.
Rechne dir einfach aus wie lange ein taktzyklus bei dir dauert und lasse
einen zähler passend lange laufen.
bsp :
du lässt das design mit 100mhz laufen, dann dauert ein Takt 10ns und du
brauchst demzufolge einen zähler bis 100.000.000 wenn du auf 1 Sekunde
warten willst.
(bzw weniger wenns um die Wartezeiten für den Displaycontroller geht)
Das ganze in einer kleinen Statemachine die weiterschaltet wenn der
zähler einen bestimmten wert erreicht hat und gut.
* Das sind minimal Zeiten, niemand wird dir böse sein wenn du länger
wartest
* Gibt es jezt bestimmt schon 5 Threads die sich mit LCD+Spartan3 hier
tummeln, nächsatemal vieleicht einfach dort mal vorbeischauen...
* Beitrag "[VHDL] 16x2 LCD Textcontroller / HD44780"> Muss aber ohne Picoblace oder so von Xilinx funktionieren, da ich davon
Null Ahnung habe.
Hm... Aber rein in VHDL scheint es dir ja trozdem Probleme zu
bereiten... für den PicoBlaze gibt es auch ein LCD Beispiel bei Xilinx
wo schritt für Schritt erklärt wird wie man das bewerkstelligt.
das Problem der Zeiten ist halt, dass ja verschiedene Zeiten realisiert
werden müssen, z. B. 1,52 ms, 40 µs usw. dafür brauche ich ja
verschiedene Zähler, die immer loszählen, wenn der andere durchgelaufen
ist. Dann würd im Automatengraph eins weiter gesprungen. Dieser zähler
müsste ja bei der nächsten Abfrage wieder Null sein. Wie bekomme ich es
denn hin, dass ein Zähler irgendwann stoppt und dann aufgrund eines
Ereignisses wieder anläuft?
Nochmal es müßen NICHT unterschiedliche Zeiten sein, kein Mensch kann so
schnell gucken das das auffallen würde.
Schau dir einfach mal meinen Code an, da löse ich das über eine einzigen
Zähler für die maximal nötige Zeit von 15 ms.
Ich sehe gerade das ich den counter sogar benutze um einmal ein 2ms
delay zu erzeugen.
Der "Trick" dabei ist einfach, das ich den counter mit meinem Wunschwert
vorlade (z.B. 10, 15, oder 2 ms) und dann runterzähle.
Bei 0 angekommen springe ich in den vorherigen Zustand zurück.
Für die Init Phase stimme ich Läubi zu. Such dir das größe Delay aus das
nötig ist und lasse alle States mit diesem laufen -> der Zähler läuft
vom Zustand des Automaten unabhängig -> kleine Schaltung.
Ob Init nun nach 10 oder 100ms fertig ist, wen juckt das schon.
bsp :
1
signalcounter:unsigned(20downto0):=(others=>'1');
2
...
3
waituntilrising_edge(clk);
4
...
5
counter<=counter+1;
6
7
ifcounter=0then
8
...hierdrinnedenZustandautomatenweiterschalten
9
endif;
oder halt die Abfrage an jede Transition, geht auch.
das ist eigentlich eine gute Idee, das ich da nicht selbst drauf
gekommen bin...
Ein Problem dabei wäre, dass gleich zu Beginn 40 ms gewartet werden
muss. Das werde ich dann wohl über einen zusätzlichen Zähler realisieren
müssen, der nur zu Beginn abgefragt wird und dann einfach weiterzählt,
ohne weitere Abfrage. Der andere Zähler fängt dann einfach an, wenn der
erste Zähler den Übertrag liefert. Das kann man ja auch mit einer
kleinen Statemachine realisieren.
Wie kann ich denn die Zeiten für das "E- Signal" realisieren, da ja das
E- Signal abgeschaltet wird und dann noch 10 ns der Ausgang DB7-DB0
eingeschaltet sein müssen, oder soll ich die dann auch einfach 1,52 ms
weiterlaufen lassen, was die Machine natürlich sehr vergrößert...
Und eine hoffentlich letzte Frage... Muss ich das Board für 8 Bit
initialisieren, oder kann ich gleich Daten drauf schicken, da in der
Beschreibung von Xilinx nur die initialisierung von 4- Bit steht.
>> Ein Problem dabei wäre, dass gleich zu Beginn 40 ms gewartet werden>> muss. Das werde ich dann wohl über einen zusätzlichen Zähler realisieren>> müssen der nur zu Beginn abgefragt wird und dann einfach weiterzählt,>> ohne weitere Abfrage
das wäre aber sehr ineffizient.
Pack den zusätzlichen zähler einfach in den init state des Automaten,
dann muss er nicht zig FF haben, weil er eh schon durch den anderen
runtergeteilt wird.
>> Wie kann ich denn die Zeiten für das "E- Signal" realisieren, da ja das>> E- Signal abgeschaltet wird und dann noch 10 ns der Ausgang DB7-DB0>> eingeschaltet sein müssen
jetzt nur exemplarisch, also das dieses Signal eben 1 Takt früher auf 0
geht als der Zustand umschaltet.
Sowas kann man wunderbar außerhalb der eigentlich statemachine
platzieren.
Mache ich ohnehin gerne, also die Ausgänge direkt am Ende vom file alle
zusammen festlegen. So hat mans schön geordnet.
Wobei ich hier eh die 1,5ms warten würde. Init ist doch sowas von
egal...solange das unter 2-3 Sekunden geht würde ich hier immer die
ressourcenärmste Variante wählen.
Aber letztendlich willst du ja was lernen, also spricht nichts dagegen
alle Varianten mal auszuprobieren.