Semana 14 - Hypatia CUCEI

Anuncio
Actividades de aprendizaje de Seminario de Resolución de
Problemas de Arquitectura de Computadoras
Actividad 14: “Procesador de 8-bits”
Implementación de Procesadoren HDL (verilog, VHDL) (1 semanas)
1. Objetivo:
El alumno conocerá la forma de modelar un procesador pequeño para ser
utilizado posteriormente en los esquemas de simulación y/o implantación, en
spartan 6
Al procesador que describimos se tiene que aumentar 3 instrucciones más a las
ya existentes, asi como agregar al esquema de la máquina de estados des
procesador estas nuevas instrucciones.
Descripción del procesador:
A continuación se describe un microprocesador sencillo en VHDL. El
procesador tiene un bus de datos bidireccional de 8 bits. Un bus de direcciones de
salida de 8 bits. Una señal de lectura escritura (a uno indica lectura y a cero
escritura). Una señal de reloj y una de reset. Internamente debe haber un
acumulador de 8 bits, el registro de instrucción de 3 bits, y el programa counter de
8 bits. El micro cuenta con 8 instrucciones. Las instrucciones están formadas por
dos bytes, en el primero se pone el código, y en el segundo el operando, salvo en
la _ultima que solo tiene un byte. A continuación se muestran las instrucciones
junto con su codifacion:
ld a,(xx) Carga el acumulador con lo que haya en la posición de memoria
indicada por el operando. (000)
ld (xx),a Carga en la posición xx el contenido del acumulador. (001)
and a,(xx) Realiza la operación and entre el acumulador y lo que haya en la
posición xx. El resultado se guarda en el acumulador. (010)
add a,(xx) Lo mismo que la anterior pero la operación es la suma. (011)
sub a,(xx) Al acumulador se le resta lo que haya en la posicion xx. El
resultado se guarda en el acumulador. (100)
jz xx Salta a la posición xx si el acumulador es cero. (101)
jmp xx Salta a la posición xx. (110)
nop No hace nada. (111)
La máquina de estados del procesador que mostramos arriba. Se parte del
estado inicial de reset de manera que, en este estado, todo está inicializado a
cero; esto significa que la primera instrucción que se ejecuta está en la dirección
de cero. Al comienzo de la instrucción, obteniéndose su código. Si la operación es
la de no hacer nada, vuelve de nuevo al estado de búsqueda, si no, pasa al estado
de ejecución. En el estado de ejecución pueden ocurrir dos cosas: que la
operación sea de salto, en cuyo caso actualiza el PC y luego vuelve al estado de
búsqueda, o bien que se trate de cualquier otra operación, en cuyo caso el
operando de la instrucción se encuentra en la posición de memoria del segundo
argumento, por lo que se tiene que poner esta dirección en el bus de direcciones y
leer el contenido, pasándole al siguiente estado que es el de la ejecución particular
de cada instrucción. Esto quiere decir que cada instrucción tarda como mucho tres
ciclos en completarse.
Realizar un procesador es relativamente sencillo en VHDL o Verilog.
Además tienen todos una estructura parecida por lo que resulta facil añadir
instrucciones y hacer el procesador lo complicado que se desee. En el caso simple
del procesador propuesto, se puede abordar el problema con una simple máquina
de estados, en la cual hay un estado inicial de reset al que le sigue el de busqueda
de instrucción. Dependiendo de la instrucción se lee el siguiente operando y se
actúa en consecuencia.
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY procesador IS
PORT( clk,rst: IN std_logic;
r_w: OUT std_logic;
dir: OUT std_logic_vector(7 DOWNTO 0);
dat: INOUT std_logic_vector(7 DOWNTO 0));
END procesador;
ARCHITECTURE descripcion OF procesador IS
TYPE estado IS (inicial,busqueda,ejec,ldxxa,ldaxx,anda,adda,suba);
SIGNAL a,pc,ir: std_logic_vector(7 DOWNTO 0);
SIGNAL rdat_in,dat_in,dat_out: std_logic_vector(7 DOWNTO 0);
SIGNAL rwaux,seldir: std_logic;
SIGNAL presente: estado:=inicial;
BEGIN
fsm:PROCESS(clk)
BEGIN
IF clk='1' THEN
CASE presente IS
WHEN inicial =>
seldir<='1'; -- dir<=pc
pc<=(OTHERS=>'0');
rwaux<='1';
ir<=(OTHERS=>'0');
a<=(OTHERS=>'0');
presente<=busqueda;
WHEN busqueda=>
ir<=dat_in;
pc<=pc+1;
IF dat_in(2 DOWNTO 0)="111" THEN
presente<=busqueda;
ELSE
presente<=ejec;
END IF;
WHEN ejec =>
seldir<='0'; -- dir<=dat_in
pc<=pc+1;
presente<=busqueda;
CASE ir(2 DOWNTO 0) IS
WHEN "000" =>
presente<=ldaxx;
WHEN "001" =>
dat_out<=a;
rwaux<='0'; -- Escribir
presente<=ldxxa;
WHEN "010" =>
presente<=anda;
WHEN "011" =>
presente<=adda;
WHEN "100" =>
presente<=suba;
WHEN "101" =>
seldir<='1';
IF a=0 THEN
pc<=dat_in;
END IF;
WHEN "110" =>
seldir<='1';
pc<=dat_in;
WHEN OTHERS => NULL;
END CASE;
WHEN ldaxx =>
a<=dat_in;
seldir<='1';
presente<=busqueda;
WHEN ldxxa =>
rwaux<='1';
seldir<='1';
presente<=busqueda;
WHEN anda =>
a<=a AND dat_in;
seldir<='1';
presente<=busqueda;
WHEN adda =>
a<=a+dat_in;
seldir<='1';
presente<=busqueda;
WHEN suba =>
a<=a-dat_in;
seldir<='1';
presente<=busqueda;
END CASE;
IF rst='1' THEN
presente<=inicial;
END IF;
END IF;
END PROCESS fsm;
latch_in: PROCESS(clk)
BEGIN
IF clk='1' THEN
rdat_in<=dat_in;
END IF;
END PROCESS latch_in;
dir<=pc WHEN seldir='1' ELSE rdat_in; -- Multiplexor de las direcciones
r_w<=rwaux;
dat<=dat_out WHEN rwaux='0' ELSE (OTHERS=>'Z'); -- Buffer de Salida
dat_in<=dat;
END descripcion;
Ahora se tiene que meter el patrón para poder simular, este patrón de simulación se tiene que
construir con las instrucciones mensionadas arriba, y generando su código de operación
instrucción
ld a,(01)
and a,(02)
ld (03),a
Código de operación
00000000
00000001
00000010
00000010
00000001
00000011
Ahora si se puede introducir el patrón de prueba
1. 00000000
2. 00000001
3. 00000010
4. 00000010
5. 00000001
6. 00000011
Que es el correspondiente al código de operación de las instrucciones para las que fue diseñado el
procesador.
Procedimiento:
i.
Diseñar una modificación al procesador descrito aquí, agregar 3
instrucciones más a las ya existentes, proponiendo el código de
operación.
ii.
iii.
Describir (data path) la circulación de datos del procesador en un
esquema.
Mostrar la simulación en algún en alguna herramienta de este
procesador, que tuviste que haber implementado en VHDL o Verilog.
Evaluación
La calificación de cada práctica se divide en dos partes.
50% es correspondiente a la entrega funcional de la practica en hora clase y envío
del proyecto, (toda la carpeta) en un solo archivo zip llamado, actividad_xx.zip a la
plataforma proymoodle.
Los Archivo(s) “.v” ó “.vhd” deben tener este formato al principio del archivo, (Fig.1)
Fig. 1 Ejemplo de la cabecera de archivos .v/.vhd.
La práctica se entregara con un reporte que debe contener al menos lo siguiente:
Introducción
Objetivos
Desarrollo
Conclusiones
Se tomaran en consideración para la evaluación de la práctica además del contenido
técnico de la misma, la escritura y formato de ésta.
Descargar