Capı́tulo 1 Introducción La implementación de procesos relacionados con la automatización está basada generalmente en el funcionamiento en sistemas secuenciales sı́ncronos. Un sistema secuencial está formado de dos partes. La primera es una parte combinacional mientras que la segunda son elementos de memoria. Estos elementos de memoria son básicamente registros de almacenamiento. Estos registros almacenan el estado presente del sistema, por lo que las salidas de dichos registros generan el valor del estado presente mientras que las entradas a los mismos registros generan el estado siguiente. El estado presente del sistema puede ser actualizado tan pronto como el estado siguiente del sistema cambie. Si este último cambio se da cuando una señal de reloj cambia, se dice que el sistema es sı́ncrono pero si el cambio se da sin referencia a una señal de reloj, entonces se dice que el sistema es ası́ncrono. Un sistema secuencial sı́ncrono tiene como elemento fundamental el flip-flop, el cual es un elemento de memoria utilizado para almacenar el estado en que se encuentre el sistema, además de almacenar y definir la secuencia del sistema. La sincronı́a condiciona a que todos los flip-flops se conecten a la misma señal de reloj, de forma tal que sólo se produzca un cambio de estado en el sistema cuando ocurra un flanco o borde de disparo en la señal de reloj. Existe una división en el diseño de los sistemas secuenciales sı́ncronos que se refiere al momento en que se produzca la salida del sistema. A estos sistemas se les conoce como máquina Mealy o máquina Moore. En una máquina Mealy la señal de salida depende tanto del estado en que se encuentra el sistema como de los valores de las entradas que se aplican en determinado momento. Mientras que en una máquina Moore la salida depende solamente del estado presente. Ambas máquinas son conocidas como máquina de estado finito, del inglés Finite State Machine (FSM), debido a que tienen un estado interno que cambia. Las FSM son esenciales en el diseño de sistemas secuenciales. 1 2 CAPÍTULO 1. INTRODUCCIÓN Capı́tulo 2 Máquina de Estado Finito (FSM) Una FSM puede ser descrita usando constructores VHDL concurrentes, pero existe una manera alterna de hacerlo y esto es utilizando VHDL secuencial, i.e., un proceso. Un proceso es evaluado cuando al menos una señal de su lista de sensibilidad cambia. Si el proceso modela un bloque combinacional entonces todas las entradas combinacionales deberán estar presentes en la lista de sensibilidad para que el proceso sea ejecutado o ”despertado”. Una FSM cambia de estado en el borde o flanco de reloj. Por lo tanto, la lista de sensibilidad de un proceso modelando una FSM, debe incluir el reloj, o éste debe ser incluido en una sentencia wait. Recuerde que si una señal es incluida en la lista de sensibilidad de un proceso entonces no puede aparecer en el mismo proceso la sentencia wait. La decisión para cambiar de estado tiene que ser hecha en el borde de reloj correspondiente. El estado del sistema puede ser mantenido en una señal. El estado puede ser representado por un tipo (type) enumerado. Generalmente los valores posibles de este tipo enumerado son los nombres de los estados. Esto conduce a que un estilo común de modelar una FSM en VHDL use dos procesos. El primer proceso modela los registros de estados, mientras que el segundo proceso (process) modela el estado siguiente y la salida lógica. 2.1. Ejemplo 1 0/0 0/0 1/0 EDO 0 1/1 0/0 0/0 EDO 3 1/0 EDO 1 1/0 EDO 2 Figura 2.1: Máquina de estados finitos. Ejemplo. Escribir un programa en VHDL para el diagrama de estados de la figura 2.1. Solución. Del diagrama de estados de la figura 2.1 se concluye que se trata de una FSM que cuenta la secuencia 3 4 CAPÍTULO 2. MÁQUINA DE ESTADO FINITO (FSM) de cuatro bits de valor ’1’, i.e., la secuencia debe ser ”1111”, y en el caso en que no se cumpla con esta secuencia, se debe reiniciar la secuencia, regresando al estado cero (EDO 0). Cuando se cumple con la secuencia correcta, entonces la salida es ’1’, de otra forma la salida es ’0’. Para saber cuál será el estado siguiente se necesita conocer tanto el estado actual ası́ como el valor de la entrada, entonces se trata de una FSM tipo Mealy. Esta FSM puede ser modelada con VHDL de manera secuencial, i.e., utilizando procesos. Para una mayor claridad en el código, la FSM se divide esencialmente en dos procesos. El primero evalúa tanto los valores del estado actual como de la entrada; el segundo actualiza el valor del estado basándose en el borde de la señal de reloj (clk). El Proceso 1, cuyo código se muestra en la figura 2.3, modela el registro de estados. Por lo tanto, dicho proceso considera tanto a las señales edo actual como entrada. Por ello dichas señales son incluidas en la lista de sensibilidad de este proceso. Además, como la FSM dispone de cuatro estados, entonces se puede utilizar la sentencia case, la cual permite seleccionar si el estado actual coincide con alguno de estos cuatro estados. Por lo tanto, el selector de la sentencia case es la señal edo actual. En cada when dependiendo del estado con el que coincida, se asigna el valor que le corresponde a la señal salida. Seguido de ello se evalúa la señal entrada y dependiendo tanto del estado ya evaluado como del valor de esta última señal de entrada, se asigna el estado siguiente. De esta forma, cada estado y su entrada de la FSM es evaluado. La figura 2.2 ilustra de manera resumida el Proceso 1. En dicha figura EDO x puede tomar un valor de cualquiera de los cuatro estados: EDO 0, EDO 1, EDO 2, EDO 3 y salida puede tomar el valor de k, donde k puede tomar el valor de ’0’ o de ’1’. edo siguiente <= EDO x salida <= k Figura 2.2: Actualización de los valoresestado siguiente y salida. Ası́, una opción para describir el Proceso 1 en VHDL es listado de la figura 2.3. 2.1. EJEMPLO 1 5 1. proceso1: process (entrada, edo actual) 2. begin 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. case edo actual is when EDO 0 => salida <= ‘0’; if entrada = ‘1’ then edo siguiente <= EDO 1; else edo siguiente <= EDO O; end if; when EDO 1 => salida <=’0’; if entrada = ‘l’ then edo siguiente <= EDO 2; else edo siguiente <= EDO 0; end if; when EDO 2 => salida <= ‘0’; if entrada = ‘l’ then edo siguiente <= EDO 3; else edo siguiente <= EDO O; end if; when EDO 3 => if entrada = ‘l’ then 24. edo siguiente <= EDO O; 25. salida <= ‘1’; 26. else 27. edo siguiente <= EDO 0; 28. salida <= ‘0’; 29. 30. 31. end if; end case; end process proceso1; Figura 2.3: Proceso 1 para el contador de cuatro bits. El Proceso 2, describe la actualización del valor del estado actual. Esto para que una vez actualizado el valor del estado actual, éste pueda ser utilizado en el Proceso 1 la próxima vez que este último sea ejecutado. Para actualizar el valor del estado actual, se debe realizar lo siguiente: 1) Determinar el borde o flanco de reloj de la señal correspondiente que debe ser utilizado para realizar el cambio de estado, i.e., la transferencia del valor del estado siguiente al estado actual. El borde de la señal de reloj puede ser de subida o de bajada. En este caso se utiliza el flanco de subida para el cambio de estado. Por lo que la sentencia queda: if(clk ‘event and clk = ‘1’). 2) Actualizar el valor del estado actual, lo cual se hace transfiriendo el valor del estado actual al estado 6 CAPÍTULO 2. MÁQUINA DE ESTADO FINITO (FSM) siguiente. La sentencia queda como: edo siguiente <= edo actual; Una opción para describir el Proceso 2 en VHDL es el mostrado en la figura 2.4. proceso2: process(clk) begin if (clk ’event and clk = ’1’) then edo actual <= edo siguiente; end if; end process proceso2; Figura 2.4: Actualización del valor del estado actual. La figura 2.5 muestra un ejemplo del código en VHDL completo. 2.1. EJEMPLO 1 7 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. library ieee; use ieee.std logic 1164.all; use ieee.std logic arith.all; use ieee.std logic unsigned.all; entity Cuenta 1s is port( clk: in std logic; entrada: in std logic; salida: out std logic; estado: out std logic vector (1 downto 0)); end; architecture Arq Cuenta 1s of Cuenta 1s is type estados is (EDO 0, EDO 1, EDO 2, EDO 3); signal EDO TEMPO : std logic vector(1 downto 0):=”00”; signal edo actual, edo siguiente : estados; begin proceso1: process (entrada, edo actual) begin case edo actual is when EDO 0 => salida <= ‘0’; if entrada = ‘1’ then edo siguiente <= EDO 1; else edo siguiente <= EDO O; end if; when EDO 1 => salida <=’0’; if entrada = ‘1’ then edo siguiente <= EDO 2; else edo siguiente <= EDO 0; end if; when EDO 2 => salida <= ‘0’; if entrada = ‘1’ then edo siguiente <= EDO 3; else edo siguiente <= EDO O; end if; when EDO 3 => if entrada = ‘1’ then edo siguiente <= EDO O; salida <= ‘1’; else edo siguiente <= EDO 0; salida <= ‘0’; end if; end case; end process proceso1; proceso2:process(clk) begin if(clk ’event and clk = ’1’) then edo actual <= edo siguiente; end if; end process proceso2; end Arq Cuenta 1s; Figura 2.5: Programa completo para el contador de cuatro bits. §§§ 8 2.2. CAPÍTULO 2. MÁQUINA DE ESTADO FINITO (FSM) Ejemplo 2 0/0 0/0 EDO 0 1/0 1/1 EDO 1 1/0 0/0 EDO 2 Figura 2.6: FSM que detecta secuencia de tres unos consecutivos(1s). Ejemplo. Escribir un circuito en VHDL para el diagrama de estados de la figura 2.2. Solución. Del diagrama de estados de la figura 2.2 se observa que cuando se detecta la secuencia de tres 1s de manera consecutiva, i.e., un valor de 1 en cada entrada correspondiente a cada estado, entonces la salida toma el valor de 1; pero en cuanto detecta un valor de entrada de 0 en un estado en particular, se queda en ese estado en el que se encuentra la FSM y la salida toma el valor de 0. La figura 2.7 presenta el código en VHDL para esta FSM. En este ejemplo, con la finalidad de aclarar los estados se simplifca la etiqueta de cada estado. Ası́ para EDO 0 se le asigno E0, a EDO 1 se le asigno E1, y para EDO 2 se le asigno E2. 2.2. EJEMPLO 2 9 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. library ieee; use ieee.std logic 1164.all; use ieee.std logic arith.all; use ieee.std logic unsigned.all; entity FSM 1 is port( CLK: in std logic ; Salida: out std logic ; Estado: out std logic vector(1 downto 0); Entrada: in std logic ); end; architecture FSM of FSM 1 is type estados is (E0,E1,E2); signal edo presente, edo futuro:estados; signal EDO TEMPO : std logic vector(1 downto 0):=”00”; begin p 1:process(edo presente,Entrada) begin case edo presente is when E0 => Salida <= ’0’; EDO TEMPO <= ”00”; if (Entrada = ’0’) then edo futuro <= E0; else edo futuro <= E1; end if; when E1 => Salida <= ’0’; EDO TEMPO <= ”01”; if (Entrada = ’0’) then edo futuro <= E1; else edo futuro <= E2; end if; when E2 => EDO TEMPO <= ”10”; if (Entrada = ’0’) then edo futuro <= E2; Salida <= ’0’; else edo futuro <= E0; Salida <= ’1’; end if; end case; end process p 1; Estado <= EDO TEMPO; 48. 49. 50. 51. 52. 53. 54. p 2: process(CLK) begin if(CLK ’event and CLK = ’1’) then edo presente <= edo futuro; end if; end process p 2; end FSM; Figura 2.7: Programa completo para el contador de tres bits. 10 CAPÍTULO 2. MÁQUINA DE ESTADO FINITO (FSM) Como se observa del código 2.7, esta FSM se describe utilizando dos procesos p 1 y p 2. §§§ 2.3. Ejemplo 3 Ejemplo. Escribir un programa en VHDL que maneje un elevador. Éste puede estar en uno de dos pisos: planta baja o primer piso. Hay un botón que controla el elevador y tiene dos valores: Subiendo o Bajando. También hay dos luces en el elevador que indican el piso actual: Rojo para Planta baja, y Verde para Primer piso. En cada piso, el controlador checa el piso actual y la entrada actual, cambia el piso y las luces en la manera obvia. Subiendo Bajando Subiendo Planta Baja Primer Piso Bajando Figura 2.8: Diagrama de estados para el elevador. Solución. La figura 2.8 ilustra el diagrama de estados para este elevador. En dicha figura se identifican dos estados ası́ como sus respectivos valores de entrada y de salida. Y en la figura 2.9 se presenta el código en VHDL para el manejo del elevador. 2.3. EJEMPLO 3 11 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. library ieee; use ieee.std logic 1164.all; use ieee.std logic arith.all; use ieee.std logic unsigned.all; – boton piso = ’0’ ==> Planta Baja – boton piso = ’1’ ==> Primer Piso – luz piso = ’0’ ==> Rojo – luz piso = ’1’ ==> Verde entity Elevador is port( Clk:in std logic; Boton Piso: in std logic; Luz Piso: out std logic; Piso Real: out std logic); end; architecture Arq Elevador of Elevador is type pisos is (Planta Baja, Primer Piso); signal Piso Actual, Piso Siguiente:pisos; signal Color Luz:std logic; signal Piso Tempo:std logic; begin Proceso 1:process(Boton Piso, Piso Actual) begin case Piso Actual is when Planta Baja => Color Luz <= ’0’; Piso Tempo <= ’0’; if(Boton Piso = ’0’) then Piso Siguiente <= Planta Baja; else Piso Siguiente <= Primer Piso; end if; when Primer Piso => Color Luz <= ’1’; Piso Tempo <= ’1’; if(Boton Piso = ’0’) then Piso Siguiente <= Planta Baja; else Piso Siguiente <= Primer Piso; end if; end case; end process Proceso 1; Piso Real <= Piso Tempo; Luz Piso <= Color Luz; Proceso 2:process(Clk) begin if(Clk’event and Clk = ’1’) then Piso Actual <= Piso Siguiente; end if; end process Proceso 2; end Arq Elevador; Figura 2.9: Programa en VHDL para el elevador. Del código en VHDL de la figura 2.9 se identifican claramente los dos procesos sugeridos para la implementación de una FSM. Lo cual le da no sólo robustez al programa completo sino también claridad. §§§ 12 2.4. CAPÍTULO 2. MÁQUINA DE ESTADO FINITO (FSM) Ejemplo 4 Ejemplo. Escribir un programa en VHDL para el circuito one hot representado en el diagrama de estados por la figura 2.10. E=0 0001 E=0 0010 E=1 E=1 E=1 E=0 E=0 1000 0100 E=1 Figura 2.10: Diagrama de estados para el One hot Solución. Del diagrama de estados de la figura 2.10, se observa que además de estar formado por cuatro estados, no dispone de una salida sino solamente del estado actual y el valor de entrada. De cualquier manera este one hot puede ser descrito en lenguaje VHDL utilizando dos procesos. La figura 2.11 presenta el programa para este diagrama de estados. 2.4. EJEMPLO 4 13 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. library ieee; use ieee.std logic 1164.all; use ieee.std logic arith.all; use ieee.std logic unsigned.all; entity Ctor OneHot is port( clk : in std logic; Entrada: in std logic; Estado: out std logic vector (3 downto 0)); end; architecture Arq Ctor OneHot of Ctor OneHot is type Estados is (EDO 1, EDO 2, EDO 4, EDO 8); signal Estado Actual, Estado Siguiente: Estados; signal EDO TEMPO: std logic vector (3 downto 0); begin P1:process(Entrada, Estado Actual) begin case Estado Actual is when EDO 1 => EDO TEMPO <= ”0001”; if(Entrada = ’1’) then Estado Siguiente <= EDO 2; else Estado Siguiente <= EDO 1; end if; when EDO 2 => EDO TEMPO <= ”0010”; if(Entrada = ’1’) then Estado Siguiente <= EDO 4; else Estado Siguiente <= EDO 2; end if; when EDO 4 => EDO TEMPO <= ”0100”; if(Entrada = ’1’) then Estado Siguiente <= EDO 8; else Estado Siguiente <= EDO 4; end if; when EDO 8 => EDO TEMPO <= ”1000”; if(Entrada = ’1’) then Estado Siguiente <= EDO 1; else Estado Siguiente <= EDO 8; end if; end case; end process P1; Estado <= EDO TEMPO; – Actualiza la salida P2: process (clk) begin if(clk ’event and clk = ’1’) then Estado Actual <= Estado Siguiente; end if; end process P2; end Arq Ctor OneHot; 14 CAPÍTULO 2. MÁQUINA DE ESTADO FINITO (FSM) Figura 2.11: Programa en VHDL para el one hot. §§§ Capı́tulo 3 Resumen Como en todo diseño de un sistema digital resulta necesario identificar si tal sistema es sı́ncrono o ası́ncrono. Además es de utilidad identificar si el valor de la salida del sistema depende exclusivamente del estado actual o también del valor de entrada, permitiendo tratar al sistema como una máquina Mealy o Moore. La implementación de tales máquinas en VHDL es directa como se ha presentado en este capı́tulo. Υ Υ Υ 15