Forum: FPGA, VHDL & Co. LCD Ansteuerung mit spartan-3E starter


von Michael S. (Firma: TGM) (funny_boy)


Angehängte Dateien:

Lesenswert?

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

von Anguel S. (anguel)


Lesenswert?

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.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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"

von Michael S. (Firma: TGM) (funny_boy)


Lesenswert?

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.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Angehängte Dateien:

Lesenswert?

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

von Anguel S. (anguel)


Lesenswert?

Lothar Miller schrieb:
> Zeitaufwand, um diese kapitalen Fehler zu sehen: 10 Minuten...

Aber nur wenn man auch weiß, was man sehen will...

von Duke Scarring (Gast)


Lesenswert?

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

von Michael S. (Firma: TGM) (funny_boy)


Angehängte Dateien:

Lesenswert?

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.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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