blob: fd376c094af0f65d38e99316a74943ce6be7b548 (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
|
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity stack is
generic (
DEPTH : positive := 8;
WIDTH : positive := 13
);
port (
clk : in std_logic;
reset : in std_logic;
push : in std_logic;
pop : in std_logic;
din : in std_logic_vector(WIDTH - 1 downto 0);
dout : out std_logic_vector(WIDTH - 1 downto 0)
);
end entity stack;
architecture rtl of stack is
type stack_t is
array (0 to DEPTH - 1)
of std_logic_vector(WIDTH - 1 downto 0);
signal mem : stack_t
:= (others => (others => '0'));
-- write pointer
signal top : unsigned(2 downto 0)
:= (others => '0');
begin
dout <=
mem(to_integer(top - 1)) when top /= 0 else (others => '0');
stck : process(clk, reset)
begin
if reset = '1' then
top <= (others => '0');
elsif rising_edge(clk) then
if push = '1' then
mem(to_integer(top)) <= din;
top <= top + 1;
elsif pop = '1' then
top <= top - 1;
end if;
end if;
end process;
end architecture rtl;
|