Está en la página 1de 26

ESCOMips

ARCHIVO DE REGISTOS
¿Qué es el Archivo de Registros?
• Un registro es un conjunto de n flip-flops que permite guardar n
bits en una sola palabra

Operación Tipo
Lectura Asíncrona
Carga Síncrona
Retención Síncrona
>> Síncrona
<< Síncrona

• Elemento de memoria de alta velocidad


• Elemento de memoria que almacena DATOS más cercano al
procesador
Diseño del Archivo de Registros
• Organización del archivo de registros
Diseño del Archivo de Registros

LI R9 0x218 R9 = 0x218
24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 1 0 0 0 0 1 1 0 0 0
Diseño del Archivo de Registros
ADD R4, R5, R12 R4 = R5 + R12
24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

0 0 0 0 0 0 1 0 0 0 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0
Diseño del Archivo de Registros
ADD R4, R5, R12 R4 = R5 + R12
24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

0 0 0 0 0 0 1 0 0 0 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0
Diseño del Archivo de Registros

SLL R3, R8, 3 R3 = R8 << 3


24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 1 1 1 0 0 1
Aluop (3 .. 0)

Aluop(3) : sela
Aluop(2) : selb
ALU1 Port map ( Aluop(1) : op(1)
A Aluop(0) : op(0)
B
Sela => aluop(3),
Selb => aluop(2),
Op => aluop(1 downto 0)
);
Registro
Registro
Diseño del Archivo de Registros
clr clk WR SHE DIR OPERACIÓN

1 x x x x Reset
registros[0, 1, … 15] = 0

0 0 0 0 Retención
registros = registros
resgistros [0] = registros[0]
0 1 0 x Carga
registros[writeReg] = writeData

0 1 1 0 >>
registros[writeReg] =
registros[readReg2] >> shamt
0 1 1 1 <<
registros[writeReg] =
registros[readReg2] << shamt
x x x x x Lectura
readData1 = registros[readReg1]
readData2 = registros[readReg2]
LI R6, #0x45
R6 = 0x45 => registros[6] = 0x45
Archivo de Registros

16 registros con carga y retención

1 Barrel shifter combinatorio

2 Multiplexores 16 a 1

1 Multiplexor 2 a 1

1 Demultiplexor 1 a 16
REGISTRO DE 16 BITS
clr clk L Operación
1 x x Q = 0; reset
0 0 Q = Q; retención
0 1 Q=D
writeReg = 0010

LI R2, #X40
R2 = x40
00001 0010 0000 0000 0100 0000

SRL R5, R3, 6


R5 = R3 >> 6
00000 0101 0011 0000 0110 0000
Barrel shifter

Vector de Entrada: 01110110

Corrimiento de 1 bit;
shamt = 001
Barrel shifter Ejemplo 1

Vector de Entrada: 01110110

Corrimiento de 1 bit;
Shift = 001

Vector de salida: 11101100


Barrel shifter Ejemplo 2

Vector de Entrada: 01110110

Corrimiento de 1 bit;
Shift = 101

Vector de salida: 11000000


Generalizando el Corrimiento

• Para N bits, se tienen i


etapas
• i = log2N
• Cada etapa i tiene N
multiplexores de 2
canales (m0, m1, …, mN-1)
Para i = 0

m s(0)=0 s(0)=1
0 p(0) 0
1 p(1) p(0)
2 p(2) p(1)
3 p(3) p(2)
4 p(4) p(3)
5 p(5) p(4)
6 p(6) p(5)
7 p(7) p(6)
Para i = 1

m s(1)=0 s(1)=1
0 p(0) 0
1 p(1) 0
2 p(2) p(0)
3 p(3) p(1)
4 p(4) p(2)
5 p(5) p(3)
6 p(6) p(4)
7 p(7) p(5)
Para i = 2

m s(2)=0 s(2)=1
0 p(0) 0
1 p(1) 0
2 p(2) 0
3 p(3) 0
4 p(4) p(0)
5 p(5) p(1)
6 p(6) p(2)
7 p(7) p(3)
De forma general, para un barrel shifter de N bits
con corrimiento a la izquierda
𝑖 = 0, 1, … , (𝑙𝑜𝑔! 𝑁 − 1) Ejercicio: Realizar el análisis para
𝑗 = 0 ; 𝑗 < 2" obtener las ecuaciones para el
𝑚 𝑗 =3
0 ;𝑠 𝑖 = 1 barrel shifter hacia la derecha
𝑝 𝑗 ;𝑠 𝑖 = 0

𝑗 = 2" ; 𝑁 − 1
𝑝 𝑗 − 2" ; 𝑠 𝑖 = 1
𝑚 𝑗 =6
𝑝 𝑗 ;𝑠 𝑖 = 0
Architecture

Type conjunto is array 0 to 15 of std _log ….


Signal banco: conjunto;

CICLO : FOR i in 0 to 15 generate


Elemento : Registro Port map (
d => sal_mux,
q => banco(i),
Clr => clr,
Clk => clk,
l => l(i)
);

L15 L14 L13 L12 L11 L10 L9 L8 L7 L6 L5 L4 L3 L2 L1


0 0 0 0 0 0 0 0 0 0 0 0 0 1 0

También podría gustarte