LIBRARY IEEE ; USE IEEE.STD_LOGIC_1164.ALL ; USE IEEE.STD_LOGIC_SIGNED.ALL ; USE IEEE.STD_LOGIC_ARITH.ALL ; USE work.PackProj.all; PACKAGE UALPack IS TYPE INSTRUCTIONS IS ( O_ADD, O_AND, O_NOP); -- On doit toujours finir l'enumeration par l'operation NOP CONSTANT NbFonctions : INTEGER := INSTRUCTIONS'POS(O_NOP) + 1; CONSTANT Log2NbFonctions : INTEGER := Log2(NbFonctions); CONSTANT NbCptRendu : INTEGER := 8; CONSTANT Log2NbCptRendu : INTEGER := Log2(NbCptRendu); CONSTANT F_ADD : Std_Logic_Vector(Log2NbFonctions-1 DOWNTO 0) := CONV_STD_LOGIC_VECTOR(INSTRUCTIONS'POS(O_ADD), Log2NbFonctions); CONSTANT F_AND : Std_Logic_Vector(Log2NbFonctions-1 DOWNTO 0) := CONV_STD_LOGIC_VECTOR(INSTRUCTIONS'POS(O_AND), Log2NbFonctions); CONSTANT F_NOP : Std_Logic_Vector(Log2NbFonctions-1 DOWNTO 0) := CONV_STD_LOGIC_VECTOR(INSTRUCTIONS'POS(O_NOP), Log2NbFonctions); CONSTANT T_ADD : TIME := 10 ns; CONSTANT T_AND : TIME := 3 ns; CONSTANT T_NOP : TIME := 1 ns; FUNCTION Debordement( A : Std_Logic_Vector; B : Std_Logic_Vector; cmd : Std_Logic_Vector; Taille : INTEGER ) RETURN BOOLEAN ; END UALPack ; PACKAGE BODY UALPack IS FUNCTION Debordement( A : Std_Logic_Vector; B : Std_Logic_Vector; cmd : Std_Logic_Vector; Taille : INTEGER ) RETURN BOOLEAN IS VARIABLE e1, e2, s: INTEGER; VARIABLE debord : BOOLEAN := false; VARIABLE STD_LOGIC_VECTOR_MAX : Std_Logic_Vector(Taille -1 DOWNTO 0) := ('0', OTHERS =>'1'); VARIABLE STD_LOGIC_VECTOR_MIN : Std_Logic_Vector(Taille -1 DOWNTO 0) := ('1', OTHERS =>'0'); VARIABLE INTEGER_MAX : INTEGER := CONV_INTEGER(STD_LOGIC_VECTOR_MAX); VARIABLE INTEGER_MIN : INTEGER := CONV_INTEGER(STD_LOGIC_VECTOR_MIN); BEGIN e1 := CONV_INTEGER(A); e2 := CONV_INTEGER(B); CASE CONV_POSITIF(cmd) IS WHEN INSTRUCTIONS'POS(O_ADD) => s := e1 + e2 ; IF (s > INTEGER_MAX) THEN debord := true; END IF; IF (s < INTEGER_MIN) THEN debord := true; END IF; WHEN OTHERS => s := 1; END CASE; RETURN debord; END Debordement; END UALPack ;