2.7. Elementos de diseño basado en el comportamiento Describir de forma directa el comportamiento de un circuito lógico Es uno de los beneficios clave de los HDL Elemento clave es el proceso = colección de instrucciones ´secuenciales´ que se ejecuta en paralelo con otras instrucciones concurrentes y procesos Especifica una interacción de señales que se ejecuta en tiempo de simulación cero Da lugar a un circuito secuencial o combinacional que efectúa la operación modelada Diseño lógico EUI Jose Torres 1 de 17 Una instrucción de proceso se usa en cualquier parte donde pueda ir una instrucción concurrente Su sintaxis es: process (nombre-señal, nombre-señal, ..., nombre-señal) declaraciones de tipos declaraciones de variables declaraciones de constantes definiciones de funciones definiciones de procedimientos begin instrucción-secuencial ... instrucción-secuencial end process; Diseño lógico EUI Jose Torres 2 de 17 Objetos visibles desde el proceso: - tipos, señales, constantes, funciones y procedimientos visibles a la arquitectura dentro de la cual está - los objetos locales al proceso Un proceso no puede declarar señales, sólo variables (no visibles desde fuera), con la sintaxis: variable nombres-variables : tipo-variable ; Diseño lógico EUI Jose Torres 3 de 17 Un proceso VHDL estará siempre en ejecución o suspendido, lo cual viene determinado por la lista de sensibilidad del proceso (señales en su definición) (1) Está inicialmente suspendido, reanuda su ejecución cuando cambia el valor de cualquier señal en su lista de sensibilidad (2) Si como resultado de la ejecución cambia alguna señal de la lista de sensibilidad, se ejecuta de nuevo; así hasta que no cambie ninguna En la simulación esto ocurre en tiempo cero Diseño lógico EUI Jose Torres 4 de 17 Instrucciones secuenciales: 1. Instrucción de asignación de señal secuencial Igual que la concurrente , pero dentro del cuerpo de un proceso en vez del de una arquitectura nombre-señal <= expresión 2. Instrucción de asignación de variable Análoga a la de señal nombre-variable := expresión Diseño lógico EUI Jose Torres 5 de 17 Ejemplo: el mismo del flujo de datos reescrito con un proceso architecture prime6_arch of prime is begin process (N) variable N3L_N0, N3L_N2L_N1, N2L_N1_N0, N2_N1L_N0: std_logic; begin N3L_N0 := not N(3) and N(0); N3L_N2L_N1 := not N(3) and not N(2) and N(1) ; N2L_N1_N0 := not N(2) and N(1) and N(0); N2_N1L_N0 := N(2) and not N(1) and N(0); F <= N3L_N0 or N3L_N2L_N1 or N2L_N1_N0 or N2_N1L_N0; end process; end prime6_arch; Diseño lógico EUI Jose Torres 6 de 17 En esta arquitectura una sola instrucción concurrente que es el proceso Las instrucciones se ejecutan secuencialmente y no podemos cambiar el orden como se podía cuando eran asignaciones de señal Lista de sensibilidad del proceso = bits de entrada al circuito(N) Las salidas de las AND son variables en vez de señales (no se pueden declarar dentro de un proceso) ¾ Veamos otras instrucciones secuenciales para tener mayor control a la hora de especificar el comportamiento del circuito: Diseño lógico EUI Jose Torres 7 de 17 3. Instrucción if 1) if expresión-booleana then instrucción-secuencial end if; 2) if expresión-booleana then instrucción-secuencial else instrucción-secuencial end if; 3) if expresión-booleana then instrucción-secuencial elsif expresión-booleana then instrucción-secuencial ... elsif expresión-booleana then instrucción-secuencial end if; 4) if expresión-booleana then instrucción-secuencial elsif expresión-booleana then instrucción-secuencial ... elsif expresión-booleana then instrucción-secuencial else instrucción-secuencial end if; Diseño lógico EUI Jose Torres 8 de 17 Ejemplo: detector de número primo usando una sentencia ‘if’ architecture prime7_arch of prime is begin process (N) variable NI: integer; -- utiliza una variable begin NI := conv_integer(N); if NI=1 or NI=2 then F <= '1'; elsif NI=3 or NI=5 or NI=7 or NI=11 or NI=13 then F <= '1'; else F <= '0'; end if; end process; end prime7_arch; Diseño lógico EUI Jose Torres 9 de 17 4. Instrucción case Para seleccionar entre alternativas según el valor de una señal o expresión. Sintaxis de una sentencia case VHDL case expresión is when opciones => instrucciones-secuenciales ... when opciones => instrucciones-secuenciales end case; evalúa expresión y ejecuta las instrucciones correspondientes Diseño lógico EUI Jose Torres 10 de 17 Pueden ser varias instrucciones secuenciales opciones pueden ser múltiples valores separados por ´|´ Las opciones deben ser mutuamente excluyentes e incluir todos los valores posibles Se puede usar others indicando todos los valores que no han sido cubiertos Diseño lógico EUI Jose Torres 11 de 17 Ejemplo: detector de número primo usando el ‘case’ architecture prime8_arch of prime is begin process(N) begin case conv_integer(N) is when 1 => F <= '1'; when 2 => F <= '1'; when 3 | 5 | 7 | 11 | 13 => F <= '1'; when others => F <= '0'; end case; end process; end prime8_arch; Diseño lógico EUI Jose Torres 12 de 17 5. Instrucción loop Sintaxis de un bucle for en VHDL for identificador in rango loop instrucción-secuencial ... instrucción-secuencial end loop; La variable identificador se declara implícitamente del tipo intervalo “rango” Diseño lógico EUI Jose Torres 13 de 17 Instrucciones exit y next Útiles para usar en bucles exit transfiere el control a la instrucción siguiente al bucle next provoca que sean ignoradas las restantes instrucciones del ciclo y comience la siguiente interacción Ejemplo : detector de número primo library IEEE; use IEEE.std_logic_1164.all; entity prime9 is port ( N: in std_logic_vector (15 downto 0); F: out std_logic ); Diseño lógico EUI Jose Torres end prime9; 14 de 17 architecture prime9_arch of prime9 is begin process(N) variable NI: integer; variable prime: boolean; begin NI := conv_integer(N); prime := true; if NI=1 or NI=2 then null; -- casos especiales else for i in 2 to NI-1 loop if NI mod i = 0 then prime := false; exit; end if; end loop; end if; if prime then F <= '1'; else F <= '0'; end if; end process; end prime9_arch; Diseño lógico EUI Jose Torres 15 de 17 Es una verdadera descripción de comportamiento Hemos incrementado la entrada N a 16 bits para enfatizar la ventaja de utilizar este método que no tiene que enumerar explícitamente cientos de primos Aunque es un mal ejemplo de diseño por poco eficiente ya que al operador mod tiene que generar divisores Diseño lógico EUI Jose Torres 16 de 17 6. Instrucción while Sintaxis de un bucle while en VHDL while expresión-booleana loop instrucción-secuencial ... instrucción-secuencial end loop; Los procesos se pueden utilizar para describir tanto circuitos combinacionales como secuenciales Diseño lógico EUI Jose Torres 17 de 17