www.mikrocontroller.net

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


Autor: Michael Schröderhofer (Firma: TGM) (funny_boy)
Datum:
Angehängte Dateien:

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

Autor: Anguel S. (anguel)
Datum:

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

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

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

Autor: Michael Schröderhofer (Firma: TGM) (funny_boy)
Datum:

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

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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:
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
 
ENTITY tb_LCD IS
  -- keine Ports --> das muss eine Testbench sein!
END tb_LCD;
 
ARCHITECTURE behavior OF tb_LCD IS 
    COMPONENT LCD_Ansteuerung
    PORT(
         Clk : IN  std_logic;
         reset : IN  std_logic;
         lcd_db : OUT  std_logic_vector(3 downto 0);
         lcd_e : OUT  std_logic;
         lcd_rw : OUT  std_logic;
         lcd_rs : OUT  std_logic
        );
    END COMPONENT;
    
   --Inputs
   signal Clk : std_logic := '0';
   signal reset : std_logic := '1';

   --Outputs
   signal lcd_db : std_logic_vector(3 downto 0);
   signal lcd_e : std_logic;
   signal lcd_rw : std_logic;
   signal lcd_rs : std_logic;

BEGIN
 
  -- Instantiate the Unit Under Test (UUT)
   uut: LCD_Ansteuerung PORT MAP (
          Clk => Clk,
          reset => reset,
          lcd_db => lcd_db,
          lcd_e => lcd_e,
          lcd_rw => lcd_rw,
          lcd_rs => lcd_rs
        );

   clk <= not clk after 10ns;    -- 50MHz Takt
   reset <= '1','0' after 100ns;

END;

Zeitaufwand, um diese kapitalen Fehler zu sehen: 10 Minuten...

Autor: Anguel S. (anguel)
Datum:

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

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

Autor: Duke Scarring (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lothar Miller schrieb:
> Die Testbench ist wie gesagt
> unschlagbar simpel

Ich hab noch den folgenden process drin stehen:
  process
    variable l : line;
    variable r : std_logic_vector(7 downto 0);
  begin
    wait until rising_edge(e);
    
    write(l, "lcd ");

    if rw = '1' then
      write(l, string'("read  "));
      report "reading not supported";
    else
      write(l, string'("write "));
      r := db & "HHHH";
    end if;

    if rs = '1' then
      write(l, string'("data    "));
    else
      write(l, string'("command "));
    end if;

    write(l, string'("register: "));
    write(l, image(r));
    writeline(output, l);
  end process;

Da sieht man auch gleich, was ankommt. Fehlen nur noch die 
timing-checks...

Duke

Autor: Michael Schröderhofer (Firma: TGM) (funny_boy)
Datum:
Angehängte Dateien:

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

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

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

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.