mirror of
https://github.com/Klagarge/Cursor.git
synced 2025-12-15 16:23:05 +00:00
Initial commit
This commit is contained in:
105
Libs/Lcd/hdl/lcdInitializer_RTL.vhd
Normal file
105
Libs/Lcd/hdl/lcdInitializer_RTL.vhd
Normal file
@@ -0,0 +1,105 @@
|
||||
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;
|
||||
Reference in New Issue
Block a user