Sesion 8
Sesion 8
Sesion 8
S8 1
VHDL: de la tecnología a la arquitectura de computadores. José J. Ruz Ortiz, Síntesis 1997
Definición del Computador
Memoria y registros
• Memoria principal de 256 palabras de 12 bits (256x12)
• Un registro acumulador (AC) también de 12 bits.
• Registro de códigos de condición de 2 bits: Z y N
11 0
11 0
000
ACUMULADOR
(AC)
MEMORIA 1 0
(MEM) NZ
FFF
COP DIRECCION/OPERANDO
S8 2
VHDL: de la tecnología a la arquitectura de computadores. José J. Ruz Ortiz, Síntesis 1997
Repertorio de instrucciones
11 instrucciones:
S8 3
VHDL: de la tecnología a la arquitectura de computadores. José J. Ruz Ortiz, Síntesis 1997
Ejemplos de programas
Ejemplo 1 Ejemplo 2
Suma 3 al contenido de la posición de memoria 4 y Inicializa 10 posiciones de memoria (de la 20 a la 29)
almacena el resultado en la posición de memoria 5. con un contenido igual a su dirección.
S8 4
VHDL: de la tecnología a la arquitectura de computadores. José J. Ruz Ortiz, Síntesis 1997
Modelo de Comportamiento (1)
• Utiliza una entidad con un único proceso
• La entidad dispone de dos puertos binarios de entrada:
• Start: para iniciar la ejecución de un programa
• Reset: para reinicializar la máquina (poner a cero el contador de programa).
•Ambas entradas deberán activarse con flancos positivos.
• Para la memoria principal de 256x12 bits se utiliza un bit_vector
de longitud 12 sobre el rango de los naturales (0 a 255).
S8 5
VHDL: de la tecnología a la arquitectura de computadores. José J. Ruz Ortiz, Síntesis 1997
Modelo de Comportamiento (2)
• Además de los registros visibles por el programador, esto es, ac y nz, utilizaremos variables para los registros
internos que tendrán existencia real en la máquina:
• registro contador de programa (pc)
• registro de instrucciones (ir)
• registro de direcciones de memoria (mar)
• registro de datos de memoria (mdr).
Decodificación-ejecución.
• Específica para cada instrucción
ma r mem
pc
mdr
ac ir
S8 6
VHDL: de la tecnología a la arquitectura de computadores. José J. Ruz Ortiz, Síntesis 1997
Modelo de Comportamiento (3)
S8 7
VHDL: de la tecnología a la arquitectura de computadores. José J. Ruz Ortiz, Síntesis 1997
Modelo de Comportamiento (4)
Visualización del resultado de la ejecución
• Para trazar programas máquina será necesario que el modelo permita visualizar el contenido de registros y memoria.
• Como ambos están soportados por variables cuyos valores sólo son accesibles dentro del proceso, su visualización
debe hacerse cuando finalice la ejecución del programa máquina, antes de que el proceso pase al estado de espera.
• Visualizaremos los registros con el siguiente formato de línea:
VARIABLE l : LINE;
WRITELINE(OUTPUT,l);
FOR i IN 0 TO 29 LOOP
WRITE(l,i); -- valor de la dirección
WRITE(l, c); -- signo =
WRITE(l, mem(i)); -- valor del contenido de memoria visualización de memoria
WRITELINE(OUTPUT, l);
END LOOP;
S8 8
VHDL: de la tecnología a la arquitectura de computadores. José J. Ruz Ortiz, Síntesis 1997
Modelo de Comportamiento (5)
Código VHDL del modelo completo (1)
USE STD.TEXTIO.ALL;
USE WORK.utilidad.ALL;
ENTITY computador IS
PORT (start, reset : IN bit);
END computador;
ARCHITECTURE comportamiento OF computador IS
BEGIN
PROCESS(start, reset)
TYPE array_memoria IS
ARRAY (NATURAL RANGE 0 TO 255) OF bit_vector(11 DOWNTO 0);
VARIABLE mem : array_memoria :=
-- programa a ejecutar
("000100000100", -- 0 LDA (STA indice)
"010100000001", -- 1 SUMI 1
"001000000100", -- 2 STA (STA indice+1)
"000100001110", -- 3 LDA indice
"001000010011", -- 4 STA indice
"010100000001", -- 5 SUMI 1
"001000001110", -- 6 STA indice
"000100001101", -- 7 LDA limite
"011000001101", -- 8 NOR limite
"010100000001", -- 9 SUMI 1
"001100001110", -- 10 SUM indice
"100000000000", -- 11 JNZ 0
"000000000000", -- 12 HALT
"000000011110", -- 13 limite
"000000010100", -- 14 indice
OTHERS => "000000000000");
VARIABLE l : LINE;
CONSTANT c : STRING := " = ";
CONSTANT cac : STRING := " <AC> = ";
CONSTANT cpc : STRING := "<PC> = ";
CONSTANT cnz : STRING := " <NZ> = ";
VARIABLE mdr, mar, pc, ir, ac : bit_vector(11 DOWNTO 0);
VARIABLE nz : bit_vector(1 DOWNTO 0);
VARIABLE stop : bit;
S8 9
VHDL: de la tecnología a la arquitectura de computadores. José J. Ruz Ortiz, Síntesis 1997
Modelo de Comportamiento (6) Código VHDL del modelo completo (2)
BEGIN
-- inicialización de la máquina (reset)
IF reset'EVENT AND reset = '1'
THEN
pc := "000000000000";
-- operación de la máquina
ELSIF start'EVENT AND START = '1'
THEN
WHILE stop = '0' LOOP
-- ciclo de búsqueda de la siguiente instrucción
mar := pc; -- mar <-- <pc>
mdr := mem(b_a_n(mar)); -- lectura
ir := mdr; -- ir <-- <mdr>
pc := n_a_b((b_a_n(pc) + 1), 12); -- pc <-- <pc> + 1
-- ciclo de ejecución
CASE ir(11 DOWNTO 8) IS
WHEN "0001" => -- LDA
mar := "0000" & ir(7 DOWNTO 0); -- mar <-- <ir>
mdr := mem(b_a_n(mar)); -- lectura
ac := mdr; -- ac <-- <mdr>
nz(1) := ac(11); -- n <-- <ac(11)>
IF ac = "000000000000" -- IF ac="000000000000"
THEN nz(0) := '1'; -- THEN z <-- '1'
ELSE nz(0) := '0'; -- ELSE z <-- '0'
END IF;
WHEN "0010" => -- STA
mdr := ac; -- mdr <-- <ac>
mar := "0000" & ir(7 DOWNTO 0); -- mar <-- <ir>
mem(b_a_n(mar)) := mdr; -- escritura
WHEN "0011" => -- SUM
mar := "0000" & ir(7 DOWNTO 0); -- mar <-- <ir>
mdr := mem(b_a_n(mar)); -- lectura
ac := n_a_b((b_a_n(ac) + b_a_n(mdr)), 12); -- ac <-- <ac>+<mdr>
nz(1) := ac(11); -- n <-- <ac(11)>
IF ac = "000000000000" -- IF ac="000000000000"
THEN nz(0) := '1'; -- THEN z <-- '1'
ELSE nz(0) := '0'; -- ELSE z <-- '0'
END IF;
S8 10
VHDL: de la tecnología a la arquitectura de computadores. José J. Ruz Ortiz, Síntesis 1997
Modelo de Comportamiento (7)
Código VHDL del modelo completo (3)
WHEN "0100" => -- LDAI WHEN "1001" => -- JN
ac := "0000" & ir(7 DOWNTO 0); -- ac <-- <ir> IF nz(1) = '1' THEN
nz(1) := ac(11); -- n <-- <ac(11)> pc := "0000" & ir(7 DOWNTO 0); -- pc <-- <ir>
IF ac = "000000000000" -- IF ac="000000000000" END IF;
THEN nz(0) := '1'; -- THEN z <-- '1' WHEN "1010" => -- JNN
ELSE nz(0) := '0'; -- ELSE z <-- '0' IF nz(1) = '0' THEN
END IF; pc := "0000" & ir(7 DOWNTO 0); -- pc <-- <ir>
WHEN "0101" => -- SUMI END IF;
mdr := "0000" & ir(7 DOWNTO 0); -- mdr <-- <ir> WHEN OTHERS =>
ac := n_a_b((b_a_n(ac) + b_a_n(mdr)), 12); -- ac <-- <ac>+<mdr> END CASE;
nz(1) := ac(11); -- n <-- <ac(11)> -- visualiza pc, ac y nz
IF ac = "000000000000" -- IF ac="00000000000" WRITE(l,cpc);
THEN nz(0) := '1'; -- THEN z <-- '1' WRITE(l, pc);
ELSE nz(0) := '0'; -- ELSE z <-- '0' WRITE(l,cac);
END IF; WRITE(l, ac);
WHEN "0110" => -- NOR WRITE(l,cnz);
mar := "0000" & ir(7 DOWNTO 0); -- mar <-- <ir> WRITE(l,nz);
mdr := mem(b_a_n(mar)); -- lectura WRITELINE(OUTPUT,l);
ac := ac NOR mdr; -- ac <-- <mdr> END LOOP;
nz(1) := ac(11); -- n <-- <ac(11)> -- visualiza las primeras posiciones de memoria
IF ac = "000000000000" -- IF ac="000000000000" FOR i IN 0 TO 30 LOOP --
THEN nz(0) := '1'; -- THEN z <-- '1' WRITE(l,i); --
ELSE nz(0) := '0'; -- ELSE z <-- '0' WRITE(l, c); --
END IF; WRITE(l, mem(i)); --
WHEN "0111" => -- JZ WRITELINE(OUTPUT, l); --
IF nz(0) = '1' THEN END LOOP; --
pc := "0000" & ir(7 DOWNTO 0); -- pc <-- <ir> END IF;
END IF; END PROCESS;
WHEN "1000" => -- JNZ END comportamiento;
IF nz(0) = '0' THEN
pc := "0000" & ir(7 DOWNTO 0); -- pc <-- <ir>
END IF;
-- STOP
stop := '1';
S8 11
VHDL: de la tecnología a la arquitectura de computadores. José J. Ruz Ortiz, Síntesis 1997
Modelo de Comportamiento (8)
Código VHDL del paquete utilidad)
PACKAGE utilidad IS
FUNCTION b_a_n (bits : IN bit_vector) RETURN natural;
FUNCTION n_a_b (nat, nb : IN NATURAL) RETURN bit_vector;
END utilidad;
El paquete contiene las funciones
b_a_n(bits : IN bit_vector) y PACKAGE BODY utilidad IS
n_a_b(nat, nb : IN NATURAL) FUNCTION b_a_n (bits : IN bit_vector) RETURN natural IS
que realizan la conversión de tipo VARIABLE result : natural := 0;
BIT_VECTOR a tipo NATURAL, BEGIN
y de tipo NATURAL a tipo FOR indice IN bits'RANGE LOOP
BIT_VECTOR, respectivamente.
result := result * 2 + bit'POS(bits(indice));
El segundo argumento de esta última END LOOP;
función (nb) determina el número RETURN result;
de bits del resultado. END b_a_n;
FUNCTION n_a_b (nat, nb : IN NATURAL) RETURN bit_vector IS
VARIABLE nat_var : bit_vector(nb - 1 DOWNTO 0);
VARIABLE temp1, temp2 : NATURAL := 0;
BEGIN
temp1 := nat;
FOR i IN nb-1 DOWNTO 0 LOOP
temp2 := temp1/(2**i);
temp1 := temp1 mod (2**i);
IF ( temp2 = 1 ) THEN nat_var(i) := '1';
ELSE nat_var(i) := '0';
END IF;
END LOOP;
RETURN nat_var;
END n_a_b;
END utilidad;
S8 12
VHDL: de la tecnología a la arquitectura de computadores. José J. Ruz Ortiz, Síntesis 1997
Modelo de Comportamiento (9)
Resultados de la simulación
Registros
# <PC> = 000000000001 <AC> = 001000010011 <NZ> = 00 # <PC> = 000000000001 <AC> = 001000011000 <NZ> = 00
# <PC> = 000000000010 <AC> = 001000010100 <NZ> = 00 # <PC> = 000000000010 <AC> = 001000011001 <NZ> = 00
# <PC> = 000000000011 <AC> = 001000010100 <NZ> = 00 # <PC> = 000000000011 <AC> = 001000011001 <NZ> = 00
# <PC> = 000000000100 <AC> = 000000010100 <NZ> = 00 # <PC> = 000000000100 <AC> = 000000011001 <NZ> = 00
# <PC> = 000000000101
# <PC> = 000000000110
<AC> = 000000010100
<AC> = 000000010101
<NZ> = 00
<NZ> = 00
# <PC> = 000000000101
# <PC> = 000000000110
<AC> = 000000011001
<AC> = 000000011010
<NZ> = 00
<NZ> = 00 Memoria
# <PC> = 000000000111 <AC> = 000000010101 <NZ> = 00 # <PC> = 000000000111 <AC> = 000000011010 <NZ> = 00
# <PC> = 000000001000 <AC> = 000000011110 <NZ> = 00 # <PC> = 000000001000 <AC> = 000000011110 <NZ> = 00
# <PC> = 000000001001 <AC> = 111111100001 <NZ> = 10 # <PC> = 000000001001 <AC> = 111111100001 <NZ> = 10
# 00 = 000100000100
# <PC> = 000000001010 <AC> = 111111100010 <NZ> = 10 # <PC> = 000000001010 <AC> = 111111100010 <NZ> = 10 # 01 = 010100000001
# <PC> = 000000001011 <AC> = 111111110111 <NZ> = 10 # <PC> = 000000001011 <AC> = 111111111100 <NZ> = 10
# <PC> = 000000000000 <AC> = 111111110111 <NZ> = 10 # <PC> = 000000000000 <AC> = 111111111100 <NZ> = 10 # 02 = 001000000100
# <PC> = 000000000001 <AC> = 001000010100 <NZ> = 00 # <PC> = 000000000001 <AC> = 001000011001 <NZ> = 00
# <PC> = 000000000010 <AC> = 001000010101 <NZ> = 00 # <PC> = 000000000010 <AC> = 001000011010 <NZ> = 00
# 03 = 000100001110
# <PC> = 000000000011 <AC> = 001000010101 <NZ> = 00 # <PC> = 000000000011 <AC> = 001000011010 <NZ> = 00 # 04 = 001000011101
# <PC> = 000000000100 <AC> = 000000010101 <NZ> = 00 # <PC> = 000000000100 <AC> = 000000011010 <NZ> = 00
# <PC> = 000000000101 <AC> = 000000010101 <NZ> = 00 # <PC> = 000000000101 <AC> = 000000011010 <NZ> = 00 # 05 = 010100000001
# <PC> = 000000000110
# <PC> = 000000000111
<AC> = 000000010110
<AC> = 000000010110
<NZ> = 00
<NZ> = 00
# <PC> = 000000000110
# <PC> = 000000000111
<AC> = 000000011011
<AC> = 000000011011
<NZ> = 00
<NZ> = 00
# 06 = 001000001110
# <PC> = 000000001000 <AC> = 000000011110 <NZ> = 00 # <PC> = 000000001000 <AC> = 000000011110 <NZ> = 00 # 07 = 000100001101
# <PC> = 000000001001 <AC> = 111111100001 <NZ> = 10 # <PC> = 000000001001 <AC> = 111111100001 <NZ> = 10
# <PC> = 000000001010 <AC> = 111111100010 <NZ> = 10 # <PC> = 000000001010 <AC> = 111111100010 <NZ> = 10 # 08 = 011000001101
# <PC> = 000000001011
# <PC> = 000000000000
<AC> = 111111111000
<AC> = 111111111000
<NZ> = 10
<NZ> = 10
# <PC> = 000000001011
# <PC> = 000000000000
<AC> = 111111111101
<AC> = 111111111101
<NZ> = 10
<NZ> = 10
# 09 = 010100000001
# <PC> = 000000000001 <AC> = 001000010101 <NZ> = 00 # <PC> = 000000000001 <AC> = 001000011010 <NZ> = 00 # 10 = 001100001110
# <PC> = 000000000010 <AC> = 001000010110 <NZ> = 00 # <PC> = 000000000010 <AC> = 001000011011 <NZ> = 00
# <PC> = 000000000011 <AC> = 001000010110 <NZ> = 00 # <PC> = 000000000011 <AC> = 001000011011 <NZ> = 00 # 11 = 100000000000
# <PC> = 000000000100
# <PC> = 000000000101
<AC> = 000000010110
<AC> = 000000010110
<NZ> = 00
<NZ> = 00
# <PC> = 000000000100
# <PC> = 000000000101
<AC> = 000000011011
<AC> = 000000011011
<NZ> = 00
<NZ> = 00
# 12 = 000000000000
# <PC> = 000000000110 <AC> = 000000010111 <NZ> = 00 # <PC> = 000000000110 <AC> = 000000011100 <NZ> = 00 # 13 = 000000011110
# <PC> = 000000000111 <AC> = 000000010111 <NZ> = 00 # <PC> = 000000000111 <AC> = 000000011100 <NZ> = 00
# <PC> = 000000001000 <AC> = 000000011110 <NZ> = 00 # <PC> = 000000001000 <AC> = 000000011110 <NZ> = 00 # 14 = 000000011110
# <PC> = 000000001001
# <PC> = 000000001010
<AC> = 111111100001
<AC> = 111111100010
<NZ> = 10
<NZ> = 10
# <PC> = 000000001001
# <PC> = 000000001010
<AC> = 111111100001
<AC> = 111111100010
<NZ> = 10
<NZ> = 10
# 15 = 000000000000
# <PC> = 000000001011 <AC> = 111111111001 <NZ> = 10 # <PC> = 000000001011 <AC> = 111111111110 <NZ> = 10 # 16 = 000000000000
# <PC> = 000000000000 <AC> = 111111111001 <NZ> = 10 # <PC> = 000000000000 <AC> = 111111111110 <NZ> = 10
# <PC> = 000000000001 <AC> = 001000010110 <NZ> = 00 # <PC> = 000000000001 <AC> = 001000011011 <NZ> = 00 # 17 = 000000000000
# <PC> = 000000000010
# <PC> = 000000000011
<AC> = 001000010111
<AC> = 001000010111
<NZ> = 00
<NZ> = 00
# <PC> = 000000000010
# <PC> = 000000000011
<AC> = 001000011100
<AC> = 001000011100
<NZ> = 00
<NZ> = 00
# 18 = 000000000000
# <PC> = 000000000100 <AC> = 000000010111 <NZ> = 00 # <PC> = 000000000100 <AC> = 000000011100 <NZ> = 00 # 19 = 000000000000
# <PC> = 000000000101 <AC> = 000000010111 <NZ> = 00 # <PC> = 000000000101 <AC> = 000000011100 <NZ> = 00
# <PC> = 000000000110 <AC> = 000000011000 <NZ> = 00 # <PC> = 000000000110 <AC> = 000000011101 <NZ> = 00 # 20 = 000000010100
# <PC> = 000000000111
# <PC> = 000000001000
<AC> = 000000011000
<AC> = 000000011110
<NZ> = 00
<NZ> = 00
# <PC> = 000000000111
# <PC> = 000000001000
<AC> = 000000011101
<AC> = 000000011110
<NZ> = 00
<NZ> = 00
# 21 = 000000010101
# <PC> = 000000001001 <AC> = 111111100001 <NZ> = 10 # <PC> = 000000001001 <AC> = 111111100001 <NZ> = 10 # 22 = 000000010110
# <PC> = 000000001010 <AC> = 111111100010 <NZ> = 10 # <PC> = 000000001010 <AC> = 111111100010 <NZ> = 10
# <PC> = 000000001011 <AC> = 111111111010 <NZ> = 10 # <PC> = 000000001011 <AC> = 111111111111 <NZ> = 10 # 23 = 000000010111
# <PC> = 000000000000 <AC> = 111111111010 <NZ> = 10 # <PC> = 000000000000 <AC> = 111111111111 <NZ> = 10 # 24 = 000000011000
# <PC> = 000000000001 <AC> = 001000010111 <NZ> = 00 # <PC> = 000000000001 <AC> = 001000011100 <NZ> = 00
# <PC> = 000000000010 <AC> = 001000011000 <NZ> = 00 # <PC> = 000000000010 <AC> = 001000011101 <NZ> = 00 # 25 = 000000011001
# <PC> = 000000000011 <AC> = 001000011000 <NZ> = 00 # <PC> = 000000000011 <AC> = 001000011101 <NZ> = 00
# <PC> = 000000000100 <AC> = 000000011000 <NZ> = 00 # <PC> = 000000000100 <AC> = 000000011101 <NZ> = 00 # 26 = 000000011010
# <PC> = 000000000101 <AC> = 000000011000 <NZ> = 00 # <PC> = 000000000101 <AC> = 000000011101 <NZ> = 00 # 27 = 000000011011
# <PC> = 000000000110 <AC> = 000000011001 <NZ> = 00 # <PC> = 000000000110 <AC> = 000000011110 <NZ> = 00
# <PC> = 000000000111 <AC> = 000000011001 <NZ> = 00 # <PC> = 000000000111 <AC> = 000000011110 <NZ> = 00 # 28 = 000000011100
# <PC> = 000000001000 <AC> = 000000011110 <NZ> = 00 # <PC> = 000000001000 <AC> = 000000011110 <NZ> = 00
# <PC> = 000000001001 <AC> = 111111100001 <NZ> = 10 # <PC> = 000000001001 <AC> = 111111100001 <NZ> = 10
# 29 = 000000011101
# <PC> = 000000001010 <AC> = 111111100010 <NZ> = 10 # <PC> = 000000001010 <AC> = 111111100010 <NZ> = 10
# <PC> = 000000001011 <AC> = 111111111011 <NZ> = 10 # <PC> = 000000001011 <AC> = 000000000000 <NZ> = 01
S8 # <PC> = 000000000000 <AC> = 111111111011 <NZ> = 10 # <PC> = 000000001100 <AC> = 000000000000 <NZ> = 01
13
VHDL: de la tecnología a la arquitectura de computadores. José J. Ruz Ortiz, Síntesis 1997
Modelo CPU-Memoria (1)
UCP y la Memoria.
• Para cada unidad diseñaremos una entidad que describirá su comportamiento funcional y temporal.
start
Reloj
stop clk
lec MEMORIA
dis
esc
S8 14
VHDL: de la tecnología a la arquitectura de computadores. José J. Ruz Ortiz, Síntesis 1997
Modelo CPU-Memoria (2)
S8 15
VHDL: de la tecnología a la arquitectura de computadores. José J. Ruz Ortiz, Síntesis 1997
Modelo CPU-Memoria (3)
Modelo VHDL de la Memoria (1)
Memoria asíncrona con buses independientes de entrada y salida de datos: bus_dat_sal y bus_dat_ent..
El control se realiza con tres señales binarias: lec, esc y dis.
La primera para leer, la segunda para escribir, y la tercera para señalar la finalización de la operación realizada.
Los buses de datos y el de direcciones (bus_dir) son todos de 12 bits de longitud
Las operaciones de lectura y escritura se realizan asíncronamente con un protocolo de señales tipo hand-shaking
bus_dir
lec
MEMORIA lec
dis
dato valido
esc bus_dat_sal
dis
12 12 12 lectura de memoria
bus_dir
ENTITY memoria IS
PORT (bus_dat_sal : OUT bit_vector(11 DOWNTO 0); esc
bus_dat_ent : IN bit_vector(11 DOWNTO 0); dato valido
bus_dir : IN bit_vector(11 DOWNTO 0); bus_dat_ent
lec, esc : IN bit;
dis : OUT bit); dis
END memoria;
escritura en memoria
S8 16
VHDL: de la tecnología a la arquitectura de computadores. José J. Ruz Ortiz, Síntesis 1997
Modelo CPU-Memoria (4)
S8 17
VHDL: de la tecnología a la arquitectura de computadores. José J. Ruz Ortiz, Síntesis 1997
Modelo CPU-Memoria (5)
Su periferia dispondrá de los buses de datos direcciones y control necesarios para comunicarse con la memoria.
Se comunicará con el reloj a través de dos señales binarias:
• clk para recibir la señal de reloj
• stop para detener la generación de pulsos cuando se ejecute la instrucción de parada HALT
stop clk
lec
dis
esc
CPU
12
bus_ent
12
bus_sal
12
bus_dir
ENTITY cpu IS
PORT (bus_sal : OUT bit_vector(11 DOWNTO 0);
bus_ent : IN bit_vector(11 DOWNTO 0);
bus_dir : OUT bit_vector(11 DOWNTO 0);
lec, esc, stop : OUT bit;
dis, clk : IN bit);
END cpu;
S8 18
VHDL: de la tecnología a la arquitectura de computadores. José J. Ruz Ortiz, Síntesis 1997
Modelo CPU-Memoria (6)
clock
clock
bus_dir
bus_dir
esc
lec
dis
dis
bus_sal
bus_ent
S8 19
VHDL: de la tecnología a la arquitectura de computadores. José J. Ruz Ortiz, Síntesis 1997
Modelo CPU-Memoria (7)
USE WORK.utilidad.ALL;
ENTITY cpu IS
PORT (bus_sal : OUT bit_vector(11 DOWNTO 0);
Código VHDL completo de la Unidad
bus_ent : IN bit_vector(11 DOWNTO 0); Central de Proceso (1)
bus_dir : OUT bit_vector(11 DOWNTO 0);
lec, esc, stop : OUT bit; BEGIN
dis, clk : IN bit); mar := pc; -- mar <-- <pc>
END cpu; lectura; -- lectura
ARCHITECTURE comportamiento OF cpu IS ir := mdr; -- ir <-- <mdr>
BEGIN pc := n_a_b((b_a_n(pc) + 1), 12); -- pc <-- <pc> + 1
PROCESS WAIT UNTIL (clk'EVENT AND clk = '0'); -- decodificacion
VARIABLE mdr, mar, pc, ir, ac : bit_vector(11 DOWNTO 0);
VARIABLE nz : bit_vector(1 DOWNTO 0);
PROCEDURE lectura IS
BEGIN
WAIT UNTIL (clk'EVENT AND clk = '0');
bus_dir <= mar;
WAIT UNTIL (clk'EVENT AND clk = '0');
lec <= '1';
WAIT UNTIL dis = '1';
WAIT UNTIL (clk'EVENT AND clk = '0');
mdr := bus_ent;
WAIT UNTIL (clk'EVENT AND clk = '0');
lec <= '0';
END lectura;
PROCEDURE escritura IS
BEGIN
WAIT UNTIL (clk'EVENT AND clk = '0');
bus_dir <= mar;
bus_sal <= mdr;
WAIT UNTIL (clk'EVENT AND clk = '0');
esc <= '1';
WAIT UNTIL dis = '1';
WAIT UNTIL (clk'EVENT AND clk = '0');
esc <= '0';
END escritura;
S8 20
VHDL: de la tecnología a la arquitectura de computadores. José J. Ruz Ortiz, Síntesis 1997
Modelo CPU-Memoria (8)
CASE ir(11 DOWNTO 8) IS
WHEN "0001" => -- LDA
mar := "0000" & ir(7 DOWNTO 0); -- mar <-- <ir> Código VHDL completo de la Unidad
lectura; -- lectura
ac := mdr; -- ac <-- <mdr> Central de Proceso (2)
nz(1) := ac(11); -- n <-- <ac(11)>
IF ac = "000000000000" -- IF ac="000000000000"
THEN nz(0) := '1'; -- THEN z <-- '1'
ELSE nz(0) := '0'; -- ELSE z <-- '0' WHEN "0110" => -- NOR
END IF; mar := "0000" & ir(7 DOWNTO 0); -- mar <-- <ir>
WHEN "0010" => -- STA lectura; -- lectura
mdr := ac; -- mdr <-- <ac> ac := ac NOR mdr; -- ac <-- <mdr>
mar := "0000" & ir(7 DOWNTO 0); -- mar <-- <ir> nz(1) := ac(11); -- n <-- <ac(11)>
escritura; -- escritura IF ac = "000000000000" -- IF ac="000000000000"
WHEN "0011" => -- SUM THEN nz(0) := '1'; -- THEN z <-- '1'
mar := "0000" & ir(7 DOWNTO 0); -- mar <-- <ir> ELSE nz(0) := '0'; -- ELSE z <-- '0'
lectura; -- lectura END IF
ac := n_a_b((b_a_n(ac) + b_a_n(mdr)), 12); -- ac <-- <ac>+<mdr> WHEN "0111" => -- JZ
nz(1) := ac(11); -- n <-- <ac(11)> IF nz(0) = '1' THEN
IF ac = "000000000000" -- IF ac="000000000000" pc := "0000" & ir(7 DOWNTO 0); -- pc <-- <ir>
THEN nz(0) := '1'; -- THEN z <-- '1' END IF;
ELSE nz(0) := '0'; -- ELSE z <-- '0' WHEN "1000" => -- JNZ
END IF; IF nz(0) = '0' THEN
WHEN "0100" => -- LDAI pc := "0000" & ir(7 DOWNTO 0); -- pc <-- <ir>
ac := "0000" & ir(7 DOWNTO 0); -- ac <-- <ir> END IF;
nz(1) := ac(11); -- n <-- <ac(11)> WHEN "1001" => -- JN
IF ac = "000000000000" -- IF ac="000000000000" IF nz(1) = '1' THEN
THEN nz(0) := '1'; -- THEN z <-- '1' pc := "0000" & ir(7 DOWNTO 0); -- pc <-- <ir>
ELSE nz(0) := '0'; -- ELSE z <-- '0' END IF;
END IF; WHEN "1010" => -- JNN
WHEN "0101" => -- SUMI IF nz(1) = '0' THEN
mdr := "0000" & ir(7 DOWNTO 0); -- mdr <-- <ir> pc := "0000" & ir(7 DOWNTO 0); -- pc <-- <ir>
ac := n_a_b((b_a_n(ac) + b_a_n(mdr)), 12); -- ac <-- <ac>+<mdr> END IF;
nz(1) := ac(11); -- n <-- <ac(11)> WHEN OTHERS =>
IF ac = "000000000000" -- IF ac="000000000000" lec <= '1';
THEN nz(0) := '1'; esc <= '1'; -- volcado memoria
-- THEN z <-- '1' stop <= '1', '0' AFTER 5 ns; -- parada
ELSE nz(0) := '0'; END CASE;
-- ELSE z <-- '0' END PROCESS;
END IF; END comportamiento;
S8 21
VHDL: de la tecnología a la arquitectura de computadores. José J. Ruz Ortiz, Síntesis 1997
Modelo CPU-Memoria (9)
unice : cpu PORT MAP(sal, ent, dir, lec, esc, stop, dis, clk);
END estructura;
S8 22
VHDL: de la tecnología a la arquitectura de computadores. José J. Ruz Ortiz, Síntesis 1997
Modelo CPU-Memoria (10)
Resultados de la simulación
ns delta start sal ent dir lec dis esc stop clk
0 +0 0 000000000000 000000000000 000000000000 0 0 0 0 0
5 +0 1 000000000000 000000000000 000000000000 0 0 0 0 0
5 +2 1 000000000000 000000000000 000000000000 0 0 0 0 1
10 +1 1 000000000000 000000000000 000000000000 0 0 0 0 0
20 +1 1 000000000000 000000000000 000000000000 0 0 0 0 1
LDAI 3
25 +1 1 000000000000 000000000000 000000000000 0 0 0 0 0
35 +1 1 000000000000 000000000000 000000000000 0 0 0 0 1
40 +1 1 000000000000 000000000000 000000000000 0 0 0 0 0
40 +2 1 000000000000 000000000000 000000000000 1 0 0 0 0
50 +1 1 000000000000 000000000000 000000000000 1 0 0 0 1
55 +0 1 000000000000 010000000011 000000000000 1 0 0 0 1
55 +1 1 000000000000 010000000011 000000000000 1 0 0 0 0
60 +0 1 000000000000 010000000011 000000000000 1 1 0 0 0
65 +1 1 000000000000 010000000011 000000000000 1 1 0 0 1
70 +1 1 000000000000 010000000011 000000000000 1 1 0 0 0
80 +1 1 000000000000 010000000011 000000000000 1 1 0 0 1
85 +1 1 000000000000 010000000011 000000000000 1 1 0 0 0
85 +2 1 000000000000 010000000011 000000000000 0 1 0 0 0
90 +0 1 000000000000 000000000000 000000000000 0 0 0 0 0
95 +1 1 000000000000 000000000000 000000000000 0 0 0 0 1
100 +1 1 000000000000 000000000000 000000000000 0 0 0 0 0
110 +1 1 000000000000 000000000000 000000000000 0 0 0 0 1
115 +1 1 000000000000 000000000000 000000000000 0 0 0 0 0
125 +1 1 000000000000 000000000000 000000000000 0 0 0 0 1
130 +1 1 000000000000 000000000000 000000000000 0 0 0 0 0
140 +1 1 000000000000 000000000000 000000000000 0 0 0 0 1
145 +1 1 000000000000 000000000000 000000000000 0 0 0 0 0
SUM 4
145 +2 1 000000000000 000000000000 000000000001 0 0 0 0 0
155 +1 1 000000000000 000000000000 000000000001 0 0 0 0 1
160 +1 1 000000000000 000000000000 000000000001 0 0 0 0 0
160 +2 1 000000000000 000000000000 000000000001 1 0 0 0 0
170 +1 1 000000000000 000000000000 000000000001 1 0 0 0 1
S8 175 +0 1 000000000000 001100000100 000000000001 1 0 0 0 1 23
VHDL: de la tecnología a la arquitectura de computadores. José J. Ruz Ortiz, Síntesis 1997
Modelo Estructural de la Ruta de Datos (1)
lectu r a
di spon i bl e
escr i tu r a
bu s1
bus dat os en tr ada
En este modelo vamos
sel 1
M UX 0
a incorporar la estructura
interna de la ruta de datos, Memor i a
es decir, sustituiremos el e_mdr
s_mdr M DR bu s2
modelo de comportamiento
algoritmico de esta unidad bus datos sal i da
por otro estructural e_mar
compuesto por un conjunto s_mar M AR
de registros y unidades Un idad bus di r ecciones
funcionales interconectados de
Cont rol e_pc
por una red de buses y/o s_pc PC
multiplexores
e_ir
s_ir IR
co
e_ac
s_ac AC
op0 a b
op1
op2 U AL
e_nz
s_nz N Z
n
z
S8 24
VHDL: de la tecnología a la arquitectura de computadores. José J. Ruz Ortiz, Síntesis 1997
Modelo Estructural de la Ruta de Datos (2)
Multiplexor
d0 d1
12 12
1 0
sel MUX
12
USE WORK.std_logic_1164.ALL;
ENTITY mux IS
PORT (d0, d1 : IN std_logic_vector(11 DOWNTO 0);
z : OUT std_logic_vector(11 DOWNTO 0);
sel : IN std_ulogic);
END mux;
S8 25
VHDL: de la tecnología a la arquitectura de computadores. José J. Ruz Ortiz, Síntesis 1997
Modelo Estructural de la Ruta de Datos (3)
valor del dato cargado
entrada Registros de 12 bits (mdr, mar, pc, ac)
entrada reloj
USE STD.TEXTIO.ALL;
Registro de Instrucciones USE WORK.std_logic_1164.ALL;
ENTITY regir IS
ed GENERIC (nombre : STRING := "registro instrucción");
PORT ( ed : IN std_logic_vector(11 DOWNTO 0);
reset 12
clk, reset, e_r, s_r : IN std_ulogic;
e_r sdb : OUT std_logic_vector(7 DOWNTO 0);
REGIR clk sdc : OUT std_logic_vector(3 DOWNTO 0));
s_r
4 8 END regir;
ARCHITECTURE comportamiento OF regir IS
sdc sdb BEGIN
PROCESS
VARIABLE r, ar : std_logic_vector(11 DOWNTO 0) := "000000000000";
VARIABLE l : LINE;
BEGIN
WAIT UNTIL (rising_edge(clk) OR s_r'EVENT OR reset'EVENT);
ar := r;
IF falling_edge(reset) THEN r := "000000000000"; END IF;
IF rising_edge(clk) THEN
IF e_r = '1' THEN r := ed; END IF;
END IF;
IF s_r = '1'
THEN
sdb <= r(7 DOWNTO 0);
ELSE
sdb <= "ZZZZZZZZ";
END IF;
sdc <= r(11 DOWNTO 8);
IF r /= ar THEN
WRITE(l, nombre);
WRITE(l,To_bitvector(r));
WRITELINE(OUTPUT,l);
END IF;
END PROCESS;
END comportamiento;
S8 27
VHDL: de la tecnología a la arquitectura de computadores. José J. Ruz Ortiz, Síntesis 1997
Modelo Estructural de la Ruta de Datos (5)
USE STD.TEXTIO.ALL;
Registro de Estado USE WORK.std_logic_1164.ALL;
ENTITY reg2 IS
PORT ( e0, e1, clk, reset, e_r, s_r : IN std_ulogic;
s0, s1 : OUT std_ulogic);
e0 e1 END reg2;
ARCHITECTURE comportamiento OF reg2 IS
reset BEGIN
PROCESS
VARIABLE r0, r1, ar0, ar1 : std_ulogic := '0';
e_r clk VARIABLE l : LINE;
s_r REG2 CONSTANT creg2 : STRING := "<NZ> = ";
BEGIN
WAIT UNTIL (rising_edge(clk) OR s_r'EVENT OR reset'EVENT);
s0 s1 ar0 := r0; ar1 := r1;
IF falling_edge(reset) THEN r0 := '0'; r1 := '0'; END IF;
IF rising_edge(clk) THEN
IF e_r = '1' THEN r0 := e0; r1 := e1; END IF;
END IF;
IF s_r = '1'
THEN
s0 <= r0 AFTER 10 ns;
s1 <= r1 AFTER 10 ns;
ELSE
s0 <= 'Z' AFTER 10 ns;
s1 <= 'Z' AFTER 10 ns;
END IF;
IF (r0 /= ar0) OR (r1 /= ar1) THEN
WRITE(l, creg2);
WRITE(l,To_bit(r1, '0'));WRITE(l,To_bit(r0,'0'));
WRITELINE(OUTPUT,l);
END IF;
END PROCESS;
END comportamiento;
S8 28
VHDL: de la tecnología a la arquitectura de computadores. José J. Ruz Ortiz, Síntesis 1997
Modelo Estructural de la Ruta de Datos (6)
Unidad Aritmético-Lógica (ual) USE WORK.utilidad.ALL;
a USE WORK.std_logic_1164.ALL;
b ENTITY ual IS
12 12 PORT( a, b : IN std_logic_vector(11 DOWNTO 0);
op0, op1, op2 : IN std_ulogic;
op2 s : OUT std_logic_vector(11 DOWNTO 0);
op1 z n, z : OUT std_ulogic);
op0 UAL n END ual;
12 ARCHITECTURE comportamiento OF ual IS
BEGIN
s PROCESS(a,b,op0, op1,op2)
op2 op1 op0 s VARIABLE as : std_logic_vector(11 DOWNTO 0);
VARIABLE op :bit_vector(2 DOWNTO 0);
0 0 0 "000000000000"
BEGIN
0 0 1 "0000" & b(7 DOWNTO 0) op := To_bit(op2, '0')&To_bit(op1, '0')&To_bit(op0,'0');
CASE op IS
0 1 0 a NOR b WHEN "000" => as := "000000000000";
0 1 1 b WHEN "001" => as := "0000" & b(7 DOWNTO 0);
WHEN "010" =>
1 0 0 b+1 as := To_StdLogicVector(To_StdULogicVector(a) NOR
1 0 1 a To_StdULogicVector(b)) ;
WHEN "011" => as := b;
1 1 0 a+b WHEN "100" =>
as := To_StdLogicVector(n_a_b((b_a_n(To_bitvector(b)) + 1), 12));
1 1 1 no opera WHEN "101" => as := a;
WHEN "110" =>
Para compatibilizar tipos, se han utilizado las siguientes as := To_StdLogicVector(n_a_b(( b_a_n(To_bitvector(a)) +
funciones de conversión de tipos del paquete b_a_n(To_bitvector(b))), 12));
STD_LOGC_1164: WHEN OTHERS => NULL;
END CASE;
- To_bit ( , ) : s <= as AFTER 5 ns;
std_ulogic a bit IF as(11)= '1‘ THEN n <= '1' AFTER 5 ns; ELSE n <= '0' AFTER 5 ns;
- To_StdLogicVector ( ) : END IF;
bit_vector Æstd_logic_vector IF as = "000000000000“ THEN z <= '1' AFTER 5 ns; ELSE z <= '0'
- To_StdULogicVector ( ) : AFTER 5 ns;
std_logic_vector Æ std_ulogic_vector END IF;
- To_bitvector( ) : END PROCESS;
std_logic_vector Æ bit_vector END comportamiento;
S8 29
VHDL: de la tecnología a la arquitectura de computadores. José J. Ruz Ortiz, Síntesis 1997
Modelo Estructural de la Ruta de Datos (7)
ARCHITECTURE estructura OF ruta IS
Conexión estructural COMPONENT mux
PORT ( d0, d1 : IN std_logic_vector(11 DOWNTO 0);
de la ruta de datos z : OUT std_logic_vector(11 DOWNTO 0);
reset clk sel : IN std_ulogic);
bus de datos de entrada
END COMPONENT;
bus1 bus2
sel 1 0
COMPONENT reg12
MUX GENERIC (nombre : STRING);
PORT ( ed : IN std_logic_vector(11 DOWNTO 0);
mm
clk, reset, e_r, s_r : IN std_ulogic;
e_mdr sd : OUT std_logic_vector(11 DOWNTO 0) );
s_mdr MDR END COMPONENT;
bus de datos de salida COMPONENT regir
e_mar
GENERIC ( nombre : STRING);
s_mar MAR
PORT ( ed : IN std_logic_vector(11 DOWNTO 0);
bus de direcciones clk, reset, e_r, s_r : IN std_ulogic;
sdb : OUT std_logic_vector(7 DOWNTO 0);
e_pc sdc : OUT std_logic_vector(11 DOWNTO 8));
s_pc PC END COMPONENT;
COMPONENT reg2
e_ir PORT ( e0, e1 : IN std_logic;
s_ir IR clk, reset, e_r, s_r : IN std_ulogic;
s0, s1 : OUT std_logic );
co END COMPONENT;
4 COMPONENT ual
e_ac PORT( a, b : IN std_logic_vector(11 DOWNTO 0);
s_ac AC op0, op1, op2 : IN std_ulogic;
au s : OUT std_logic_vector(11 DOWNTO 0);
op0 a b n, z : std_logic);
op1
op2 UAL END COMPONENT;
SIGNAL bus1, bus2, mm, au : std_logic_vector(11 DOWNTO 0);
sn sz
e_nz SIGNAL sn, sz : std_logic;
s_nz CONSTANT rmdr : STRING := "<MDR> = ";
NZ
CONSTANT rmar : STRING := "<MAR> = ";
n
z CONSTANT rpc : STRING := "<PC> = ";
CONSTANT rac : STRING := "<AC> = ";
CONSTANT rir : STRING := "<IR> = ";
USE WORK.std_logic_1164.ALL; BEGIN
USE WORK.ALL; mu : mux PORT MAP(s_dat, bus1, mm, sel);
ENTITY ruta IS mdr : reg12 GENERIC MAP(rmdr) PORT MAP(mm, clk, reset, e_mdr, s_mdr, bus2);
PORT ( e_dat : OUT std_logic_vector(11 DOWNTO 0); mar : reg12 GENERIC MAP(rmar) PORT MAP(bus1, clk, reset, e_mar, s_mar, dir);
s_dat : IN std_logic_vector(11 DOWNTO 0); pc : reg12 GENERIC MAP(rpc) PORT MAP(bus1, clk, reset, e_pc, s_pc, bus2);
dir : OUT std_logic_vector(11 DOWNTO 0); ir : regir GENERIC MAP (rir)
clk, reset, sel, e_mdr, s_mdr, e_mar, s_mar, e_pc, s_pc, PORT MAP(bus1, clk, reset, e_ir, s_ir, bus2(7 DOWNTO 0), co);
e_ir, s_ir, e_ac, s_ac, e_nz, s_nz : IN std_ulogic; ac : reg12 GENERIC MAP(rac) PORT MAP(bus1, clk, reset, e_ac, s_ac, au);
op0, op1, op2 : IN std_ulogic; ua : ual PORT MAP(au,bus2, op0, op1, op2, bus1, sn, sz);
n, z : OUT std_logic; nz : reg2 PORT MAP(sz, sn, clk, reset, e_nz, s_nz, n, z);
co : OUT std_logic_vector(3 DOWNTO 0)); e_dat <= bus2;
END ruta; END estructura;
S8 30
VHDL: de la tecnología a la arquitectura de computadores. José J. Ruz Ortiz, Síntesis 1997
Modelo Estructural de la Ruta de Datos (8)
Modelo de la Unidad de Control
• La Unidad de Control se encarga de generar todas las señales que gobiernan el flujo de información por la RD.
Fases de búsqueda y decodificación: se lee la instrucción de memoria, se transfiere a IR y se decodifica.
clk
lec
esc <PC> Æ MAR
stop
• s_pc (salir del PC)
sel
• op0 y op1 (paso transparente por b de la UAL)
e_mdr • e_mar (entrar en el MAR).
s_mdr
e_mar Lectura de la instrucción
s_mar
• s_mar (salir del MAR)
e_pc • lec (al comienzo del siguiente ciclo)
s_pc • dis, (disponibilidad del dato)
e_ir • e_mdr (cargar el dato leido en el registro MDR. )
s_ir • desactivación de s_mar y lec
e_ac <MDR> Æ RI
s_ac
op0 • s_mdr, op0, op1 y e_ri.
op1
<PC> + 1 Æ PC
op2 • s_pc, op2 y e_pc.
e_nz
s_nz Decodificación
búsqueda decodificación
S8 31
VHDL: de la tecnología a la arquitectura de computadores. José J. Ruz Ortiz, Síntesis 1997
Modelo Estructural de la Ruta de Datos (9)
clk clk
lec lec
esc esc
stop stop
sel sel
e_mdr e_mdr
s_mdr s_mdr
e_mar e_mar
s_mar s_mar
e_pc e_pc
s_pc s_pc
e_ir e_ir
s_ir s_ir
e_ac e_ac
s_ac s_ac
op0 op0
op1 op1
op2 op2
e_nz e_nz
s_nz s_nz
dis dis
n n
z z
SUM STA
S8 32
VHDL: de la tecnología a la arquitectura de computadores. José J. Ruz Ortiz, Síntesis 1997
Modelo Estructural de la Ruta de Datos (10)
S8 33
VHDL: de la tecnología a la arquitectura de computadores. José J. Ruz Ortiz, Síntesis 1997
Modelo Estructural de la Ruta de Datos (11)
ciclo 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
clk
lec
Señales generadas por la UC esc
stop
a lo largo de la ejecución sel
e_mdr
delsiguiente programa: s_mdr
e_mar
s_mar
e_pc
Dir. Simbólico Binario s_pc
e_ir
0 LDAI 3 0100 00000011 s_ir
e_ac
1 SUM 4 0011 00000100 s_ac
op0
2 STA 5 0010 00000101 op1
3 HALT 0000 00000000 op2
e_nz
s_nz
dis
• El programa dura 39 ciclos n
z
LDAI 3 SUM 4
• La parada la origina la ejecución
de la instrucción HALT activando ciclo 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
dis
n
z
STA 5 HALT
S8 34
VHDL: de la tecnología a la arquitectura de computadores. José J. Ruz Ortiz, Síntesis 1997
Modelo Estructural de la Ruta de Datos (12)
PACKAGE std_logic_1164 IS
TYPE std_ulogic IS ( 'U', -- Uninitialized
'X', -- Forcing Unknown
Partedel paquete '0', -- Forcing 0
standard IEEE '1', -- Forcing 1
'Z', -- High Impedance
std_logic_1164 'W', -- Weak Unknown
'L', -- Weak 0
'H', -- Weak 1
'-' -- Don't care );
TYPE std_ulogic_vector IS ARRAY ( NATURAL RANGE <> ) OF std_ulogic;
-- resolution function
FUNCTION resolved ( s : std_ulogic_vector ) RETURN std_ulogic;
SUBTYPE std_logic IS resolved std_ulogic;
TYPE std_logic_vector IS ARRAY ( NATURAL RANGE <>) OF std_logic;
-- overloaded logical operators
FUNCTION "and" ( l : std_ulogic; r : std_ulogic ) RETURN UX01;
FUNCTION "nand" ( l : std_ulogic; r : std_ulogic ) RETURN UX01;
FUNCTION "or" ( l : std_ulogic; r : std_ulogic ) RETURN UX01;
FUNCTION "nor" ( l : std_ulogic; r : std_ulogic ) RETURN UX01;
FUNCTION "xor" ( l : std_ulogic; r : std_ulogic ) RETURN UX01;
FUNCTION "not" ( l : std_ulogic ) RETURN UX01;
-- conversion functions
FUNCTION To_bit ( s : std_ulogic; xmap : BIT := '0') RETURN BIT;
FUNCTION To_bitvector ( s : std_logic_vector ; xmap : BIT := '0') RETURN BIT_VECTOR;
FUNCTION To_bitvector ( s : std_ulogic_vector; xmap : BIT := '0') RETURN BIT_VECTOR;
FUNCTION To_StdULogic ( b : BIT ) RETURN std_ulogic;
FUNCTION To_StdLogicVector ( b : BIT_VECTOR ) RETURN std_logic_vector;
FUNCTION To_StdLogicVector ( s : std_ulogic_vector ) RETURN std_logic_vector;
FUNCTION To_StdULogicVector ( b : BIT_VECTOR ) RETURN std_ulogic_vector;
FUNCTION To_StdULogicVector ( s : std_logic_vector ) RETURN std_ulogic_vector;
-- edge detection
FUNCTION rising_edge (SIGNAL s : std_ulogic) RETURN BOOLEAN;
FUNCTION falling_edge (SIGNAL s : std_ulogic) RETURN BOOLEAN;
-------------------------------------------------------------------
END std_logic_1164;
S8 35
VHDL: de la tecnología a la arquitectura de computadores. José J. Ruz Ortiz, Síntesis 1997
Modelo Estructural de la Ruta de Datos (13)
Definición de los tipos de control
USE WORK.std_logic_1164.ALL;
PACKAGE tipos_control IS
TYPE senales_control IS (lec, esc, stop, sel, e_mdr, s_mdr, e_mar,
s_mar,e_pc, s_pc, e_ir, s_ir, e_ac, s_ac,
op0, op1, op2, e_nz, s_nz);
TYPE vector_senales_control IS ARRAY (natural RANGE <>) OF senales_control;
TYPE bus_control IS ARRAY (senales_control) OF std_ulogic;
FUNCTION ctrl (ent : vector_senales_control) RETURN bus_control;
FUNCTION ctrl (ent : senales_control) RETURN bus_control;
FUNCTION ctrl RETURN bus_control;
END tipos_control;
PACKAGE BODY tipos_control IS
FUNCTION ctrl(ent : vector_senales_control) RETURN bus_control IS
VARIABLE res : bus_control := (OTHERS => '0');
BEGIN
FOR i IN ent'RANGE LOOP res(ent(i)) := '1'; END LOOP;
RETURN res;
END ctrl;
FUNCTION ctrl(ent : senales_control) RETURN bus_control IS
VARIABLE res : bus_control := (OTHERS => '0');
BEGIN
res(ent) := '1';
RETURN res;
END ctrl;
FUNCTION ctrl RETURN bus_control IS
VARIABLE res : bus_control := (OTHERS => '0');
BEGIN
RETURN res;
END ctrl;
END tipos_control;
S8 36
VHDL: de la tecnología a la arquitectura de computadores. José J. Ruz Ortiz, Síntesis 1997
Modelo Estructural de la Ruta de Datos (14)
disp
Declaración de entidad
N
Z realimentación USE WORK.std_logic_1164.ALL;
co USE WORK.tipos_control.ALL;
lec ENTITY u_control IS
esc PORT(disp, n, z : IN std_ulogic;
stop co : IN std_logic_vector(3 DOWNTO 0);
sel control : OUT bus_control;
e_mdr clk : IN std_ulogic);
s_mdr END u_control;
e_mar
Unidad s_mar
de e_pc
Control s_pc control
e_ir
s_ir • Todas las señales binarias de salida (tipo std_ulogic) las hemos
agrupado en un array de nombre control de tipo bus_control
e_ac (array de std_ulogic sobre un índice enumerado de nombres de señales).
s_ac
op0 • La señal de entrada co será la única resuelta de tipo std_logic_vector
op1 (tipo utilizado en la salida de los registros de la RD, en particular el IR,
op2 de donde procede co)
e_nz
• Las restantes entradas (disp, N, Z, y clk) serán todas del tipo std_ulogic.
s_nz
clk reloj
S8 37
VHDL: de la tecnología a la arquitectura de computadores. José J. Ruz Ortiz, Síntesis 1997
Modelo Estructural de la Ruta de Datos (15)
clk
PROCEDURE m_orden (ordenes : IN vector_senales_control) IS
BEGIN
WAIT UNTIL falling_edge(clk); • órdenes de control
control <= ctrl(ordenes); •
•
END m_orden;
clk
clk
s_mar
s_mar
esc
lec
s_mdr
e_mdr
disp
disp
S8 38
VHDL: de la tecnología a la arquitectura de computadores. José J. Ruz Ortiz, Síntesis 1997
Modelo Estructural de la Ruta de Datos (16) m_orden(s_pc & op0 & op1 & e_mar); -- mar <-- <pc>
lectura; -- Lectura
m_orden(s_mdr & op0 & op1 & e_ir); -- ir <-- <mdr>
USE WORK.std_logic_1164.ALL;
ENTITY reloj IS
GENERIC(tl : TIME := 20 ns; th : TIME := 5 ns);
PORT(start : IN bit; stop : IN std_ulogic := '0'; clock : OUT std_ulogic);
END reloj;
ARCHITECTURE comportamiento OF reloj IS
SIGNAL clk : bit := '0';
BEGIN
PROCESS(start, stop, clk)
VARIABLE clke : bit := '0';
BEGIN
IF (start = '1' and NOT start'STABLE) THEN
clke := '1';
clk <= TRANSPORT '1' AFTER 0 ns;
clk <= TRANSPORT '0' AFTER th;
END IF;
IF (stop = '1' and NOT stop'STABLE) THEN
clke := '0';
clk <= TRANSPORT '0' AFTER 0 ns;
END IF;
IF (clk = '0' and NOT clk'STABLE and clke = '1') THEN
clk <= TRANSPORT '1' AFTER tl;
clk <= TRANSPORT '0' AFTER tl+th;
END IF;
clock <= To_StdUlogic(clk);
END PROCESS;
END comportamiento;
S8 40
VHDL: de la tecnología a la arquitectura de computadores. José J. Ruz Ortiz, Síntesis 1997
Memoria Modelo Estructural de la Ruta de Datos (18)
Al igual que hicimos con el reloj, utilizaremos el mismo modelo anterior cambiando el tipo bit_vector por std_logic_vector en los buses
de datos (bus_dat_sal, bus_dat_ent) y direcciones (bus_dir), y el tipo bit por el std_ulogic en las lineas de control (lec, esc, dis):
mm
e_mdr
s_mdr MDR
Unidad e_mar
de s_mar MAR
Control
e_pc
s_pc PC
e_ir
s_ir IR
co
4
e_ac
s_ac AC
au
op0 a b
op1
op2 UAL
sn sz
e_nz
s_nz NZ
n
z
S8 42
VHDL: de la tecnología a la arquitectura de computadores. José J. Ruz Ortiz, Síntesis 1997
Modelo Estructural de la Ruta de Datos (20)
S8 43
VHDL: de la tecnología a la arquitectura de computadores. José J. Ruz Ortiz, Síntesis 1997
Modelo Estructural de la Ruta de Datos (21)
Evolución de buses y señales de control del modelo estructural en la ejecución del programa
ns delta start reset control sal ent dir dis clk n z co
s_mar
e mdr
s mdr
e mar
e_pc
s_pc
e_ir
s_ir
e_ac
s_ac
e_nz
s_nz
stop
op0
op1
op2
lec
esc
sel
0 +0 0 1 UUUUUUUUUUUUUUUUUUU UUUUUUUUUUUU UUUUUUUUUUUU UUUUUUUUUUUU U U U U UUUU
0 +1 0 1 UUUUUUUUUUUUUUUUUUU UUUUUUUUUUUU UUUUUUUUUUUU UUUUUUUUUUUU U 0 U U UUUU
5 +0 1 1 UUUUUUUUUUUUUUUUUUU ZZZZZZZZZZZZ UUUUUUUUUUUU UUUUUUUUUUUU 0 0 U U UUUU
5 +2 1 1 UUUUUUUUUUUUUUUUUUU ZZZZZZZZZZZZ UUUUUUUUUUUU UUUUUUUUUUUU 0 1 U U UUUU
5 +3 1 1 UUUUUUUUUUUUUUUUUUU ZZZZZZZZZZZZ UUUUUUUUUUUU ZZZZZZZZZZZZ 0 1 U U 0000
5 +4 1 1 UUUUUUUUUUUUUUUUUUU ZZZZZZZZZZZZ ZZZZZZZZZZZZ ZZZZZZZZZZZZ 0 1 U U 0000
10 +1 1 1 UUUUUUUUUUUUUUUUUUU ZZZZZZZZZZZZ ZZZZZZZZZZZZ ZZZZZZZZZZZZ 0 0 U U 0000
10 +2 1 1 0000001001000011000 ZZZZZZZZZZZZ ZZZZZZZZZZZZ ZZZZZZZZZZZZ 0 0 U U 0000
10 +4 1 1 0000001001000011000 ZZZZZZZZZZZZ 000000000000 ZZZZZZZZZZZZ 0 0 U U 0000
15 +0 1 1 0000001001000011000 ZZZZZZZZZZZZ 000000000000 ZZZZZZZZZZZZ 0 0 Z Z 0000
20 +1 1 1 0000001001000011000 ZZZZZZZZZZZZ 000000000000 ZZZZZZZZZZZZ 0 1 Z Z 0000
25 +1 1 1 0000001001000011000 ZZZZZZZZZZZZ 000000000000 ZZZZZZZZZZZZ 0 0 Z Z 0000
25 +2 1 1 0000000100000000000 ZZZZZZZZZZZZ 000000000000 ZZZZZZZZZZZZ 0 0 Z Z 0000
25 +3 1 1 0000000100000000000 ZZZZZZZZZZZZ 000000000000 000000000000 0 0 Z Z 0000
25 +4 1 1 0000000100000000000 ZZZZZZZZZZZZ ZZZZZZZZZZZZ 000000000000 0 0 Z Z 0000
35 +1 1 1 0000000100000000000 ZZZZZZZZZZZZ ZZZZZZZZZZZZ 000000000000 0 1 Z Z 0000
40 +1 1 1 0000000100000000000 ZZZZZZZZZZZZ ZZZZZZZZZZZZ 000000000000 0 0 Z Z 0000
40 +2 1 1 1000000100000000000 ZZZZZZZZZZZZ ZZZZZZZZZZZZ 000000000000 0 0 Z Z 0000
48 +0 1 1 1000000100000000000 010000000011 ZZZZZZZZZZZZ 000000000000 0 0 Z Z 0000
50 +0 1 1 1000000100000000000 010000000011 ZZZZZZZZZZZZ 000000000000 1 0 Z Z 0000
50 +1 1 1 1000000100000000000 010000000011 ZZZZZZZZZZZZ 000000000000 1 1 Z Z 0000
55 +1 1 1 1000000100000000000 010000000011 ZZZZZZZZZZZZ 000000000000 1 0 Z Z 0000
55 +2 1 1 1000100100000000000 010000000011 ZZZZZZZZZZZZ 000000000000 1 0 Z Z 0000
65 +1 1 1 1000100100000000000 010000000011 ZZZZZZZZZZZZ 000000000000 1 1 Z Z 0000
70 +1 1 1 1000100100000000000 010000000011 ZZZZZZZZZZZZ 000000000000 1 0 Z Z 0000
70 +2 1 1 0000010000100011000 010000000011 ZZZZZZZZZZZZ 000000000000 1 0 Z Z 0000
70 +3 1 1 0000010000100011000 010000000011 ZZZZZZZZZZZZ ZZZZZZZZZZZZ 1 0 Z Z 0000
70 +4 1 1 0000010000100011000 010000000011 010000000011 ZZZZZZZZZZZZ 1 0 Z Z 0000
75 +0 1 1 0000010000100011000 ZZZZZZZZZZZZ 010000000011 ZZZZZZZZZZZZ 0 0 Z Z 0000
80 +1 1 1 0000010000100011000 ZZZZZZZZZZZZ 010000000011 ZZZZZZZZZZZZ 0 1 Z Z 0000
80 +2 1 1 0000010000100011000 ZZZZZZZZZZZZ 010000000011 ZZZZZZZZZZZZ 0 1 Z Z 0100
85 +1 1 1 0000010000100011000 ZZZZZZZZZZZZ 010000000011 ZZZZZZZZZZZZ 0 0 Z Z 0100
85 +2 1 1 0000000011000000100 ZZZZZZZZZZZZ 010000000011 ZZZZZZZZZZZZ 0 0 Z Z 0100
85 +4 1 1 0000000011000000100 ZZZZZZZZZZZZ 000000000000 ZZZZZZZZZZZZ 0 0 Z Z 0100
S8 44
VHDL: de la tecnología a la arquitectura de computadores. José J. Ruz Ortiz, Síntesis 1997
Practica 8 : Diseño de un Computador con VHDL
Objetivos:
Diseño de un computador.
Práctica a realizar:
Resultados a entregar:
Documentación del diseño incluyendo:
1. Especificación completa y precisa de la arquitectura del computador.
2. Listado VHDL comentado de los programas correspondientes a cada modelo.
3. Visualización de los resultados y/o valores de los buses y registros en el proceso de
ejecución de un programa de test.
S8 45
VHDL: de la tecnología a la arquitectura de computadores. José J. Ruz Ortiz, Síntesis 1997
Arquitectura del DLX (subconjunto)
Repertorio de Instrucciones
Instrucción Simbólico Operación
Menor que (R) slt r1, r2, r3 if (r2 < r3) r1<-1 else r1<-0
Menor que (I) slti r1, r2, #n if (r2 < n) r1<-1 else r1<-0
Mayor que (R) sgt r1, r2, r3 if (r2 > r3) r1<-1 else r1<-0
Mayor que (I) sgti r1, r2, #n if (r2 > n) r1<-1 else r1<-0
Igual (R) seq r1, r2, r3 if (r2 = r3) r1<-1 else r1<-0
Igual (I) seqi r1, r2, n if (r2 = n) r1<-1 else r1<-0
Arquitectura
No igual (R) sne r1, r2, r3 if (r2 ≠ r3) r1<-1 else r1<-0
No igual (I) sne r1, r2, #n if (r2 ≠ n) r1<-1 else r1<-0
Bifurcación reg. jr r1 pc Å r1
S8 46
VHDL: de la tecnología a la arquitectura de computadores. José J. Ruz Ortiz, Síntesis 1997