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.