library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity Stack is port( Takt: in std_logic; put: in std_logic; -- Daten ablegen get: in std_logic; -- Daten entnehmen full: out std_logic; -- Stapel voll empty: out std_logic; -- Stapel leer Din: in std_logic_vector(3 downto 0); -- Eingabedaten Dout: out std_logic_vector(3 downto 0); -- Ausgabedaten Fuellstand: out std_logic_vector(4 downto 0)); end Stack; architecture Behavioral of Stack is -- Definition eines Datentyps für einen 32 x 4 Bit Speicher type ram_type is array (0 to 31) of std_logic_vector (3 downto 0); signal ram : ram_type; -- Die Adressierung eines "array 0 to 31" erfordert ein "integer range 0 to 31" signal adr : integer range 0 to 31:=0; -- interne Signale für full und empty, weil Ausgabesignale nicht -- nicht innerhalb der Schaltung ausgewertet werden können signal full_int: std_logic:= '0'; signal empty_int: std_logic:='1'; begin process(Takt) begin if Takt'event and Takt='1' then -- Daten auf den Stapel legen; nur möglich, wenn der Stapel -- nicht voll ist if put='1' and get='0' and full_int='0' then ram(adr)<=Din; empty_int<='0'; if adr=31 then full_int<='1'; else adr<=adr+1; end if; elsif put='0' and get='1' and empty_int='0' then -- Daten vom Stapel nehmen; nur möglich, wenn der Stapel -- nicht leer ist Dout<=ram(adr); full_int<='0'; if adr=0 then empty_int<='1'; else adr<=adr-1; end if; elsif put='1' and get='1' then -- Daten gleichzeitig auf den Stapel legen und wieder -- entnehmen ist immer möglich Dout<=Din; end if; end if; end process; empty<=empty_int; full<=full_int; -- Füllstand ist gleich der Speicheradresse. Die Funktion -- CONV_STD_LOGIC(...) wandelt "integer range 0 to 31" in einen -- 5Bit std_logic_vector um. Fuellstand<=CONV_STD_LOGIC_VECTOR(adr, 5); end Behavioral;