Practica - 13 Maquinas de Estado
Practica - 13 Maquinas de Estado
Practica - 13 Maquinas de Estado
Una red canónica secuencial puede ser representada por un diagrama que se muestra en la figura
13.1. La entrada presente es descrita por x(t) y la salida presente por z(t). Note que el estado
presente s(t) es la salida de un registro de estado, pudiendo ser una serie de flip-flops. La red
combinacional en la figura 13.1 ene 2 salidas: la salida z(t) y el próximo estado s(t+1).
Figura 13.2 Maquina de estado po Mealy Figura 13.3 Maquina de estado po Moore
Si la salida presente z(t) depende únicamente del estado presente s(t) como se muestra en la
figura 13.3, nos referimos a la máquina de estado conocida como “maquina Moore”
ING MIGUEL ANGEL PEREZ SOLANO Página 46
INSTITUTO TECNOLOGICO DE OAXACA DISEÑO DIGITAL CON FPGAs Y VHDL
En esta sección se mostrará como diseñar una maquina Moore para detectar la secuencia 1101.
( se analiza desde el bit mas significa vo).En la próxima sección u lizaremos una maquina Mealy
para detectar la misma secuencia.
El primer paso es dibujar un diagrama de estado para detectar la secuencia 1101 usando una
maquina Moore. La salida z, de esta máquina Moore será 1 cuando la secuencia 1101 sea
detectada. Tomaremos al estado S0 como el estado inicial o de reset.
En la medida de lo posible, como esta es una maquina Moore en la cual las salidas dependen
únicamente del estado presente, desplegaremos el valor de la salida dentro del circulo en el
diagrama de estado bajo el nombre del estado como se muestra en la figura 13.4. Si se está en
estado S0 y la entrada es 0 el circuito se quedará en el estado S0 indicándolo por una flecha
arqueada en la figura 13.4 donde se ha escrito el valor de la próxima entrada sobre el arco.
cual indica que se ha recibido la secuencia 110. En este punto (s3), si se recibe un 0, el circuito se
debe regresar a S0.
Si no queremos permi r el reuso del ul mo bit, para ser el posible primer bit de la siguiente
secuencia, la máquina de estado deberá modificada de S4 a S1, para reusar el primer bit, o de S4
a S0 si no queremos reusar ninguno.
El diagrama de estado de la maquina Moore de la figura 13.4 ene 5 estados. La salida z, en esta
máquina Moore es 1 cuando está en el estado s4. Otra forma de implementar este detector de
secuencia, es u lizando una maquina Mealy, donde la salida z será 1, cuando este en el estado
S3 y la entrada x(t) sea 1. El diagrama de estado para esta máquina Mealy usado para
implementar el detector de secuencia 1101 se muestra en la figura 13.5 (note que solo ene
cuatro estados).
Figura 13.5 Diagrama de estado para detectar la secuencia 1101 con una maquina Mealy.
En la figura 13.5 los valores de salida son mostradas sobre las transiciones a lo largo de las
condiciones de entrada. Transiciones desde el present_state (PS) son e quetadas con
“present_input /present_output”. Es importante entender que el valor de salida desplegado es
la salida combinacional que depende de la entrada presente y del estado presente como se
muestra en la figura 13.2. Por ejemplo, cuando el estado presente es S3 (significando que se ha
recibido 110) y la entrada presente es 1, la sálida z cambia a 1en ese misma transición. En la
próxima transición de clock el estado cambia a s1 y la salida cambiara a 0. Esto significa que la
salida z nunca latcheara el 1.
Si queremos que z sea una salida registrada (esto es sostener su valor cuando haya la transición
a S1), se tendría que agregar un flip-flop a la salida z(t) en la figura 13.2. Esto es, la salida del
módulo combinacional C2 en la figura 13.2 será conectada a la entrada D de un flip-flop po D.
Por lo que, si en la figura 13.5 el estado es S3 y la entrada presente se vuelve 1, la salida z será 1,
y sobre la próxima transición de clock este valor de salida 1 será latcheado a la salida del flip-flop
el estado cambiará a S1.
PROBLEMAS RESUELTOS
ER13_1.- En este ejemplo se implementará la maquina Moore diseñada en sección 13.2 para
detectar la secuencia 1101. A con nuación, se muestra el modelado en VHDL para implementarlo
en la tarjeta Nexys 3. El primer paso es definir los cinco estados; S0, S1, S2, S3, S4. Estos estados
son las salidas de los registros de estado en la figura 13.3. ¿De qué tamaño debe ser este registro?
Debido a que hay 5 estados, se necesitan al menos 3 bits para representar a los 5 estados (22=4,
y 23= 8 siendo ú l para representas 5 estados) si se codifican los estados como números binarios
como se muestra en la tabla 13.1. Un esquema alterno de codificación llamado codificación one-
hot. El cual u liza un flip-flop por estado. En este caso necesitaríamos 5 flip-flop, uno por bit como
se muestra en la tabla 13.1. Se podría pensar que es un desperdicio de flip-flops, pero los FPGAs
donde los flip-flops son suficientes, codificación one-hot es frecuentemente u lizado debido a
que usualmente reduce la complejidad de la lógica combinacional requerida para producir el
próximo estado. Otro esquema de codificación que también es posible es con el código Gray.
En el modelado que se muestra a con nuación, para definir los estados (en este caso 5; S0, S1,
S2,S3,S4) se u liza la declaración type y entonces se define las dos señales; present_state y
next_state como sigue:
Note que el modelado del circuito se separa en tres procesos separados; uno para el registro de
estado y dos módulos combinacionales para C1 y C2. El proceso del registro de estado setea el
presente estado a S0 si clr está ac vo alto. De otra manera este mueve el present_state (PS) al
next_state (NS) en la transición del clock. El proceso C1 u liza una sentencia case para
implementar el diagrama de estado de la figura 13.5. El proceso C2 define la salida z dependiente
del present_state.
library IEEE;
use IEEE.STD_LOGIC_1164.all;
entity seqdeta_moore is
port (clk: in STD_LOGIC;
clr: in STD_LOGIC;
w: in STD_LOGIC;
z: out STD_LOGIC);
end seqdeta_moore;
C1: process(present_state, w)
begin
case present_state is
when s0 =>
if w = '1' then
next_state <= s1;
else
next_state <= s0;
end if;
when s1 =>
if w = '1' then
next_state <= s2;
else
when s4=>
if w = '0' then
next_state <= s0;
else
next_state <= s2;
end if;
C2: process(present_state)
begin
if present_state = s4 then
z <= '1';
else
z <= '0';
end if;
end process;
end seqdeta;
ER13_2.- El listado siguiente muestra el modelado en VHDL para implementar la maquina Moore
definido por el diagrama de estado de la figura 13.3. Compare el modelado Moore con el
modelado Mealy. Note que la maquina Mealy necesita únicamente cuatro estados, donde su
codificación binaria puede ser hecho con un numero binario de 2 bits. También note que la salida
del módulo C2 ene que volverse un circuito secuencial en el cual z se latchea a 1 en la transición
del clock cuando el present_state es S3 y w = 1.
library IEEE;
use IEEE.STD_LOGIC_1164.all;
en ty seqdeta_moore is
port (clk: in STD_LOGIC;
clr: in STD_LOGIC;
w: in STD_LOGIC;
z: out STD_LOGIC);
end seqdeta_moore;
C1: process(present_state, w)
begin
case present_state is
when s0 =>
if din = '1' then
next_state <= s1;
else
next_state <= s0;
end if;
when s1 =>
if din = '1' then
next_state <= s2;
else
next_state <= s0;
end if;
when s2 =>
if din = '0' then
next_state <= s3;
else
next_state <= s2;
end if;
when s3 =>
if din = '1' then
next_state <= s1;
else
ING MIGUEL ANGEL PEREZ SOLANO Página 52
INSTITUTO TECNOLOGICO DE OAXACA DISEÑO DIGITAL CON FPGAs Y VHDL
Para simular estos semáforos u lizaremos 6 leds de la Nexys4 (led16_r, led16_b, led16_g y
led17_r, led17_b, led17_g ) y ciclar los 6 estados mostrados en la tabla 13.2. El diagrama de
estado para controlar estos semáforos se muestra en la figura 13.8. Si u lizamos un clock de 3 Hz
para manejar este diagrama, entonces un delay de 1 segundo se logrará permaneciendo en un
estado de tres ciclos. Similarmente, un delay de 5 segundos se logrará permaneciendo en un
estado 15 ciclos de clock. La variable “count” en la figura 13.8 se reseteará a cero cuando este
moviéndose al siguiente estado después de un meout.
El listado que se muestra a con nuación es un modelado VHDL que implementa el diagrama de
estado de la figura 13.8. Debido a que necesitamos un contador para el conteo de delays, es más
conveniente en este caso combinar el registro de estado y módulo combinacional C1 en la
maquina Moore en la figura 13.3 en un único proceso secuencial mostrado en el siguiente
modelado. Note que en este caso usaremos únicamente una única variable “state”.
library IEEE;
use IEEE.STD_LOGIC_1164.all;
use IEEE.STD_LOGIC_unsigned.all;
en ty ER13_a is
port(
mclk : in STD_LOGIC;
clr : in STD_LOGIC;
clk3 : out STD_LOGIC
);
end ER13_a;
-- clock divider
process(mclk, clr)
begin
if clr = '1' then
q <= (others =>'0');
elsif mclk'event and mclk='1' then
q <= q + 1;
end if;
end process;
clk3 <= q (24); -- 3 Hz
end behavioral;
ibrary IEEE;
use IEEE.STD_LOGIC_1164.all;
use IEEE.STD_LOGIC_unsigned.all;
en ty ER13_3b is
port (clk: in STD_LOGIC;
clr: in STD_LOGIC;
lights: out STD_LOGIC_VECTOR(5 downto 0));
end ER13_3b;
end if;
end process;
C2: process(state)
begin
case state is
when s0 => lights <= "100001";
when s1 => lights <= "010001";
when s2 => lights <= "001001";
when s3 => lights <= "001100";
when s4 => lights <= "001001";
when s5 => lights <= "100001";
when others => lights <= "100001";
end case;
end process;
end traffic;
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
en ty TOP_ER13_4 is
Port ( mclk : in STD_LOGIC;
btn : in STD_LOGIC_VECTOR (0 downto 0);
led16_r : out STD_LOGIC;
led16_b : out STD_LOGIC;
led16_g : out STD_LOGIC;
led17_r : out STD_LOGIC;
led17_b : out STD_LOGIC;
led17_g : out STD_LOGIC);
end TOP_ER13_4;
);
end Behavioral;
ER13_4
A con nuación, se presenta el diagrama de estados que seguirá el circuito dependiendo del valor
de sel; o en binario o en gray. Así también el diagrama a bloques. Mediante instanciación
agregarle un clock de 1 Hz para implementarlo en la Nexys 3.
library ieee;
use ieee.std_logic_1164.all;
en ty mealy_4s is
port ( clk : in std_logic;
data_in : in std_logic;
reset : in std_logic;
data_out : out std_logic_vector(1 downto 0)
);
end en ty;
case state is
when s0=>
if data_in = '1' then
state <= s1;
else
state <= s0;
end if;
when s1=>
if data_in = '1' then
state <= s2;
else
state <= s1;
end if;
when s2=>
if data_in = '1' then
state <= s3;
else
state <= s2;
end if;
when s3=>
if data_in = '1' then
state <= s3;
else
state <= s1;
end if;
end case;
end if;
end process;