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;
 |