Oscar Ignacio Botero Henao. MEF – MODELADO POR DIAGRAMAS DE ESTADO Diseñe una Máquina de Estado Finito (MEF) con una entrada de datos llamada EN y que cumpla el siguiente Diagrama de Estados. El sistema secuencial debe tener un RESET que se activa con ‘0’ y cada vez que llegue al estado S2 se activará una salida llamada Z. 1 0 0 S1 0 S0 0 0 1 S2 1 1 MODELOS MODELO MOORE EN ACTUAL Circuito Combinacional de Entrada Memoria RESET CLK Z Circuito Combinacional de Salida Oscar Ignacio Botero Henao. MODELO MEALY EN Z Circuito Combinacional de Entrada Memoria ACTUAL Circuito Combinacional de Salida RESET CLK MODELACIÓN POR DIAGRAMA DE ESTADOS Haremos el Diagrama de Flujo con sus estados estables e inestables mediante la herramienta StateCAD de Xilinx. El ejercicio consiste en detectar la secuencia del diagrama de estados, estará compuesto de una entrada de datos “EN”, la salida “Z” se activará cuando cumpla la secuencia y los pulsos de reloj “CLK” se realizan de forma manual mediante un interruptor. Comenzamos creando el proyecto como se realiza habitualmente (File / New Project), ponemos el nombre de nuestro proyecto, en este caso “MEF_1” y configuramos las especificaciones de nuestro dispositivo y el tipo de lenguaje, en este caso “HDL”. 2 Oscar Ignacio Botero Henao. En la siguiente ventana seleccionamos “New Source” y añadiremos una nueva fuente que será el Diagrama de Estados. 3 Oscar Ignacio Botero Henao. Ahora, pasaremos al entorno “StateCAD”, el cual nos sirve para diseñar maquinas de estados. Seleccionamos “Options/ Variable” y declararemos las variables que vamos a utilizar. Pondremos “EN“ como entrada por donde se ingresarán los datos para la secuencia, “CLK“ el reloj que será manual y “Z“ será la salida por donde se visualizará un “1” al completarse la secuencia; esta salida la ponemos como registro para que se mantenga encendida hasta dar el siguiente pulso de reloj. A continuación, vamos a la herramienta “Add State” y colocamos los 3 estados que necesitamos o con la herramienta “Draw State Machines” (SO, S1, S2), así: 4 Oscar Ignacio Botero Henao. STAT E0 STAT E1 STAT E2 Continuamos… colocando a los estados las transiciones con la herramienta “Add Transition”. Los cuadritos pequeños que se ven al lado de las transiciones son puntos que podemos establecer para que la línea quede curvada, se hacen con solo hacer clic con el mouse en la posición que queramos antes de llevar la transición a su destino. Ahora, vamos a colocar el RESET para controlar el estado de inicio del programa, para ello utilizamos la herramienta “Add Reset” y lo colocamos desde un punto externo hasta el ESTADO 0. Configuramos el RESET como asíncrono y activo en bajo “0”, para lo cual lo igualamos a 0 con comillas simples RESET=’0’. 5 Oscar Ignacio Botero Henao. @ELSE RESET ='0' STAT E0 Ahora configuramos los estados estables e inestables dando doble clic sobre los globos o las transiciones. En las transiciones pondremos el estado del dato de entrada EN (EN=’0’ o EN=’1’), en los globos pondremos el estado de la salida Z, (Z=’0’; o Z=’1’;). 6 Oscar Ignacio Botero Henao. EN='1' RESET='0' S0 Z='0' EN='0' EN='1' EN='1' EN='0' S1 S2 Z='0' Z='1' EN='0' Grabe el Diagrama de Flujo del StateCAD y luego genere el archivo de código VHD 7 Oscar Ignacio Botero Henao. Cada estado comprueba el dato de entrada “EN”. Dependiendo del estado en el que se encuentre compara el dato con los asignados en la secuencia y si es correcto pasará al estado siguiente, de lo contrario irá al estado asignado por medio de las transiciones. 8 Oscar Ignacio Botero Henao. Ahora vamos a generar el archivo para hacer la simulación con el Xilinx dando clic sobre “State Bench”. Se genera de forma automática dando clic en el icono “Automatic Testbench” Cuando está en el Estado S2 la salida Z se activa 9 Oscar Ignacio Botero Henao. Añadimos los archivos generados al proyecto (código HDL y Simulación), NO VUELVA A GRABAR el Diagrama de Flujo del StateCAD. Volvamos al proyecto que habíamos creado en ISE y damos clic derecho sobre él y “Add Source”. Seleccionamos el documento con extensión “MEF_1.vhd” que es la generación y compilación del programa echo en el StateCAD. 10 Oscar Ignacio Botero Henao. Repetimos el procedimiento pero adicionamos el archivo de la simulación “MEF_1_TB.VHD”. Luego Sintetiza, Asigna Pines o Terminales, Implementa el diseño y Genera los archivos de Programa para finalmente pasarlo a la tarjeta Spartan 3E. 11 Oscar Ignacio Botero Henao. DIAGRAMA DE ESTADO MODELO MOORE – FORMA 1 RESET ='0' EN='1' MODELO MOORE S0 Z='0' EN='0' EN='0' EN='1' EN='1' S1 S2 Z='0' Z='1' EN='0' CÓDIGO GENERADO LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY MOORE1_DED IS PORT (CLK,EN,RESET: IN std_logic; Z : OUT std_logic); END; ARCHITECTURE BEHAVIOR OF MOORE1_DED IS ‐‐ State variables for machine sreg SIGNAL S0, next_S0, S1, next_S1, S2, next_S2 : std_logic; BEGIN PROCESS (CLK, RESET, next_S0, next_S1, next_S2) BEGIN IF ( RESET='0' ) THEN S0 <= '1'; S1 <= '0'; S2 <= '0'; ELSIF CLK='1' AND CLK'event THEN S0 <= next_S0; S1 <= next_S1; S2 <= next_S2; END IF; END PROCESS; PROCESS (EN,S0,S1,S2) BEGIN 12 IF (( EN='1' AND (S0='1')) OR ( EN='1' AND (S2='1'))) THEN next_S0<='1'; ELSE next_S0<='0'; END IF; Oscar Ignacio Botero Henao. IF ((EN='0' AND (S0='1')) OR (EN='0' AND (S1='1')) OR (EN='0' AND (S2='1'))) THEN next_S1<='1'; ELSE next_S1<='0'; END IF; IF ((EN='1' AND (S1='1'))) THEN next_S2<='1'; ELSE next_S2<='0'; END IF; IF (((S2='1'))) THEN Z<='1'; ELSE Z<='0'; END IF; END PROCESS; END BEHAVIOR; DIAGRAMA DE ESTADO MODELO MOORE – FORMA 2 RESET ='0' EN='1' S0 MODELO MOORE Q0='0';Q1='0';Z='0' EN='0' EN='1' EN='1' EN='0' S1 S2 Q0='1';Q1='0';Z='0' Q0='0';Q1='1';Z='1' EN='0' CÓDIGO GENERADO LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY MOORE1_DEJK IS PORT (CLK,EN,RESET: IN std_logic; Q0,Q1,Z : OUT std_logic); END; 13 Oscar Ignacio Botero Henao. ARCHITECTURE BEHAVIOR OF MOORE1_DEJK IS ‐‐ State variables for machine sreg SIGNAL S0, next_S0, S1, next_S1, S2, next_S2 : std_logic; SIGNAL next_Z : std_logic; BEGIN PROCESS (CLK, RESET, next_S0, next_S1, next_S2, next_Z) BEGIN IF ( RESET='0' ) THEN S0 <= '1'; S1 <= '0'; S2 <= '0'; Z <= '0'; ELSIF CLK='1' AND CLK'event THEN S0 <= next_S0; S1 <= next_S1; S2 <= next_S2; Z <= next_Z; END IF; END PROCESS; PROCESS (EN,S0,S1,S2) BEGIN IF (( EN='1' AND (S0='1')) OR ( EN='1' AND (S2='1'))) THEN next_S0<='1'; ELSE next_S0<='0'; END IF; IF (( EN='0' AND (S0='1')) OR ( EN='0' AND (S1='1')) OR ( EN='0' AND (S2='1'))) THEN next_S1<='1'; ELSE next_S1<='0'; END IF; IF (( EN='1' AND (S1='1'))) THEN next_S2<='1'; ELSE next_S2<='0'; END IF; IF (( (S1='1'))) THEN Q0<='1'; ELSE Q0<='0'; END IF; IF (( (S2='1'))) THEN Q1<='1'; ELSE Q1<='0'; END IF; IF (( EN='1' AND (S1='1'))) THEN next_Z<='1'; ELSE next_Z<='0'; END IF; END PROCESS; END BEHAVIOR; 14 Oscar Ignacio Botero Henao. DIAGRAMA DE ESTADO MODELO MEALY – FORMA 1 EN='1' Z='0' RESET ='0' S0 EN='0' EN='1' Z='0' EN='1' Z='1' EN='0' Z='0' S1 S2 EN='0' Z='0' CÓDIGO GENERADO LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY MEALY_DE1 IS PORT (CLK,EN,RESET: IN std_logic; Z : OUT std_logic); END; ARCHITECTURE BEHAVIOR OF MEALY_DE1 IS ‐‐ State variables for machine sreg SIGNAL S0, next_S0, S1, next_S1, S2, next_S2 : std_logic; SIGNAL next_Z : std_logic; BEGIN PROCESS (CLK, RESET, next_S0, next_S1, next_S2, next_Z) BEGIN IF ( RESET='0' ) THEN S0 <= '1'; S1 <= '0'; S2 <= '0'; Z <= '0'; ELSIF CLK='1' AND CLK'event THEN S0 <= next_S0; S1 <= next_S1; S2 <= next_S2; Z <= next_Z; END IF; END PROCESS; 15 Z='0' Oscar Ignacio Botero Henao. PROCESS (EN,S0,S1,S2) BEGIN IF (( EN='1' AND (S0='1')) OR ( EN='1' AND (S2='1'))) THEN next_S0<='1'; ELSE next_S0<='0'; END IF; IF (( EN='0' AND (S0='1')) OR ( EN='0' AND (S1='1')) OR ( EN='0' AND (S2='1'))) THEN next_S1<='1'; ELSE next_S1<='0'; END IF; IF (( EN='1' AND (S1='1'))) THEN next_S2<='1'; ELSE next_S2<='0'; END IF; IF (( EN='1' AND (S1='1'))) THEN next_Z<='1'; ELSE next_Z<='0'; END IF; END PROCESS; END BEHAVIOR; 16