PRACTICA 13: MAQUINAS DE ESTADO (FSM: Finite …solano.orgfree.com/DD_VHDL/PRACTICA_13 MAQUINAS DE...

15
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

Transcript of PRACTICA 13: MAQUINAS DE ESTADO (FSM: Finite …solano.orgfree.com/DD_VHDL/PRACTICA_13 MAQUINAS DE...

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