Check the new version here

Popular channels

Programación de un microprocesador en VHDL

Diseño



DESCRIPCIÓN DE COMPONENTES Y SUS FUNCIONES

Memoria: contiene el conjunto de instrucciones a ejecutarse (programa) así como también pueden ser almacenados en la misma, datos temporales.

PC (Program Counter o Contador de Programa): registro contador que lleva la secuencia del programa. Contiene la dirección de la instrucción que esta próxima a ejecutarse. Cada vez que se ejecuta una instrucción, el PC se incrementa en uno para poder direccionar la siguiente instrucción.

MAR (Memory Address Register o Registro de Direcciones de Memoria): registro que direcciona la memoria, ya sea para leer de ella una instrucción o para leer o escribir un dato en cualquier localidad.

MBR (Memory Buffer Register o Registro Separador de Memoria): es el registro que captura toda información que sale de la memoria. En la realidad el registro MBR y el Buffer asociado pueden quedar constituidos en un solo registro bidireccional para leer o escribir en la memoria.

IR (Instruction register o registro de instrucción): es el registro que se encarga de recibir el código de operación de la instrucción que se va a ejecutar, para proceder a decodificarlo.

ID (Instruction decoder o Decodificador de instrucción): es un decodificador cuya función es decodificar el código de operación.

T (Contador de tiempo): su función es incrementarse con cada pulso de reloj para proporcionar la secuencia de señales de tiempo que realizan las microoperaciones.

TD (Time decoder o decodificador de tiempo): decodificador que proporciona salidas discretas de tiempo según el avance del contador de tiempo T.

OSC (Oscilador): genera la señal de reloj.

ALU (Arithmetic Logic Unit o unidad lógica - aritmética): en ella se llevan a cabo todas las operaciones lógicas y aritméticas que el computador será capaz de realizar.
A (Acumulador): registro que almacena (acumula) los resultados de operaciones realizadas en la ALU.

F (flags o registro de banderas): registro en el que se guarda en forma de 8 bits individuales el estado del computador después que la ALU ha realizado una operación, como por ejemplo: si existió carry, si el resultado fue cero o si el número es positivo o negativo.

B (Buffer de entrada): Buffer que permite tomar datos del exterior del computador.

C (Registro de salida): registro que se comunica con el exterior del computador y que permite enviar información hacia afuera del mismo.

Circuiteria de control: Tiene como entradas la decodificación de la instrucción qi y la decodificación del tiempo ti y produce salidas que permiten el control de todas las líneas que controlan a los dispositivos que conforman el computador.

Código para el modulo VHDL

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

-- SEÑALES DE CONTROL DEL FPGA BASYS 2
entity CPU is
Port ( ENTRADA : in STD_LOGIC_VECTOR (7 downto 0);
SALIDA : out STD_LOGIC_VECTOR (7 downto 0);
RELOJ : in STD_LOGIC);
end CPU;

architecture Behavioral of CPU is

-- SEÑALES DE CONTROL + SEÑALES DE COMPONENTES + SEÑAL DE INICIALIZACIÓN
SIGNAL TIEMPO : STD_LOGIC_VECTOR (2 DOWNTO 0) := "000";
SIGNAL MAR, MBR, IR : STD_LOGIC_VECTOR (7 DOWNTO 0);
SIGNAL ACOMULADOR : STD_LOGIC_VECTOR (7 DOWNTO 0) := "00000000";
SIGNAL PC : STD_LOGIC_VECTOR (7 DOWNTO 0) := "00000000";
SIGNAL FINALIZADO : STD_LOGIC := '1';

-- MEMORIA DE PROGRAMACION (RAM --> MEMORIA DE ACCESO ALEATORIO)
TYPE RAM_array IS ARRAY ( 0 TO 255 ) OF STD_LOGIC_VECTOR ( 7 DOWNTO 0 );
SIGNAL RAM : RAM_array := (0 => X"00", 1 => X"05", 2 => X"0E", 3=>X"FF", 4=>X"FF",5=>X"FF",6=>X"FF",7=>X"FF",9=>X"FF",10=>X"FF", others => x"FF"; );
ATTRIBUTE RAM_STYLE : STRING;
ATTRIBUTE RAM_STYLE OF RAM: SIGNAL IS "distributed";
BEGIN

-- INICIALIZACIÓN DEL CICLO FETCH O DE BUSQUEDA + SECUENCIA DE MICROOPERACIONES
PROCESS(RELOJ)
BEGIN
IF RELOJ'EVENT AND RELOJ= '1' AND FINALIZADO = '1' THEN

-- CICLO FETCH
IF TIEMPO = "000" THEN
MAR <= PC;
TIEMPO <= TIEMPO + 1;
END IF;
IF TIEMPO = "001" THEN
MBR <= RAM(TO_INTEGER(UNSIGNED(MAR)));
PC <= PC + 1 ;
TIEMPO <= TIEMPO + 1;
END IF;
IF TIEMPO = "010" THEN
IR <= MBR;
TIEMPO<= TIEMPO + 1;
END IF;

