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?
aber keiner der anderen Beiträge löst mein Problem
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 | signal counter : unsigned(20 downto 0) := (others => '1'); |
2 | ...
|
3 | wait until rising_edge(clk); |
4 | ...
|
5 | counter <= counter +1; |
6 | |
7 | if counter = 0 then |
8 | ...hier drinne den Zustandautomaten weiterschalten |
9 | end if; |
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
1 | e_signal <= '1' when zustand=transmit and counter<(max-1) else '0' |
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.
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.