mirror of
https://github.com/Klagarge/Cursor.git
synced 2024-11-23 09:53:29 +00:00
106 lines
4.6 KiB
VHDL
106 lines
4.6 KiB
VHDL
library Common;
|
|
use Common.CommonLib.all;
|
|
|
|
ARCHITECTURE RTL OF lcdInitializer IS
|
|
|
|
constant initializationSequenceLength: positive := 14;
|
|
type initializationDataType is array (1 to initializationSequenceLength+1)
|
|
of std_ulogic_vector(lcdData'range);
|
|
constant initializationData: initializationDataType :=(
|
|
'0' & X"40", -- Display start line 0
|
|
'0' & X"A1", -- ADC reverse
|
|
'0' & X"C0", -- Normal COM0~COM31
|
|
'0' & X"A6", -- Display normal
|
|
'0' & X"A2", -- Set bias 1/9 (Duty 1/33)
|
|
'0' & X"2F", -- Booster, Regulator and Follower on
|
|
'0' & X"F8", -- Set internal Booster to 3x / 4x
|
|
'0' & X"00", --
|
|
'0' & X"23", -- Contrast set
|
|
'0' & X"81", --
|
|
'0' & X"1F", --
|
|
'0' & X"AC", -- No indicator
|
|
'0' & X"00", --
|
|
'0' & X"AF", -- Display on
|
|
std_ulogic_vector(to_unsigned(0, lcdData'length))
|
|
);
|
|
|
|
constant clearDisplaySequenceLength : positive := 566;--(3+132)*4 + 3; -- (3 commands + 132 columns) * 4 pages + jump back to start
|
|
constant clearDisplayDataLength : positive := 6;
|
|
type clearDisplayDataType is array (1 to clearDisplayDataLength+1)
|
|
of std_ulogic_vector(lcdData'range);
|
|
constant clearDisplayData: clearDisplayDataType :=(
|
|
-- ind seq
|
|
'0' & X"B0", -- 1 Page 0
|
|
'0' & X"B1", -- 2 Page 1
|
|
'0' & X"B2", -- 3 Page 2
|
|
'0' & X"B3", -- 4 Page 3
|
|
'0' & X"10", -- 5 Column MSB 0
|
|
'0' & X"00", -- 6 Column LSB 0
|
|
'1' & X"00" -- 7 Data "empty"
|
|
);
|
|
|
|
signal initSequenceCounter: unsigned(requiredBitNb(initializationSequenceLength+1)-1 downto 0);
|
|
signal initSequenceDone: std_ulogic;
|
|
signal clearSequenceCounter: unsigned(requiredBitNb(clearDisplaySequenceLength+1)-1 downto 0);
|
|
signal clearSequenceDone: std_ulogic;
|
|
|
|
BEGIN
|
|
------------------------------------------------------------------------------
|
|
-- initialization sequence counter
|
|
buildInitSequence: process(reset, clock)
|
|
begin
|
|
if reset='1' then
|
|
initSequenceCounter <= to_unsigned(1, initSequenceCounter'length);
|
|
elsif rising_edge(clock) then
|
|
if lcdBusy = '0' then
|
|
if initSequenceDone = '0' then
|
|
initSequenceCounter <= initSequenceCounter + 1;
|
|
end if;
|
|
end if;
|
|
end if;
|
|
end process buildInitSequence;
|
|
|
|
initSequenceDone <= '1' when initSequenceCounter > initializationSequenceLength
|
|
else '0';
|
|
|
|
------------------------------------------------------------------------------
|
|
-- clear sequence counter
|
|
buildClearSequence: process(reset, clock)
|
|
begin
|
|
if reset='1' then
|
|
clearSequenceCounter <= to_unsigned(clearDisplaySequenceLength+1, clearSequenceCounter'length);
|
|
elsif rising_edge(clock) then
|
|
if lcdBusy = '0' then
|
|
if clearDisplay = '1' and initSequenceDone = '1' then
|
|
clearSequenceCounter <= to_unsigned(1, clearSequenceCounter'length);
|
|
elsif clearSequenceDone = '0' then
|
|
clearSequenceCounter <= clearSequenceCounter + 1;
|
|
end if;
|
|
end if;
|
|
end if;
|
|
end process buildClearSequence;
|
|
|
|
clearSequenceDone <= '1' when clearSequenceCounter > clearDisplaySequenceLength
|
|
else '0';
|
|
|
|
------------------------------------------------------------------------------
|
|
-- data multiplexer
|
|
lcdData <= columnData when (initSequenceDone = '1' and clearSequenceDone = '1')
|
|
else initializationData(to_integer(initSequenceCounter)) when (initSequenceCounter > 0 and initSequenceDone = '0')
|
|
else clearDisplayData(1) when (clearSequenceCounter = 1 or clearSequenceCounter = 564)
|
|
else clearDisplayData(2) when (clearSequenceCounter = 137)
|
|
else clearDisplayData(3) when (clearSequenceCounter = 273)
|
|
else clearDisplayData(4) when (clearSequenceCounter = 409)
|
|
else clearDisplayData(5) when (clearSequenceCounter = 2 or clearSequenceCounter = 138 or clearSequenceCounter = 274 or clearSequenceCounter = 410 or clearSequenceCounter = 565)
|
|
else clearDisplayData(6) when (clearSequenceCounter = 3 or clearSequenceCounter = 139 or clearSequenceCounter = 275 or clearSequenceCounter = 411 or clearSequenceCounter = 566)
|
|
else clearDisplayData(7);
|
|
|
|
lcdSend <= columnSend when initSequenceDone = '1' and clearSequenceDone = '1'
|
|
else not lcdBusy when initSequenceCounter <= initializationSequenceLength
|
|
else not lcdBusy when clearSequenceCounter <= clearDisplaySequenceLength
|
|
else '0';
|
|
columnBusy <= lcdBusy when initSequenceDone = '1' and clearSequenceDone = '1'
|
|
else '1';
|
|
|
|
END ARCHITECTURE RTL;
|