summaryrefslogtreecommitdiffstats
path: root/PIC/stack.vhd
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;