www.mikrocontroller.net

Forum: FPGA, VHDL & Co. Ansteuerung LCD Display(Spartan3E)


Autor: Christian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
bräuchte mal einen VHDL Text zur Ansteuerung eines LCD-Displays
auf den Spartan3E.Einfache Anwendung(z.b.Hello world)reicht völlig.
Hat vielleicht jemand Lust und Laune mir was zuzuposten?
Danke im voraus.

MFG
Christian

Autor: Frager (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Me too!

Autor: Mike (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Eigentlich steht in der Anleitung (ug230.pdf) alles was man für die 
Ansteuerung braucht.

Hier mal ein ziemlich minimales Beispiel das ich zum Herumprobieren mit 
Statemachines verwendet habe. Auf dem Display sollte "Test" erscheinen. 
Um den Reset musst du dich allerdings noch selber kümmern. Ich hoffe mal 
das war jetzt nicht irgendeine Hausaufgabe.

Autor: Daniel Governatori (duese7)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Auf der Xilinx Homepage gibt es eine xapp zur Ansteuerung für ein LCD. 
Diese funktioniert auch, steuert allerdings über 11 Leitungen an.

Daniel

Autor: Christian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die Hilfe.LCD-Display funktioniert.Das lcd.vhdl ist mir
auch soweit klar,weiss nur noch nicht warum nach dem reset
lcd_data mit 0x32,0x33 und 0x22 initialisiert worden ist.
0x06 für cmd entry mode,0x28 für cmd function set usw ist ja klar,aber
die ersten 3 commands sind in der ug230 und auch im datasheet für das
LCD nicht zu finden.

MFG
Christian

Autor: Mike (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die 0x33 solltest du als 2x 0x3F betrachten. Das Display wird so erstmal 
aus einem beliebigen Zustand in den 8-Bit Modus umgeschaltet. Mittels 
0x32 und 0x22 wird dann wieder der 4-Bit Modus aktiviert. Die 0x22 
könnte man wohl weglassen.

Das ist im ug230 unter "Power-On Initialization" Seite 51 zu finden.

Autor: Mayer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Mike,

Ich habe dein Programm nachgeschaut, ich bien anfänger mit den Thema 
LCD. kannst du mir bitte erklaren was in den Modul clock und reset 
stehen? ein Beispiel wäre nett von dir, ich will nur probieren.

Mayer

Autor: taylor (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie hast du dein delay berechnet? und welche verhältnis hat delay mit 
o_clock?

Autor: Mike (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Takt beträgt 50MHz. Laut ug230.pdf braucht einer der 
Initalisierungsbefehle 4,1ms. Durch den Delay (0x3ffff) bekommt man eine 
Verzögerung von ca. 5ms zwischen den Befehlen. Da alle Kommandos die 
gleiche Verzögerung benutzen musste es halt dieser größte vorkommende 
Wert sein. Du kannst den Code ja mal erweitern ;).

Autor: taylor (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke Mike für dein Antwort

Es wäre net wenn du mir noch der reset erklärt! ich bin relativ Anfänger 
in die Domain!

Danke

Tay

Autor: Mike (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das ist einfach nur ein Zähler der nach einiger Zeit das Signal frei 
gibt. Kannst du auch auf einen festen Pegel legen.

Autor: Klaus S. (profi_sa)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
konnte bis jetzt keine Doumentation über die Ansteuerung mit Vhdl bei 
Xilinx finden.
Frage:
Wie heißt bitte die Xapp

Autor: Mike (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nix xapp. Die Werte stehem im ug230.pdf (Seite 51). Das ist die 
Anleitung für das Board ("Spartan-3E Starter Kit Board User Guide"). Es 
gibt bei Xilinx auch einige Referenz Designs für das Board die das LCD 
verwenden.

Autor: Matthias Ruschko (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo
Funktionier das Programm genau so wie es dort steht? weil bei meinem 
Board funzt es nicht!! warum könnte es nicht gehen oder was fehlt da 
noch?
lg

Autor: Bluehorn (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Referenzdesigns sind ein wenig langweilig, da die einfach eine MCU 
auf dem FPGA implementieren (was wiederum cool ist), und damit das LCD 
ansteuern. Lerneffekt in Sachen VHDL ca. 0, da der MCU-Code nur als 
Netzliste beiliegt...

Meine Meinung :)

Torsten

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  Bluehorn (Gast)

>ansteuern. Lerneffekt in Sachen VHDL ca. 0, da der MCU-Code nur als
>Netzliste beiliegt...

Sehr clever für ein Beispiel :-0

MFG
Falk

Autor: Mike (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Bluehorn:

Du solltest dir nicht nur das eine Beispiel mit dem Microblaze 
anschauen. Die anderen Referenzdesigns verwenden fast ausschliesslich 
den Picoblaze und für den ist dann alles dabei.

Autor: Johannes (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich versuche gerade mir das bsp. von Mike von
15.01.2008 in meine FPGA runter zu laden.
Jedoch tauchen da zwei Fehler auf die wie folgt aussehen:

ERROR:HDLParsers:709 - "D:/VHDLTutorial/LCD/test02.vhd" Line 64. clock 
is not an entity name
ERROR:HDLParsers:709 - "D:/VHDLTutorial/LCD/test02.vhd" Line 71. reset 
is not an entity name

Also es geht um die beiden schnittstellen: port map

inst_clock : entity clock
  port map (
    i_reset => i_reset,
    i_clock => i_clock,
    o_clock => clock
  );

  inst_reset : entity reset
  port map (
    i_reset => i_reset,
    i_clock => clock,
    o_reset => reset

Kann mir irgendjemand helfen?

Danke,

MfG,
Johannes

Autor: Johannes (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich versuche gerade mir das bsp. von Mike von
15.01.2007 in meine FPGA runter zu laden.
Jedoch tauchen da zwei Fehler auf die wie folgt aussehen:

ERROR:HDLParsers:709 - "D:/VHDLTutorial/LCD/test02.vhd" Line 64. clock 
is not an entity name
ERROR:HDLParsers:709 - "D:/VHDLTutorial/LCD/test02.vhd" Line 71. reset 
is not an entity name

Also es geht um die beiden schnittstellen: port map

inst_clock : entity clock
  port map (
    i_reset => i_reset,
    i_clock => i_clock,
    o_clock => clock
  );

  inst_reset : entity reset
  port map (
    i_reset => i_reset,
    i_clock => clock,
    o_reset => reset

Kann mir irgendjemand helfen?

Danke,

MfG,
Johannes

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das entity muss weg.

Autor: Johannes (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Falk,

das lässt sich sythetisieren, aber auf dem Display erscheint nicht.

Gruss,
Johannes

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Johannes (Gast)

>das lässt sich sythetisieren, aber auf dem Display erscheint nicht.

Willkommen in der realen Welt der Schaltungsentwicklung. ;-)
Statt Plug & Play gibts dort eher Plug & Curse . . .

MfG
Falk

Autor: Johannes (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hey Falk,

ich hab das Entity gelöscht.
Hmm, die Flash Pins habe ich ebenfals auf high gezogen.
Was mache ich da falsch?

GfG,
Johannes

Autor: Johannes (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
anbei nochmal das code:

------------------------------------------------------------------------ 
----------
-- Company:
-- Engineer:
--
-- Create Date:    13:26:47 11/10/2006
-- Design Name:
-- Module Name:    lcd - Behavioral
-- Project Name:
-- Target Devices:
-- Tool versions:
-- Description:
--
-- Dependencies:
--
-- Revision:
-- Revision 0.01 - File Created
-- Additional Comments:
--
------------------------------------------------------------------------ 
----------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

---- Uncomment the following library declaration if instantiating
---- any Xilinx primitives in this code.
-- library UNISIM;
-- use UNISIM.VComponents.all;

entity lcd is
  port (
    i_clock    : in std_logic;
    i_reset    : in std_logic;
    o_lcd_data : out std_logic_vector(3 downto 0);
    o_lcd_e    : out std_logic;
    o_lcd_rs   : out std_logic;
    o_lcd_rw   : out std_logic;
   o_sf_we0  : out std_logic;
   o_sf_oe0  : out std_logic;
    o_sf_ce0   : out std_logic
  );
end lcd;

architecture Behavioral of lcd is
  signal clock : std_logic;
  signal reset : std_logic;
  signal delay : std_logic_vector(19 downto 0) := x"00000";
  signal delay2 : std_logic_vector(7 downto 0) := x"00";
   signal lcd_data : std_logic_vector(7 downto 0) := x"00";

  type   state_lcd_type is (lcdreset, init1, init2, init3, cmd1, cmd2, 
cmd3, cmd4, data1, data2, data3, data4, lcdok);
  type   state_lcd2_type is 
(setdata1,setenable1,disable1,setdata2,setenable2,disable);
  signal state_lcd : state_lcd_type := lcdreset;
  signal state_lcd2 : state_lcd2_type := setdata1;

  signal lcd_e  : std_logic;
  signal lcd_rs : std_logic;

  signal write_lcd : std_logic := '0';



begin
  o_lcd_e  <= lcd_e;
  o_lcd_rs <= lcd_rs;
  o_lcd_rw <= '0';
  o_sf_ce0 <= '1';
  o_sf_oe0 <= '1';
  o_sf_we0 <= '1';

  init_lcd : process (clock)
  begin
    if rising_edge(clock) then
      if reset='1' then
        state_lcd <= lcdreset;
        delay     <= x"fffff";
        lcd_e     <= '0';
        lcd_rs    <= '0';
        write_lcd <= '0';
      else
         if not(delay=x"0") then
          delay <= delay - 1;
        end if;

        if not(delay2=x"0") then
          delay2 <= delay2 - 1;
        end if;

        if delay = x"0" then
          case state_lcd is
            when lcdreset =>
              lcd_data  <= x"33";
              state_lcd <= init1;
              write_lcd <= '1';
            when init1 =>
                     lcd_data  <= x"32";
               state_lcd <= init2;
              write_lcd <= '1';
            when init2 =>
                     lcd_data  <= x"22";
               state_lcd <= cmd1;
              write_lcd <= '1';
            when cmd1 =>
              lcd_data  <= x"28";
              state_lcd <= cmd2;
              write_lcd <= '1';
            when cmd2 =>
              lcd_data  <= x"06";
              state_lcd <= cmd3;
              write_lcd <= '1';
            when cmd3 =>
              lcd_data  <= x"0c";
              state_lcd <= cmd4;
              write_lcd <= '1';
            when cmd4 =>
              lcd_data  <= x"01";
              state_lcd <= data1;
              write_lcd <= '1';
            when data1 =>
               lcd_rs    <= '1';
              lcd_data  <= x"54";
              state_lcd <= data2;
              write_lcd <= '1';
                  when data2 =>
              lcd_data  <= x"65";
              state_lcd <= data3;
              write_lcd <= '1';
                  when data3 =>
              lcd_data  <= x"73";
              state_lcd <= data4;
              write_lcd <= '1';
                  when data4 =>
              lcd_data  <= x"74";
              state_lcd <= lcdok;
              write_lcd <= '1';
            when lcdok => null;
            when others => state_lcd  <= lcdreset;
          end case;
--               delay <= x"00010";
               delay      <= x"3ffff";
        end if;

        if delay2=x"0" and write_lcd='1' then
          case state_lcd2 is
            when setdata1 =>
                     o_lcd_data <= lcd_data(7 downto 4);
              lcd_e <= '0';
              state_lcd2 <= setenable1;
            when setenable1 =>
              lcd_e <= '1';
              state_lcd2 <= disable1;
            when disable1 =>
              lcd_e <= '0';
              state_lcd2 <= setdata2;
                  when setdata2 =>
                     o_lcd_data <= lcd_data(3 downto 0);
              lcd_e <= '0';
              state_lcd2 <= setenable2;
            when setenable2 =>
              lcd_e <= '1';
              state_lcd2 <= disable;
            when disable =>
              write_lcd <= '0';
              lcd_e <= '0';
              state_lcd2 <= setdata1;
            when others => state_lcd2 <= setdata1;
          end case;

               delay2 <= x"ff";
        end if;

      end if;
    end if;
  end process;
end Behavioral;

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Johannes (Gast)

>anbei nochmal das code:

Der wäre im Anhang wesentlich besser aufgehoben, siehe Netiquette.

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.