Ansteuerung LCD Display(Spartan3E)

Gast #476959
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.
Angehängte Dateien:
Gast #477354
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
Gast #477488
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.
Gast #576337
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
Gast #587362
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 ;).
Gast #605064
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.
Gast #796204
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
Gast #1052506
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
Gast #1052508
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
Gast #1052692
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;

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren