LCD <-> VHDL klein probleem in de code

M

mobile-it

Guest
Hi all,

Ik vond een lcd-controller voor gebruik op mijn FPGA.maar als ik probeer om wat tekst te schrijven, toont het de tekst, maar zijn er 2 kleine problemen in.

Ik wil het display van de tekst: "XIOS http://www.fpga.be", maar dit leidt tot (op het LCD-scherm): http:/ "www.fpgf.be XIOS".Kan iemand me helpen?Heel veel dank u!

Code:

library IEEE;

gebruik IEEE.STD_LOGIC_1164.ALL;

gebruik IEEE.STD_LOGIC_ARITH.ALL;

gebruik IEEE.STD_LOGIC_UNSIGNED.ALL;entiteit LCD is

Port (lcd_data: out std_logic_vector (7 Downto 4);

clk: in std_logic;

reset: in std_logic;

lcd_enable: out std_logic;

lcd_rs: out std_logic;

lcd_rw: out std_logic);

end LCD;architectuur gedrag van LCD istype state_type is (opwarmen, setfunc, clear1, clear2, setmode1, setmode2, write1, home1, home2);signaal staat: state_type;attribuut syn_state_machine: Boolean;

attribuut syn_state_machine van de staat: signaal is waar;signaal count: std_logic_vector (3 Downto 0);

signaal af: std_logic; - set hoog zijn, indien gedaan schrijven cyclussignaal char_mode: std_logic_vector (1 Downto 0);- het bepalen van de display

constante N: integer: = 8;

type arr is array (1 tot N) van std_logic_vector (7 Downto 0);

constante display_char1: arr.: = (X "A0", - blanco

x "68", - h

x "74", - t

X "74", - t

X "70", - p

X "3A", -:

X "2F", - /

X "2F"); - /constante display_char2: arr.: = (X "77", - w

x "77", - w

x "77", - w

X "2E", --.

X "66", - f

X "70", - p

X "67", - g

X "61"); - eenconstante display_char3: arr.: = (X "2E", --.

x "62", - b

x "65", - e

X "88", - blanco

X "88", - blanco

X "88", - blanco

X "88", - blanco

X "88"); - blancoconstante display_char4: arr.: = (X "A0", - blanco

X "88", - blanco

x "58", - X

x "49", - I

X "4F", - O

X "53", - S

X "88", - blanco

X "88"); - blancosignaal display_char: arr;beginnen

lcd_rw <= '0 ';

lcd_enable <= clk; - niet clk, - dit is zeer belangrijk!
indien mogelijk niet gepulst, lcd zal niet schrijvenchar_mode_process: proces (char_mode)

beginnen

geval char_mode is

wanneer "00" =>

display_char <= display_char1;

wanneer "01" =>

display_char <= display_char2;

wanneer "10" =>

display_char <= display_char3;

wanneer "11" =>

display_char <= display_char4;

wanneer anderen =>

display_char <= display_char1;

einde geval;

einde processtate_set: proces (clk, reset, afgewerkt)

beginnen

indien reset = '1 'dan

count <= (others => '0 ');

toestand <= opwarmen, - setfunc;

