Tutorial: Diseño digital con lenguajes de descripción material (VHDL) Dr. Andrés David García García Departamento de Mecatrónica Escuela de Diseño, Ingeniería y Arquitectura Campus Estado de México Introducción: Justificación de los HDL’s Debido a los rápidos avances en las tecnologías de integración (semiconductores) de los C.I., la complejidad de los sistemas digitales ha aumentado rápidamente en los últimos 30 años. Objetivos: Reducir tiempos y costos de fabricación Reducir tamaños de PCBs Aumentar la eficiencia de los dispositivos 2 Introducción: Evolución Tecnológica De los transistores hacia el diseño VLSI: VDD R1 4k R4 1.6k INT1 A Q1 PN2222 V V1 = 5V V2 = 0V TD = 0.1u TR = 0.15u TF = 0.15u PW = 6u PER = 13u V2 R3 130 Q3 PN2222 V5 INT 5Vdc Q2 PN2222 D3 D1N4004 B OUT V V1 = 5V V2 = 0V TD = 0.1u TR = 0.15u TF = 0.15u PW = 13u PER = 26u V3 Q1_bis PN2222 INT2 V Q4 PN2222 R2 1k 2 1 C1 0.1n GND 0 Solución: Hardware Description Languages (HDLs) 3 Introducción: Surgimiento de VHDL 1980 El departamento de defensa de los Estados Unidos de América lanza un concurso público con el propósito de crear una metodología de diseño de circuitos de fácil documentación (self-documenting): Común para cualquier diseñador, Independiente tecnológicamente, Re-utilizable en nuevas tecnologías de semiconductor. El proyecto se fundó dentro del programa VHSIC (Very High Speed Integrated Circuits) y bajo la bandera de la IEEE con el fin de generar un HDL estándar. Resultado: VHDL 4 Introducción: Surgimiento de VHDL 1983 VHDL: Desarrollado inicialmente con la colaboración de IBM, TI, e Intermetrics. Grupo de trabajo de personas con experiencia en lenguajes de alto nivel y diseño en metodología “top-down”. VHDL: Metodología de diseño y manipulación de la información estándar. Facilita desarrollar, actualizar e implementar sistemas electrónicos digitales. Adaptable a nuevas tecnologías una vez que la tecnología actual se haya vuelto obsoleta. 1987 El Departamento de Defensa de EUA impone el uso de VHDL. La IEEE avala el estándar de VHDL bajo el número: IEEE1076. Avión-caza F-22, primer proyecto donde se exigió utilizar VHDL. 5 Introducción: Surgimiento de VHDL 1987 Los fabricantes de herramientas de diseño electrónico EDA (Electronic Design Automation) comienzan a desarrollar software de diseño y simulación bajo este estándar industrial. 1993 Se realiza la primera revisión del estándar, lo que tiene como consecuencia una nueva versión del mismo: IEEE 1076 ’93 1996 Nuevas herramientas comerciales de simulación y síntesis lógica salen al mercado cumpliendo con la nueva versión del estándar IEEE 1076’93 Incremento exponencial del uso de VHDL en la industria para el diseño de C.I. bajo una metodología “Top-Down”. Desarrollo de librerías del estándar IEEE 1076.3 que permite la portabilidad de los diseños entre distintos fabricantes de EDA’s. El estándar IEEE 1076.4 se complementa con librarías para modelar estructuras de circuitos ASIC y FPGAs: VITAL(VHDL Initiative Towards 6 ASIC Libraries). ¿Para qué sirven los HDL? A 1 si A = 0 Z 0 si A = 1 Modelización A A Z Z Simulación Síntesis lógica 7 HDLs: Características Inspirado en lenguajes de programación de alto nivel como C, o C++ (Software) para modelar y describir funciones que serán implementadas físicamente (Hardware) Existen 2 aspectos importantes en la descripción de Hardware que se facilitan con el uso de HDLs: Modelado del comportamiento abstracto del circuito Modelado estructural a nivel físico 8 HDLs: Niveles de abstracción Los modelos de alto nivel permiten describir de forma abstracta la función del HW Los modelos de bajo nivel describen con mas detalle las estructuras del HW 9 Descripción comportamental 10 Descripción RTL 11 Nivel compuertas lógicas 12 Nivel de abstracción VHDL permite codificar un algoritmo (como un lenguaje de alto nivel). Los diferentes niveles de abstracción del código permiten realizar una concepción descendente TOP-DOWN. El nivel RTL (Register Transfer Logic) donde los registros son identificados es sintetizable. Después de la síntesis, la herramienta genera la netlist, es decir, el HDL Estructural con los componentes de la biblioteca. registros S=fft(e,64) Nivel 1 radix1 radix2 biblioteca radix3 Nivel 2 Nivel RTL Síntesis lógica netlist 13 Módulos y jerarquía: Diseño Top-Down Partición en varias partes del diseño Reducción de la complejidad material Permite el trabajo en red de diseñadores Permite el estudio de soluciones alternativas Permite la creación de macros en software Permite la creación de modelos de simulación genéricos 14 Características de VHDL VHDL: Proximidad con las herramientas de diseño asistido por computadora (CAD): Relación implícita con lenguajes de alto nivel como C. Facilidad de documentar. Código portátil (se puede usar en diferentes tecnologías o procesos). NO ES UN LENGUAJE COMPUTACIONAL 15 Estructura del lenguaje Cinco unidades de diseño sintetizables: Entity Architecture Package declaration Package body Configuration La Entidad, el Empaquetado y la Configuración son unidades principales de diseño, visibes dentro de la librería. Una librería es un conjunto de unidades de diseño. La Arquitectura y el Cuerpo del Empaquetado son unidades de diseño secundarias y no son visibles dentro de la librería. Un archivo de descripción en VHDL consiste de una Entidad y una Arquitectura. E A P B C Compilador Librería Editor de Conexiones elaboración 16 VHDL: Unidades de diseño y síntesis Entity: Descripción de la interfaz con el mundo exterior. Aquí se definen las terminales que permiten a una unidad de diseño comunicarse con otras, engloba a a las terminales de Entrada, Salida, y Bidireccionales definidas en la declaración de “puertos”, y cualquier parámetro o modelo general definido en la declaración de “genéricos”. Architecture: Descripción de la funcionalidad del circuito, descripción de la estructura del diseño, puede ser descrita en cualquiera de los niveles de abstracción (comportamenta, RTL o nivel de compuertas lógicas). Entidad del Circuito Arquitectura 17 VHDL: Unidades de diseño y síntesis Package declaration: Archivo que concentra las declaraciones recurrentemente utilizadas dentro de una serie de diseños (tipos de datos, sub-programas, sub-rutinas) que serán accesibles a múltiples unidades de diseño. Package body: Contiene la definición de los sub-programas, subrutinas, funciones y procesos declarados en el Empaquetado. Configuration: Asocia la Entidad a la Arquitectura para formar los componentes de un diseño. Permite asociar una Entidad a distintas versiones de la Arquitectura sintetizadas, lo que permite modificar la funcionalidad sin modificar la estructura externa del circuito. 18 Estructura de un código en VHDL Definición de Librerías Declaración de la Entidad Definición de la Arquitectura Declaraciones de: signals constants variables components types Library IEEE; use IEEE.std_logic_1164.ALL; entity NAME_OF_ENT is Port ( NAME, NAME : in type of input; NAME, NAME: out type of output; NAME : bidir type of bidir); end NAME_OF_ENT; architecture NAME_OF_ARC of NAME_OF_ENT is signal SIG_A, SIG_B : type of signal; variable VAR_A, VAR_B : type of variable; constan CONS_A: type of constant; type NAME_OF_TYPE is (values of type); component NAME_OF_COMP is port ( ……….; in type of input: ………..: out type of output); end component NAME_OF_COMP; Begin ------ concurrent instruction ----------; ------ concurrent instruction ----------; end NAME_OF_ARC; Estructura de un código en VHDL: architecture NAME_OF_ARC of NAME_OF_ENT is Arquitectura signal SIG_A, SIG_B : type of signal; Configuración Declaraciones : signals constants variables components types Proceso (instrucción concurrente) variable VAR_A, VAR_B : type of variable; constan CONS_A: type of constant; type NAME_OF_TYPE is (values of type); component NAME_OF_COMP is port ( ……….; in type of input: ………..: out type of output); end component NAME_OF_COMP; Begin ------ concurrent instruction ----------; ------ concurrent instruction ----------; process (list of sensibility) begin ------ sequential instructions -----; ------ sequential instructions -----; end process; ------ concurrent instruction ----------; end NAME_OF_ARC; Instrucciones concurrentes VHDL permite describir una función materal con la ayuda de instrucciones concurrentes. Un process es un tipo de instrucción concurrente (también lo son los procedures y las functions. Las señales se usan para contectar entre si los procesos (síncronos y combinatorios) y las instrucciones concurrentes: A procesos combin. CLK Proceso síncrono señales B C S3 procesos combin. instr concurrente S1 instr concurrente S2 21 Estructura de VHDL C <= A and B; E <= C or D; A B C D E Operador “señal” A, B , C, D : señales Señal : tipo correspondiente a las señales en sistemas físicos (cables) Instrucción concurrente: Instrucciones “paralelas” para que el simulador tome en cuenta el tiempo de propagación de las señales dentro de un circuito. 22 Asignación Concurrente: Dentro de una arquitectura podemos asignar un valor a una señal (cable), a una variable (nodo R/W) o a una constante (nodo R). Las asignaciones concurrentes dentro de una arquitectura de ejecutan al mismo tiempo (no es un código síncrono): VAR := VAR + ‘1’; SIG <= SIG + ‘1’; Las instrucciones concurrentes tales como los “process” son pedazos de código secuencial y solo se ejecutan cuando se cumplen sus condiciones de activación (lista de sensibilidad). 23 Señales/variables ENTITY mux IS PORT (a, b, c, selx, sely : IN BIT; data_out : OUT BIT); END mux; ARCHITECTURE ex OF mux IS SIGNAL sig : BIT; BEGIN sig <= a and selx or b and not(selx); La señal sig es conocida En toda la arquitectura. process_b: PROCESS(sig,b, c, sely) VARIABLE var : BIT; BEGIN var := ‘ 0 ’; IF (sely = ‘0’) THEN var := '1'; ELSIF (sig = '1') THEN var := c; ELSE var := '0'; END IF; data_out <= var xor b; END PROCESS process_b; END ex; La variable var es local (solo en el process). Esta se actualiza instantáneamente. La señal se actualiza al final del proceso 24 Procesos (Process) Un proceso es una instrucción concurrente definida con la ayuda de instrucciones secuenciales internas al proceso. El proceso se activa si al menos una de las señales de la lista de sensibilidad cambia de estado lógico. Ejemplo : P1 : process(X,Y) begin if X=‘ 1 ’ then Z <= Y; else Z <= ‘ 0 ’; end if; end process P1; Lista de sensibilidad X Z Y 25 Objetos: Signal Port function constant variable procedure component Los objetos deben ser declarados antes de ser utilizados Los puertos, señales, variables y constantes deben ser tipos (integer, real, natural, …) La conversión implícita de tipos es imposible, se deben crear funciones de conversión 26 Tipología Las señales, variables y constantes deben pertencer a un tipo. Con la biblioteca STD, los tipos son: Files Access Scalar Composite Physical Enumerated Record BIT BOOLEAN Real Array BIT_VECTOR Integer INTEGER NATURAL POSITIVE 27 Instrucción de afectación. Combinatorios Para el siguiente circuito : sel a mux s b c Una instrucción de afectación permite codificar directamente la ecuación lógica : S <= c and ((a and not(sel)) or (b and sel)); 28 Instrucción de afectación condicional WHEN...ELSE La afectación de la señal s depende de condiciones descritas despues del WHEN : sel s <= '0 ’ when c = '0' else a when sel = '0' else b when sel = '1' else '0'; a mux s b c 29 Instrucción de afectación condicional WITH ... SELECT La expresión que sigue al WITH se evalúa y permite la afectación condicional de la señal s : LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY toto IS port(a,b,c,sel: in std_logic; s: out std_logic); END toto; ARCHITECTURE behavior OF toto IS BEGIN with sel select S <= (a and c) when '0', (b and c) when OTHERS; END behavior; sel a b mux s c Nota : esta instrucción permite codificar fácilmente un multiplexor 30 Ejemplo: Full Adder entity FullAdder is port (X, Y, Cin: in bit; Cout, Sum: out bit ); end FullAdder; palabras reservadas X Y Cin FullAdder Sum -- entradas -- salidas comentarios Cout 31 Ejemplo: Full Adder architecture ecuaciones of FullAdder is begin Sum <= X xor Y xor Cin; Cout <= (X and Y) or (X and Cin) or (Y and Cin); end ecuaciones; Nombre de la Arquitectura (arbitrario) Arquitectura perteneciente a la entidad FullAdder (MISMO NOMBRE) 32 Componentes Si ya tenemos una “biblioteca” con componentes ya diseñados (FA´s, MUX´s, …), podemos utilizarlos para el diseño de otros sistemas que necesiten estos componentes ya diseñados. Se habla de “instanciamiento” de componentes: crear “copias” de un componente para implementar un sistema más complejo. 33 Ejemplo: Full Adder de 4 bits A(3) B(3) A(2) B(2) A(1) B(1) A(0) B(0) entity Co C(3) FullAdder FullAdder S(3) S(2) C(2) FullAdder S(1) C(1) Ci FullAdder S(0) 34 Ejemplo: Full Adder de 4 bits entity Adder4 is port (A, B : in bit_vector (3 downto 0); --entradas Ci : in bit; --entrada S : out bit_vector (3 downto 0); --salidas Co : out bit ); --salida end Adder4; Señales vectoriales A, B y S formadas por 4 bits S Co 4 4 Adder4 4 A B Ci 35 Ejemplo: Full Adder de 4 bits FullAdder es un componente architecture estructura of Adder4 is component FullAdder port (X, Y, Cin : in bit; Cout, Sum : out bit); end component; signal C : bit_vector (3 downto 1) ; --entradas --salidas --señal interna que comunica --los componentes FullAdder begin --intanciar 4 copias de FullAdder FA0 : FullAdder port map ( A(0), B(0), Ci, C(1), S(0) ); instancias FA1: FullAdder port map ( A(1), B(1), C(1), C(2), S(1) ); de FullAdder FA2: FullAdder port map ( A(2), B(2), C(2), C(3), S(2) ); FA3: FullAdder port map ( A(3), B(3), C(3), Co, S(3) ); end estructura; 36 La construcción de tipos y sub-tipos type COLORES is (ROJO, AMARILLO, AZUL, VERDE, NARANJA); type BOOLEAN is (FALSE, TRUE); type BIT is ('0', '1'); type UN_A_DIX is range 1 to 10; type DIX_A_UN is range 10 downto 1; Tipos diferentes type TAB1 is array (0 to 31) of BIT; type TAB2 is array (0 to 1023, 0 to 31) of BIT; type BIT_VECTOR is array (NATURAL range <>) of BIT; subtype NATURAL is INTEGER range 0 to INTEGER'HIGH; subtype POSITIVE is INTEGER range 1 to INTEGER'HIGH; subtype UNO_A_DIEZ is NATURAL range (1 to 10); subtype DIEZ_A_UNO is NATURAL range (10 downto 1); Herencia de propiedades de tipo 37 Los operadores Lógicos Relacionales Aditivos De signo and, or, nand, nor, xor =, /=, <, <=, >, >= +, & (concatenación) +, - Multiplicativos Diversos ** (exponente) abs (valor absoluto) not (negación) *, /, mod, rem A = (A / B) * B + (A rem B) signe(A rem B) = signe(A) abs(A rem B) < abs(B) (-A) / B = -(A / B) = A / (-B) N, A = B * N + (A mod B) signe(A mod B) = signe(B) abs(A mod B) < abs(B) Nota: Cualquier operador que implique un operador aritmético requerirá de la librería correspondiente. 38 Bibliotecas y Librerías En VHDL es posible utilizar componentes, funciones y procesos descritos previamente por otros diseñadores o por las empresas que usan este estándar. Estas unidades estarán almacenadas en una biblioteca (librería) que puede ser agregada al proyecto con el fin de utilizar sus componentes en un nuevo diseño. Los componentes se sintetizan dentro de la librería de trabajo El nombre lógico para una librería de trabajo es “work”. La localización física de este repertorio debe ser especificada en la herramienta que se utilice. Normalmente, las herramientas de diseño con VHDL definen y usan la librería “work” automáticamente. 39 Bibliotecas • Para utilizar los componentes de una librería, ésta debe ser especificada como se muestra: library <library_name>; use <library_name>.<package_name>.ALL; • “Work” y “Standard” (o STD) son librerías siempre visibes, es decir, no se requieren especificar dentro del código VHDL • Todos los tipos de datos y funciones predefinidas en el estándar VHDL se localizan dentro del standard package que se localiza en la librería: std library • Bit, bit vector, character, string, time, integer, … library work; Library std; use std.standard.ALL; No necesitan ser especificadas 40 Library Otras librerías o empaquetados requieren ser especificados al inicio del código en VHDL: std_logic std_ulogic, std_logic_vector std_ulogic_vector package std_logic_1164 defined by IEEE Library ieee library IEEE; use IEEE.STD_LOGIC_1164.ALL; entity … 41 Bibliotecas La biblioteca “WORK” corresponde al repertorio de trabajo del usuario: Biblioteca ALTERA Empaquetado maxplus2 megacore Descripción LPM lpm_components megafonciones LPM IEEE std_logic_1164 std_logic_unsigned std_logic_signed std_logic_arith declaración de tipo STD_LOGIC aritmética con vectores sin signo aritmética con vectores con signo declaración de tipos UNSIGNED y SIGNED. Funciones aritméticas y de conversión primitivos y macros ALTERA megafunciones Bibliotecas de ALTERA : 42 Biblioteca LPM de ALTERA Estándar industrial para los parámetros y E/S de funciones lógicas Código optimizado para las arquitecturas ALTERA Compuertas lpm_and lpm_clshift lpm_inv lpm_or lpm_bustri lpm_constant lpm_mux lpm_xor lpm_decode lpm_add_sub lpm_mult csdpram lpm_latch lpm_ram_io lpm_tff Circuitos aritméticos lpm_abs lpm_compare lpm_counter Memorias csfifo lpm_ram_dq lpm_dff lpm_rom Xilinx tiene su propia biblioteca LPM 43 VHDL para circuitos digitales Combinatorio : entradas lógica salidas Resultado para lógica secuencial Secuencial : entradas lógica Estado_f D estado CLK 44 Lógica combinatoria Hay varios estilos de codificación: Con la ayuda de una instrucción concurrente de afectación. (vistos previamente) Con la ayuda de un proceso (process) Con la ayuda de instanciación de componentes (código estructural o jerárquico) 45 Proceso (Process) Un proceso es una “subrutina” dentro de la arquitectura que solo se efectúa (activa) cuando algunas de las señales internas a éste cambian de estado. Sintaxis: process (lista de sensibilidad) begin instrucciones combinatorias o secuenciales end process; 46 Código dentro de un proceso IF ... THEN La afectación de S depende de las condiciones del IF y ELSIF combi : process(a,b,c,sel) begin if c='0' then s <= '0'; elsif sel='0' then s <= a; else s <= b; end if; end process; La lista de sensibilidad contiene todas las entradas de la función sel a mux s b c 47 Código dentro de un proceso CASE …WHEN La expresión que sigue al CASE se evalua y permite la afectación condicional de la señal s : sel combi : process(a,b,c,sel) begin case sel is when '0' => s <= a and c; when '1' => s <= b and c; when others => null; end case; a b mux s c Note : Este código permite construir facilmente un multiplexor end process; 48 Precauciones para procesos combinatorios combi : process(a,b,c,sel) begin if c='0' then s <= '0'; elsif sel='0' then s <= a; else s <= b; end if; end process; Que pasaría si c se omite de la lista de de sensibilidad ? A B C SEL 1 S Conclusión : Nunca olvidar una señal de entrada a un proceso en la lista de sensibilidad 49 Síntesis de un « latch »: Cuando las condiciones no son muy precisas en las instrucciones condicionales => memorisación se traduce como una síntesis en flip-flops tipo "latch". PROCESS(A,B) BEGIN IF A = '1' THEN Q <= B; -ELSE -Q <= ‘ 0 ’; END IF; END PROCESS; A B Q Con ELSE : síntesis de una AND Sin ELSE : síntesis de un LATCH B D A Q Q E Nota : Un Flip-Flop D es preferible a un LATCH 50 Operaciones aritméticas Por default sobre los tipos INTEGER Sobre tipos STD_LOGIC, UNSIGNED, STD_LOGIC_VECTOR y SIGNED utilizar la biblioteca IEEE1164 con las sublibrerías: std_logic_1164 std_logic_unsigned std_logic_signed std_logic_arith Declaración de tipos STD_LOGIC y STD_LOGIC_VECTOR Aritmética de tipos STD_LOGIC_VECTOR sin signo Aritmética de tipos STD_LOGIC_VECTOR con signo Declaración de UNSIGNED y SIGNED. Funciones aritméticas y de conversión +,-,* Operaciones posibles : La síntesis llama automáticamente a las macrofunciones LPM 51 Lógica Síncrona Una sola solución : uso de un process síncrono con un solo reloj en la lista de sensibilidad Proceso síncrono Entradas lógica Estado_f D estado ó CLK Codigo de la lógica Por separado Proceso síncrono entradas Lógica = registro Estado_f D estado CLK 52 Lógica Síncrona Los circuitos secuenciales siempre van acompañados de una red combinacional. Para una sintaxis VHDL “limpia” SIEMPRE DEBE separarse la red combinacional de la parte secuencial Los procesos secuenciales van siempre dentro de un process Los procesos combinatorios pueden asignarse dentro de la Arquitectura, en un process, en una function o en un procedure 53 Proceso síncrono elemental síntesis de un Flip-Flop D Reloj únicamente Indicación del flanco de subida PROCESS(CLK) BEGIN IF CLK’event and CLK = '1' THEN Q <= D; END IF; END PROCESS; Note : es mejor añadir el atributo ‘event Aún cuando no sea muy útil CLK D Q D D Q Q CLK 54 Flip-Flop D con RESET síncrono PROCESS (CLK) BEGIN IF (CLK’event and CLK = '1') THEN IF N_RST = ‘0’ THEN Q <= ‘0’; ELSE Q<= D; END IF; END IF; END PROCESS; CLK N_RS T D Q N_RST D D Q Q CLK 55 Flip-Flop D con RESET asíncrono Añadir la señal de reset asíncrono dentro de la lista de sensibilidad PROCESS (CLK, N_RST) BEGIN IF N_RST = ‘0’ THEN Q <= ‘0’; ELSIF (CLK’event and CLK = ‘1’) THEN Q<= D; END IF; END PROCESS; La condición sobre el reset es prioritaria CLK N_RST D Q D D Q Q CLK Que pasaría si no hay clk´event ? N_RST 56 Flip-Flop D con “enable” La condición sobre el “enable” tiene prioridad PROCESS (CLK) BEGIN IF EN= ‘0’ THEN NULL; -- Q <= Q; ELSIF CLK’event and CLK = ‘1’ THEN Q<= D; END IF; END PROCESS; D EN CLK D Q ENA Q Físicamente, la señan de “enable” equivale a un FF cuya entrada está controlada por un MUX 57 Ejemplo de lógica síncrona: el contador La lógica combinatoria ARCHITECTURE ex OF compteur IS SIGNAL CPT : STD_LOGIC_VECTOR(7 downto 0); se codifica dentro del proceso BEGIN Síncrono usando CPT<= CPT+1 PROCESS (CLK) BEGIN IF clk = '1' THEN IF LOAD = '1' THEN CPT <= D; ELSE 1 Estado_F D Estado S CPT <= CPT + '1'; END IF; CLK END IF; END PROCESS; El empaquetado S <= CPT; ieee.std_logic_unsigned debe ser END ex; El número de F-F D generado declarado para aritmética de números sin signo = dimensión de CPT + 58 Ejemplo de un FlipFlop JK PROCESS(CLK, RST) BEGIN IF RST = ‘0’ THEN Q <= ‘0’; ELSIF CLK’event and CLK = '1' THEN Q <= (J and not(Q)) or (not(K) and Q); END IF; END PROCESS; Q_N <= not (Q); J J Q Q CLK K Q_N Q_N K 59 Máquina de estados Máquina de MOORE : Entradas Estado_F estado Salidas D CLK Ejemplo de código : Proceso combinatorio : P3 Proceso síncrono : P1 Proceso combinatorio : P2 60 Máquina de estados Creación de un tipo que engloba la lista de estados ARCHITECTURE Ejemplo OF maquina_de_cafe IS type ST is (elección,pieza,moneda,cafe); signal estado,estado_futuro : ST; BEGIN P1 : PROCESS(CLK) ...estado <= estado_futuro; P2 : PROCESS(estado) if (estado = x) then ...sorties <= end if; if (estado = y) then … P3 : PROCESS(entradas,estado) ...estado_futuro <= END Ejemplo; 61 Ejemplo de máquina de estados m='1' MON DES S0 S1 alto='1' bajo='1' alto m d DES='1' S3 MON='1' d='1' S2 bas 62 Ejemplo de máquina de estados P3: process(estadot,m,d,alto,bajo) begin m='1' estado is MON S0 S1 MON='1' case when S0 =>if (m='1') then DES estado_f<=S1; alto='1' alto bajo='1' else estado_f<=estado; m d end if; d='1' DES='1' S3 S2 when S1 => if (alto='1') then estado_f<=S2; else bas estado_f<=estado; P2: process(estado) end if; begin when S2 => if (d='1') then if(estado=S1) then type ST is (S0,S1,S2,S3); estado_f<=S3; MON <= '1'; signal estado,estado_f : ST; else else estado_f<=estado; MON <='0'; P1: process(CLK) end if; end if; begin when S3 => if (bajo='1') then if(estado=S3) then if(CLK='1') then estado_f<=S0; DES<= '1'; estado <= estado_f; else else end if; estado_f<=estado; DES<='0'; end process P1; end if; end if; end case; end process P2; 63 end process P3; Bibliografía sugerida: Roth, Ch. Jr. Digital Systems Design Using VHDL.PWS Publishing Company, 2a Ed. Roth, Ch. Jr. Fundamentals of Logic Design, PWS Publishing Company, 2a Ed. Brown, Vranesic. Fundamentals of Digital Logic with VHDL, McGrawHill. 2nd edition. K. C. Chang. “Digital Design and Modeling with VHDL and Synthesis”. IEEE computer society press. Sjoholm, Lindh. “VHDL for Designers”. Prentice Hall 64