Forum: FPGA, VHDL & Co. Xilinx Spartan 3an: Realisierung der Zeiten bei Displayansteuerung


von toni_36 (Gast)


Lesenswert?

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...

von Iulius (Gast)


Lesenswert?

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.

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

* 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.

von toni_36 (Gast)


Lesenswert?

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?

von toni_36 (Gast)


Lesenswert?

aber keiner der anderen Beiträge löst mein Problem

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

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.

von Iulius (Gast)


Lesenswert?

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.

von toni_36 (Gast)


Lesenswert?

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.

von Iulius (Gast)


Lesenswert?

>> 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
Noch kein Account? Hier anmelden.