char_mode <= (others => '0 ');elsif (clk'event en clk = '1 ') then

geval staat

wanneer Warmup =>

lcd_rs <= '0 ';

lcd_data <= "0011", - "0000"; - niets doen

Als count = "0111" dan - 0111

count <= (others => '0 ');

state <= setfunc;

anders

count <= count '1 ';

state <= Warmup;

end if;wanneer setfunc =>

lcd_rs <= '0 ';

lcd_data <= "0010";

afgewerkte <= '0 ';Als count = "0010" dan - 0010

count <= (others => '0 ');

state <= clear1;

anders

count <= count '1 ';

state <= setfunc;

end if;wanneer clear1 =>lcd_rs <= '0 ';

lcd_data <= "0000";

state <= clear2;wanneer clear2 =>

lcd_rs <= '0 ';

Als count = "0111" dan

state <= setmode1;

count <= (others => '0 ');

lcd_data <= "1111";

anders

count <= count '1 ';

lcd_data <= "0001";

state <= clear1;

end if;wanneer setmode1 =>

lcd_rs <= '0 ';

lcd_data <= "0000";

state <= setmode2;

afgewerkte <= '0 ';wanneer setmode2 =>

lcd_rs <= '0 ';

lcd_data <= "0110";

state <= write1;wanneer write1 =>

als klaar = '1 'dan

state <= home1;

anders

lcd_rs <= '1 ';

count < count = '1 ';

state <= write1;

ZAAK telling

WHEN "0000" =>

lcd_data <= display_char (1) (7 Downto 4);

WHEN "0001" =>

lcd_data <= display_char (1) (3 Downto 0);

WHEN "0010" =>

lcd_data <= display_char (2) (7 Downto 4);

WHEN "0011" =>

lcd_data <= display_char (2) (3 Downto 0);

WHEN "0100" =>

lcd_data <= display_char (3) (7 Downto 4);

WHEN "0101" =>

lcd_data <= display_char (3) (3 Downto 0);

WHEN "0110" =>

lcd_data <= display_char (4) (7 Downto 4);

WHEN "0111" =>

lcd_data <= display_char (4) (3 Downto 0);

WHEN "1000" =>

lcd_data <= display_char (5) (7 Downto 4);

WHEN "1001" =>

lcd_data <= display_char (5) (3 Downto 0);

WHEN "1010" =>

lcd_data <= display_char (6) (7 Downto 4);

WHEN "1011" =>

lcd_data <= display_char (6) (3 Downto 0);

WHEN "1100" =>

lcd_data <= display_char (7) (7 Downto 4);

WHEN "1101" =>

lcd_data <= display_char (7) (3 Downto 0);

WHEN "1110" =>

lcd_data <= display_char (8) (7 Downto 4);

klaar <= '1 '; - nodig is om laag ingesteld gedaan voordat geldige gegevens is gone

char_mode <= char_mode '1 ';

Wanneer anderen =>

lcd_data <= "0000", - "

END CASE;

end if;

wanneer home1 =>

lcd_rs <= '0 ';

lcd_data <= "0000";

state <= home2;

afgewerkte <= '0 ';

count <= (others => '0 ');

wanneer home2 =>

lcd_rs <= '0 ';

lcd_data <= "0111";

state <= write1;

einde geval;

end if;

einde procesend gedrag;
 
Je niet uitgevoerd

Code:display_char (8) (3 Downto 0);

 
Bedankt,

Ik gebruik deze VHDL fragment voor onderwijsdoeleinden, (ik heb het gevonden ergens).Toegevoegd na 16 minuten:De tekst op het LCD-scherm is nog steeds niet correct.Toegevoegd na 2 uur en 25 minuten:Oke,Ik heb een download van de ACTEL website van de nieuw voorbeeld van de ProASIC3 (de FPGA ik mee bezig ben) en schrijf de inhoud van de UIT en dan werkt alles ...Ik denk dat ik zal verder gaan met dit voorbeeld om mijn aanvraag te creëren; ik nodig om UIT de wijziging van een aantal geheugen op de FPGA, omdat ik niet kan schrijven naar het UIT van de FPGA silicium.(De UIT wordt gebruikt voor beveiligingsdoeleinden, enz.).bedankt voor je hulp

 
U was niet het uitsturen van de laatste knabbelen van de 8e karakter.Ik hoop dat het zal goed werken.

Code:

library IEEE;

gebruik IEEE.STD_LOGIC_1164.ALL;

gebruik IEEE.STD_LOGIC_ARITH.ALL;

gebruik IEEE.STD_LOGIC_UNSIGNED.ALL;entiteit LCD is

Port (lcd_data: out std_logic_vector (7 Downto 4);

clk: in std_logic;

reset: in std_logic;

lcd_enable: out std_logic;

lcd_rs: out std_logic;

lcd_rw: out std_logic

)

end LCD;architectuur gedrag van LCD istype state_type is (opwarmen, setfunc, clear1, clear2, setmode1, setmode2, write1, home1, home2);signaal staat: state_type;attribuut syn_state_machine: Boolean;

attribuut syn_state_machine van de staat: signaal is waar;signaal count: std_logic_vector (3 Downto 0);

signaal af: std_logic; - set hoog zijn, indien gedaan schrijven cyclussignaal char_mode: std_logic_vector (1 Downto 0);- het bepalen van de display

constante N: integer: = 8;

type arr is array (1 tot N) van std_logic_vector (7 Downto 0);constante display_char1: arr.: = (x "A0", - blanco

X "68", - h

X "74", - t

X "74", - t

X "70", - p

X "3A", -:

X "2F", - /

X "2F"); - /constante display_char2: arr.: = (X "77", - w

X "77", - w

X "77", - w

X "2E", --.

X "66", - f

X "70", - p

X "67", - g

X "61"); - eenconstante display_char3: arr.: = (X "2E", --.

X "62", - b

X "65", - e

X "88", - blanco

X "88", - blanco

X "88", - blanco

X "88", - blanco

X "88"); - blancoconstante display_char4: arr.: = (X "A0", - blanco

X "88", - blanco

X "58", - X

X "49", - I

X "4F", - O

X "53", - S

X "88", - blanco

X "88"); - blancosignaal display_char: arr;beginnen

lcd_rw <= '0 ';

lcd_enable <= clk; - niet clk, - dit is zeer belangrijk!
indien mogelijk niet gepulst, lcd zal niet schrijvenchar_mode_process: proces (char_mode)

beginnen

geval char_mode is

wanneer "00" =>

display_char <= display_char1;

wanneer "01" =>

display_char <= display_char2;

wanneer "10" =>

display_char <= display_char3;

wanneer "11" =>

display_char <= display_char4;

wanneer anderen =>

display_char <= display_char1;

einde geval;

einde processtate_set: proces (clk, reset, afgewerkt)

beginnen

if (reset = '1 ') thentoestand <= opwarmen, - setfunc;

count <= (others => '0 ');

char_mode <= (others => '0 ');elsif (clk'event en clk = '1 ') then

geval staatwanneer Warmup =>

lcd_rs <= '0 ';

lcd_data <= "0011", - "0000"; - niets doen

Als count = "0111" dan - 0111

count <= (others => '0 ');

state <= setfunc;

anders

count <= count '1 ';

state <= Warmup;

end if;wanneer setfunc =>

lcd_rs <= '0 ';

lcd_data <= "0010";

afgewerkte <= '0 ';Als count = "0010" dan - 0010

count <= (others => '0 ');

state <= clear1;

anders

count <= count '1 ';

state <= setfunc;

end if;wanneer clear1 =>lcd_rs <= '0 ';

lcd_data <= "0000";

state <= clear2;wanneer clear2 =>

lcd_rs <= '0 ';

Als count = "0111" dan

state <= setmode1;

count <= (others => '0 ');

lcd_data <= "1111";

anders

count <= count '1 ';

lcd_data <= "0001";

state <= clear1;

end if;wanneer setmode1 =>

lcd_rs <= '0 ';

lcd_data <= "0000";

state <= setmode2;

afgewerkte <= '0 ';wanneer setmode2 =>

lcd_rs <= '0 ';

lcd_data <= "0110";

state <= write1;wanneer write1 =>

als klaar = '1 'dan

state <= home1;

anders

lcd_rs <= '1 ';

count <= count '1 ';

state <= write1;ZAAK tellingWHEN "0000" =>

lcd_data <= display_char (1) (7 Downto 4);WHEN "0001" =>

lcd_data <= display_char (1) (3 Downto 0);WHEN "0010" =>

lcd_data <= display_char (2) (7 Downto 4);WHEN "0011" =>

lcd_data <= display_char (2) (3 Downto 0);WHEN "0100" =>

lcd_data <= display_char (3) (7 Downto 4);WHEN "0101" =>

lcd_data <= display_char (3) (3 Downto 0);WHEN "0110" =>

lcd_data <= display_char (4) (7 Downto 4);WHEN "0111" =>

lcd_data <= display_char (4) (3 Downto 0);WHEN "1000" =>

lcd_data <= display_char (5) (7 Downto 4);WHEN "1001" =>

lcd_data <= display_char (5) (3 Downto 0);WHEN "1010" =>

lcd_data <= display_char (6) (7 Downto 4);WHEN "1011" =>

lcd_data <= display_char (6) (3 Downto 0);WHEN "1100" =>

lcd_data <= display_char (7) (7 Downto 4);WHEN "1101" =>

lcd_data <= display_char (7) (3 Downto 0);WHEN "1110" =>

lcd_data <= display_char (8) (7 Downto 4);

- afgewerkt <= '1 '; - nodig is om laag ingesteld gedaan voordat geldige gegevens is gone

- char_mode <= char_mode '1 ';WHEN "1111" =>

lcd_data <= display_char (8) (3 Downto 0);

klaar <= '1 '; - nodig is om laag ingesteld gedaan voordat geldige gegevens is gone

char_mode <= char_mode '1 ';Wanneer anderen =>

lcd_data <= "0000", - "END CASE;

end if;wanneer home1 =>

lcd_rs <= '0 ';

lcd_data <= "0000";

state <= home2;

afgewerkte <= '0 ';

count <= (others => '0 ');wanneer home2 =>

lcd_rs <= '0 ';

lcd_data <= "0111";

state <= write1;einde geval;end if;einde procesend gedrag;
 
hoe het zal werken.Quote:lcd_rw <= '0 ';

lcd_enable <= clk; - niet clk, - dit is zeer belangrijk!
indien mogelijk niet gepulst, lcd zal niet schrijven
 

Welcome to EDABoard.com

Sponsor

Back
Top