Documente Academic
Documente Profesional
Documente Cultură
S2
Dir2
S1
MSS
clk
Dir1
Resetn
1/00
10/10
1/00
0/01
0/10
Asignacin de estados:
1
0
Se pide:
1.
2.
3.
4.
5.
ASM.
Mapas de estado siguiente y salida (ASM a mapas).
Tabla de Verdad y mapas de E.S. y salida (D.E. a Tabla y Tabla a mapas).
Implementacin, con multiplexores y flip-flop tipo D.
Cdigo VHDL completo y diagrama de tiempo (simulado).
ASM:
Viendo el diagrama de estados podemos formar el diagrama ASM, solo tenemos que ver
las condiciones de entrada (bloque de decisin) y las salidas que sean 1 (inicio/fin).
Las salidas que tienen un inicio/fin(ovalo), son salidas tipo Mealy, es decir, varan acorde
la condicin de entrada.
Resetn
00
Ta
0
0
S2
S1
S1
Dir1
Dir2
Tb
11
Tc
Dir1
S2
10
Dir2
1
S1
Mapas de Karnaugh
-
En Ta (00):
En el camino rojo vemos que hay unas dos ecuaciones en la posicin de 1 :
2 1 + 2 1 = 2 1
En Tc (10):
Camino morado, posicin 1 :
1
En 0 no hay presencia de 1 en la trayectoria, entonces es 0
(1 , 0 ):
1
0
2 1
2 1 ,
1 , 0
2
,
Para la salida, solo vemos los bloques de inicio/fin (ovalos), ya que estos son 1s a la salida, as
mismo, nos centramos en un estado, preferible el estado inicial, y ver las trayectorias hacia
otro estado, pero solo en donde haya las condiciones de salida.
La posicin la determina la variable de salida acorde al formato establecido.
En la posicin de Dir1:
Camino rojo (Ta)
2 1
En la posicin de Dir2:
Camino azul (Ta)
2 1
Camino morado (Tc)
1
(2 , 1 ):
(deco de salida)
1
0
2 1
S2 S1 ,
1 , 0
0 ,
2
IN
0
0
0
0
0
1
1
1
1
0
0
0
0
1
1
1
1
1
0
1
1
0
1
0
1
0
1
1
0
0
2
0
0
1
1
0
0
1
1
0
0
1
1
0
0
1
1
E.S.
1
0
1
0
1
0
1
0
1
0
1
0
1
0
1
0
1
0
0
1
0
0
0
0
0
0
1
1
0
0
1
0
1
1
0
1
0
1
0
1
1
0
0
2 1
OUT
0
0
1
0
0
0
0
0
0
1
1
0
0
2
0
0
1
0
1
0
1
0
0
0
0
0
2
0
0
1
0
1
0
1
0
0
0
0
0
1
0
1
0
0
0
0
0
0
1
1
0
0
2 1
1
0
1
0
0
0
0
0
0
1
1
0
0
2 1
Este mtodo es Variable Entrante al Mapa, la tabla debe ser reducida hasta que tenga las
variables de estado actual, despus stas salidas colocarlas en un mapa de Karnaugh:
Decodificador de Estado Siguiente:
1
0
2 1
2 1 ,
1 , 0
2
,
2 1
S2 S1 ,
1 , 0
2
0,
Decodificador de Salida
1
0
Implementacin:
S2
S1
1
1
0
S2
0
S1
1
FF-D
1 MUX
Y1
8-1
Dir2
MUX
8-1
D
Q
1
3
Clock
reset
0
1
0
S1
1 MUX
8-1
FF-D
Y0
S2
D
Q
2
Clock
reset
1
2
3
Clock
reset
MUX
8-1
Dir1
VHDL:
library ieee;
use ieee.std_logic_1164.all;
-- black box o bloque general con entradas y salidas
entity ejemplo_e_14 is
port(S1,S2,clk,Resetn: in std_logic; Dir1,Dir2: out std_logic);
end ejemplo_e_14;
architecture behaviour of ejemplo_e_14 is
-- estados
type states is (Ta,Tb,Tc);
signal y: states:=Ta;
begin
-- deco de estado siguiente
process(clk,Resetn)
begin
if Resetn = '0' then y <= Ta; -- reset asincrono
elsif clk = '1' and clk'event then --flanco positivo
case y is
when Ta =>
if
(S2 = '0' and S1 = '0') or (S2 = '1' and S1 = '1') then
y <= Ta;
elsif S2 = '0' and S1 = '1' then y <= Tb;
elsif S2 = '1' and S1 = '0' then y <= Tc;
end if;
when Tb =>
if
S2 = '0' then y <= Tb;
else y <= Ta;
end if;
when Tc =>
if
S1 = '0' then y <= Tc;
else y <= Ta;
end if;
end case;
end if;
end process;
-- deco de salida
process (y,S1,S2)
begin
Dir2 <= '0'; Dir1 <= '0';
case y is
when Ta =>
if
S2 = '0' and S1 = '1' then Dir1 <= '1';
elsif S2 = '1' and S1 = '0' then Dir2 <= '1';
end if;
when Tb =>
if
S2 = '0' then Dir1 <= '1';
end if;
when Tc =>
if
S1 = '0' then Dir2 <= '1';
end if;
end case;
end process;
end behaviour;
00
01
11
10
0 , 0 , 1
0, 1 , 1
0,0,0
0,1, 3
2 1 , 0 , 2 1
0, 2 , 2
0,0,0
0,0,0
00
01
11
10
1 ,0 ,0
1 , 1 , 0
0,0,0
0,0, 3
2 1 , 0 , 0
1, 2 , 2
0,0,0
0,0,0
0
0
Decodificador de salida
(3 , 2 , 1 ) :
2 1
0
0
00
01
11
10
Ta
Tc
Tg
Te
Tb
Td
Th
Tf
Como ya sabemos los nombres para los estados, entonces podemos posicionarnos en el
estado de Ta, evaluaremos primero al mapa de estados, despus evaluaremos al de
salida:
Estados Siguientes
En Ta (000)
0
000
Ta
001
Tb
0, 0, I1
Vemos que la entrada I1 es la nica condicin para pasar de un estado a otro o quedarse
en el mismo estado. Continuamos en el siguiente estado Tb
0
2 1 , 0 , 2 1
000
Ta
I1
001
Tb
100
Te
2 , 0 , 2
Por intuicin y lgica, evaluamos primero a I1 debido a que este esta no-inverso y la
entrada I2 puede tomar cualquier valor, es decir un dont care.
Seguimos al siguiente estado Tc:
010
Tc
001
Tb
0, 1 , 1
0, 2 , 2
I2
000
Ta
011
Td
010
Tc
011
Td
Continuamos con Te
0,1, 3
I3
Para Tf, Tg y Th son estado cero, es decir, los estados anteriores no nos conducen a
stos, no se los evalu.
Ahora las salidas
Vemos solo cuando se hace uno en las salidas:
Ta: (es Moore)
O3
Tb:
2 1 , 0 , 0
I2
000
I1 0 0
000
O3
I1
Tc:
0
010
O2
100
O3
1 , 1 , 0
Td:
110
O2
101
O1
1 , 2 , 2
Te:
000
001
0 , 0 , 3
O1
Resetn
Ta
000
3
1
1
Tb
001
1
1
2
1
Te
100
1
0
Tc
010
Td
011
3
VHDL:
library ieee;
use ieee.std_logic_1164.all;
entity mapas is
port( I3,I2,I1,clk,resetn
:
in std_logic;
O3,O2,O1
:
out std_logic);
end mapas;
architecture behaviour of mapas is
type estados is (Ta,Tb,Tc,Td,Te);
signal y: estados;
begin
--transiciones
process(clk,resetn)
begin
if resetn = '0' then y <= Ta;
elsif (clk = '1' and clk'event) then
case y is
when Ta =>
if
I1 = '0' then y <= Ta;
else y <= Tb; end if;
when Tb =>
if
I1 = '0' then y <= Ta;
elsif I2 = '0' then y <= Tb;
else
y <= Te; end if;
when Te => --seguii el orden del ASM, no importa
if
I3 = '0' then y <= Tc;
else
y <= Td; end if;
when Tc =>
if
I1 = '0' then y <= Tc;
else
y <= Tb; end if;
when Td =>
if
I2 = '1' then y <= Td;
else
y <= Ta; end if;
end case;
end if;
end process;
--salidas
process(y,I3,I2,I1)
begin
O3 <= '0' ; O2 <= '0' ; O1 <= '0';
case y is
when Ta => O3 <= '1';
when Tb => if I1 = '1' and I2 ='1' then
O3 <= '1';
end if;
when Te => if I3 = '1' then O1 <= '1';
end if;
when Tc => if I1 = '0' then O3 <= '1';
else O2 <= '1'; end if;
when Td => if I2 = '1' then
O3 <= '1' ; O1 <= '1';
else
O3 <= '1' ; O2 <= '1';
end if;
end case;
end process;
end behaviour;
Simulacin:
Seal
de
Voltaje
S1
Diagrama de estado:
Formato: S2, S1 / w
0/0
a/0
00/1
11/0
b/1
1/1
Tabla de estados:
y0
0
0
0
0
1
1
1
1
S2
0
0
1
1
0
0
1
1
S1
0
1
0
1
0
1
0
1
Y0
0
0
1
0
1
1
w
0
0
0
1
1
1
Implementacin:
El valor de 01 en las entradas es un valor imposible fsicamente, as que se le da un dont care.
En el estado siguiente (Y0), cuando estamos en el estado a, al dont care le damos un valor de
1 para que se parezca a la entrada S1, cuando estamos en b, al dont care le damos un valor de
0 para que se parezca a S2.
La salida w cuando y0 es cero, podemos darle el valor de cero al dont care, cuando y0 es 1, le
damos el valor de 1 al dont care, hacemos esto para que la salida no dependa de la entrada y
no gastar compuertas (mquina de Moore), en pocas palabras, estamos tomando el valor de y0
como salida.
resetn
Cdigo VHDL:
library ieee;
use ieee.std_logic_1164.all;
entity autotank is
port(S1,S2,clk,resetn : in std_logic;
w
: out std_logic);
end autotank;
architecture behaviour of autotank is
type states is (a,b);
signal y: states;
begin
process(clk,resetn)
begin
if resetn = '0' then y <= a;
elseif clk = '1' and clk'event then
case y is
when a => if
S1 = '0' then
elsif S2 = '1' then
end if;
when b => if
S2 = '1' then
elsif S1 = '0' then
end if;
end case;
end if;
end process;
process(y,S1,S2)
begin
case y is
when a => w <= '0';
when b => w <= '1';
end case;
end process;
end behaviour;
y <= a;
y <= b;
y <= b;
y <= a;
ASM:
Resetn
Ta
S1
S2
1
Tb
1
w
1
S2
0
S1
Simulacin en Quartus ii :
Solucin:
Tenemos que darnos cuenta que no nos dan el cdigo completo de VHDL, solo nos
proporcionan informacin de las entradas y salidas y tambin el cdigo del
decodificador de estado siguiente. Debemos de ver las salidas en el diagrama de tiempo
y ver las salidas que genera cada estado (si es Mealy o Moore)
00/0
01/1
11/0
10/0
11/1
10/0
11/1
00/0
01/0
00/1
01/0
10/0
Formato: A1, A2 / W
Ta
W
1
0
A2
A1
1
A2
11/0
Tb
Apuntes:
1. Las salidas de un estado en un diagrama de estado no deben ser ms de 2 ,
donde es el nmero de entradas de la MSS, el estado puede recibir cualquier
cantidad de entradas.
Formato: x, y / z
a
00/0
11/1
01/0
10/0
2. Las flechas de salidas pueden tener dont care en sus entradas, pero no en la
salida:
a
0/0
11/1
10/1
11/0
00/1
1/1
0
a
A
A
A
B
b
B
B
0
0
1
1
0
0
1
1
0
1
0
1
0
1
0
1
0
a
a
b
a
b
b
0
0
1
1
1
1
0
1
Siguiente estado
Aunque en la programacin con VHDL se le puede asignar a todas las salidas y que no
estn en la descripcin como cero si se usara una asignacin al inicio en la descripcin
del decodificador de salida
--deco de salida
process(y,X,Y)
begin
Z <= '0';
case y is
when b => Z <= '1';
end case;
end process;
end behaviour;
Estados presentes
entradas
. . 1 0
.
Estados siguientes
. . 1 0
salidas
3 .
9. Los mapas de Karnaugh se reducen de tal forma que se deben ingresar las
entradas de la MSS como variables de entrada al mapa (V.E.M.) y los estados
actuales como variables combinatorias.
Se los hace de esta manera para utilizar un MUX, las variables de estado
presentes quedan como selectores de dato y las entradas en el MUX van
conectadas a la combinacin respectiva que presenta cada cuadro.
0
0
1
1
0
1
0
1
+
0
1
1
1
0
0
1
1
0
1
0
1
0
0
0
1
0
0
1
1
0
1
0
1
0
1
1
0
0
0
1
1
0
1
0
1
1
0
0
1
0
0
1
1
0
1
0
1
1
1
1
0
0
0
1
1
0
1
0
1
+
1
0
0
0
0
0
1
1
0
1
0
1
0
1
0
0
0
0
1
1
0
1
0
1
0
0
1
0