57 lines
2.7 KiB
VHDL
57 lines
2.7 KiB
VHDL
|
ARCHITECTURE RTL OF instructionDecoder IS
|
||
|
|
||
|
constant opCodeIndexH : integer := instruction'high;
|
||
|
constant opCodeIndexL : integer := opCodeIndexH - opCodeBitNb + 1;
|
||
|
|
||
|
constant twoRegInstrIndex : integer := opCodeIndexL - 1;
|
||
|
constant ioAddrIndexed : integer := twoRegInstrIndex;
|
||
|
|
||
|
constant addrAIndexH : integer := twoRegInstrIndex - 1;
|
||
|
constant addrAIndexL : integer := addrAIndexH - registerAddressBitNb + 1;
|
||
|
|
||
|
constant immediateDataIndexH : integer := registerBitNb-1;
|
||
|
constant immediateDataIndexL : integer := 0;
|
||
|
constant addrBIndexH : integer := addrAIndexL - 1;
|
||
|
constant addrBIndexL : integer := addrBIndexH - registerAddressBitNb + 1;
|
||
|
|
||
|
constant aluCodeIndexH : integer := opCodeIndexH;
|
||
|
constant aluCodeIndexL : integer := aluCodeIndexH - aluCodeBitNb + 1;
|
||
|
|
||
|
constant portAddressH : integer := registerBitNb-1;
|
||
|
constant portAddressL : integer := portAddressH-portAddressBitNb+1;
|
||
|
constant spadAddressH : integer := registerBitNb-1;
|
||
|
constant spadAddressL : integer := spadAddressH-spadAddressBitNb+1;
|
||
|
|
||
|
constant branchCondH : integer := opCodeIndexL-1;
|
||
|
constant branchCondL : integer := branchCondH-branchCondBitNb+1;
|
||
|
|
||
|
BEGIN
|
||
|
------------------------------------------------------------------------------
|
||
|
-- ALU control
|
||
|
aluCode <=
|
||
|
instruction(aluCodeIndexH downto aluCodeIndexL)
|
||
|
when instruction(aluCodeIndexH) = '0' else
|
||
|
'1' & instruction(aluCodeBitNb-2 downto 0);
|
||
|
opCode <= instruction(opCodeIndexH downto opCodeIndexL);
|
||
|
twoRegInstr <= instruction(twoRegInstrIndex);
|
||
|
addrA <= unsigned(instruction(addrAIndexH downto addrAIndexL));
|
||
|
addrB <= unsigned(instruction(addrBIndexH downto addrBIndexL));
|
||
|
instrData <= signed(instruction(immediateDataIndexH downto immediateDataIndexL));
|
||
|
|
||
|
------------------------------------------------------------------------------
|
||
|
-- I/O control
|
||
|
portIndexedSel <= instruction(ioAddrIndexed);
|
||
|
portAddress <= unsigned(instruction(portAddressH downto portAddressL));
|
||
|
|
||
|
------------------------------------------------------------------------------
|
||
|
-- scratchpad control
|
||
|
spadIndexedSel <= instruction(ioAddrIndexed);
|
||
|
spadAddress <= unsigned(instruction(spadAddressH downto spadAddressL));
|
||
|
|
||
|
------------------------------------------------------------------------------
|
||
|
-- branch control
|
||
|
branchCond <= instruction(branchCondH downto branchCondL);
|
||
|
instrAddress <= unsigned(instruction(instrAddress'range));
|
||
|
|
||
|
END ARCHITECTURE RTL;
|