LCD_16x2_ENGINE.vhd
213 lines
| 5.3 KiB
| text/x-vhdl
|
VhdlLexer
Alexis
|
r1 | ------------------------------------------------------------------------------ | ||
-- This file is a part of the LPP VHDL IP LIBRARY | ||||
-- Copyright (C) 2009 - 2010, Laboratory of Plasmas Physic - CNRS | ||||
-- | ||||
-- This program is free software; you can redistribute it and/or modify | ||||
-- it under the terms of the GNU General Public License as published by | ||||
Alexis
|
r19 | -- the Free Software Foundation; either version 3 of the License, or | ||
Alexis
|
r1 | -- (at your option) any later version. | ||
-- | ||||
-- This program is distributed in the hope that it will be useful, | ||||
-- but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||||
-- GNU General Public License for more details. | ||||
-- | ||||
-- You should have received a copy of the GNU General Public License | ||||
-- along with this program; if not, write to the Free Software | ||||
-- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||||
------------------------------------------------------------------------------- | ||||
Alexis
|
r38 | -- Author : Alexis Jeandet | ||
-- Mail : alexis.jeandet@lpp.polytechnique.fr | ||||
------------------------------------------------------------------------------- | ||||
Alexis
|
r1 | library IEEE; | ||
use IEEE.STD_LOGIC_1164.ALL; | ||||
use IEEE.NUMERIC_STD.ALL; | ||||
library lpp; | ||||
use lpp.amba_lcd_16x2_ctrlr.all; | ||||
use lpp.LCD_16x2_CFG.all; | ||||
entity LCD_16x2_ENGINE is | ||||
generic(OSC_freqKHz : integer := 50000); | ||||
Port ( clk : in STD_LOGIC; | ||||
reset : in STD_LOGIC; | ||||
Alexis
|
r14 | DATA : in FRM_Buff_Space; | ||
Alexis
|
r1 | CMD : in std_logic_vector(10 downto 0); | ||
Exec : in std_logic; | ||||
Ready : out std_logic; | ||||
LCD_CTRL : out LCD_DRVR_CTRL_BUSS | ||||
); | ||||
end LCD_16x2_ENGINE; | ||||
architecture ar_LCD_16x2_ENGINE of LCD_16x2_ENGINE is | ||||
constant ConfigTbl : LCD_CFG_Tbl :=(ClearDSPLY,FunctionSet,DSPL_CTRL,SetEntryMode,RetHome); | ||||
signal SYNCH : LCD_DRVR_SYNCH_BUSS; | ||||
signal DRIVER_CMD : LCD_DRVR_CMD_BUSS; | ||||
signal FRAME_CLK : std_logic; | ||||
signal FRAME_CLK_reg : std_logic; | ||||
signal RefreshFlag : std_logic; | ||||
signal CMD_Flag : std_logic; | ||||
signal Exec_Reg : std_logic; | ||||
type state_t is (INIT0,INIT1,INIT2,IDLE,Refresh,Refresh0,Refresh1,ReturnHome,GoLine2,GoLine2_0,ExecCMD0,ExecCMD1); | ||||
signal state : state_t; | ||||
Alexis
|
r14 | signal i : integer range 0 to lcd_space_size := 0; | ||
Alexis
|
r1 | |||
begin | ||||
Driver0 : LCD_16x2_DRIVER | ||||
generic map(OSC_freqKHz) | ||||
Port map(reset,clk,LCD_CTRL,SYNCH,DRIVER_CMD); | ||||
FRAME_CLK_GEN0 : FRAME_CLK_GEN | ||||
generic map(OSC_freqKHz) | ||||
Port map( clk,reset,FRAME_CLK); | ||||
process(reset,clk) | ||||
begin | ||||
if reset = '0' then | ||||
state <= INIT0; | ||||
Ready <= '0'; | ||||
RefreshFlag <= '0'; | ||||
i <= 0; | ||||
elsif clk'event and clk ='1' then | ||||
FRAME_CLK_reg <= FRAME_CLK; | ||||
Exec_Reg <= Exec; | ||||
if FRAME_CLK_reg = '0' and FRAME_CLK = '1' then | ||||
RefreshFlag <= '1'; | ||||
elsif state = Refresh or state = Refresh0 or state = Refresh1 then | ||||
RefreshFlag <= '0'; | ||||
end if; | ||||
if Exec_Reg = '0' and Exec = '1' then | ||||
CMD_Flag <= '1'; | ||||
elsif state = ExecCMD0 or state = ExecCMD1 then | ||||
CMD_Flag <= '0'; | ||||
end if; | ||||
case state is | ||||
when INIT0 => | ||||
if SYNCH.DRVR_READY = '1' then | ||||
DRIVER_CMD.Exec <= '1'; | ||||
DRIVER_CMD.Duration <= Duration_20ms; | ||||
DRIVER_CMD.CMD_Data <= '0'; | ||||
DRIVER_CMD.Word <= ConfigTbl(i); | ||||
i <= i + 1; | ||||
state <= INIT1; | ||||
else | ||||
DRIVER_CMD.Exec <= '0'; | ||||
end if; | ||||
when INIT1 => | ||||
state <= INIT2; | ||||
DRIVER_CMD.Exec <= '0'; | ||||
when INIT2 => | ||||
if SYNCH.DRVR_READY = '1' then | ||||
if i = 5 then | ||||
state <= Idle; | ||||
else | ||||
state <= INIT0; | ||||
end if; | ||||
end if; | ||||
when Idle=> | ||||
DRIVER_CMD.Exec <= '0'; | ||||
if RefreshFlag = '1' then | ||||
Ready <= '0'; | ||||
state <= Refresh; | ||||
elsif CMD_Flag = '1' then | ||||
Ready <= '0'; | ||||
state <= ExecCMD0; | ||||
else | ||||
Ready <= '1'; | ||||
end if; | ||||
i <= 0; | ||||
when Refresh=> | ||||
if SYNCH.DRVR_READY = '1' then | ||||
DRIVER_CMD.Exec <= '1'; | ||||
DRIVER_CMD.Duration <= Duration_100us; | ||||
DRIVER_CMD.CMD_Data <= '1'; | ||||
Alexis
|
r14 | DRIVER_CMD.Word <= DATA(i); | ||
Alexis
|
r1 | state <= Refresh0; | ||
else | ||||
DRIVER_CMD.Exec <= '0'; | ||||
end if; | ||||
when Refresh0=> | ||||
Alexis
|
r11 | i <= i + 1; | ||
Alexis
|
r1 | state <= Refresh1; | ||
DRIVER_CMD.Exec <= '0'; | ||||
when Refresh1=> | ||||
if SYNCH.DRVR_READY = '1' then | ||||
Alexis
|
r14 | if i = lcd_space_size then | ||
-- state <= ReturnHome; | ||||
state <= Idle; | ||||
-- elsif i = 16 then | ||||
-- state <= GoLine2; | ||||
Alexis
|
r1 | else | ||
state <= Refresh; | ||||
end if; | ||||
end if; | ||||
when ExecCMD0=> | ||||
if SYNCH.DRVR_READY = '1' then | ||||
DRIVER_CMD.Exec <= '1'; | ||||
DRIVER_CMD.Duration <= CMD(9 downto 8); | ||||
DRIVER_CMD.CMD_Data <= '0'; | ||||
DRIVER_CMD.Word <= CMD(7 downto 0); | ||||
state <= ExecCMD1; | ||||
else | ||||
DRIVER_CMD.Exec <= '0'; | ||||
end if; | ||||
when ExecCMD1=> | ||||
state <= Idle; | ||||
DRIVER_CMD.Exec <= '0'; | ||||
when GoLine2=> | ||||
if SYNCH.DRVR_READY = '1' then | ||||
DRIVER_CMD.Exec <= '1'; | ||||
Alexis
|
r14 | DRIVER_CMD.Duration <= Duration_4ms; | ||
Alexis
|
r1 | DRIVER_CMD.CMD_Data <= '0'; | ||
DRIVER_CMD.Word <= X"C0"; | ||||
state <= GoLine2_0; | ||||
else | ||||
DRIVER_CMD.Exec <= '0'; | ||||
end if; | ||||
when GoLine2_0=> | ||||
state <= Refresh; | ||||
DRIVER_CMD.Exec <= '0'; | ||||
when ReturnHome=> | ||||
if SYNCH.DRVR_READY = '1' then | ||||
DRIVER_CMD.Exec <= '1'; | ||||
DRIVER_CMD.Duration <= Duration_4ms; | ||||
DRIVER_CMD.CMD_Data <= '0'; | ||||
Alexis
|
r11 | DRIVER_CMD.Word <= RetHome; | ||
Alexis
|
r1 | state <= Idle; | ||
else | ||||
DRIVER_CMD.Exec <= '0'; | ||||
end if; | ||||
end case; | ||||
end if; | ||||
end process; | ||||
end ar_LCD_16x2_ENGINE; | ||||