Specification and Implementation of A Microcomputer
Specification and Implementation of A Microcomputer
• ARCHITECTURE
• IMPLEMENTATION
• PROCESSOR;
• MEMORY SUBSYSTEM;
Memory I/O
subsystem subsystem
I/O devices
Virtual memory
(Disk) 2 Gbyte
Faster Larger
Main memory size
(Dynamic devices) 16 Mbyte
Cache memory
(Static devices) 64 Kbyte
Processor
11 IOAddr MemAddr 24
1 IOLength MemLength 1
1 IORd MemRd 1
1 IOWr MemWr 1
I/O I/O Memory
1 IOEnable
Processor MemEnable 1
devices subsystem subsystem
IORdy 1 1 MemRdy
32 IOData MemData 32
LIBRARY ieee;
USE ieee.std_logic_1164.all;
PACKAGE comp_pkg IS
SUBTYPE WordT IS STD_LOGIC_VECTOR(31 DOWNTO 0);
SUBTYPE MAddrT IS STD_LOGIC_VECTOR(23 DOWNTO 0);
SUBTYPE IOAddrT IS STD_LOGIC_VECTOR(10 DOWNTO 0);
SUBTYPE ByteT IS STD_LOGIC_VECTOR( 7 DOWNTO 0);
TYPE StatusT IS (undef, p_reset, fetch, execute, memop, ioop);
BEGIN
-- description of carry generation included here
RETURN(cy);
END get_carry;
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE WORK.ALL, WORK.comp_pkg.ALL;
ENTITY Computer IS
PORT (Reset, Clk : IN STD_LOGIC);
END Computer;
BEGIN
U1: ENTITY Memory
PORT MAP (MemAddr, MemLength, MemRd, MemWr, MemEnable,
MemRdy, MemData);
U2: ENTITY IO
PORT MAP (IOAddr, IOLength, IORd, IOWr, IOEnable,
IORdy, IOData);
24
Addr
Word 0 Byte 3 Byte 2 Byte 1 Byte 0
Length Word 4 Byte 7 Byte 6 Byte 5 Byte 4
32
Rd Memory Data
Wr Word 224 -4
Enable Rdy 32 bits
(a) (b)
Addr
Enable
Rd
Rdy
tdv
(c)
Figure 15.4: MEMORY SUBSYSTEM. (a) EXTERNAL SIGNALS. (b) INTERNAL ORGANIZATION. (c) TIMING DIAGRAM
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE WORK.comp_pkg.ALL;
ENTITY Memory IS
PORT (Addr : IN MAddrT ; -- memory address bus
Length : IN STD_LOGIC; -- byte/word operand
Rd, Wr : IN STD_LOGIC; -- access control signals
Enable : IN STD_LOGIC; -- enable signal
Rdy : OUT STD_LOGIC; -- access completion signal
Data : INOUT WordT ); -- memory data bus
END Memory;
LIBRARY ieee;
USE ieee.std_logic_unsigned.ALL;
BEGIN
tCtrls:= Rd & Wr & Enable; -- group signals for simpler decoding
CASE tCtrls IS
-- output to tri-state
WHEN "000" => Data <= (OTHERS => ’Z’) AFTER Td;
-- timing verifications
ASSERT NOT (Rd’EVENT AND Rd=’1’ AND NOT Addr’STABLE(Tsu))
REPORT "Read address setup time violation";
END behavioral;
I/O Port 0
11 I/O Port 1
Addr
Length
I/O 32
Rd Data
subsystem
Wr
I/O Port 2047
Enable Rdy
32 bits
(a) (b)
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE WORK.comp_pkg.ALL;
ENTITY IO IS
PORT (Addr : IN IOAddrT ; -- I/O address bus
Length : IN STD_LOGIC; -- byte/word control
Rd, Wr : IN STD_LOGIC; -- I/O access control
Enable : IN STD_LOGIC; -- I/O enable control
Rdy : OUT STD_LOGIC; -- I/O completion signal
Data : INOUT WordT ); -- I/O data bus
END IO;
Processor state
• 32 general-purpose registers (32-bits wide), called R0, R1, ..., R31;
CR Z N C V
R31
Clk
MemEnable
Fetch instruction
MemRd
MemRdy
Execute Memory
Fetch Execute Fetch (Addr. access
calc.)
(a) (i) (ii)
Figure 15.7: BEHAVIOR OF THE PROCESSOR. (a) INSTRUCTION LOOP. (b) MEMORY BUS BEHAVIOR FOR REGISTER
OPERATION. (c) MEMORY BUS BEHAVIOR FOR LOAD OPERATION.
R1
addr.gen.
+4
R5
PC PC
R7
add R7,R1,R5 branch 2000
conds.
Memory Memory
CR
(a) (b)
+4 addr.gen.
selector cond?
PC
branch cond,2000
Memory
(c)
Figure 15.8: BEHAVIOR OF INSTRUCTIONS. (a) ADD instruction. (b) UNCONDITIONAL BRANCH INSTRUCTION. (c) CON-
DITIONAL BRANCH INSTRUCTION.
• SEQUENTIAL UNLESS
1. UNCONDITIONAL BRANCH
2. CONDITIONAL BRANCH
31 25 20 15 10 0
RT:= op(RA) Opcode RT RA --
RT:= RA op RB Opcode RT RA RB --
RT:= RA op SI Opcode RT RA SI
RT:= RA op UI Opcode RT RA UI
PC:= PC + 4 + D Opcode -- D
PC:= RA Opcode -- RA --
Figure 15.9: INSTRUCTION FORMATS.
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE WORK.comp_pkg.ALL;
ENTITY processor IS
PORT (MemAddr : OUT MAddrT ; -- memory address bus
MemData : INOUT WordT ; -- data bus to/from memory
MemLength: OUT STD_LOGIC; -- memory operand length
MemRd : OUT STD_LOGIC; -- memory read control signal
MemWr : OUT STD_LOGIC; -- memory write control signal
MemEnable: OUT STD_LOGIC; -- memory enable signal
MemRdy : IN STD_LOGIC; -- memory completion signal
IOAddr : OUT IOAddrT ; -- I/O address bus
IOData : INOUT WordT ; -- data bus to/from I/O
IOLength : OUT STD_LOGIC; -- I/O operand length
IORd : OUT STD_LOGIC; -- I/O read control signal
IOWr : OUT STD_LOGIC; -- I/O write control signal
IOEnable : OUT STD_LOGIC; -- memory enable signal
IORdy : IN STD_LOGIC; -- I/O completion signal
Status : OUT StatusT ; -- processor status signal
Reset : IN STD_LOGIC; -- reset signal
Clk : IN STD_LOGIC); -- clock signal
END processor;
LIBRARY ieee;
USE ieee.std_logic_arith.all; -- use definitions and operations
USE ieee.std_logic_signed.all; -- on signed values
-- other declarations
CONSTANT delay : TIME := 200 ps; -- register delay
CONSTANT Reset_delay: TIME := 5 ns;
CONSTANT Exec_delay : TIME := 10 ns; -- Execute delay
CONSTANT Mdelay : TIME := 600 ps; -- MemEnable signal delay
CONSTANT Pulse_Width: TIME := 2.6 ns; -- memory signals width
CONSTANT Fetch_delay: TIME := 3 ns; -- disable memory after
-- access completed
BEGIN
PROCESS -- transition function
-- working variables
VARIABLE RS_data, RA_data, RB_data : WordT;
VARIABLE RT_addr, RA_addr, RB_addr, RS_addr : Natural;
BEGIN
WAIT ON Clk,Reset;
FOR i IN 0 TO 31 LOOP
GPR(i) <= (OTHERS => ’0’);
END LOOP;
-- instruction execution
Status <= Execute;
Phase <= Execute;
RA_addr := CONV_INTEGER(’0’ & RA); RB_addr := CONV_INTEGER(’0’ & RB);
-- ’0’ to force bit-vector to positive value
RA_data := GPR(RA_addr) ; RB_data := GPR(RB_addr) ;
RT_addr := CONV_INTEGER(’0’ & RT);
RS_addr := CONV_INTEGER(’0’ & RS); -- source reg. for store
RS_data := GPR(RS_addr) ; -- or I/O write
WAIT FOR Exec_delay;
CASE Opcode IS
WHEN "000000" =>
null; -- nop
WHEN "000010" =>
GPR(RT_Addr)<= not(RA_data); -- not
WHEN "000100" =>
GPR(RT_Addr)<= RA_data(30 DOWNTO 0) & ’0’; -- lshift
WHEN "000110" =>
GPR(RT_Addr)<= ’0’ & RA_data(31 DOWNTO 1); -- rshift
-- lrotate
WHEN "001000" => GPR(RT_Addr)<= RA_data(30 DOWNTO 0) & RA_data(31);
-- rrotate
WHEN "001010" => GPR(RT_Addr)<= RA_DATA(0) & RA_data(31 DOWNTO 1);
-- memory declaration
CONSTANT MaxMem: NATURAL:= 16#FFF#; -- 4Kbytes
TYPE MemArrayT IS ARRAY(0 to MaxMem-1) OF ByteT;
VARIABLE Mem : MemArrayT:=
(-- program
3=>"01100000", 2=>"00000000", 1=>"00000000", 0=>"00000000",
7=>"01000100", 6=>"00100000", 5=>"00000000", 4=>"00110010",
11=>"10000110", 10=>"10000001", 9=>"00000000", 8=>"00000000",
15=>"10000110", 14=>"10100001", 13=>"00000000", 12=>"00000100",
19=>"01000100", 18=>"01000000", 17=>"00000000", 16=>"00111111",
23=>"10001000", 22=>"01000001", 21=>"00000000", 20=>"00000000",
-- data
51=>"00110011", 50=>"00001111", 49=>"11110000", 48=>"11001100",
55=>"00110011", 54=>"00001111", 53=>"11110000", 52=>"11001100",
OTHERS => "00000000");
where the memory contents corresponds to the following instructions:
0x000000: xor R0,R0,R0 ; R0 = 0
0x000004: adi R1,R0,50 ; R1 = 50
0x000008: ldw R20,0(R1) ; R20= Mem(50,4)= Mem(48,4)
0x00000C: ldw R21,4(R1) ; R21= Mem(54,4)= Mem(52,4)
0x000010: adi R2,R0,63 ; R2 = 63
0x000014: stb R2,0(R1) ; Mem(50,1) = 63
0x000048: 0x330FF0CC
0x000052: 0x330FF0CC
• MEMORY SUBSYSTEM
• PROCESSOR
1. DATA SUBSYSTEM
2. CONTROL SUBSYSTEM
Rd
222 x1 bits
Wr Controller MRdy
Enable
Controls
Address 22
8 8 8 8
Length Selector/Distributor
32
Data
Condition signals
MemRdy
IORdy
Data Instr 32
signals ZE,NG,CY,OV 4
24
MemAddr
MemData 32 Data Control
subsystem subsystem
11
IOAddr
IOData 32
MemRd
MemWr
MemLength
MemEnable
IORd
IOWr
IOLength
IOEnable
Sin_Sout
Mem_ALU
MemData
0
Switch
MemData
DataB
1 0 1
Mux1 B MemAddr
AddrB WrIR
DataC Clk
DataA IR Reset
AddrC C A
WrC AddrA Instr
Extndr.
Register SE_ZE
file 0 1 1 0
PC_RA Mux2 Mux3 IR_RB
ALU
ALUOp WrCR
C
Cond
ALUdata Clk
Z N C V Reset
WrPC PCin
Clk ZE,NG,CY,OV
Reset PC
PCout
1 0 ALU_PC
Mux4
ALUop Operation
0000 Zero 32
0001 A+B
0010 A-B
0011 -B
0100 A and B
0101 A or B
0110 A xor B
0111 not(B)
1000 unused
1001 B
1010 shiftl(A)
1011 shiftr(A)
1100 rotl(A)
1101 rotr(A)
1110 A+4
1111 unused
2
Mem_ALU
2 MemData
DataB
Mux1 MemAddr
AddrB
4 DataC 2
DataA IR
2 3 1
AddrC AddrA Instr
2 3
WrC 2
Register 2
file
2 Mux2 Mux3 2
PC_RA IR_RB
Clk
2
4 2
ALUOp
Cond WrCR
Clk
Z N C V
ZE,NG,CY,OV
PC
ALU_PC
Clk
AddrA
AddrB
AddrC
ALUop
WrC
WrCR
DataA
DataB
DataC
Cond
1 2 3 4
instruction register ALUop register
decode read delay delay setup
AddrA
AddrB
AddrC
State ALUOp
Combinational
reg. ...
logic
...
ALU_PC
Clk
Reset
Fetch
ALU_PC <- 1 ALU_Op <- 1110
Memop
MemRd <- 1, 0 Sin_Sout <- 1 Mem_ALU <-
MemLength <- 1, 0 WrIR <- 1, 0 WrC <-
MemEnable <- 1, 0 WrPC <- 1, 0
PC_RA <- 0
(Op < 100000) (Op >= 100000)
and (Op > 100111) and (Op <= 100111)
Execute
AddrA <- Instr(20 downto 16) IR_RB <- Mem_ALU <-
AddrB <- Instr(15 downto 11) ALUOp <- ALU_PC <-
AddrC <- Instr(25 downto 21) MemLength <-
WrPC <- MemRd <-
PC_RA <- WrCR <- MemWr <-
ZE_SE <- WrC <- MemEnable <-
Sin_Sout <-
Clk
Register
operations Fetch Execute Fetch
Memory
operations Fetch Execute Memop Fetch
Figure 15.16: STATE DIAGRAM AND TIMING FOR CONTROL SUBSYSTEM OF THE PROCESSOR.
t6
Clk State Register
t0
NS= Execute
Control logic
t1 t1
t1
PC_RA=0 ALU_PC=1
t2 PC t2 MemAddr
t3 t4 MemData
WrPC=1 MemRdy=1
PC+4
Switch
t5
Instruction
t13 t12
t9 ALU
ALUData t14
t9 Mux1
DataC t15
t25
Clk State Register
t15 t20 t18
NS= Fetch
Memory Control logic
t21 MemRdy t19 t19
WrC=1
Switch
t22
Mux1
t23 DataC
Clk
Reg. File (t24)
t25
BEGIN
P1: ENTITY Data_Subsystem
PORT MAP (MemAddr, MemData, IOAddr, IOData,
Instr, ZE, NG, CY, OV, AddrA, AddrB, AddrC, ALUOp,
WrC, WrPC, WrCR, WrIR, Mem_ALU, PC_RA, IR_RB, ALU_PC,
ZE_SE, SinSout, Clk, Reset);
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE WORK.comp_pkg.ALL, WORK.ALL;
ENTITY Data_Subsystem IS
PORT(MemAddr : OUT MAddrT ;
MemData : INOUT WordT ;
IOAddr : OUT IOAddrT ;
IOData : INOUT WordT ;
Instr : OUT WordT ;
ZE, NG, CY, OV : OUT STD_LOGIC ;
AddrA, AddrB, AddrC : IN STD_LOGIC_VECTOR(4 DOWNTO 0);
ALUOp : IN STD_LOGIC_VECTOR(3 DOWNTO 0);
WrC, WrPC, WrCR, WrIR : IN STD_LOGIC ;
Mem_ALU, PC_RA, IR_RB : IN STD_LOGIC ;
ALU_PC, ZE_SE, Sin_Sout: IN STD_LOGIC ;
Clk, Reset : IN STD_LOGIC);
END Data_Subsystem;
BEGIN
ALU1: ENTITY ALU
PORT MAP(Ain,Bin,ALUop,ALUdata,Cond);
GPR: ENTITY Reg_File
PORT MAP(AddrA,AddrB,AddrC,DataA,DataB,DataC,
WrC,Reset,Clk);
PC: ENTITY Reg
PORT MAP(ALUdata(23 DOWNTO 0),PCout(23 DOWNTO 0),
WrPC,Reset,Clk);
CR: ENTITY Reg
PORT MAP(Cond,CRout,WrCR,Reset,Clk);
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.std_logic_unsigned.ALL;
USE WORK.comp_pkg.ALL;
ENTITY Reg_File IS
PORT(AddrA, AddrB, AddrC : IN STD_LOGIC_VECTOR(4 DOWNTO 0);
DataA, DataB : OUT WordT;
DataC : IN WordT;
WrC : IN STD_LOGIC ;
Reset, Clk : IN STD_LOGIC);
END Reg_File;
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.std_logic_signed.ALL;
USE WORK.comp_pkg.ALL;
ENTITY ALU IS
PORT(A, B: IN STD_LOGIC_VECTOR(31 DOWNTO 0);
Op : IN STD_LOGIC_VECTOR( 3 DOWNTO 0);
C : OUT STD_LOGIC_VECTOR(31 DOWNTO 0);
Cond: OUT STD_LOGIC_VECTOR( 3 DOWNTO 0));
END ALU;
ENTITY Reg IS
PORT(Data_in : IN STD_LOGIC_VECTOR;
Data_out: OUT STD_LOGIC_VECTOR;
Wr : IN STD_LOGIC ;
Reset : IN STD_LOGIC ;
Clk : IN STD_LOGIC);
END Reg;
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
ENTITY Mux IS
PORT(A_in,B_in: IN STD_LOGIC_VECTOR;
Sel : IN STD_LOGIC ;
Data_out : OUT STD_LOGIC_VECTOR);
END Mux;
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
ENTITY Extender IS
PORT(X_in : IN STD_LOGIC_VECTOR(31 DOWNTO 0);
ZE_SE : IN STD_LOGIC ;
X_out : OUT STD_LOGIC_VECTOR(31 DOWNTO 0));
END Extender;
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
ENTITY Switch IS
PORT(A : INOUT STD_LOGIC_VECTOR;
B_out: OUT STD_LOGIC_VECTOR;
C_in : IN STD_LOGIC_VECTOR;
Sel : IN STD_LOGIC );
END Switch;
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE WORK.comp_pkg.ALL;
ENTITY Ctrl_Subsystem IS
PORT(Instr : IN WordT ;
ZE, NG, CY, OV : IN STD_LOGIC ;
AddrA, AddrB, AddrC : OUT STD_LOGIC_VECTOR(4 DOWNTO 0);
ALUOp : OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
WrC, WrPC, WrCR, WrIR : OUT STD_LOGIC ;
Mem_ALU, PC_RA, IR_RB : OUT STD_LOGIC ;
ALU_PC, ZE_SE, Sin_Sout: OUT STD_LOGIC ;
MemRd,MemWr : OUT STD_LOGIC ;
MemLength : OUT STD_LOGIC ;
MemEnable : OUT STD_LOGIC ;
MemRdy : IN STD_LOGIC ;
IORd, IOWr : OUT STD_LOGIC ;
IOLength : OUT STD_LOGIC ;
IOEnable : OUT STD_LOGIC ;
IORdy : IN STD_LOGIC ;
Status : OUT StatusT ;
Clk, Reset : IN STD_LOGIC );
END Ctrl_Subsystem;
LIBRARY ieee;
USE ieee.std_logic_signed.ALL;
16=> (’0’, ’0’, ’1’, ’1’, ’1’, ’0’, ’1’, ’0’, "0001"), -- add
17=> (’0’, ’0’, ’1’, ’0’, ’1’, ’0’, ’1’, ’1’, "0001"), -- adi
18=> (’0’, ’0’, ’1’, ’1’, ’1’, ’0’, ’1’, ’0’, "0010"), -- sub
19=> (’0’, ’0’, ’1’, ’0’, ’1’, ’0’, ’1’, ’1’, "0010"), -- sbi
20=> (’0’, ’0’, ’1’, ’1’, ’1’, ’0’, ’1’, ’0’, "0100"), -- and
21=> (’0’, ’0’, ’1’, ’0’, ’1’, ’0’, ’1’, ’0’, "0100"), -- ani
22=> (’0’, ’0’, ’1’, ’1’, ’1’, ’0’, ’1’, ’0’, "0101"), -- or
23=> (’0’, ’0’, ’1’, ’0’, ’1’, ’0’, ’1’, ’0’, "0101"), -- ori
24=> (’0’, ’0’, ’1’, ’1’, ’1’, ’0’, ’1’, ’0’, "0110"), -- xor
25=> (’0’, ’0’, ’1’, ’0’, ’1’, ’0’, ’1’, ’0’, "0110"), -- xri
32=> (’1’, ’0’, ’0’, ’0’, ’1’, ’0’, ’0’, ’1’, "0001"), -- ldb
33=> (’1’, ’0’, ’0’, ’0’, ’1’, ’0’, ’0’, ’1’, "0001"), -- ldw
34=> (’1’, ’1’, ’0’, ’0’, ’0’, ’0’, ’0’, ’1’, "0001"), -- stb
35=> (’1’, ’1’, ’0’, ’0’, ’0’, ’0’, ’0’, ’1’, "0001"), -- stw
36=> (’1’, ’0’, ’0’, ’1’, ’1’, ’0’, ’0’, ’0’, "1001"), -- irb
37=> (’1’, ’0’, ’0’, ’1’, ’1’, ’0’, ’0’, ’0’, "1001"), -- irw
38=> (’1’, ’1’, ’0’, ’1’, ’0’, ’0’, ’0’, ’0’, "1001"), -- iwb
39=> (’1’, ’1’, ’0’, ’1’, ’0’, ’0’, ’0’, ’0’, "1001"), -- iww
56=> (’0’, ’0’, ’1’, ’0’, ’0’, ’1’, ’0’, ’1’, "0001"), -- br
57=> (’0’, ’0’, ’1’, ’0’, ’0’, ’1’, ’0’, ’1’, "1000"), -- bri
48=> (’0’, ’0’, ’1’, ’0’, ’0’, ’1’, ’0’, ’1’, "0001"), -- brp
49=> (’0’, ’0’, ’1’, ’0’, ’0’, ’1’, ’0’, ’1’, "0001"), -- brn
50=> (’0’, ’0’, ’1’, ’0’, ’0’, ’1’, ’0’, ’1’, "0001"), -- bnz
51=> (’0’, ’0’, ’1’, ’0’, ’0’, ’1’, ’0’, ’1’, "0001"), -- brz
52=> (’0’, ’0’, ’1’, ’0’, ’0’, ’1’, ’0’, ’1’, "0001"), -- bnc
53=> (’0’, ’0’, ’1’, ’0’, ’0’, ’1’, ’0’, ’1’, "0001"), -- brc
54=> (’0’, ’0’, ’1’, ’0’, ’0’, ’1’, ’0’, ’1’, "0001"), -- bnv
55=> (’0’, ’0’, ’1’, ’0’, ’0’, ’1’, ’0’, ’1’, "0001"), -- brv
OTHERS => (’0’, ’0’, ’1’, ’1’, ’0’, ’0’, ’0’, ’1’, "0000")
);
BEGIN
IF (State’EVENT) THEN
CASE State IS
WHEN undef => NULL;
WHEN p_reset => ALUOp <= "0000";
MemRd <= ’0’; MemWr <= ’0’;
MemEnable <= ’0’; MemLength <= ’0’;
IORd <= ’0’; IOWr <= ’0’;
IOEnable <= ’0’; IOLength <= ’0’;
WHEN fetch =>
-- disable write signals from previous cycle
WrCR <= ’0’ AFTER Ctrl_delay;
WrC <= ’0’ AFTER Ctrl_delay;
-- fetch instruction
ALU_PC <= ’1’ AFTER Ctrl_delay;
MemLength<= ’1’ AFTER Ctrl_delay;
MemEnable<= ’1’ AFTER Ctrl_delay;
MemRd <= ’1’ AFTER MemRd_delay, ’0’ AFTER MemRd_pulse;
Sin_Sout <= ’0’ AFTER Ctrl_delay; -- switch in
-- increment PC
PC_RA <= ’0’ AFTER Ctrl_delay;
ALUop <= "1110" AFTER Ctrl_delay; -- PC + 4
WrIR <= ’1’ AFTER Ctrl_delay;
WrPC <= ’1’ AFTER Ctrl_delay;
-- decode registers
AddrA <= Instr(20 DOWNTO 16) AFTER Dec_delay;
IF (Ctrl_Line.RS_RB = ’0’) THEN
AddrB <= Instr(25 DOWNTO 21) AFTER Dec_delay;
ELSE
AddrB <= Instr(15 DOWNTO 11) AFTER Dec_delay;
END IF;
AddrC <= Instr(25 DOWNTO 21) AFTER Dec_delay;