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


von Christian (Gast)


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

von Frager (Gast)


Lesenswert?

Me too!

von Mike (Gast)


Angehängte Dateien:

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.

von Daniel G. (duese7)


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

von Christian (Gast)


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

von Mike (Gast)


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.

von Mayer (Gast)


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

von taylor (Gast)


Lesenswert?

Wie hast du dein delay berechnet? und welche verhältnis hat delay mit 
o_clock?

von Mike (Gast)


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

von taylor (Gast)


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

von Mike (Gast)


Lesenswert?

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

von Klaus S. (profi_sa)


Lesenswert?

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

von Mike (Gast)


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.

von Matthias Ruschko (Gast)


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

von Bluehorn (Gast)


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

von Falk B. (falk)


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

von Mike (Gast)


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.

von Johannes (Gast)


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

von Johannes (Gast)


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

von Falk B. (falk)


Lesenswert?

Das entity muss weg.

von Johannes (Gast)


Lesenswert?

Hallo Falk,

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

Gruss,
Johannes

von Falk B. (falk)


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

von Johannes (Gast)


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

von Johannes (Gast)


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;

von Falk B. (falk)


Lesenswert?

@ Johannes (Gast)

>anbei nochmal das code:

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

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.