library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; --use ieee.std_logic_unsigned.all; entity top_HALLO is Port ( RST : in std_logic ; -- Reset CLK : in std_logic ; -- externe Clock mit 125 MHz nSS : out std_logic ; -- not slave select, ausgewählt bei 0 SCLK : out std_logic ; -- Clock MOSI : out std_logic ; -- Datenleitung RS : out std_logic -- 0: Kommando, 1: Daten ); end top_HALLO; architecture Behavioral of top_HALLO is type t_FSM is ( fsm_init, -- Initialisierungsbefehl übernehmen fsm_wait, -- Warten fsm_H, fsm_A, fsm_L, -- Zustände für Ausgabe verschiedener Zeichen fsm_L2, fsm_O, fsm_end ); component Taktgenerator is -- teilt die Frequenz von 25 MHz herunter Port ( pi1c_CLK: in std_logic ; pi1r_RST: in std_logic ; po1_SCLK : out std_logic -- CLK heruntergeteilt ) ; end component; component SPI_ausgabe is -- Schnittstelle zw. FPGA und Display Port ( pi1r_RST : in std_logic; pi1c_CLK : in std_logic; pi8_Data : in std_logic_vector (7 downto 0) ; pi1_SCLK : in std_logic ; -- CLK heruntergeteilt pi1_Enable : in std_logic ; -- neues Byte vorliegend? pi1_Enable2 : in std_logic ; po1_Ready : out std_logic ; -- Byte übertragen? po1_nSS : out std_logic ; -- not slave select, ausgewählt bei 0 po1_SCLK : out std_logic ; -- Clock po1_MOSI : out std_logic -- Datenleitung ) ; end component; component entprellen is Port( clk : in STD_LOGIC; keyin : in STD_LOGIC; keyout : out STD_LOGIC ); end component; signal s1_SCLK : std_logic; signal s1_SPI_Enable : std_logic; signal s8_Data : std_logic_vector (7 downto 0); signal st_FSM : t_FSM; signal si_Cnt_init : integer range 0 to 8 ; -- welcher init-Befehl wird abgearbeitet? signal si_HALLO : integer range 0 to 7 ; -- welcher Zustand folgt auf Wait? signal s1_Data_String : character ; -- anzuzeigendes Zeichen signal s1_Steuer : std_logic ; signal s8_Data_init : std_logic_vector (7 downto 0); signal s8_Data_decode : std_logic_vector (7 downto 0); signal s1_Ready : std_logic; signal s1_enable2 : std_logic ; signal s1_RST : std_logic ; begin process(CLK,RST) variable vi_Cnt_Wait : integer range 0 to 200000; -- Anzahl an Clockzyklen, die gewartet werden muss, bevor Zustand Wait verlassen wird constant c_wait : integer := 200000 ; variable vi_wait_test : integer range 0 to 100 ; variable v1_wait_enable : std_logic ; begin -- bei 100 MHz ergibt sich somit eine Zeit von 2 ms if ( s1_RST = '0' ) then st_FSM <= fsm_init ; -- INIT-Zustand RS <= '0'; -- Kommandos werden übergeben si_Cnt_init <=8 ; si_HALLO <= 0 ; -- solange der Wert 0 ist => init s1_SPI_Enable <= '0'; vi_Cnt_Wait := c_wait ; s1_Steuer <= '0' ; vi_wait_test := 2 ; v1_wait_enable := '1' ; elsif rising_edge(CLK) then if v1_wait_enable = '1' then vi_wait_test := vi_wait_test -1 ; end if ; if vi_wait_test = 0 then --TEST v1_wait_enable := '0' ; end if ; end if; s1_SPI_Enable <= '0'; -- Enable für SPI gleich 0 bei jeder steigenden CLK-Flanke case st_FSM is when fsm_init => -- if si_Cnt_init=8 then s8_Data_init <= x"39" ; s1_SPI_Enable <= '1'; elsif si_Cnt_init=7 then s8_Data_init <= x"15" ; s1_SPI_Enable <= '1'; elsif si_Cnt_init=6 then s8_Data_init <= x"55" ; s1_SPI_Enable <= '1'; elsif si_Cnt_init=5 then s8_Data_init <= x"6E" ; s1_SPI_Enable <= '1'; -- abhängig von si_Cnt_init wird ein Initialisierungsbefehl elsif si_Cnt_init=4 then -- nach dem anderen abgearbeitet s8_Data_init <= x"72" ; s1_SPI_Enable <= '1'; -- heruntergezählt wird in Wait-Zustand ; elsif si_Cnt_init=3 then s8_Data_init <= x"38" ; s1_SPI_Enable <= '1'; elsif si_Cnt_init=2 then s8_Data_init <= x"0F" ; s1_SPI_Enable <= '1'; elsif si_Cnt_init=1 then s8_Data_init <= x"01" ; s1_SPI_Enable <= '1'; elsif si_Cnt_init=0 then s8_Data_init <= x"06"; s1_SPI_Enable <= '1'; si_HALLO <= 1 ; -- wenn initialisiert, dann HALLO anzeigen end if; vi_Cnt_Wait := c_wait ; --entspricht einer Wartezeit von 2 ms s1_SPI_Enable <= '1'; -- neuer Wert vorhanden st_FSM <= fsm_wait; when fsm_wait => vi_Cnt_Wait := vi_Cnt_Wait - 1; -- Zähler if vi_Cnt_Wait = 0 then if si_Cnt_init > 0 then si_Cnt_init <= si_Cnt_init - 1; -- nächster Init-Befehl end if; case si_HALLO is when 0 => st_FSM <= fsm_init ; when 1 => st_FSM <= fsm_H ; when 2 => st_FSM <= fsm_A ; -- wechseln in nächsten Zustand, abhängig von si_Hallo when 3 => st_FSM <= fsm_L ; when 4 => st_FSM <= fsm_L2 ; when 5 => st_FSM <= fsm_O ; when 6 => st_FSM <= fsm_end ; when others => st_FSM <= fsm_init ; end case; else st_FSM <= fsm_wait; end if; when fsm_H => s1_Steuer <= '1' ; s1_SPI_Enable <= '1'; st_FSM <= fsm_wait ; vi_Cnt_Wait := 200000 ; si_HALLO <= 2 ; when fsm_A => s1_SPI_Enable <= '1'; st_FSM <= fsm_wait; vi_Cnt_Wait := 200000 ; si_HALLO <= 3 ; when fsm_L => s1_SPI_Enable <= '1'; st_FSM <= fsm_wait; vi_Cnt_Wait := 200000 ; si_HALLO <= 4 ; when fsm_L2 => st_FSM <= fsm_wait; s1_SPI_Enable <= '1'; vi_Cnt_Wait := 200000 ; si_HALLO <= 5 ; when fsm_O => s1_SPI_Enable <= '1'; st_FSM <= fsm_wait; vi_Cnt_Wait := 200000 ; si_HALLO <= 6 ; when fsm_end => s1_SPI_Enable <= '0'; st_FSM <= fsm_end ; end case; end process; MODUL1: Taktgenerator port map ( pi1c_CLK => CLK, pi1r_RST => s1_RST, po1_SCLK => s1_SCLK ); MODUL2: SPI_ausgabe port map ( --pilc_Cnt_init => si_Cnt_init, --pi8_Data_init => s8_Data_init, pi1c_CLK => CLK, pi1r_RST => s1_RST, pi8_Data => s8_Data, pi1_SCLK => s1_SCLK, pi1_Enable => s1_SPI_Enable, pi1_Enable2 => s1_enable2, po1_nSS => nSS, po1_SCLK => SCLK, po1_MOSI => MOSI, po1_Ready => s1_Ready ); MODUL3: entprellen port map ( clk => CLK, keyin => RST, keyout => s1_RST ); end Behavioral ;