41 lines
1.4 KiB
VHDL
41 lines
1.4 KiB
VHDL
|
ARCHITECTURE RTL OF branchStack IS
|
||
|
|
||
|
subtype progCounterType is unsigned(progCounter'range);
|
||
|
type progCounterArrayType is array (0 to 2**stackPointerBitNb) of progCounterType;
|
||
|
signal progCounterArray : progCounterArrayType;
|
||
|
|
||
|
signal writePointer : unsigned(stackPointerBitNb-1 downto 0);
|
||
|
signal readPointer : unsigned(stackPointerBitNb-1 downto 0);
|
||
|
|
||
|
BEGIN
|
||
|
------------------------------------------------------------------------------
|
||
|
-- stack pointers
|
||
|
updateStackPointer: process(reset, clock)
|
||
|
begin
|
||
|
if reset = '1' then
|
||
|
writePointer <= (others => '0');
|
||
|
elsif rising_edge(clock) then
|
||
|
if storePC = '1' then
|
||
|
writePointer <= writePointer + 1;
|
||
|
elsif prevPC = '1' then
|
||
|
writePointer <= writePointer - 1;
|
||
|
end if;
|
||
|
end if;
|
||
|
end process updateStackPointer;
|
||
|
|
||
|
readPointer <= writePointer - 1;
|
||
|
|
||
|
------------------------------------------------------------------------------
|
||
|
-- program counters stack
|
||
|
updateStack: process(reset, clock)
|
||
|
begin
|
||
|
if rising_edge(clock) then
|
||
|
if storePc = '1' then
|
||
|
progCounterArray(to_integer(writePointer)) <= progCounter;
|
||
|
end if;
|
||
|
storedProgCounter <= progCounterArray(to_integer(readPointer));
|
||
|
end if;
|
||
|
end process updateStack;
|
||
|
|
||
|
END ARCHITECTURE RTL;
|