www.mikrocontroller.net

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


Autor: toni_36 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Iulius (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: toni_36 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: toni_36 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
aber keiner der anderen Beiträge löst mein Problem

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Iulius (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 :
signal counter : unsigned(20 downto 0) := (others => '1');
...
wait until rising_edge(clk);
...
counter <= counter +1;

if counter = 0 then
 ...hier drinne den Zustandautomaten weiterschalten
end if;

oder halt die Abfrage an jede Transition, geht auch.

Autor: toni_36 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Iulius (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.