Program counter

De program counter is als vingertje van een kind dat leert lezen. Het duidt aan waar het gebleven is, welke regel er gelezen moet worden. Dit is ook de functie van de program counter (PC). De PC duidt aan welke instructie er momenteel uitgevoerd wordt. Wanneer de instructie uitgevoerd is, moet de vinger een plaats verschoven worden.

De program counter houdt de regelnummer naar de juiste instructie bij. Deze staat opgeslagen in een 32-bit breed register. Na het uitvoeren van een instructie dient de PC verhoogd te worden met 0x4.

In een programma wordt er ook vaak een sprong gedaan. Dit wilt zeggen dat de program counter een stuk verderop (of terug) moet gaan voor de volgende instructie aan te duiden. In de hardware kan dit geïmplementeerd worden door de controle signalen correct aan te sturen.

Waarom 0x4?

Het is je misschien opgevallen dat er bij een verhoging van de progam counter, verhoogd wordt met 0x4. Alhoewel dit verwarrend kan overkomen is de reden hiervoor echter simpel.

Het geheugen waarin het programma opgeslagen zit, werkt op byte-niveau. Dit wilt zeggen: iedere byte die opgeslagen is, is bereikbaar op één welbepaald adres.

De processor werkt echter met een 32-bit bus. Dit wilt zeggen dat er altijd 32 bits (of 4 bytes) gelezen en/of geschreven worden. Aangezien een de breedte van 1 instructie ook 32 bits is, komt dit dus overeen met 1 overdracht over de bus. Dit wilt echter ook zeggen dat de volgende instructie 4 addressen verder staat.

… start your engines

Voordat de processor geïmplementeerd kan worden, moet dus eerst de program counter gemaakt worden. In het volgende hoofdstuk wordt er in detail ingegaan op de program counter. Voorlopig is het voldoende dat de program counter gewoon optelt met stappen van 4.

De entity voor de program counter er als volgt uit.

  • clock en synchrone, actief hoge reset
  • twee 32-bit data ingangen
  • één 32-bit data uitgang
  • 2 controle signalen:
    • abs_rel_b is ‘1’ bij een absolute sprong en ‘0’ bij een relatieve
    • immediate_four_b is ‘1’ voor een relatieve sprong met offset en ‘0’ bij een (standaard) sprong met 4
entity program_counter is
    port(
        clock : in STD_LOGIC;
        reset : in STD_LOGIC;
        abs_rel_b: in std_logic;
        immediate_four_b: in std_logic;
        rs1 : in std_logic_vector(31 downto 0);
        immediate : in std_logic_vector(31 downto 0);
        data_out : out std_logic_vector(31 downto 0)
    );
end entity program_counter;

De enige poorten die nodig zijn in dit hoofdstuk zijn:

  • clock
  • synchrone, actief hoge reset
  • data_out (de waarde van de program counter)

Je kan de ripple carry adder van opdracht 2 gebruiken.