hi. ich möchte gleich zur Sache kommen. Wir haben eine Aufgabe bekommen, wir sollen LCD von SPARTAN3E ansteuern, dazu haben wir auch eine Gesamt-Blockschaltung bekommen. es soll uns bei der Programmierung helfen. wir programmieren selbstständig mit VHDL =). Bis jetzt hat es nur 1 gruppe geschafft. ich versuche verzweifelt, aber scheitern bei letzte Blockschaltung. Nun, ich habe bereits die innere Schalung(componenten) bereits programmiert. ich habe Testbench geschrieben und getestet. es funktioniert einwandfrei. Aber Gesamt-Projekt funktioniert nicht. Write-Bits.pdf ist ein tabelle mit Hex-code, diese code soll auf Display als "Embedded Systems" darstellen, natürlich kann man es auch als Binärcode reinschreiben. LCD-Komponenten.txt: da steht VHDEL-Code für die komponenten. Sie funtionieren, ich lade hoch, vielleicht kann jemand mit gesamt programm dann simulieren. Gesamt.jpg: es ist die schaltung, was unsere Fach-lehrer uns gegeben hat. LCD-gesamt: genau darin habe ich probleme, ich habe versucht, und auf board darauf gespielt, es zeigt zwar was an, aber nur blödsinn. Ich programmiere das mit Zustände, somit habe ich 36 Zustände eingebaut. die Gruppe, die das geschafft haben, programmieren das mit Integer zähler. ich hoffe, jemand kann mir helfen. ich danke mich schon mal vorraus. Mit freundlichen Grüßen
Michael Schröderhofer schrieb: > Bis jetzt hat es nur 1 gruppe geschafft. Warum wendet ihr euch in dem Fall nicht an denjenigen, der die Aufgabe gestellt hat? Sieht so aus, als ob er euch nicht genug erklärt hat, wenn das nur eine Gruppe geschafft hat... Der Tutor macht das ganze sicher nicht unentgeltlich.
Michael Schröderhofer schrieb: > LCD-Komponenten.txt: da steht VHDEL-Code für die komponenten. Meine VHDL-Dateien heißen mit Nachname .VHD Dann kann die Foren-SW da schön syntax-highlighten... :-/ Michael Schröderhofer schrieb: > Ich programmiere das mit Zustände, somit habe ich 36 Zustände eingebaut. > die Gruppe, die das geschafft haben, programmieren das mit Integer > zähler. Beide Wege führen nach ROM. Allerdings solltest du das einfach mal selber simulieren. Dann siehst du sofort, wo es klemmt... > vielleicht kann jemand mit gesamt programm dann simulieren. Warum machst du das nicht kurz selber? Die Testbench für die Waveform ist an Einfachheit hier ja kaum zu übertreffen: Den Takt angelegt (und den hier absolut unnötigen Reset). Und fertig... BTW: das wäre meine Lösung Beitrag "Re: EA DOG-M initialisieren"
Anguel S. schrieb: > Michael Schröderhofer schrieb: >> Bis jetzt hat es nur 1 gruppe geschafft. > > Warum wendet ihr euch in dem Fall nicht an denjenigen, der die Aufgabe > gestellt hat? Sieht so aus, als ob er euch nicht genug erklärt hat, wenn > das nur eine Gruppe geschafft hat... Der Tutor macht das ganze sicher > nicht unentgeltlich. ich habe mit ihn geredet. wir sollen die User Guide 230 nach schauen, und da ich in englisch, speziell in technische englisch schlecht bin, konnte ich es schwer nachvollziehen. DieKomponenten ( entspricht: Write_c usw. in LCD-Componenten.txt), die ich dann in Gesamt-projekt eingefügt habe, funktionieren bereits, ich habe es selbst geschrieben. es war leicht für mich, weil wir eine Zeitdiagramm bekommen haben. von dem bauteil FSM in Bild Gesamt.jpg habe ich keine Ahnung, was es macht, dazu haben keine information bekommen, ausser dass wir es in User Guide 230 lesen müssen. ich habe versucht das ganze per 36 Zustände zu programmieren. LCD-display zeigt zwar was an, aber nur "?" und "//". das ist das problem.
Michael Schröderhofer schrieb: > DieKomponenten ( entspricht: Write_c usw. in LCD-Componenten.txt), die > ich dann in Gesamt-projekt eingefügt habe, funktionieren bereits Wie hast du das überprüft? Garantiert nicht mit einer Simulation. Gut, da tut sich schon irgendwas... Aber schon der allererste Zugriff mit lcd_e auf das Display (nach ca. 15ms) verletzt das Timing /garantiert: gleichzeitig mit der steigenden Flanke von lcd_e ändern sich die Daten an lcd_db. So steht das nicht im UG230 in der Abbildung 5-6. Da werden die Daten 40ns vor dem lcd_e angelegt! Und dann ab 20ms wird es haarsträubend: da kommt erst das von vorhin bekannte Bild mit dem Enable, und dann toggelt lcd_rw wie blöd durch die Gegend... So kann das Display niemals irgendwas sinnvolles anzeigen!! Also: lass da mal eine Simulation laufen. Die Testbench ist wie gesagt unschlagbar simpel:
1 | LIBRARY ieee; |
2 | USE ieee.std_logic_1164.ALL; |
3 | |
4 | ENTITY tb_LCD IS |
5 | -- keine Ports --> das muss eine Testbench sein!
|
6 | END tb_LCD; |
7 | |
8 | ARCHITECTURE behavior OF tb_LCD IS |
9 | COMPONENT LCD_Ansteuerung |
10 | PORT( |
11 | Clk : IN std_logic; |
12 | reset : IN std_logic; |
13 | lcd_db : OUT std_logic_vector(3 downto 0); |
14 | lcd_e : OUT std_logic; |
15 | lcd_rw : OUT std_logic; |
16 | lcd_rs : OUT std_logic |
17 | );
|
18 | END COMPONENT; |
19 | |
20 | --Inputs
|
21 | signal Clk : std_logic := '0'; |
22 | signal reset : std_logic := '1'; |
23 | |
24 | --Outputs
|
25 | signal lcd_db : std_logic_vector(3 downto 0); |
26 | signal lcd_e : std_logic; |
27 | signal lcd_rw : std_logic; |
28 | signal lcd_rs : std_logic; |
29 | |
30 | BEGIN
|
31 | |
32 | -- Instantiate the Unit Under Test (UUT)
|
33 | uut: LCD_Ansteuerung PORT MAP ( |
34 | Clk => Clk, |
35 | reset => reset, |
36 | lcd_db => lcd_db, |
37 | lcd_e => lcd_e, |
38 | lcd_rw => lcd_rw, |
39 | lcd_rs => lcd_rs |
40 | );
|
41 | |
42 | clk <= not clk after 10ns; -- 50MHz Takt |
43 | reset <= '1','0' after 100ns; |
44 | |
45 | END; |
Zeitaufwand, um diese kapitalen Fehler zu sehen: 10 Minuten...
Lothar Miller schrieb: > Zeitaufwand, um diese kapitalen Fehler zu sehen: 10 Minuten... Aber nur wenn man auch weiß, was man sehen will...
Lothar Miller schrieb: > Die Testbench ist wie gesagt > unschlagbar simpel Ich hab noch den folgenden process drin stehen:
1 | process
|
2 | variable l : line; |
3 | variable r : std_logic_vector(7 downto 0); |
4 | begin
|
5 | wait until rising_edge(e); |
6 | |
7 | write(l, "lcd "); |
8 | |
9 | if rw = '1' then |
10 | write(l, string'("read ")); |
11 | report "reading not supported"; |
12 | else
|
13 | write(l, string'("write ")); |
14 | r := db & "HHHH"; |
15 | end if; |
16 | |
17 | if rs = '1' then |
18 | write(l, string'("data ")); |
19 | else
|
20 | write(l, string'("command ")); |
21 | end if; |
22 | |
23 | write(l, string'("register: ")); |
24 | write(l, image(r)); |
25 | writeline(output, l); |
26 | end process; |
Da sieht man auch gleich, was ankommt. Fehlen nur noch die timing-checks... Duke
offenbar habt ihr mich falsch verstanden. Wie ihr die Blockschaltung gesehen habt, besteht das Ganze aus 3 kleine Blockschaltungen(komponenten) und 2 MUXs die 3 Komponenten sind power_on_init, write und lcd_fsm. power_on_init und write sind richtig programmiert wurden, auch die beide MUXs.( wir haben zu die beiden komponenten zeitdiagramm bekommen, somit konnte ich VHDL-code einwandfrei schreiben.siehe anhang) Zu komponenten: ich habe schon bereits simuliert, ich weiss auch wie man testbench schreibt. ich bin schließlich kein "blutiger" VHDL anfänger. :P Es wurde auch von unsere Fach-lehrer kontroliert. es ist fehler frei. mein Problem sind, diese lcd_fsm und Zusammenhängen von andere Komponenten alles zusammen.( auch Die Steuerung von MUXs, MUX intern als komponent ist auch fehler frei.) zu lcd_fsm haben wir keinelei informationen bekommen, wir sollen nus aus ug230 rauslesen, und genau das checke ich nicht. du sagtest, dass lcd_db und lcd_e gegenseitig behindert. das werde ich heute noch unter lupe schauen. danke für diese hinweis. PS: das ist eine Schulübung, keine Hausaufgaben oder ähnliches.
Duke Scarring schrieb: > Ich hab noch den folgenden process drin stehen: So weit wollte ich Michael noch gar nicht treiben. Er hat sicher genug zu tun, wenn er mal in der Waveform sein Timing anschauen kann... BTW: Ich würde statt write(l, image(r)); einfach die use ieee.std_logic_textio.all; mit einbinden und write(l, r); verwenden.
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.