-- Exemples de fonctions et procedures courantes -- PACKAGE -- Surcharge -- variable -- attributs -- conversion de types -- Fonction de résolution --------------------------------------------------- LIBRARY ieee; USE ieee.std_logic_1164.ALL; USE work.ALL; PACKAGE utils IS PROCEDURE horloge ( SIGNAL h : OUT bit; th, tb : time); PROCEDURE horloge ( SIGNAL h : OUT std_ulogic; th, tb : time); FUNCTION convert (n, l : natural) RETURN bit_vector; FUNCTION convert (b : bit_vector) RETURN natural; PROCEDURE verif_precond (SIGNAL h, d : IN bit; Tsetup : IN time); FUNCTION resolution_nor ( b : bit_vector) RETURN bit; FUNCTION front_montant (SIGNAL s : bit) RETURN boolean; FUNCTION front_descendant (SIGNAL s : bit) RETURN boolean; FUNCTION front_montant (SIGNAL s : std_logic) RETURN boolean; FUNCTION front_descendant (SIGNAL s : std_logic) RETURN boolean; END utils; --------------------------------------------------- PACKAGE BODY utils IS PROCEDURE horloge ( SIGNAL h : OUT bit; th, tb : time) IS BEGIN LOOP h <= '0', '1' AFTER tb; WAIT FOR tb + th; END LOOP; END; PROCEDURE horloge ( SIGNAL h : OUT std_ulogic; th, tb : time) IS BEGIN LOOP h <= '0', '1' AFTER tb; WAIT FOR tb + th; END LOOP; END; FUNCTION Convert (n, l : natural) RETURN bit_vector IS VARIABLE temp : bit_vector( l-1 DOWNTO 0); VARIABLE valeur : natural := n; BEGIN FOR i IN temp'right TO temp'left LOOP temp(i) := bit'val( valeur MOD 2); valeur := valeur / 2; END LOOP; RETURN temp; END; FUNCTION Convert (b : bit_vector) RETURN natural IS VARIABLE temp : bit_vector ( b'length - 1 DOWNTO 0) := b; VARIABLE valeur : natural := 0; BEGIN FOR i IN temp'right TO temp'left LOOP IF temp(i) = '1' THEN valeur := valeur + (2**i); END IF; END LOOP; RETURN valeur; END; PROCEDURE verif_precond (SIGNAL h, d : IN bit; Tsetup : IN time) IS BEGIN WAIT UNTIL h'event AND h = '1'; ASSERT d'last_event >= Tsetup REPORT "Violation du temps de preconditionnement" SEVERITY warning; END; FUNCTION resolution_nor ( b : bit_vector) RETURN bit IS -- Fonction NOR cablée VARIABLE niveau : bit := '1'; -- valeur par défaut BEGIN FOR i IN b'range LOOP IF b(i) = '1' THEN niveau := '0'; END IF; END LOOP; RETURN niveau; END; FUNCTION front_montant (SIGNAL s : bit) RETURN boolean IS BEGIN RETURN (s'event AND s = '1'); END; FUNCTION front_descendant (SIGNAL s : bit) RETURN boolean IS BEGIN RETURN (s'event AND s = '0'); END; FUNCTION front_montant (SIGNAL s : std_logic) RETURN boolean IS BEGIN RETURN (s'event AND s = '1'); END; FUNCTION front_descendant (SIGNAL s : std_logic) RETURN boolean IS BEGIN RETURN (s'event AND s = '0'); END; END utils;