Forum: FPGA, VHDL & Co. LCD Initialisieren


von Sabine M. (zizo)


Lesenswert?

Hallo,

ich habe LCD 2x16 mit FPGA verbunden. Ich möchte das Display mit 
folgende Code Initialisieren.
allerdings die Initialsierung erfolgt nur nachdem ich reset drücke und 
es zeigt kein 0.

könnte jemand mir sagen, warum erfolgt die intialiesierung nur nach 
reset und nicht nach dem Einschalten. Und warum wird keine 0 auf dem 
Display gezeigt

Danke

--Die feste zeiten hier beziehen sich auf CPLD quarz oszi
LIBRARY ieee ;
USE ieee.std_logic_1164.all;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITY lcd IS
  PORT(
    clk, reset :  in std_logic;
    init_fertig : out std_logic;
    init_out : out std_logic_vector(6 downto 0)); --EN RS RW D7 D6 D5 D4
END lcd;

ARCHITECTURE struct of lcd is

--der flag wird auf 1 gesetzt wenn die zeit verstrichen wurde
signal delay_flag : std_logic;
--hier wird je nach anforderung die benötigte zeit vorgegeben
signal delay_time : integer:= 0;
--für delay...
signal count : integer:= 0;

--braucht man nicht unbedingt, ist für ausgang an LCD
signal sig_init_out : std_logic_vector(6 downto 0):="0000010";

signal init_suc : std_logic:='0';

BEGIN
  init_out <= sig_init_out;
  init_fertig <= init_suc;

  process (clk,reset, init_suc)
  begin
    if (reset='0') then
      count <= 0;
    else
      if (clk'event and clk='1' and init_suc='0') then
          if (count = delay_time) then
            count <= 0;
            delay_flag <= '1';
          else
            count <= count + 1;
            delay_flag <= '0';
          end if;
      end if;
    end if;
  end process;

  process (delay_flag, reset)
    variable delay_nr : std_logic_vector(3 downto 0):=(others=>'0');
  begin
    if (reset='0') then
      init_suc <= '0';
      delay_nr := (others=>'0');
      sig_init_out <= "0000010";
      delay_time <= 0;
    else
      if (delay_flag = '1') then
        case delay_nr is


          when "0000" =>   sig_init_out <= "1000010";
                  delay_time <= 100000; --2ms

          when "0001" =>   sig_init_out <= "1000010"; --
                  delay_time <= 50000; --1ms        4-Bit Datenlänge, 
2-zeiliges Display, 5x7 Font
          when "0010" =>   sig_init_out <= "1001000"; --
                  delay_time <= 50000;

          when "0011" =>   sig_init_out <= "1000000";--
                  delay_time <= 50000; --1ms        Display ein, Cursor 
ein, Cursor blinken
          when "0100" =>   sig_init_out <= "1001111";--
                  delay_time <= 50000; --1ms

          when "0101" =>   sig_init_out <= "1000000";--
                  delay_time <= 50000; --1ms        Display löschen, 
Cursor auf 1. Spalte von 1. Zeile
          when "0110" =>   sig_init_out <= "1000001";--
                  delay_time <= 50000; --1ms

          when "0111" =>   sig_init_out <= "1000000";--
                  delay_time <= 50000; --1ms        Cursor 
Auto-Increment
       when "1000" =>   sig_init_out <= "1000110";--
                  delay_time <= 50000; --1ms

       when "1001" =>   sig_init_out <= "1100011";--
                  delay_time <= 50000; --1ms        0 auf Disply 
schreiben
       when "1010" =>   sig_init_out <= "1100000";--
                  delay_time <= 50000; --1ms

          when "1011" =>  init_suc <= '1';

          when others => null;
        end case;
        delay_nr := unsigned(delay_nr)+1;

      end if;
    end if;
  end process;

end struct;

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


Lesenswert?

Sabine Mühller schrieb:
> warum erfolgt die intialiesierung nur nach
> reset und nicht nach dem Einschalten.
Weil das Display nach dem Power-Up noch Zeit (bis zu 100ms) braucht, um 
sich selbst zu finden...

von Sabine M. (zizo)


Lesenswert?

Hallo Lothar,

danke für deine Antwort,
ich habe im Code paar Veränderungen durchgeführt. ich habe  ein 120 ms 
Zeitverzögerung nch dem Einschalten eingefügt. Leider hat es nicht 
gebracht.

--Die feste zeiten hier beziehen sich auf CPLD quarz oszi
LIBRARY ieee ;
USE ieee.std_logic_1164.all;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITY lcd IS
  PORT(
    clk, reset :  in std_logic;
    init_fertig : out std_logic;
    init_out : out std_logic_vector(6 downto 0)); --EN RS RW D7 D6 D5 D4
END lcd;

ARCHITECTURE struct of lcd is

--der flag wird auf 1 gesetzt wenn die zeit verstrichen wurde
signal delay_flag : std_logic;
--hier wird je nach anforderung die benötigte zeit vorgegeben
signal delay_time : integer:= 0;
--für delay...
signal count : integer:= 0;

--braucht man nicht unbedingt, ist für ausgang an LCD
signal sig_init_out : std_logic_vector(6 downto 0):="0000011";

signal init_suc : std_logic:='0';

BEGIN
  init_out <= sig_init_out;
  init_fertig <= init_suc;

  process (clk,reset, init_suc)
  begin
    if (reset='0') then
      count <= 0;
    else
      if (clk'event and clk='1' and init_suc='0') then
          if (count = delay_time) then
            count <= 0;
            delay_flag <= '1';
          else
            count <= count + 1;
            delay_flag <= '0';
          end if;
      end if;
    end if;
  end process;

  process (delay_flag, reset)
    variable delay_nr : std_logic_vector(3 downto 0):=(others=>'0');
  begin
    if (reset='0') then
      init_suc <= '0';
      delay_nr := (others=>'0');
      sig_init_out <= "0000011";
      delay_time <= 0;
    else
      if (delay_flag = '1') then
        case delay_nr is

          when "0000" =>   delay_time <= 6000000; --120ms

          when "0001" =>   sig_init_out <= "1000011";
                  delay_time <= 300000; --6ms

       when "0010" =>   sig_init_out <= "1000010";
                  delay_time <= 5000; --100us        Interface auf 4-Bit 
setzen

          when "0011" =>   sig_init_out <= "1000010"; --
                  delay_time <= 5000; --100us        4-Bit Datenlänge, 
2-zeiliges Display, 5x7 Font
          when "0100" =>   sig_init_out <= "1001000"; --
                  delay_time <= 5000;

          when "0101" =>   sig_init_out <= "1000000";--
                  delay_time <= 50000; --100us        Display aus
          when "0110" =>   sig_init_out <= "1001000";--
                  delay_time <= 50000; --100us

          when "0111" =>   sig_init_out <= "1000000";--
                  delay_time <= 50000; --100us        Display löschen,
          when "1000" =>   sig_init_out <= "1000001";--
                  delay_time <= 50000; --100us

          when "1001" =>   sig_init_out <= "1000000";--
                  delay_time <= 50000; --100us        Kursor nach rechts 
wandernd, kein Display shif
       when "1010" =>   sig_init_out <= "1000110";--
                  delay_time <= 50000; --100us

       when "1011" =>   sig_init_out <= "1000000";--
                  delay_time <= 50000; --100us        Display ein
       when "1100" =>   sig_init_out <= "1001111";--
                  delay_time <= 50000; --100us

          when "1101" =>  init_suc <= '1';

          when others => null;
        end case;
        delay_nr := unsigned(delay_nr)+1;

      end if;
    end if;
  end process;
  end struct;

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.