-- SECUENCIA DE MICROOPERACIONES

CASE IR is

-- LDA nn
WHEN X"00" =>
IF TIEMPO = "011" THEN
MAR <= PC;
TIEMPO <= TIEMPO +1;
END IF;
IF TIEMPO = "100" THEN
MBR <= RAM(TO_INTEGER(UNSIGNED(MAR)));
PC <= PC +1;
TIEMPO<= TIEMPO +1;
END IF;
IF TIEMPO = "101" THEN
ACOMULADOR <= MBR;
TIEMPO<= "000" ;
END IF;

-- LDA (nn)
WHEN X"01" =>
IF TIEMPO= "011" THEN
MAR <= PC;
TIEMPO <= TIEMPO + 1;
END IF;
IF TIEMPO = "100" THEN
MBR <= RAM(TO_INTEGER(UNSIGNED(MAR)));
PC <= PC + 1;
TIEMPO <= TIEMPO + 1;
END IF;
IF TIEMPO = "101" THEN
MAR <= MBR;
TIEMPO <= TIEMPO + 1;
END IF;
IF TIEMPO = "110" THEN
MBR <= RAM(TO_INTEGER(UNSIGNED(MAR)));
TIEMPO <= TIEMPO + 1;
END IF;
IF TIEMPO = "111" THEN
ACOMULADOR <= MBR;
TIEMPO <= "000";
END IF;

-- ADD nn
WHEN X"02" =>
IF TIEMPO = "011" THEN
MAR <= PC;
TIEMPO <= TIEMPO + 1;
END IF;
IF TIEMPO = "100" THEN
MBR <= RAM(TO_INTEGER(UNSIGNED(MAR)));
PC <= PC + 1;
TIEMPO <= TIEMPO + 1;
END IF;
IF TIEMPO = "101" THEN
ACOMULADOR <= ACOMULADOR + MBR;
TIEMPO <= "000";
END IF;

-- ADD (nn)
WHEN X"03" =>
IF TIEMPO = "011" THEN
MAR <= PC;
TIEMPO <= TIEMPO + 1;
END IF;
IF TIEMPO = "100" THEN
MBR <= RAM(TO_INTEGER(UNSIGNED(MAR)));
PC <= PC + 1;
TIEMPO <= TIEMPO + 1;
END IF;
IF TIEMPO = "101" THEN
MAR <= MBR;
TIEMPO <= TIEMPO + 1;
END IF;
IF TIEMPO = "110" THEN
MBR <= RAM(TO_INTEGER(UNSIGNED(MAR)));
TIEMPO <= TIEMPO + 1 ;
END IF;
IF TIEMPO = "111" THEN
ACOMULADOR <= ACOMULADOR + MBR;
TIEMPO <= "000";
END IF;

-- SUB nn
WHEN X"04" =>
IF TIEMPO = "011" THEN
MAR <= PC;
TIEMPO <= TIEMPO + 1;
END IF;
IF TIEMPO = "100" THEN
MBR <= RAM(TO_INTEGER(UNSIGNED(MAR)));
PC <= PC + 1;
TIEMPO <= TIEMPO +1;
END IF;
IF TIEMPO = "101" THEN
ACOMULADOR <= ACOMULADOR - MBR;
TIEMPO <= "000";
END IF;

-- SUB (nn)
WHEN X"05" =>
IF TIEMPO = "011" THEN
MAR <= PC;
TIEMPO <= TIEMPO +1;
END IF;
IF TIEMPO = "100" THEN
MBR <= RAM(TO_INTEGER(UNSIGNED(MAR)));
PC <= PC + 1 ;
TIEMPO <= TIEMPO + 1;
END IF;
IF TIEMPO = "101" THEN
MAR <= MBR;
TIEMPO <= TIEMPO+ 1;
END IF;
IF TIEMPO = "110" THEN
MBR <= RAM(TO_INTEGER(UNSIGNED(MAR)));
TIEMPO <= TIEMPO + 1;
END IF;
IF TIEMPO = "111" THEN
ACOMULADOR <= ACOMULADOR - MBR;
TIEMPO <= "000";
END IF;

-- STA (nn)
WHEN X"06" =>
IF TIEMPO = "011" THEN
MAR <= PC;
TIEMPO <= TIEMPO + 1;
END IF;
IF TIEMPO = "100" THEN
MBR <= RAM(TO_INTEGER(UNSIGNED(MAR)));
PC <= PC + 1;
TIEMPO <= TIEMPO + 1;
END IF;
IF TIEMPO = "101" THEN
MAR <= MBR;
TIEMPO <= TIEMPO + 1;
END IF;
IF TIEMPO = "110" THEN
RAM(TO_INTEGER(UNSIGNED (MAR))) <= ACOMULADOR;
TIEMPO <= "000";
END IF;

