OpenCores
URL https://opencores.org/ocsvn/igor/igor/trunk

Subversion Repositories igor

[/] [igor/] [trunk/] [processor/] [pl/] [control.vhd] - Rev 4

Compare with Previous | Blame | View Log

library ieee;
use ieee.std_logic_1164.all;
use work.leval2_package.all;
 
entity control is
    port (
    -- from decode
    -- Controls the indirect register fetch stage.
    IndirReg1 : in std_logic;
    IndirReg2 : in std_logic;
 
     -- controls 
    PCmux : out std_logic_vector(1 downto 0);
    AluOp : out std_logic_vector(ALU_FUNCT_SIZE - 1 downto 0);
    WriteReg : out std_logic;
    Flush : out std_logic;
    MemToReg : out std_logic;
 
    IndirMux1 : out std_logic;
    IndirMux2 : out std_logic;
 
	Branch : out std_logic;
	StoreInst : out std_logic;
    Stall : out std_logic;
 
    Opcode : in std_logic_vector(INSTR_OPCODE_BITS - 1 downto 0);
    MemWait : in std_logic;
	Sync : in std_logic;
    BranchTaken : in std_logic;
 
	Hazard : in std_logic
);
end entity;
 
 
architecture behav of control is
begin
    control_set : process (IndirReg1,IndirReg2,Opcode,MemWait,BranchTaken)
    begin
        -- default values for the output. 
        PCmux <= PCMUX_NOBRANCH;
        AluOp <= ALU_PASS;
        WriteReg <= '0';
        MemToReg <= '0';
		StoreInst <= '0';
 
		-- Stall control
 
        -- Indirection control
        if IndirReg1 = '1' or Sync = '1' then
            --We have an indirect register addressing mode. Stall pipeline.
            PCmux <= PCMUX_STALL;
 
        elsif MemWait = '1' or Sync = '1' then 
            -- Memory wait control. Freeze pipeline while waiting 
            -- for memory transaction to complete.
            PCmux <= PCMUX_STALL;
        end if;
 
        -- Opcode control
        case opcode is
                    -- Arithmetical / Logic functions
            when ADD =>
                AluOp<= ALU_ADD;
                WriteReg <= '1';
 
            when SUBB =>
                AluOp<= ALU_SUB;
                WriteReg <= '1';
 
            when MUL =>
                AluOp<= ALU_MUL;
                WriteReg <= '1';
 
                    --					-- NOT IMPLEMENTED
                    --					when DIV =>
                    --						AluOp<= ALU_DIV;
                    --						--WriteReg <= '1';
                    --					when MODULO =>
                    --						AluOp<= ALU_MOD;
                    --						--WriteReg <= '1';
 
            when LAND =>
                AluOp<= ALU_AND;
                WriteReg <= '1';
 
            when LOR =>
                AluOp<= ALU_OR;
                WriteReg <= '1';
 
            when LXOR =>
                AluOp<= ALU_XOR;
                WriteReg <= '1';
 
            when LOAD =>
                MemToReg <= '1'; -- use data bus
                AluOp<= ALU_ADD;
--                alu_op2_sel <= '1';
 --               --alu_op1_sel <= '1';
                --stored <= false;
                --stall <= '1';
                -- Also, stall pipeline!
 
            when STORE =>
                AluOp<= ALU_ADD;
				StoreInst <= '1';
                --alu_op2_sel <= '1';
                ----alu_op1_sel <= '1';
 
            when BIDX =>
                if BranchTaken = '1' then
                    AluOp<= ALU_ADD;
                    --branch_taken <= '1';
                    --alu_op2_sel <= '1';
                end if;
 
            when GET_TYPE =>
                AluOp<= ALU_GET_TYPE;
                WriteReg <= '1';
 
            when SET_TYPE =>
                AluOp<= ALU_SET_TYPE;
                WriteReg <= '1';
 
            when SET_TYPE_IMM	=>
                AluOp<= ALU_SET_TYPE;
                WriteReg <= '1';
                --alu_op2_sel <= '1';
 
            when SET_DATUM =>
                AluOp<= ALU_SET_DATUM;
                WriteReg <= '1';
 
            when SET_DATUM_IMM =>
                AluOp<= ALU_SET_DATUM;
                WriteReg <= '1';
                --alu_op2_sel <= '1';
 
            when SET_GC =>
                AluOp<= ALU_SET_GC;
                WriteReg <= '1';
 
            when SET_GC_IMM =>
                AluOp<= ALU_SET_GC;
                WriteReg <= '1';
                --alu_op2_sel <= '1';
 
            when CPY =>
                AluOp<= ALU_CPY;
                WriteReg <= '1';
 
            when CMP_TYPE =>
                AluOp<= ALU_CMP_TYPE;
 
            when CMP_TYPE_IMM =>
                AluOp<= ALU_CMP_TYPE_IMM;
                --alu_op2_sel <= '1';
 
            when CMP_DATUM =>
                AluOp<= ALU_CMP_DATUM;
 
            when CMP_DATUM_IMM =>
                AluOp<= ALU_CMP_DATUM;
                --alu_op2_sel <= '1';
 
            when CMP_GC =>
                AluOp<= ALU_CMP_GC;
 
            when CMP_GC_IMM =>
                AluOp<= ALU_CMP_GC_IMM;
                --alu_op2_sel <= '1';
 
            when CMP =>
                AluOp<= ALU_CMP;
 
            when SHIFT_L =>
                AluOp<= ALU_SL;
                WriteReg <= '1';
 
            when SHIFT_R =>
                AluOp<= ALU_SR;
                WriteReg <= '1';
 
            when SETLED =>
                AluOp<= ALU_SETLED;
 
            when others =>
                -- unknown opcode, do nothing
                AluOp<= ALU_PASS;
        end case;
    end process;
end architecture;
 
 
 
 
 
 

Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.