Halle zusammen,
ich bin ziemlich neu in VHDL und FPGA und habe die Tage versucht meinen
ersten FPGA zu programmieren. Leider hat die Freude nicht lange
angehalten, denn irgendwie kann ich das Ding einfach nicht ansteuern.
Ich habe mit Modelsim eine Simulation gestartet (alles ok...), alle
Settings für die IO-Pins gecheckt und das Board (DE2-115) via Control
Panel auf Funktionen getestet. Alles vollkommen in Ordnung, in der
Simulation werden auch alle Bits richtig gesetzt...
Es ist ein Code (denn ich hier bei mc gefunden habe), denn ich ein wenig
modifiziert habe.
Die Funktion des Programms:
- Über 7 Switchs werden die binären Codes für die Zeichen definiert, die
auf dem LCD angezeigt werden sollen.
Nachdem ich das Programm auf den FPGA übertragen habe, kommt nur die
Standart-Anzeige des LCDs. Er reagiert kein bisschen auf Veränderungen
der Switchs...
Habe dem Code einige Kommentare hinzugefügt, damit er für euch schneller
zu verstehen ist.
Ich bin für jeden noch so kleinen Hinweis sehr dankbar...
Mike schrieb:> USE IEEE.STD_LOGIC_ARITH.all;> USE IEEE.STD_LOGIC_UNSIGNED.all;
Siehe: Beitrag "IEEE.STD_LOGIC_ARITH.ALL obsolete"Mike schrieb:> Modelsim eine Simulation gestartet
Kannst Du uns auch die Testbench zur Verfügung stellen?
Dann läßt sich das Problem leichter nachvollziehen.
Duke
> [QUOTE]...[/QUOTE]
Nimm statt "QOUTE" besser mal "vhdl", dann klappt das mit dem
Syntax-Higlighting besser. So also (ohne Leerzeichen):
[ vhdl ]...[ /vhdl ]
Hi Duke...
Wollt gerade die Simalation unter "File"--> "Export"--> "Waveform"
exportieren, nur ist "Waveform" nicht auswählbar. Und als Image ist das
Wavebild zu klein.
Was mach ich bei meinem Export-Versuch falsch?
Diese Clock
clk : in std_logic;
wie schnell ist sie getaktet?
Der DE2-115 läuft mit 50MHz. Die Wartezeit muss aber mehrere
Millisekunden sein.
Da kommt man doch mit einem 8-Bit Wartezähler
signal wait_cnt : std_logic_vector(7 downto 0);
gar nicht weit?
Bei mir mußte ich gerade die Reset- und Schreib-Zeiten sehr genau
einhalten.
Ausserdem fehlt mir so etwas wie
if rising_edge(clk)
Wo wird das gemacht?
Hey PittyJ,
oh man, klar... Die Clock läuft mit 50 Mhz, da war meine Wartezeit wohl
etwas kurz. Habe das nun den Zähler (vielleicht nicht auf die feine Art)
auf 500.000 "Warte-Takte" anstatt 56 gesetzt, aber dennoch tun sich
nichts auf der Anzeige.
Brauche ich denn die rising_edge(clk) für meinen Fall überhaupt?
Danke schonmal für die schnelle Unterstützung...
Mike schrieb:> Wollt gerade die Simalation unter "File"--> "Export"--> "Waveform"> exportieren, nur ist "Waveform" nicht auswählbar. Und als Image ist das> Wavebild zu klein.
Ich wollte eigentlich nicht die Waveforms haben, sondern die Testbench,
die die Stimuli erzeugt. Wie erzeugst Du die Stimuli?
Duke
>>Brauche ich denn die rising_edge(clk) für meinen Fall überhaupt?
Also ich mache nur Prozesse, die von einer rising_edge abhängen.
Zumindest, wenn ich etwas synthetisieren möchte.
Die Profis hier schaffen das wohl auch ohne, nur wir als Anfänger
sollten das beachten. Auch in sämtlicher einschlägiger Literatur habe
ich das so gesehen.
Noch ein Tipp:
Versuche es auf dem Board erst einmal mit einer blinkenden LED.
Da bekommt man schon ein Gefühl, wir groß die Zähler sein müssen, hat
nur 2 States und nur eine Ausgabeleitung. Und trotzdem gibt es da noch
genug Fallstricke für Neulinge.
naja, ich habe das File mit ModelSim von Altera simuliert und mir die
Wave angeschaut, ob das Programm irgendwo nicht das macht, was es
eigentlich soll...
Wenn du mir genau beschreibst, wie ich die Testbench auslesen und zu
Verfügung stellen kann, dann kann ich sie hier natürlich noch posten...
(Sorry, ist alles noch relativ neu für mich... )
Mike schrieb:> oh man, klar... Die Clock läuft mit 50 Mhz, da war meine Wartezeit wohl> etwas kurz.
Genau sowas sollte man mit einer Testbench aber herausfinden...
Mike schrieb:> wie ich die Testbench auslesen und zu Verfügung stellen kann,
Eine Testbench liest du nicht aus, sondern du schreibst sie passend zu
deinem Projekt...
Das wichtigste Merkmal einer Testbench: sie hat keine Ports nach
aussen, also keine Ein- oder Ausgnänge.
Sieh dir mal das da mit der blinkenden LED und der passenden Testbench
an:
http://www.lothar-miller.de/s9y/archives/80-Hello-World!.html
Ok, ich habe nun mein Problem gelöst, an dem ich seit Tagen dran bin.
Problem
NR.1: Ich habe die Zeit aus dem Datenblatt nicht eingehalten.
Nr.2: In vielen Programmen und Beispielen haben ich im Code gesehen,
dass das enable-Bit von 0 auf 1 wechseln muss, damit das LCD die Daten
verarbeitet.
Ich dachte, dass das in jedem LCD HD44780 so Standart ist... Anscheinend
nicht...
In meinem Datenblatt des LCDs steht nämlich folgendes:
Chip enable signal H, H --> L
Nachdem ich mein enable-Signal im Code invertiert habe, klappt jetzt
alles...
Meine letzte Frage:
Was genau bedeutet "H, H" ? Ist damit gemeint, dass das chip enable
signal zwei Clock-Zyklen auf H sein udn dann auf L fallen muss, damit
das LCD meine Daten verarbeitet?
Vielen Dank für die vielen (sehr hilfreichen) Antworten...
Mike schrieb:> Nr.2: In vielen Programmen und Beispielen haben ich im Code gesehen,> dass das enable-Bit von 0 auf 1 wechseln muss, damit das LCD die Daten> verarbeitet.> Ich dachte, dass das in jedem LCD HD44780 so Standart ist... Anscheinend> nicht...
Üblicherweise werden die Daten bei der fallenden Flanke übernommen
(z.B. auch bei SRAMs usw...), und deshalb bei den meisten
Softwarelösungen der Enable-Pin bei stabil anliegenden Daten einmal
komplett getoggelt. Die Softies haben dann auch kein Problem, weil
sowieso immer alles nacheinander passiert:
1. Daten anlegen
2. Enable auf High
3. Enable auf Low
4. Weiter bei 1.
Du hast bei der Hardware aber den "Vorteil", dass du alles
gleichzeitig machen kannst. Das wird dir noch öfter zu denken geben...
;-)
Mike schrieb:> Chip enable signal H, H --> L
Sieht in der Tat etwas ominös aus.
Weiter hinten sind ja aber die konkreten Timings angegeben (230 ns/500
ns).
Duke