Funciones El mismo concepto que los LANs Sintaxis de la definición de una función en VHDL function nombre-función (nombre-señal : tipo-señal; nombre-señal : tipo-señal; ... nombre-señal : tipo-señal ) -- parámetros formales que serán sustituidos por los -- parámetros reales que serán del mismo tipo o subtipo return tipo-devuelto is Diseño lógico -- se devuelve un valor de este tipo EUI-ULPGC Jose Torres type declarations -- Una función puede definir sus propios objetos declaraciones de constantes y variables definiciones de función definiciones de procedimientos begin instrucción-secuencial instrucción-secuencial ... instrucción-secuencial end nombre-función; Diseño lógico -- instrucciones secuenciales (las veremos en su momento) EUI-ULPGC Jose Torres Ejemplo: programa VHDL para una función “inhibit” architecture Inhibit_archf of Inhibit is function ButNot (A, B: bit) return bit is begin if B = '0' then return A; -- ´return´ indica lo que devuelve la else return '0'; -- función a quien la llamó end if; end ButNot; begin Z <= ButNot(X,Y); end Inhibit_archf; Diseño lógico EUI-ULPGC Jose Torres Ejemplo: conversión de std_logic_vector a entero function conv_integer (X: std_logic_vector) return integer is variable result: integer; begin result := 0; for i in X'range loop result := result * 2; case X(i) is when '0' | 'L' => null; -- no hacer nada when '1' | 'H' => result := result + 1; when others => null; end case; end loop; return result; end conv_integer; Diseño lógico EUI-ULPGC Jose Torres En la otra dirección: function conv_std_logic_vector(arg: integer; size: integer) return std_logic_vector is variable result: std_logic_vector (size-1 downto 0); variable temp: integer; begin temp := arg; for i in 0 to size-1 loop if (temp mod 2) = 1 then result(i) := '1'; else result(i) := '0'; end if; temp := temp / 2; end loop; return result; -- donde size es el número de bits del resultado end conv_std_logic_vector; Diseño lógico EUI-ULPGC Jose Torres