INSTITUTO TECNOLOGICO DE OAXACA DISEÑO DIGITAL CON FPGAs Y VHDL
ING MIGUEL ANGEL PEREZ SOLANO Página 38
PRACTICA 13: MAQUINAS DE ESTADO (FSM: Finite State Machine)
13.1 MAQUINAS DE ESTADO MEALY Y MOORE: Una red canónica secuencial puede ser representada por un diagrama que se muestra en la figura 15.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 15.1 ene 2 salidas: la salida z(t) y el próximo estado s(t+1).
Figura 15.1 Red canónica secuencial Es frecuentemente conveniente dividir la red combinacional en dos partes, C1 y C2, como se muestra en la figura 15.2. El módulo combinacional C1 ene a la entrada presente x(t) y al estado presente s(t) como entradas, y salidas al próximo estado s(t+1). El módulo combinacional C2 ene al estado presente x(t) y al estado presente s(t) como entradas, y salidas el estado presente z(t). Esta máquina en la cual la salida presente z(t) depende tanto del estado presente s(t) y la entrada presente x(t) es llamada “maquina Mealy”.
Figura 15.2 Maquina de estado po Mealy Figura 15.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 15.3, nos referimos a la máquina de estado conocida como “maquina Moore”
INSTITUTO TECNOLOGICO DE OAXACA DISEÑO DIGITAL CON FPGAs Y VHDL
ING MIGUEL ANGEL PEREZ SOLANO Página 39
13.2 DETECTOR DE SECUENCIA CON MAQUINA MOORE. En esta sección se mostrará como diseñar una maquina Moore para detectar la secuencia 1101. 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 15.4. Si se está en estado S0 y la entrada es 0 el circuito se quedara en el estado S0 indicándolo por una flecha arqueada en la figura 15.4 donde se ha escrito el valor de la próxima entrada sobre el arco.
Figura 15.4 Diagrama de estado para detectar la secuencia 1101. Si la entrada es 1, entonces el circuito se moverá al estado S1 como se muestra en la figura 15.4, lo que indica que un único 1 se ha sido recibido. Si se está en el estado S1 y la entrada es 0, se debe regresar al estado S0. Por otro lado, si se está en S1 y se recibe un 1, el circuito se moverá a S2, lo cual indica que ya se han recibido consecu vamente dos 1´s. Si se está en S2 y la entrada es un 1, el circuito permanecerá en S2, pero si la entrada es un 0, entonces se moverá a S3, lo cual indica que se ha recibido la secuencia 110. En este punto, si se recibe un 0, el circuito se debe regresar a S0. Finalmente, si se está en el estado S3 y le llega a la entrada un 1, entonces se moverá al estado S4 como se muestra en la figura 15.4, lo cual indica que ha sido recibida la secuencia 1101. Por lo tanto la salida z(t) se fijara en 1. Note que si estamos en S4 y la entrada es 0 entonces el circuito deberá irse al estado S0, pero si estando en s4 le llega a la entrada un 1, el circuito se deberá mover al estado s2, lo cual indica que se ha recibido dos 1´s consecu vos. Esta es la transición que permite solapar bits para ser reu lizados. El úl mo en la secuencia detectada, puede ser usado como el primer 1 de la próxima secuencia que está siendo buscada.
INSTITUTO TECNOLOGICO DE OAXACA DISEÑO DIGITAL CON FPGAs Y VHDL
ING MIGUEL ANGEL PEREZ SOLANO Página 40
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. 13.3 DETECTOR DE SECUENCIA MEDIANTE UNA MAQUINA MEALY El diagrama de estado de la maquina Moore de la figura 15.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 sea 1. El diagrama de estado para esta máquina Mealy usado para implementar el detector de secuencia 1101 se muestra en la figura 15.5. <note que solo ene cuatro estados>.
Figura 15.5 Diagrama de estado para detectar la secu3ncia 1101 con una maquina Mealy. . En la figura 15.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 15.2. Por ejemplo, cuando el estado presente es S3 (significando que se ha recibido 110) y la entrada presente es 1, la sálica z cambia a 1. 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 15.2. Esto es, la salida del módulo combinacional C2 en la figura 15.2 será conectada a la entrada D de un flip-flop po D. Por lo que, si en la figura 8.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
INSTITUTO TECNOLOGICO DE OAXACA DISEÑO DIGITAL CON FPGAs Y VHDL
ING MIGUEL ANGEL PEREZ SOLANO Página 41
ER13_1.- En este ejemplo se implementará la maquina Moore diseñada en sección 15.2para 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 15.3. ¿De que 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= 5) si se codifican los estados como números binarios como se muestra en la tabla 15.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 15.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.
Tabla 15.1 Esquemas de codificación del estado.
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 C2.El proceso del registro de estado setea el presente estado a S0si clr está ac vo (alto). De otra manera este setea 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 15.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);
INSTITUTO TECNOLOGICO DE OAXACA DISEÑO DIGITAL CON FPGAs Y VHDL
ING MIGUEL ANGEL PEREZ SOLANO Página 42
end seqdeta_moore; architecture seqdeta of seqdeta_moore is type state_type is (s0, s1, s2, s3, s4); signal present_state, next_state: state_type; begin sreg: process(clk, clr) begin if clr = '1' then present_state <= s0; elsif clk'event and clk = '1' then present_state <= next_state; end if; end process; 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 next_state <= s0; end if; when s2 => if w = '0' then next_state <= s3; else next_state <= s2; end if; when s3 => if w = '1' then next_state <= s4; else next_state <= s0; end if; when s4=> if w = '0' then next_state <= s0; else next_state <= s2; end if; when others => null;
INSTITUTO TECNOLOGICO DE OAXACA DISEÑO DIGITAL CON FPGAs Y VHDL
ING MIGUEL ANGEL PEREZ SOLANO Página 43
end case; end process; 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 15.5. 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; architecture seqdeta of seqdeta_moore is type state_type is (s0, s1, s2, s3; signal present_state, next_state: state_type; begin sreg: process(clk, clr) begin if clr = '1' then present_state <= s0; elsif clk'event and clk = '1' then present_state <= next_state; end if; end process; C1: process(present_state, w)
INSTITUTO TECNOLOGICO DE OAXACA DISEÑO DIGITAL CON FPGAs Y VHDL
ING MIGUEL ANGEL PEREZ SOLANO Página 44
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 next_state <= s0; end if; when others => null; end case; end process; C2: process(clk, clr) begin if clr=’1’ then z<= ‘0’, ELSIF CLK’event and clk = ‘1’ then If present_state = S3 and w = ‘1’ then z= ‘1’; else z = ‘0’; ER13_3.- Top level de diseño para detectar la secuencia 1101 con clock: Probaremos la solución de una Maquina Moore dada en el ejercicio resuelto 1 en la tarjeta Nexys 3, u lizando btn(0) y
INSTITUTO TECNOLOGICO DE OAXACA DISEÑO DIGITAL CON FPGAs Y VHDL
ING MIGUEL ANGEL PEREZ SOLANO Página 45
btn(1) para ingresar 0 y 1respec vamente. El diseño top-level para detectar la secuencia 1101 se muestra en la figura 15.6. El modelado VHDL para este detector de secuencia está dado a con nuación.
Figura 15.6 Diseño top level para detectar la secuencia 1101 con clock.
MODULO clock_pulse: Cuando se presiona un pushbu on de la tarjeta del FPGA, hay muchos rebotes por escasamente unos milisegundo antes de establecerse en su valor. Esto significa que que en lugar que la entrada al FPGA vaya de 0 a 1 limpiamente, este puede rebotar entre esos valor por unos milisegundos. Este puede ser un problema serio en circuitos secuenciales donde las acciones toman lugar en las transiciones de la señal de clock. Debido a que las señales de clock cambian mucho muy rápido que el rebote del switch, es posible que valores erróneos sean latcheados en los registros. Por esta razón es necesario eliminar el rebote de los switches cuando ellos se u licen en circuitos secuenciales.
library IEEE; use IEEE.STD_LOGIC_1164.all; en ty clock_pulse is port( inp : in STD_LOGIC;
INSTITUTO TECNOLOGICO DE OAXACA DISEÑO DIGITAL CON FPGAs Y VHDL
ING MIGUEL ANGEL PEREZ SOLANO Página 46
cclk : in STD_LOGIC; clr : in STD_LOGIC; outp : out STD_LOGIC ); end clock_pulse; architecture clock_pulse of clock_pulse is signal delay1, delay2, delay3: STD_LOGIC; begin process(cclk, clr) begin if clr = '1' then delay1 <= '0'; delay2 <= '0'; delay3 <= '0'; elsif cclk'event and cclk = '1' then delay1 <= inp; delay2 <= delay1; delay3 <= delay2; end if; end process; outp <= delay1 and delay2 and not delay3; end clock_pulse;
Modulo clk_divider:
library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_unsigned.ALL; en ty clockdiv is Port ( mclk : in STD_LOGIC; reset : in STD_LOGIC; clk5 : out STD_LOGIC); end clockdiv; architecture Behavioral of clockdiv is signal q: std_logic_vector (19 downto 0); begin
INSTITUTO TECNOLOGICO DE OAXACA DISEÑO DIGITAL CON FPGAs Y VHDL
ING MIGUEL ANGEL PEREZ SOLANO Página 47
process (mclk, reset) begin if reset ='1' then q<= x"00000"; elsif mclk'event and mclk ='1' then q <= q + 1; end if; end process; clk190 <= q(19); end Behavioral;
MODULO seqdataa: listado del ejercicio resuelto 15.1. A continuación hacer el top_level de este circuitos, utilizando clk, btn(3) btn(0), btn(1), led(0). Y la señales internas según el diagrama. 15.4.- Es frecuentemente ú l habilitar una secuencia a través de un numero arbitrario de estados, dejando en cada estado una can dad arbitraria de empo. Por ejemplo, considere un grupo de semáforos mostrados en la figura 15.7. Estas luces se considera que estén en una intersección con una calle que va de norte a sur y la otra carretera de este a oeste. Para simular estos semáforos u lizaremos 6 leds conectados a ld(7:2) de la tarjeta FPGA y ciclar los 6 estados mostrados en la tabla 15.2. El diagrama de estado para controlar estos semáforos se muestra en la figura 15.8. Si u lizamos un clock de 3 Hz para manejar este diagrama, entonces un delay de 1 segundo se lograra 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 15.8 se reseteara a cero cuando este moviéndose al siguiente estado después de un meout.
Figura 15.7 Norte-sur Este-oeste
INSTITUTO TECNOLOGICO DE OAXACA DISEÑO DIGITAL CON FPGAs Y VHDL
ING MIGUEL ANGEL PEREZ SOLANO Página 48
El listado que se muestra a con nuación es un modelado VHDL implementa el diagrama de estado de la figura 15.8 debido a que necesitamos un contador para el conteo de delays, es mas conveniente en este caso combinar el registro de estado y módulo combinacional C1 en la maquina Moore en la figura 15.3 en un único proceso secuencial mostrado en el siguiente modelado. Note que en este caso usaremos únicamente una única variable “state”. Para generar la señal de 3 Hz u lizaremos la versión de Clkdiv mostrado en el ejercicio. El modelado topo-level se da en el listado…..
Tabla 15.2 Estado de los semaforos
--listado 15.6 de Semaforos library IEEE; use IEEE.STD_LOGIC_1164.all; use IEEE.STD_LOGIC_unsigned.all; en ty traffic is port (clk: in STD_LOGIC; clr: in STD_LOGIC; lights: out STD_LOGIC_VECTOR(5 downto 0));
Figura 15.8 Diagrama de estado para
controlar los semaforos
INSTITUTO TECNOLOGICO DE OAXACA DISEÑO DIGITAL CON FPGAs Y VHDL
ING MIGUEL ANGEL PEREZ SOLANO Página 49
end traffic; architecture traffic of traffic is type state_type is (s0, s1, s2, s3, s4, s5); signal state: state_type; signal count: STD_LOGIC_VECTOR(3 downto 0); constant SEC5: STD_LOGIC_VECTOR(3 downto 0) := "1111"; constant SEC1: STD_LOGIC_VECTOR(3 downto 0) := "0011"; begin process(clk, clr) begin if clr = '1' then state <= s0; count <= X"0"; elsif clk'event and clk = '1' then case state is when s0 => if count < SEC5 then state <= s0; count <= count + 1; else state <= s1; count <= X"0"; end if; when s1 => if count < SEC1 then state <= s1; count <= count + 1; else state <= s2; count <= X"0"; end if; when s2 => if count < SEC1 then state <= s2; count <= count + 1; else state <= s3; count <= X"0"; end if; when s3 => if count < SEC5 then state <= s3; count <= count + 1; else
INSTITUTO TECNOLOGICO DE OAXACA DISEÑO DIGITAL CON FPGAs Y VHDL
ING MIGUEL ANGEL PEREZ SOLANO Página 50
state <= s4; count <= X"0"; end if; when s4 => if count < SEC1 then state <= s4; count <= count + 1; else state <= s5; count <= X"0"; end if; when s5 => if count < SEC1 then state <= s5; count <= count + 1; else state <= s0; count <= X"0"; end if; when others => state <= s0; end case; end if; end process; C2: process(state) begin case state is when s0 => lights <= "100001"; when s1 => lights <= "100010"; when s2 => lights <= "100100"; when s3 => lights <= "001100"; when s4 => lights <= "010100"; when s5 => lights <= "100100"; when others => lights <= "100001"; end case; end process; end traffic; --------------------------------------------------------------------------------------------------------------------- --Clock divider library IEEE; use IEEE.STD_LOGIC_1164.all; use IEEE.STD_LOGIC_unsigned.all;
INSTITUTO TECNOLOGICO DE OAXACA DISEÑO DIGITAL CON FPGAs Y VHDL
ING MIGUEL ANGEL PEREZ SOLANO Página 51
en ty clkdiv is port( mclk : in STD_LOGIC; clr : in STD_LOGIC; clk3 : out STD_LOGIC ); end clkdiv; architecture clkdiv of clkdiv is signal q:STD_LOGIC_VECTOR(23 downto 0); begin -- clock divider process(mclk, clr) begin if clr = '1' then q <= X"000000"; elsif mclk'event and mclk='1' then q <= q + 1; end if; end process; clk3 <= q(23); -- 3 Hz end clkdiv;
---traffic_lights_top library IEEE; use IEEE.STD_LOGIC_1164.all; use work.traffic_components.all; en ty traffic_lights_top is port( mclk : in STD_LOGIC; btn : in STD_LOGIC_VECTOR(3 downto 3); ld : out STD_LOGIC_VECTOR(7 downto 2) ); end traffic_lights_top; architecture traffic_lights_top of traffic_lights_top is signal clr, clk3: STD_LOGIC; begin clr <= btn(3);
INSTITUTO TECNOLOGICO DE OAXACA DISEÑO DIGITAL CON FPGAs Y VHDL
ING MIGUEL ANGEL PEREZ SOLANO Página 52
U1: clkdiv port map (mclk=>mclk, clr=>clr, clk3=>clk3); U2: traffic port map (clk=>clk3, clr=>clr, lights=>ld); end traffic_lights_top; EP13_1 EP13_2 EP13_3 EP13_4
PRACTICA No. 14 MEMORIAS
PRACTICA No. 15 ARQUITECTURA DE MICROPROCESADORES
PRACTICA No. 16 MODULOS DE INTERFAZ
PRACTICA No. 17 PROYECTO FINAL
Top Related