UNIVERSIDAD NACIONAL AUTÓNOMA DE MÉXICO
Semestre: 2021-1
FACULTAD DE INGENIERÍA
Microprocesadores y Microcontroladores
Página 1 de 22
Prof. Dr. Saúl De La Rosa Nieves Grupo 3
TAREA-EXAMEN # 2
Microcontrolador de 8 bits
Título:
Fecha: 08-11-2020
Preparado por: Garcia Hernandez Carlos
Evaluación:
I. Planteamiento del proyecto
- Objetivo:
Diseñar un microcontrolador utilizando los conceptos adquiridos previamente en la materia de diseño
digital, utilizando como herramienta de apoyo en lenguaje descriptivo “VHDL”, para poder verificar
como se procesa la información dentro de un microcontrolador.
- Descripción del proyecto
El proyecto consiste en elabora un procesador de 8 bits, agregar periféricos con el fin de poder
implementar un microcontrolador.
II. Requerimientos del proyecto
- El procesador deberá tener un BUS de 8 bits.
- Deberá ser capaz de realizar salto a subrutina,
- Su ALU se le deberá anexar las operaciones, resta, multiplicación y división, además de una bandera
que indique operación incorrecta.
- Debe tener un puerto paralelo de entrada-salida.
- Debe tener un puerto serie de entrada-salida.
- Un generador de PWM en el que podamos controlar el ancho de pulso.
III. Metodología
- Se diseña el generador de ciclo de máquina, haciendo uso de un contador y un decodificador,
generamos el ciclo de maquina que nos permite activar cada uno de los registros.
- Haciendo uso de Flip-Flops D diseñamos los registros necesarios para la implementación del
circuito, recordando que todos estos deben ser de 8 bits.
- El contador de programa se implementa nuevamente usando Flip-Flops D, además de que se
implementaron dos habilitadores de carga, uno que nos permite saltar a subrutina, y otro que nos
devuelve a la instrucción anterior.
- El decodificador de instrucción se realiza por medio de la implementación de compuertas, ya que
este es un circuito combinacional.
- La alu consta de 7 operaciones (XOR, Invertir, AND, OR, SUB, MULT y DIV).
UNIVERSIDAD NACIONAL AUTÓNOMA DE MÉXICO
Semestre: 2021-1
FACULTAD DE INGENIERÍA
Microprocesadores y Microcontroladores
Página 2 de 22
Prof. Dr. Saúl De La Rosa Nieves Grupo 3
- Para poder implementar la alu, se diseñaron un medio sumador y un sumador completo, ya que la
construcción de un restador, multiplicador o divisor se realiza por medio del uso de sumador y
medio- sumador.
- El puerto paralelo s implemento usando dos registros paralelos, cada uno de estos registros se carga
con una señal de reloj.
- El puerto serie consta de dos señales, una de entrada y una de salida, la señal de entrada debe venir
acompañada de los pulsos de reloj correspondiente para poder realizar el corrimiento en el registro
de entrada, la señal de salida va acompañada de los pulsos necesarios para que otro puerto serie la
pueda recibir.
- El generador PWM consta de un contador y un comparador, dicho dispositivo compara el valor del
contador con el valor cargado, con lo cual se genera una señal de diferentes anchos de pulso.
IV. Diseño
- Generador de ciclo de maquina
3
Contador Decodificador A
B
CLK C
D
E
Codigo VHDL
library ieee;
use ieee.std_logic_1164.all;
entity GCM is
port(clk,rst: in std_logic;
A,B,C,D,E: out std_logic);
end entity;
architecture algo of GCM is
signal A1,A1N,A2,A2N,A3,A3N: std_logic;
signal D1,D2,D3: std_logic;
begin
--Flip-Flops tipo D
process(clk,rst)
begin
if (rst='1') then
A1<='0';
A1N<='1';
A2<='0';
A2N<='1';
A3<='0';
A3N<='1';
elsif (clk'event and clk='1') then
A1<=D1;
UNIVERSIDAD NACIONAL AUTÓNOMA DE MÉXICO
Semestre: 2021-1
FACULTAD DE INGENIERÍA
Microprocesadores y Microcontroladores
Página 3 de 22
Prof. Dr. Saúl De La Rosa Nieves Grupo 3
A1N<=not D1;
A2<=D2;
A2N<=not D2;
A3<=D3;
A3N<=not D3;
end if;
end process;
--Diseño del contador de 0 a 7
D1<=(A1 and A2N)or(A1 and A3N)or(A1N and A2 and A3);
D2<=(A2N and A3)or(A2 and A3N);
D3<=A3N;
--Decodificador
A<=A1N and A2N and A3;
B<=A1N and A2 and A3;
C<=A1 and A2N and A3;
D<=A1 and A2 and A3;
E<=(A1 and A2N and A3N)or(A1N and A2 and A3N);
end;
Contador de programa.
L1
L2 DDR
H1 PC
H2
CLK
RST
Código VHDL del contador de programa
library ieee;
use ieee.std_logic_1164.all;
entity PC is
port(clk,rst,H1,H2: in std_logic;---H1 y H2 son los pulsos de reloj respectivos de L1 y L2
L1,L2: in std_logic_vector(7 downto 0);--L1 y L2 son los registros que contienen el valor a cargar
--L1 la direccion de subrutina y L2 la direecion de la
--instruccion anterior
A: out std_logic_vector(7 downto 0));
end entity;
architecture algo of PC is
signal clk1,clk2,clk3,clk4,clk5,clk6,clk7: std_logic;
UNIVERSIDAD NACIONAL AUTÓNOMA DE MÉXICO
Semestre: 2021-1
FACULTAD DE INGENIERÍA
Microprocesadores y Microcontroladores
Página 4 de 22
Prof. Dr. Saúl De La Rosa Nieves Grupo 3
signal A1N,A2N,A3N,A4N,A5N,A6N,A7N,A8N: std_logic;
signal D1,D2,D3,D4,D5,D6,D7,D8,H: std_logic;
begin
--Flip-Flops que generan el contador de 8 bits.
process(clk,rst,H)
begin
if (rst='1') then
A(0)<='0';
A1N<='1';
elsif (H='1') then
A(0)<=D1;
A1N<=not D1;
elsif (clk'event and clk='1') then
A(0)<=D1;
A1N<=not D1;
end if;
end process;
process(clk1,rst,H)
begin
if (rst='1') then
A(1)<='0';
A2N<='1';
elsif (H='1') then
A(1)<=D2;
A2N<=not D2;
elsif (clk1'event and clk1='1') then
A(1)<=D2;
A2N<=not D2;
end if;
end process;
process(clk2,rst,H)
begin
if (rst='1') then
A(2)<='0';
A3N<='1';
elsif (H='1') then
A(2)<=D3;
A3N<=not D3;
elsif (clk2'event and clk2='1') then
A(2)<=D3;
A3N<=not D3;
end if;
end process;
process(clk3,rst,H)
begin
UNIVERSIDAD NACIONAL AUTÓNOMA DE MÉXICO
Semestre: 2021-1
FACULTAD DE INGENIERÍA
Microprocesadores y Microcontroladores
Página 5 de 22
Prof. Dr. Saúl De La Rosa Nieves Grupo 3
if (rst='1') then
A(3)<='0';
A4N<='1';
elsif (H='1') then
A(3)<=D4;
A4N<=not D4;
elsif (clk3'event and clk3='1') then
A(3)<=D4;
A4N<=not D4;
end if;
end process;
process(clk4,rst,H)
begin
if (rst='1') then
A(4)<='0';
A5N<='1';
elsif (H='1') then
A(4)<=D5;
A5N<=not D5;
elsif (clk4'event and clk4='1') then
A(4)<=D5;
A5N<=not D5;
end if;
end process;
process(clk5,rst,H)
begin
if (rst='1') then
A(5)<='0';
A6N<='1';
elsif (H='1') then
A(5)<=D6;
A6N<=not D6;
elsif (clk5'event and clk5='1') then
A(5)<=D6;
A6N<=not D6;
end if;
end process;
process(clk6,rst,H)
begin
if (rst='1') then
A(6)<='0';
A7N<='1';
elsif (H='1') then
A(6)<=D7;
A7N<=not D7;
UNIVERSIDAD NACIONAL AUTÓNOMA DE MÉXICO
Semestre: 2021-1
FACULTAD DE INGENIERÍA
Microprocesadores y Microcontroladores
Página 6 de 22
Prof. Dr. Saúl De La Rosa Nieves Grupo 3
elsif (clk6'event and clk6='1') then
A(6)<=D7;
A7N<=not D7;
end if;
end process;
process(clk7,rst,H)
begin
if (rst='1') then
A(7)<='0';
A8N<='1';
elsif (H='1') then
A(7)<=D8;
A8N<=not D8;
elsif (clk7'event and clk7='1') then
A(7)<=D8;
A8N<=not D8;
end if;
end process;
--Multiplexor que asigna a D el valo correspondiente
H<=H1 or H2;
D1<=(A1N and not(H1) and not(H2))or(H2 and L2(0))or(H1 and L1(0));
D2<=(A2N and not(H1) and not(H2))or(H2 and L2(1))or(H1 and L1(1));
D3<=(A3N and not(H1) and not(H2))or(H2 and L2(2))or(H1 and L1(2));
D4<=(A4N and not(H1) and not(H2))or(H2 and L2(3))or(H1 and L1(3));
D5<=(A5N and not(H1) and not(H2))or(H2 and L2(4))or(H1 and L1(4));
D6<=(A6N and not(H1) and not(H2))or(H2 and L2(5))or(H1 and L1(5));
D7<=(A7N and not(H1) and not(H2))or(H2 and L2(6))or(H1 and L1(6));
D8<=(A8N and not(H1) and not(H2))or(H2 and L2(7))or(H1 and L1(7));
--Al ser un contador ascendente solo realizamos divisores de frecuencia
--Colocando en serie los flip flops
clk1<=A1N;
clk2<=A2N;
clk3<=A3N;
clk4<=A4N;
clk5<=A5N;
clk6<=A6N;
clk7<=A7N;
end;
UNIVERSIDAD NACIONAL AUTÓNOMA DE MÉXICO
Semestre: 2021-1
FACULTAD DE INGENIERÍA
Microprocesadores y Microcontroladores
Página 7 de 22
Prof. Dr. Saúl De La Rosa Nieves Grupo 3
Sumador
S
A
ADD
B OV
código VHDL del sumador
library ieee;
use ieee.std_logic_1164.all;
entity SUMA is
port( O: out std_logic_vector(7 downto 0);
A: in std_logic_vector(7 downto 0);
B: in std_logic_vector(7 downto 0);
OV: out std_logic);--bandera de sobreflujo
end entity;
architecture algo of SUMA is
signal Ci1,Ci2,Ci3,Ci4,Ci5,Ci6,Ci7,Ci8: std_logic;
begin
--Arreglo serie de sumadores.
O(0)<=not(Ci8) and (A(0)xor B(0));
Ci1<=A(0)and B(0);
O(1)<=not(Ci8) and (A(1) xor B(1) xor Ci1);
Ci2<=(A(1) and B(1))or(Ci1 and(A(1) xor B(1)));
O(2)<=not(Ci8) and (A(2) xor B(2) xor Ci2);
Ci3<=(A(2) and B(2))or(Ci2 and(A(2) xor B(2)));
O(3)<=not(Ci8) and (A(3) xor B(3) xor Ci3);
Ci4<=(A(3) and B(3))or(Ci3 and(A(3) xor B(3)));
O(4)<=not(Ci8) and (A(4) xor B(4) xor Ci4);
Ci5<=(A(4) and B(4))or(Ci4 and(A(4) xor B(4)));
O(5)<=not(Ci8) and (A(5) xor B(5) xor Ci5);
Ci6<=(A(5) and B(5))or(Ci5 and(A(5) xor B(5)));
O(6)<=not(Ci8) and (A(6) xor B(6) xor Ci6);
Ci7<=(A(6) and B(6))or(Ci6 and(A(6) xor B(6)));
O(7)<=not(Ci8) and (A(7) xor B(7) xor Ci7);
Ci8<=(A(7) and B(7))or(Ci7 and(A(7) xor B(7)));
OV<=Ci8; --Si sucede un acarreo el número no se puede representar pues hay un sobreflujo.
end;
UNIVERSIDAD NACIONAL AUTÓNOMA DE MÉXICO
Semestre: 2021-1
FACULTAD DE INGENIERÍA
Microprocesadores y Microcontroladores
Página 8 de 22
Prof. Dr. Saúl De La Rosa Nieves Grupo 3
Restador
S
A
SUB
B OV
Código VHDL
library ieee;
use ieee.std_logic_1164.all;
entity RESTA is
port( O: out std_logic_vector(7 downto 0);
A: in std_logic_vector(7 downto 0);
B: in std_logic_vector(7 downto 0);
OV,v1,v2: out std_logic);
end entity;
architecture algo of RESTA is
signal Ci0,H: std_logic;
signal aux,NB: std_logic_vector(7 downto 0);
signal Ci1,Ci2,Ci3,Ci4,Ci5,Ci6,Ci7,Ci8: std_logic;
begin
Ci0<='1';
NB<= not B;
aux(0)<=(A(0) xor NB(0) xor Ci0);
Ci1<=(A(0) and NB(0))or(Ci0 and(A(0) xor NB(0)));
aux(1)<=(A(1) xor NB(1) xor Ci1);
Ci2<=(A(1) and NB(1))or(Ci1 and(A(1) xor NB(1)));
aux(2)<=(A(2) xor NB(2) xor Ci2);
Ci3<=(A(2) and NB(2))or(Ci2 and(A(2) xor NB(2)));
aux(3)<=(A(3) xor NB(3) xor Ci3);
Ci4<=(A(3) and NB(3))or(Ci3 and(A(3) xor NB(3)));
aux(4)<=(A(4) xor NB(4) xor Ci4);
Ci5<=(A(4) and NB(4))or(Ci4 and(A(4) xor NB(4)));
aux(5)<=(A(5) xor NB(5) xor Ci5);
Ci6<=(A(5) and NB(5))or(Ci5 and(A(5) xor NB(5)));
aux(6)<=(A(6) xor NB(6) xor Ci6);
Ci7<=(A(6) and NB(6))or(Ci6 and(A(6) xor NB(6)));
aux(7)<=(A(7) xor NB(7) xor Ci7);
Ci8<=(A(7) and NB(7))or(Ci7 and(A(7) xor NB(7)));
H<=Ci8 xor aux(7);
O(0)<=H and aux(0);
UNIVERSIDAD NACIONAL AUTÓNOMA DE MÉXICO
Semestre: 2021-1
FACULTAD DE INGENIERÍA
Microprocesadores y Microcontroladores
Página 9 de 22
Prof. Dr. Saúl De La Rosa Nieves Grupo 3
O(1)<=H and aux(1);
O(2)<=H and aux(2);
O(3)<=H and aux(3);
O(4)<=H and aux(4);
O(5)<=H and aux(5);
O(6)<=H and aux(6);
O(7)<=H and aux(7);
v1<=Ci8;
V2<= aux(7);
OV<=not(H);
Multiplicador
R
A
MULT
B OV
Código VHDL
library ieee;
use ieee.std_logic_1164.all;
entity MUL is
port( O: out std_logic_vector(7 downto 0);
A: in std_logic_vector(7 downto 0);
B: in std_logic_vector(7 downto 0);
OV: out std_logic);
end entity;
architecture algo of MUL is
signal CM1,S2,S13,H: std_logic;
signal CM2,CM13,S3,S12: std_logic_vector(1 downto 0);
signal CM3,CM12,S4,S11: std_logic_vector(2 downto 0);
signal CM4,CM11,S5,S10: std_logic_vector(3 downto 0);
signal CM5,CM10,S6,S9: std_logic_vector(4 downto 0);
signal CM6,CM9,S7,S8: std_logic_vector(5 downto 0);
signal CM7,CM8: std_logic_vector(6 downto 0);
signal M: std_logic_vector(15 downto 0);
begin
--Bit M0 del resultado
M(0)<=A(0) and B(0);
--Digito M1 del resultado
M(1)<=(A(0) and B(1))xor(A(1) and B(0));
CM1<=(A(0) and B(1))and(A(1) and B(0));
--Bit M2 del resultado
S2<=(A(1) and B(1))xor(A(2) and B(0))xor CM1;
UNIVERSIDAD NACIONAL AUTÓNOMA DE MÉXICO
Semestre: 2021-1
FACULTAD DE INGENIERÍA
Microprocesadores y Microcontroladores
Página 10 de 22
Prof. Dr. Saúl De La Rosa Nieves Grupo 3
CM2(0)<=((A(1) and B(1))and(A(2) and B(0)))or(CM1 and((A(1) and B(1))xor(A(2) and B(0))));
M(2)<=(A(0) and B(2))xor(S2);
CM2(1)<=(A(0) and B(2))and(S2);
--Bit M3 del resultado
S3(0)<=(A(2) and B(1))xor(A(3) and B(0))xor CM2(0);
CM3(0)<=((A(2) and B(1))and(A(3) and B(0)))or(CM2(0) and((A(2) and B(1))xor(A(3) and B(0))));
S3(1)<=(A(1) and B(2))xor(S3(0))xor CM2(1);
CM3(1)<=((A(1) and B(2))and(S3(0)))or(CM2(1) and((A(1) and B(2))xor(S3(0))));
M(3)<=(A(0) and B(3))xor(S3(1));
CM3(2)<=(A(0) and B(3))and(S3(1));
--Bit M4 del resultado
S4(0)<=(A(3) and B(1))xor(A(4) and B(0))xor CM3(0);
CM4(0)<=((A(3) and B(1))and(A(4) and B(0)))or(CM3(0) and((A(3) and B(1))xor(A(4) and B(0))));
S4(1)<=(A(2) and B(2))xor(S4(0))xor CM3(1);
CM4(1)<=((A(2) and B(2))and(S4(0)))or(CM3(1) and((A(2) and B(2))xor(S4(0))));
S4(2)<=(A(1) and B(3))xor(S4(1))xor CM3(2);
CM4(2)<=((A(1) and B(3))and(S4(1)))or(CM3(2) and((A(1) and B(2))xor(S4(1))));
M(4)<=(A(0) and B(4))xor(S4(2));
CM4(3)<=(A(0) and B(4))and(S4(2));
--Bit M5 del resultado
S5(0)<=(A(4) and B(1))xor(A(5) and B(0))xor CM4(0);
CM5(0)<=((A(4) and B(1))and(A(5) and B(0)))or(CM4(0) and((A(4) and B(1))xor(A(5) and B(0))));
S5(1)<=(A(3) and B(2))xor(S5(0))xor CM4(1);
CM5(1)<=((A(3) and B(2))and(S5(0)))or(CM4(1) and((A(3) and B(2))xor(S5(0))));
S5(2)<=(A(2) and B(3))xor(S5(1))xor CM4(2);
CM5(2)<=((A(2) and B(3))and(S5(1)))or(CM4(2) and((A(2) and B(3))xor(S5(1))));
S5(3)<=(A(1) and B(4))xor(S5(2))xor CM4(3);
CM5(3)<=((A(1) and B(4))and(S5(2)))or(CM4(3) and((A(1) and B(4))xor(S5(2))));
M(5)<=(A(0) and B(5))xor(S5(3));
CM5(4)<=(A(0) and B(5))and(S5(3));
--Bit M6 del resultado
S6(0)<=(A(5) and B(1))xor(A(6) and B(0))xor CM5(0);
CM6(0)<=((A(5) and B(1))and(A(6) and B(0)))or(CM5(0) and((A(5) and B(1))xor(A(6) and B(0))));
S6(1)<=(A(4) and B(2))xor(S6(0))xor CM5(1);
CM6(1)<=((A(4) and B(2))and(S6(0)))or(CM5(1) and((A(4) and B(2))xor(S6(0))));
S6(2)<=(A(3) and B(3))xor(S6(1))xor CM5(2);
CM6(2)<=((A(3) and B(3))and(S6(1)))or(CM5(2) and((A(3) and B(3))xor(S6(1))));
S6(3)<=(A(2) and B(4))xor(S6(2))xor CM5(3);
CM6(3)<=((A(2) and B(4))and(S6(2)))or(CM5(3) and((A(2) and B(4))xor(S6(2))));
S6(4)<=(A(1) and B(5))xor(S6(3))xor CM5(4);
CM6(4)<=((A(1) and B(5))and(S6(3)))or(CM5(4) and((A(1) and B(5))xor(S6(3))));
M(6)<=(A(0) and B(6))xor(S6(4));
CM6(5)<=(A(0) and B(6))and(S6(4));
--Bit M7 del resultado
S7(0)<=(A(6) and B(1))xor(A(7) and B(0))xor CM6(0);
CM7(0)<=((A(6) and B(1))and(A(7) and B(0)))or(CM6(0) and((A(6) and B(1))xor(A(7) and B(0))));
S7(1)<=(A(5) and B(2))xor(S7(0))xor CM6(1);
CM7(1)<=((A(5) and B(2))and(S7(0)))or(CM6(1) and((A(5) and B(2))xor(S7(0))));
UNIVERSIDAD NACIONAL AUTÓNOMA DE MÉXICO
Semestre: 2021-1
FACULTAD DE INGENIERÍA
Microprocesadores y Microcontroladores
Página 11 de 22
Prof. Dr. Saúl De La Rosa Nieves Grupo 3
S7(2)<=(A(4) and B(3))xor(S7(1))xor CM6(2);
CM7(2)<=((A(4) and B(3))and(S7(1)))or(CM6(2) and((A(4) and B(3))xor(S7(1))));
S7(3)<=(A(3) and B(4))xor(S7(2))xor CM6(3);
CM7(3)<=((A(3) and B(4))and(S7(2)))or(CM6(3) and((A(3) and B(4))xor(S7(2))));
S7(4)<=(A(2) and B(5))xor(S7(3))xor CM6(4);
CM7(4)<=((A(2) and B(5))and(S7(3)))or(CM6(4) and((A(2) and B(5))xor(S7(3))));
S7(5)<=(A(1) and B(6))xor(S7(4))xor CM6(5);
CM7(5)<=((A(1) and B(6))and(S7(4)))or(CM6(5) and((A(1) and B(6))xor(S7(4))));
M(7)<=(A(0) and B(7))xor(S7(5));
CM7(6)<=(A(0) and B(7))and(S7(5));
--Bit M8 del resultado
S8(0)<=(A(7) and B(1))xor(CM7(0));
CM8(0)<=(A(7) and B(1))and(CM7(0));
S8(1)<=(A(6) and B(2))xor(S8(0))xor CM7(1);
CM8(1)<=((A(6) and B(2))and(S8(0)))or(CM7(1) and((A(6) and B(2))xor(S8(0))));
S8(2)<=(A(5) and B(3))xor(S8(1))xor CM7(2);
CM8(2)<=((A(5) and B(3))and(S8(1)))or(CM7(2) and((A(5) and B(3))xor(S8(1))));
S8(3)<=(A(4) and B(4))xor(S8(2))xor CM7(3);
CM8(3)<=((A(4) and B(4))and(S8(2)))or(CM7(3) and((A(4) and B(4))xor(S8(2))));
S8(4)<=(A(3) and B(5))xor(S8(3))xor CM7(4);
CM8(4)<=((A(3) and B(5))and(S8(3)))or(CM7(4) and((A(3) and B(5))xor(S8(3))));
S8(5)<=(A(2) and B(6))xor(S8(4))xor CM7(5);
CM8(5)<=((A(2) and B(6))and(S8(4)))or(CM7(5) and((A(2) and B(6))xor(S8(4))));
M(8)<=(A(1) and B(7))xor(S8(5))xor CM7(6);
CM8(6)<=((A(1) and B(7))and(S8(5)))or(CM7(6) and((A(1) and B(7))xor(S8(5))));
--Bit M9 del resultado
S9(0)<=(A(7) and B(2))xor(CM8(0))xor(CM8(1));
CM9(0)<=((A(7) and B(2))and(CM8(0)))or(CM8(1) and((A(7) and B(2))xor(CM8(0))));
S9(1)<=(A(6) and B(3))xor(S9(0))xor CM8(2);
CM9(1)<=(((A(6) and B(3)))and(S9(0)))or(CM8(2) and((A(6) and B(3))xor(S9(0))));
S9(2)<=(A(5) and B(4))xor(S9(1))xor CM8(3);
CM9(2)<=((A(5) and B(4))and(S9(1)))or(CM8(4) and((A(5) and B(4))xor(S9(1))));
S9(3)<=(A(4) and B(5))xor(S9(2))xor CM8(4);
CM9(3)<=((A(4) and B(5))and(S9(2)))or(CM8(4) and((A(4) and B(5))xor(S9(2))));
S9(4)<=(A(3) and B(6))xor(S9(3))xor CM8(5);
CM9(4)<=((A(3) and B(6))and(S9(3)))or(CM8(5) and((A(3) and B(6))xor(S9(3))));
M(9)<=(A(2) and B(7))xor(S9(4))xor CM8(6);
CM9(5)<=((A(2) and B(7))and(S9(4)))or(CM8(6) and((A(2) and B(7))xor(S9(4))));
--Bit M10 del resultado
S10(0)<=(A(7) and B(3))xor(CM9(0))xor(CM9(1));
CM10(0)<=((A(7) and B(3))and(CM9(0)))or(CM9(1) and((A(7) and B(3))xor(CM9(0))));
S10(1)<=(A(6) and B(4))xor(S10(0))xor CM9(2);
CM10(1)<=((A(6) and B(4))and(S10(0)))or(CM9(2) and((A(6) and B(4))xor(S10(0))));
S10(2)<=(A(5) and B(5))xor(S10(1))xor CM9(3);
CM10(2)<=((A(5) and B(5))and(S10(1)))or(CM9(3) and((A(5) and B(5))xor(S10(1))));
S10(3)<=(A(4) and B(6))xor(S10(2))xor CM9(4);
CM10(3)<=((A(4) and B(6))and(S10(2)))or(CM9(4) and((A(4) and B(5))xor(S10(2))));
M(10)<=(A(3) and B(7))xor(S10(3))xor CM9(5);
UNIVERSIDAD NACIONAL AUTÓNOMA DE MÉXICO
Semestre: 2021-1
FACULTAD DE INGENIERÍA
Microprocesadores y Microcontroladores
Página 12 de 22
Prof. Dr. Saúl De La Rosa Nieves Grupo 3
CM10(4)<=((A(3) and B(7))and(S10(3)))or(CM9(5) and((A(3) and B(7))xor(S10(3))));
--Bit M11 del resultado
S11(0)<=(A(7) and B(4))xor(CM10(0))xor(CM10(1));
CM11(0)<=((A(7) and B(4))and(CM10(0)))or(CM10(1) and((A(7) and B(4))xor(CM10(0))));
S11(1)<=(A(6) and B(5))xor(S11(0))xor CM10(2);
CM11(1)<=((A(6) and B(5))and(S11(0)))or(CM10(2) and((A(6) and B(5))xor(S11(0))));
S11(2)<=(A(5) and B(6))xor(S11(1))xor CM10(3);
CM11(2)<=((A(5) and B(6))and(S11(1)))or(CM10(3) and((A(5) and B(6))xor(S11(1))));
M(11)<=(A(4) and B(7))xor(S11(2))xor CM10(4);
CM11(3)<=((A(4) and B(7))and(S11(2)))or(CM10(4) and((A(4) and B(7))xor(S11(2))));
--Bit M12 del resultado
S12(0)<=(A(7) and B(5))xor(CM11(0))xor(CM11(1));
CM12(0)<=((A(7) and B(5))and(CM11(0)))or(CM11(1) and((A(7) and B(5))xor(CM11(0))));
S12(1)<=(A(6) and B(6))xor(S12(0))xor CM11(2);
CM12(1)<=((A(6) and B(6))and(S12(0)))or(CM11(2) and((A(6) and B(6))xor(S12(0))));
M(12)<=(A(5) and B(7))xor(S12(1))xor CM11(3);
CM12(2)<=((A(5) and B(7))and(S12(1)))or(CM11(3) and((A(5) and B(7))xor(S12(1))));
--Bit M13 del resultado
S13<=(A(7) and B(6))xor(CM12(0))xor(CM12(1));
CM13(0)<=((A(7) and B(6))and(CM12(0)))or(CM12(1) and((A(7) and B(6))xor(CM12(0))));
M(13)<=(A(6) and B(7))xor(S13)xor CM12(2);
CM13(1)<=((A(6) and B(7))and(S13))or(CM12(2) and((A(6) and B(7))xor(S13)));
--Bit M14 y M15 del resultado
M(14)<=(A(7) and B(7))xor(CM13(0))xor(CM13(1));
M(15)<=((A(7) and B(7))and(CM13(0)))or(CM13(1) and((A(7) and B(7))xor(CM13(0))));
--Asignacion de bits
H<=M(15) or M(14) or M(13) or M(12) or M(11) or M(10) or M(9) or M(8);
OV<=H;
O(0)<=(not H) and M(0);
O(1)<=(not H) and M(1);
O(2)<=(not H) and M(2);
O(3)<=(not H) and M(3);
O(4)<=(not H) and M(4);
O(5)<=(not H) and M(5);
O(6)<=(not H) and M(6);
O(7)<=(not H) and M(7);
end;
Generador PWM
A
CTRL
L COMP S
CONT
CLK
UNIVERSIDAD NACIONAL AUTÓNOMA DE MÉXICO
Semestre: 2021-1
FACULTAD DE INGENIERÍA
Microprocesadores y Microcontroladores
Página 13 de 22
Prof. Dr. Saúl De La Rosa Nieves Grupo 3
Codigo VHDL PWM
library ieee;
use ieee.std_logic_1164.all;
entity PWM is
port(clk,L: in std_logic;
CTRL: in std_logic_vector(7 downto 0);
S: out std_logic
);
end entity;
architecture algo of PWM is
signal Q: std_logic_vector(7 downto 0);
signal A: std_logic_vector(3 downto 0);
signal D2,Q2,Q2N: std_logic_vector(3 downto 0);
signal BP,AP,BP1: std_logic_vector(4 downto 0);
signal Ci,C0,C1,C2,C3,CF: std_logic;
begin
--Registro CTRL
process(L)
begin
if (L'event and L='1') then
Q(7)<=CTRL(7);
Q(6)<=CTRL(6);
Q(5)<=CTRL(5);
Q(4)<=CTRL(4);
Q(3)<=CTRL(3);
Q(2)<=CTRL(2);
Q(1)<=CTRL(1);
Q(0)<=CTRL(0);
end if;
end process;
A(3)<=Q(4);
A(2)<=Q(3);
A(1)<=Q(2);
A(0)<=Q(1);
----------------------------------------------------------------------------
--Contador de 10-0
process(clk)
begin
if (clk'event and clk='1') then
Q2(3)<=D2(3);
Q2N(3)<=not D2(3);
end if;
end process;
process(clk)
begin
UNIVERSIDAD NACIONAL AUTÓNOMA DE MÉXICO
Semestre: 2021-1
FACULTAD DE INGENIERÍA
Microprocesadores y Microcontroladores
Página 14 de 22
Prof. Dr. Saúl De La Rosa Nieves Grupo 3
if (clk'event and clk='1') then
Q2(2)<=D2(2);
Q2N(2)<=not D2(2);
end if;
end process;
process(clk)
begin
if (clk'event and clk='1') then
Q2(1)<=D2(1);
Q2N(1)<=not D2(1);
end if;
end process;
process(clk)
begin
if (clk'event and clk='1') then
Q2(0)<=D2(0);
Q2N(0)<=not D2(0);
end if;
end process;
D2(3)<=(Q2N(3) and Q2N(2) and Q2N(1) and Q2N(0))or(Q2(3) and Q2(0))or(Q2(3) and Q2(1));
D2(2)<=(Q2(2) and Q2(0))or(Q2(2) and Q2(1))or(Q2(3) and Q2N(1) and Q2N(0));
D2(1)<=(Q2N(1) and Q2N(0))or(Q2(1) and Q2(0));
D2(0)<=(Q2(1) and Q2N(0))or(Q2(2) and Q2N(0))or(Q2(3) and Q2N(0));
-------------------------------------------------------------------------------------------
---Comparador
BP1(4)<='0';
BP1(3)<=Q2(3);
BP1(2)<=Q2(2);
BP1(1)<=Q2(1);
BP1(0)<=Q2(0);
AP(4)<='0';
AP(3)<=A(3);
AP(2)<=A(2);
AP(1)<=A(1);
AP(0)<=A(0);
BP<=not BP1;
Ci<='1';
C0<=(AP(0) and BP(0))or(Ci and (AP(0) xor BP(0)));
C1<=(AP(1) and BP(1))or(C0 and (AP(1) xor BP(1)));
C2<=(AP(2) and BP(2))or(C1 and (AP(2) xor BP(2)));
C3<=(AP(3) and BP(3))or(C2 and (AP(3) xor BP(3)));
CF<=(AP(4) and BP(4))or(C3 and (AP(4) xor BP(4)));
S<=Q(0) and CF;
end;
UNIVERSIDAD NACIONAL AUTÓNOMA DE MÉXICO
Semestre: 2021-1
FACULTAD DE INGENIERÍA
Microprocesadores y Microcontroladores
Página 15 de 22
Prof. Dr. Saúl De La Rosa Nieves Grupo 3
Puerto Serie:
8
RX
A
RSP
CLK
TX
B RPS
Código VHDL
library ieee;
use ieee.std_logic_1164.all;
entity PS is
port(clk,Dir,H,RX: in std_logic;
TX: out std_logic;
A: in std_logic_vector(7 downto 0);
AA: out std_logic_vector(7 downto 0);
clock: inout std_logic
);
end entity;
architecture algo of PS is
signal Q7,Q6,Q5,Q4,Q3,Q2,Q1,Q0: std_logic;
signal D7,D6,D5,D4,D3,D2,D1,D0: std_logic;
signal QQ7,QQ6,QQ5,QQ4,QQ3,QQ2,QQ1,QQ0: std_logic;
signal DD7,DD6,DD5,DD4,DD3,DD2,DD1,DD0: std_logic;
signal DA7,DA6,DA5,DA4,DA3,DA2,DA1,DA0:std_logic;
signal QA7,QA6,QA5,QA4,QA3,QA2,QA1,QA0:std_logic;
signal Fa,clk1: std_logic;
begin
--reggistro paralelo-serie
process(clk1)
begin
if(clk1'event and clk1='1')then
QQ7<=DD7;
QQ6<=DD6;
QQ5<=DD5;
QQ4<=DD4;
QQ3<=DD3;
QQ2<=DD2;
UNIVERSIDAD NACIONAL AUTÓNOMA DE MÉXICO
Semestre: 2021-1
FACULTAD DE INGENIERÍA
Microprocesadores y Microcontroladores
Página 16 de 22
Prof. Dr. Saúl De La Rosa Nieves Grupo 3
QQ1<=DD1;
QQ0<=DD0;
end if;
end process ;
DD7<=RX;
DD6<=QQ7;
DD5<=QQ6;
DD4<=QQ5;
DD3<=QQ4;
DD2<=QQ3;
DD1<=QQ2;
DD0<=QQ1;
--------------------------------
process(clk)
begin
if(clk'event and clk='1')then
QA7<=DA7;
QA6<=DA6;
QA5<=DA5;
QA4<=DA4;
QA3<=DA3;
QA2<=DA2;
QA1<=DA1;
QA0<=DA0;
Fa<=QA0;
end if;
end process;
process(clk)
begin
if(clk'event and clk='1')then
Q7<=D7;
Q6<=D6;
Q5<=D5;
Q4<=D4;
Q3<=D3;
Q2<=D2;
Q1<=D1;
Q0<=D0;
TX<=Q0;
end if;
end process;
process(Dir)
begin
if(Dir='1')then
clock<=Fa and clk;
else
AA(7)<=QQ7;
AA(6)<=QQ6;
UNIVERSIDAD NACIONAL AUTÓNOMA DE MÉXICO
Semestre: 2021-1
FACULTAD DE INGENIERÍA
Microprocesadores y Microcontroladores
Página 17 de 22
Prof. Dr. Saúl De La Rosa Nieves Grupo 3
AA(5)<=QQ5;
AA(4)<=QQ4;
AA(3)<=QQ3;
AA(2)<=QQ2;
AA(1)<=QQ1;
AA(0)<=QQ0;
clock<='Z';
--Tx<='Z';
clk1<=clock;
end if;
end process;
D7<=H and A(7);
D6<=(Q7 and not(H))or(H and A(6));
D5<=(Q6 and not(H))or(H and A(5));
D4<=(Q5 and not(H))or(H and A(4));
D3<=(Q4 and not(H))or(H and A(3));
D2<=(Q3 and not(H))or(H and A(2));
D1<=(Q2 and not(H))or(H and A(1));
D0<=(Q1 and not(H))or(H and A(0));
DA7<=H and '1';
DA6<=(QA7 and not(H))or(H and '1');
DA5<=(QA6 and not(H))or(H and '1');
DA4<=(QA5 and not(H))or(H and '1');
DA3<=(QA4 and not(H))or(H and '1');
DA2<=(QA3 and not(H))or(H and '1');
DA1<=(QA2 and not(H))or(H and '1');
DA0<=(QA1 and not(H))or(H and '1');
---------------------------------------------------
end;
Puerto Paralelo-Paralelo
library ieee;
use ieee.std_logic_1164.all;
entity PP is
port(L,E,Dir: in std_logic;--L=salida, E=entrada
B: inout std_logic_vector(7 downto 0);
A: in std_logic_vector(7 downto 0);
AA: out std_logic_vector(7 downto 0)
);
end entity;
architecture algo of PP is
signal D7,D6,D5,D4,D3,D2,D1,D0: std_logic;
signal Q7,Q6,Q5,Q4,Q3,Q2,Q1,Q0: std_logic;
signal Q7N,Q6N,Q5N,Q4N,Q3N,Q2N,Q1N,Q0N: std_logic;
signal DD7,DD6,DD5,DD4,DD3,DD2,DD1,DD0: std_logic;
UNIVERSIDAD NACIONAL AUTÓNOMA DE MÉXICO
Semestre: 2021-1
FACULTAD DE INGENIERÍA
Microprocesadores y Microcontroladores
Página 18 de 22
Prof. Dr. Saúl De La Rosa Nieves Grupo 3
signal QQ7,QQ6,QQ5,QQ4,QQ3,QQ2,QQ1,QQ0: std_logic;
signal QQ7N,QQ6N,QQ5N,QQ4N,QQ3N,QQ2N,QQ1N,QQ0N: std_logic;
--signal L,E: std_logic;
begin
-- L<=Dir;
-- E<=not(Dir);
--Registro salida
Q7<=not(not(D7 and L)and Q7N);
Q7N<=not(not(not(D7 and L) and L)and Q7);
Q6<=not(not(D6 and L)and Q6N);
Q6N<=not(not(not(D6 and L) and L)and Q6);
Q5<=not(not(D5 and L)and Q5N);
Q5N<=not(not(not(D5 and L) and L)and Q5);
Q4<=not(not(D4 and L)and Q4N);
Q4N<=not(not(not(D4 and L) and L)and Q4);
Q3<=not(not(D3 and L)and Q3N);
Q3N<=not(not(not(D3 and L) and L)and Q3);
Q2<=not(not(D2 and L)and Q2N);
Q2N<=not(not(not(D2 and L) and L)and Q2);
Q1<=not(not(D1 and L)and Q1N);
Q1N<=not(not(not(D1 and L) and L)and Q1);
Q0<=not(not(D0 and L)and Q0N);
Q0N<=not(not(not(D0 and L) and L)and Q0);
--Registro de entrada
QQ7<=not(not(DD7 and E)and QQ7N);
QQ7N<=not(not(not(DD7 and E) and E)and QQ7);
QQ6<=not(not(DD6 and E)and QQ6N);
QQ6N<=not(not(not(DD6 and E) and E)and QQ6);
QQ5<=not(not(DD5 and E)and QQ5N);
QQ5N<=not(not(not(DD5 and E) and E)and QQ5);
QQ4<=not(not(DD4 and E)and QQ4N);
QQ4N<=not(not(not(DD4 and E) and E)and QQ4);
QQ3<=not(not(DD3 and E)and QQ3N);
QQ3N<=not(not(not(DD3 and E) and E)and QQ3);
QQ2<=not(not(DD2 and E)and QQ2N);
UNIVERSIDAD NACIONAL AUTÓNOMA DE MÉXICO
Semestre: 2021-1
FACULTAD DE INGENIERÍA
Microprocesadores y Microcontroladores
Página 19 de 22
Prof. Dr. Saúl De La Rosa Nieves Grupo 3
QQ2N<=not(not(not(DD2 and E) and E)and QQ2);
QQ1<=not(not(DD1 and E)and QQ1N);
QQ1N<=not(not(not(DD1 and E) and E)and QQ1);
QQ0<=not(not(DD0 and E)and QQ0N);
QQ0N<=not(not(not(DD0 and E) and E)and QQ0);
----configuracion del puerto como o entrada o salida, H=0 entrada, H=1 salida
process(Dir)
begin
if(Dir='1')then
D7<=A(7);
D6<=A(6);
D5<=A(5);
D4<=A(4);
D3<=A(3);
D2<=A(2);
D1<=A(1);
D0<=A(0);
B(7)<=Q7;
B(6)<=Q6;
B(5)<=Q5;
B(4)<=Q4;
B(3)<=Q3;
B(2)<=Q2;
B(1)<=Q1;
B(0)<=Q0;
else
B(7)<='Z';
B(6)<='Z';
B(5)<='Z';
B(4)<='Z';
B(3)<='Z';
B(2)<='Z';
B(1)<='Z';
B(0)<='Z';
DD7<=B(7);
DD6<=B(6);
DD5<=B(5);
DD4<=B(4);
DD3<=B(3);
DD2<=B(2);
DD1<=B(1);
DD0<=B(0);
AA(7)<=QQ7;
UNIVERSIDAD NACIONAL AUTÓNOMA DE MÉXICO
Semestre: 2021-1
FACULTAD DE INGENIERÍA
Microprocesadores y Microcontroladores
Página 20 de 22
Prof. Dr. Saúl De La Rosa Nieves Grupo 3
AA(6)<=QQ6;
AA(5)<=QQ5;
AA(4)<=QQ4;
AA(3)<=QQ3;
AA(2)<=QQ2;
AA(1)<=QQ1;
AA(0)<=QQ0;
end if;
end process;
end;
V. Construcción
Utilizando el modo esquemático de VHDL unimos los elementos antes diseñados, el modelo queda
como se muestra:
UNIVERSIDAD NACIONAL AUTÓNOMA DE MÉXICO
Semestre: 2021-1
FACULTAD DE INGENIERÍA
Microprocesadores y Microcontroladores
Página 21 de 22
Prof. Dr. Saúl De La Rosa Nieves Grupo 3
El conjunto de instrucciones del microcontrolador son las siguientes:
Instrucción Codigo Función
(Hex)
XOR 0 Realiza la función XOR bit a bit de dos operandos.
Invertir 1 Invierte(Complemento) al operando inmediato en el acumulador
ADD 2 Realiza la suma de dos operandos
AND 3 Realiza la función AND bit a bit de dos operandos.
OR 4 Realiza la función OR bit a bit de dos operandos
NO OP 5 No realiza operación y consume ciclos de reloj.
Cargar 6 Carga un dato al acumulador
Reinicio 7 Reinicia el contador de programa
SUB 8 Realiza la resta de dos operandos
MULT 9 Realiza la multiplicación de dos operados.
DIV A Realiza la división de dos operandos.
LPP B Lee el puerto paralelo
CPP C Carga el puerto paralelo con el resultado que se encuentre en el registro
auxiliar
APP D Activa el puerto paralelo
LPS E Lee el puerto serie
CPS F Carga el puerto serie con el resultado que se encuentre en el registro auxiliar.
APS 10 Activa el puerto serie.
DUTY 11 Carga el ciclo de trabajo al generador PWM
B 12 Realiza un salto a subrutina
LR 13 Carga el registro LR con la instrucción actual.
BLR 14 Regresa a la dirección apuntada por LR
RL 15 Carga el registro de datos con el resultado que se encuentra en el registro
auxiliar.
Uso de puertos:
Para poder utilizar los puertos debemos activarlos cargando los registros correspondientes a cada uno, la
instrucción APP carga el registro que habilita el puerto paralelo, mientras que APS carga el registro que
habilita el puerto serie.
Para poder habilitar el registro se carga el registro de la siguiente manera:
* * * * * * CLK Dir
El registro de izquierda a derecha va de MSB al LSB, los bits marcados con “*” no importa el valor que
carguemos pues el puerto solo requiere del bit Dir y CLK para poder funcionar, si Dir=0 el registro estará
habilitado como entrada, si Dir=1 el puerto estará habilitado como salida.
VI. Resultados y – Conclusiones
Con el fin de poder verificar que funciona se realizó la siguiente operación con el micro, y se
visualizó el resultado en el puerto serie, el programa quedo escrito como se muestra a
continuación:
UNIVERSIDAD NACIONAL AUTÓNOMA DE MÉXICO
Semestre: 2021-1
FACULTAD DE INGENIERÍA
Microprocesadores y Microcontroladores
Página 22 de 22
Prof. Dr. Saúl De La Rosa Nieves Grupo 3
0=>X"00",--Para tener en sincronía los registros colocamos 0 al inicio
1=>X"06",--instrucción que carga el registro para habilitar puerto serie
2=>X"03",--Configuramos como salida y colocamos reloj al puerto serie
3=>X"10",--Activamos el puerto serie
4=>X"00",--Dejamos consumir ciclo de reloj para poder introducir los siguientes datos
5=>X"06",--Cargamos acumulador con el primer operando
6=>X"02",--dato a operar
7=>X"03",--instrucción operación AND
8=>X"06",--dato dato a operar
9=>X"0F",--cargamos el resultado en el puerto serie
El resultado de la simulación es el siguiente:
El resultado se envia del bit LSB al MSB acompañado de una serie de pulsos de reloj que cargan el
resultado en el puerto de entrada correspondiente.
Conclusion:
Este trabajo ademas de aplicar los conocimientos adquiridos en diseño digital, nos permite entender
como funciona un procesador, esto para nosotros como electronicos es muy imortante pues debemos
entender que sucede dentro de estos dispositivos, para poder realizar implementaciones eficientes de
sistemas electronicos y en otros casos mejorar los ya existentes.
Bibliografía