mirror of
				https://github.com/Klagarge/Cursor.git
				synced 2025-10-30 21:49:17 +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;
 |