📄 stack.vhd
字号:
library LIB;
use LIB.SYNOPSYS.all;
use LIB.AMD_PACK.all;
entity STACK is
port(OPERATION : in STACK_OPS;
VALUE : in ADDRESS;
CLOCK : in BIT;
OUTPUT_VALUE : out WIRED_OR ADDRESS;
OVERFLOW : out BIT);
end STACK;
architecture STACK_HDL of STACK is
-- Tristate latch used to store stack element data
component STACK_ELEMENT
port(VALUE: in ADDRESS; CLOCK: in BIT; WRITE_ENABLE: in BIT;
OUTPUT_ENABLE: in BIT; OUTPUT: out ADDRESS);
end component;
signal WRITE_ENABLE: STACK_VECTOR;
signal READ_ENABLE: STACK_VECTOR;
signal STACK_TOP, NEW_STACK_TOP : STACK_VECTOR_SIZE;
begin
-- Set the write enable mask on if a "push" was requested
WRITE_EN : process (NEW_STACK_TOP, OPERATION)
begin
WRITE_ENABLE <= STACK_VECTOR'(others => '0');
if (OPERATION = S_PUSH) then
WRITE_ENABLE(NEW_STACK_TOP) <= '1';
end if;
end process WRITE_EN;
-- Set the read enable mask and overflow flag
READ_EN : process (STACK_TOP)
begin
READ_ENABLE <= STACK_VECTOR'(others => '0');
READ_ENABLE(STACK_TOP) <= '1';
OVERFLOW <= BIT_OF(STACK_TOP = STACK_VECTOR'HIGH);
end process READ_EN;
-- Update the stack top pointer on each clock
STACK : process
variable TEMP: INT;
begin
wait until not CLOCK'stable and CLOCK = '1';
-- Set the top of the stack based on the operation requested
if (OPERATION = S_CLEAR) then
STACK_TOP <= STACK_VECTOR'LOW;
else
if (OPERATION = S_NOOP or
(OPERATION = S_PUSH and STACK_TOP = STACK_VECTOR'HIGH) or
(OPERATION = S_POP and STACK_TOP = STACK_VECTOR'LOW)) then
TEMP := 0;
elsif (OPERATION = S_PUSH) then
TEMP := 1;
else
TEMP := -1;
end if;
STACK_TOP <= STACK_TOP + TEMP;
end if;
end process STACK;
-- Stack values, controlled by read and write enables set above
U1: STACK_ELEMENT port map(VALUE, CLOCK, WRITE_ENABLE(1),
READ_ENABLE(1), OUTPUT_VALUE);
U2: STACK_ELEMENT port map(VALUE, CLOCK, WRITE_ENABLE(2),
READ_ENABLE(2), OUTPUT_VALUE);
U3: STACK_ELEMENT port map(VALUE, CLOCK, WRITE_ENABLE(3),
READ_ENABLE(3), OUTPUT_VALUE);
U4: STACK_ELEMENT port map(VALUE, CLOCK, WRITE_ENABLE(4),
READ_ENABLE(4), OUTPUT_VALUE);
U5: STACK_ELEMENT port map(VALUE, CLOCK, WRITE_ENABLE(5),
READ_ENABLE(5), OUTPUT_VALUE);
U6: STACK_ELEMENT port map(VALUE, CLOCK, WRITE_ENABLE(6),
READ_ENABLE(6), OUTPUT_VALUE);
U7: STACK_ELEMENT port map(VALUE, CLOCK, WRITE_ENABLE(7),
READ_ENABLE(7), OUTPUT_VALUE);
U8: STACK_ELEMENT port map(VALUE, CLOCK, WRITE_ENABLE(8),
READ_ENABLE(8), OUTPUT_VALUE);
U9: STACK_ELEMENT port map(VALUE, CLOCK, WRITE_ENABLE(9),
READ_ENABLE(9), OUTPUT_VALUE);
end STACK_HDL;
library LIB;
use LIB.SYNOPSYS.all;
use LIB.AMD_PACK.all;
-- Latches and tristates an ADDRESS
entity STACK_ELEMENT is
port( VALUE: in ADDRESS ;
CLOCK: in BIT ;
WRITE_ENABLE: in BIT ;
OUTPUT_ENABLE: in BIT ;
OUTPUT: out ADDRESS) ;
end STACK_ELEMENT ;
architecture STACK_ELEMENT_HDL of STACK_ELEMENT is
-- Tristate element from target library
component BTS4
port(A: in BIT; E: in BIT; Z: out BIT) ;
end component ;
signal GATED_CLOCK: BIT ;
signal LATCHED_VALUE : ADDRESS;
begin
-- make gated clock for flip-flop
GATED_CLOCK <= CLOCK and WRITE_ENABLE ;
-- make flip-flop
process
begin
wait until (not GATED_CLOCK'stable and GATED_CLOCK = '1') ;
LATCHED_VALUE <= VALUE;
end process ;
-- Tristate the output (use tristate components from library)
U1: BTS4 port map(LATCHED_VALUE(1), OUTPUT_ENABLE, OUTPUT(1));
U2: BTS4 port map(LATCHED_VALUE(2), OUTPUT_ENABLE, OUTPUT(2));
U3: BTS4 port map(LATCHED_VALUE(3), OUTPUT_ENABLE, OUTPUT(3));
U4: BTS4 port map(LATCHED_VALUE(4), OUTPUT_ENABLE, OUTPUT(4));
U5: BTS4 port map(LATCHED_VALUE(5), OUTPUT_ENABLE, OUTPUT(5));
U6: BTS4 port map(LATCHED_VALUE(6), OUTPUT_ENABLE, OUTPUT(6));
U7: BTS4 port map(LATCHED_VALUE(7), OUTPUT_ENABLE, OUTPUT(7));
U8: BTS4 port map(LATCHED_VALUE(8), OUTPUT_ENABLE, OUTPUT(8));
U9: BTS4 port map(LATCHED_VALUE(9), OUTPUT_ENABLE, OUTPUT(9));
U10: BTS4 port map(LATCHED_VALUE(10), OUTPUT_ENABLE, OUTPUT(10));
U11: BTS4 port map(LATCHED_VALUE(11), OUTPUT_ENABLE, OUTPUT(11));
U12: BTS4 port map(LATCHED_VALUE(12), OUTPUT_ENABLE, OUTPUT(12));
end STACK_ELEMENT_HDL ;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -