Files
lt16lab/soc/peripheral/LCDController.vhd
Thomas Fehmel 657a54ba18 Initial Commit
2016-10-18 14:21:45 +02:00

75 lines
1.5 KiB
VHDL

-- See the file "LICENSE" for the full license governing this code. --
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.numeric_std.all;
USE work.lt16x32_global.all;
USE work.wishbone.all;
USE work.config.all;
ENTITY wb_lcd IS
generic(
memaddr : generic_addr_type;
addrmask : generic_mask_type
);
port(
clk : IN std_logic;
rst : IN std_logic;
dataLCD : INOUT std_logic_vector(7 downto 0);
enableLCD : OUT std_logic;
rsLCD : OUT std_logic;
rwLCD : OUT std_logic;
wslvi : IN wb_slv_in_type;
wslvo : OUT wb_slv_out_type
);
END ENTITY;
ARCHITECTURE behav OF wb_lcd IS
signal lcd_reg : std_logic_vector(10 downto 0);
signal ack : std_logic;
BEGIN
process(clk)
begin
if clk'event and clk='1' then
if rst = '1' then
ack <= '0';
lcd_reg <= (others => '0');
else
if wslvi.stb = '1' and wslvi.cyc = '1' then
if wslvi.we = '1' then
lcd_reg <= dec_wb_dat(wslvi.sel,wslvi.dat)(10 downto 0);
end if;
if ack = '0' then
ack <= '1';
else
ack <= '0';
end if;
else
ack <= '0';
end if;
end if;
end if;
end process;
wslvo.dat(10 downto 0) <= lcd_reg when wslvi.adr(2) = '0'
else "000" & dataLCD when wslvi.adr(2) = '1' and lcd_reg(8) = '1'
else (others => '0');
wslvo.dat(31 downto 11) <= (others=>'0');
wslvo.wbcfg <= wb_membar(memaddr, addrmask);
wslvo.ack <= ack;
enableLCD <= lcd_reg(10);
rsLCD <= lcd_reg(9);
rwLCD <= lcd_reg(8);
dataLCD <= lcd_reg(7 downto 0) when lcd_reg(8) = '0' else "ZZZZZZZZ";
END ARCHITECTURE;