-- JMP (nn)
WHEN X"07" =>
IF TIEMPO = "011" THEN
MAR <= PC;
TIEMPO <= TIEMPO + 1;
END IF;
IF TIEMPO = "100" THEN
MBR <= RAM(TO_INTEGER(UNSIGNED(MAR)));
TIEMPO <= TIEMPO + 1 ;
END IF;
IF TIEMPO = "101" THEN
PC <= MBR;
TIEMPO <= "000";
END IF;

-- JPZ (nn)
WHEN X"08" =>
IF TIEMPO = "011" AND ACOMULADOR = "000" THEN
MAR <= PC;
TIEMPO <= TIEMPO + 1;
END IF;
IF TIEMPO = "100" AND ACOMULADOR = "000" THEN
MBR <= RAM(TO_INTEGER(UNSIGNED(MAR)));
TIEMPO <= TIEMPO + 1; ----------------------------> CHECAR
END IF;
IF TIEMPO = "101" AND ACOMULADOR = "000" THEN
TIEMPO <= "000";
END IF;
IF TIEMPO = "011" AND ACOMULADOR /= "000" THEN
PC <= PC + 1;
TIEMPO <= "000" ;
END IF;

-- INC A
WHEN X"09" =>
IF TIEMPO = "011" THEN
ACOMULADOR <= ACOMULADOR + 1 ;
TIEMPO <= "000";
END IF;

-- DEC A
WHEN X"0A" =>
IF TIEMPO = "011" THEN
ACOMULADOR <= ACOMULADOR - 1;
TIEMPO <= "000";
END IF;

-- SHL A
WHEN X"0B" =>
IF TIEMPO = "011" THEN
ACOMULADOR(7) <= ACOMULADOR(6);
ACOMULADOR(6) <= ACOMULADOR(5);
ACOMULADOR(5) <= ACOMULADOR(4);
ACOMULADOR(4) <= ACOMULADOR(3);
ACOMULADOR(3) <= ACOMULADOR(2);
ACOMULADOR(2) <= ACOMULADOR(1);
ACOMULADOR(1) <= ACOMULADOR(0);
ACOMULADOR(0) <= '0' ;
TIEMPO <= "000";
END IF;

-- SHR A
WHEN X"0C" =>
IF TIEMPO = "011" THEN
ACOMULADOR(0) <= ACOMULADOR(1);
ACOMULADOR(1) <= ACOMULADOR(2);
ACOMULADOR(2) <= ACOMULADOR(3);
ACOMULADOR(3) <= ACOMULADOR(4);
ACOMULADOR(4) <= ACOMULADOR(5);
ACOMULADOR(5) <= ACOMULADOR(6);
ACOMULADOR(6) <= ACOMULADOR(7);
ACOMULADOR(7) <= '0' ;
TIEMPO <= "000";
END IF;

-- IN A,B
WHEN X"0D" =>
IF TIEMPO = "011" THEN
ACOMULADOR <= ENTRADA;
TIEMPO <= "000";
END IF;

-- OUT C,A
WHEN X"0E" =>
IF TIEMPO <= "011" THEN
SALIDA <= ACOMULADOR;
TIEMPO <= "000";
END IF;

-- HALT
WHEN X"0F" =>
IF TIEMPO <= "011" THEN
FINALIZADO <= '0';
TIEMPO<= "000" ;
END IF;

-- OTRO POSIBLE CASO
WHEN OTHERS =>
NULL;
END CASE;
END IF;
END PROCESS;

end Behavioral;

Código para el modulo UCF Basys 2

NET "SALIDA[0]" LOC = M5;
NET "SALIDA[1]" LOC = M11;
NET "SALIDA[2]" LOC = P7;
NET "SALIDA[3]" LOC = P6;
NET "SALIDA[4]" LOC = N5;
NET "SALIDA[5]" LOC = N4;
NET "SALIDA[6]" LOC = P4;
NET "SALIDA[7]" LOC = G1;
NET "ENTRADA[0]" LOC = P11;
NET "ENTRADA[1]" LOC = L3;
NET "ENTRADA[2]" LOC = K3;
NET "ENTRADA[3]" LOC = B4;
NET "ENTRADA[4]" LOC = G3;
NET "ENTRADA[5]" LOC = F3;
NET "ENTRADA[6]" LOC = E2;
NET "ENTRADA[7]" LOC = N3;
NET "RELOJ" LOC = B8;

Ejemplo de programas

Ejemplo 1
Carga en la memoria: 00, 04, 02, 05, 0E. Resultado: 00001001

Ejemplo 2
Carga en la memoria: 01, 03, 02, 04, 0E. Resultado: 00001000

En el siguiente link se encuentra el set de instrucciones junto con el conjunto de micro operaciones que la computadora realiza.

https://www.dropbox.com/s/6mhb2ogx08cmbwi/DIGITALES%20CPU.rar?dl=0
0
0
0
2
0No comments yet