library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; package ssd1306_pkg is constant DISPLAY_WIDTH : unsigned(7 downto 0) := to_unsigned(128, 8); constant DISPLAY_HEIGHT : unsigned(7 downto 0) := to_unsigned(64, 8); type data_arr_t is array (natural range <>) of std_logic_vector(7 downto 0); constant SSD1306_INIT : data_arr_t := ( X"80", X"A8", X"80", X"3F", X"80", X"D3", X"80", X"00", X"80", X"40", X"80", X"A0", X"80", X"C0", X"80", X"DA", X"80", X"02", X"80", X"81", X"80", X"7F", X"80", X"A4", X"80", X"A6", X"80", X"D5", X"80", X"80", X"80", X"8D", X"80", X"14", X"80", X"AF" -- init done ); constant SSD1306_HORIZONTAL_ADDRESSING_MODE : data_arr_t := ( X"80", X"20", -- set addressing mode X"80", X"00" -- horizontal ); constant SSD1306_CURSOR_TO_ZERO : data_arr_t := ( X"80", X"21", -- set column address X"80", X"00", -- set first address X"80", X"7F", -- set last address X"80", X"22", -- set page address X"80", X"00", -- start X"80", X"07" -- end ); constant SSD1306_ZERO_LEN : integer := 1025; constant SSD1306_ZERO : data_arr_t := ( X"40", X"00" ); ----------------------------------------------------------------------------- -- 8x8 characters obtained from https://github.com/dhepper/font8x8 ----------------------------------------------------------------------------- -- contains beginning of i2c packet -- (0x40) to signal only data will follow constant SSD1306_CHAR_0 : data_arr_t(0 to 8) := ( X"40", X"3E", X"7F", X"71", X"59", X"4D", X"7F", X"3E", X"00" ); constant SSD1306_CHAR_1 : data_arr_t(0 to 8) := ( X"40", X"40", X"42", X"7F", X"7F", X"40", X"40", X"00", X"00" ); constant SSD1306_CHAR_2 : data_arr_t(0 to 8) := ( X"40", X"62", X"73", X"59", X"49", X"6F", X"66", X"00", X"00" ); constant SSD1306_CHAR_3 : data_arr_t(0 to 8) := ( X"40", X"22", X"63", X"49", X"49", X"7F", X"36", X"00", X"00" ); constant SSD1306_CHAR_4 : data_arr_t(0 to 8) := ( X"40", X"18", X"1C", X"16", X"53", X"7F", X"7F", X"50", X"00" ); constant SSD1306_CHAR_5 : data_arr_t(0 to 8) := ( X"40", X"27", X"67", X"45", X"45", X"7D", X"39", X"00", X"00" ); constant SSD1306_CHAR_6 : data_arr_t(0 to 8) := ( X"40", X"3C", X"7E", X"4B", X"49", X"79", X"30", X"00", X"00" ); constant SSD1306_CHAR_7 : data_arr_t(0 to 8) := ( X"40", X"03", X"03", X"71", X"79", X"0F", X"07", X"00", X"00" ); constant SSD1306_CHAR_8 : data_arr_t(0 to 8) := ( X"40", X"36", X"7F", X"49", X"49", X"7F", X"36", X"00", X"00" ); constant SSD1306_CHAR_9 : data_arr_t(0 to 8) := ( X"40", X"06", X"4F", X"49", X"69", X"3F", X"1E", X"00", X"00" ); function ssd1306_bcd_digit_data ( constant digit : std_logic_vector(3 downto 0)) return data_arr_t; end package ssd1306_pkg; package body ssd1306_pkg is function ssd1306_bcd_digit_data ( constant digit : std_logic_vector(3 downto 0)) return data_arr_t is variable ret : data_arr_t(0 to 8); begin case digit is when "0000" => ret := SSD1306_CHAR_0; when "0001" => ret := SSD1306_CHAR_1; when "0010" => ret := SSD1306_CHAR_2; when "0011" => ret := SSD1306_CHAR_3; when "0100" => ret := SSD1306_CHAR_4; when "0101" => ret := SSD1306_CHAR_5; when "0110" => ret := SSD1306_CHAR_6; when "0111" => ret := SSD1306_CHAR_7; when "1000" => ret := SSD1306_CHAR_8; when "1001" => ret := SSD1306_CHAR_9; when others => ret := SSD1306_CHAR_0; end case; return ret; end function ssd1306_bcd_digit_data; end package body ssd1306_pkg;