InicioCiencia EducacionDiseño de una computadora digital en VHDL para fpga Basys 2

Diseño de una computadora digital en VHDL para fpga Basys 2

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

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
Datos archivados del Taringa! original
0puntos
224visitas
0comentarios
Actividad nueva en Posteamelo
0puntos
1visitas
0comentarios
Dar puntos:

Dejá tu comentario

0/2000

Autor del Post

T
Tanori93🇦🇷
Usuario
Puntos0
Posts63
Ver perfil →
PosteameloArchivo Histórico de Taringa! (2004-2017). Preservando la inteligencia colectiva de la internet hispanohablante.

CONTACTO

18 de Septiembre 455, Casilla 52

Chillán, Región de Ñuble, Chile

Solo correo postal

© 2026 Posteamelo.com. No afiliado con Taringa! ni sus sucesores.

Contenido preservado con fines históricos y culturales.