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
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.
Auf der Xilinx Homepage gibt es eine xapp zur Ansteuerung für ein LCD. Diese funktioniert auch, steuert allerdings über 11 Leitungen an. Daniel
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
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.
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
Wie hast du dein delay berechnet? und welche verhältnis hat delay mit o_clock?
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 ;).
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
Das ist einfach nur ein Zähler der nach einiger Zeit das Signal frei gibt. Kannst du auch auf einen festen Pegel legen.
konnte bis jetzt keine Doumentation über die Ansteuerung mit Vhdl bei Xilinx finden. Frage: Wie heißt bitte die Xapp
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.
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
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
@ 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
@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.
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
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
Hallo Falk, das lässt sich sythetisieren, aber auf dem Display erscheint nicht. Gruss, Johannes
@ 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
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
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;
@ 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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.