LIBRARY ieee; USE ieee.numeric_std.all; PACKAGE BODY mti_pkg IS -- Convert BIT to STD_LOGIC FUNCTION To_StdLogic (s : BIT) RETURN STD_LOGIC IS BEGIN CASE s IS WHEN '0' => RETURN ('0'); WHEN '1' => RETURN ('1'); WHEN OTHERS => RETURN ('0'); END CASE; END; -- Convert STD_LOGIC to INTEGER FUNCTION TO_INTEGER (input : STD_LOGIC) RETURN INTEGER IS VARIABLE result : INTEGER := 0; VARIABLE weight : INTEGER := 1; BEGIN IF input = '1' THEN result := weight; ELSE result := 0; -- if unknowns, default to logic 0 END IF; RETURN result; END TO_INTEGER; -- Convert BIT_VECTOR to INTEGER FUNCTION TO_INTEGER (input : BIT_VECTOR) RETURN INTEGER IS VARIABLE result : INTEGER := 0; VARIABLE weight : INTEGER := 1; BEGIN FOR i IN input'LOW TO input'HIGH LOOP IF input(i) = '1' THEN result := result + weight; ELSE result := result + 0; -- if unknowns, default to logic 0 END IF; weight := weight * 2; END LOOP; RETURN result; END TO_INTEGER; -- Convert STD_LOGIC_VECTOR to INTEGER FUNCTION TO_INTEGER (input : STD_LOGIC_VECTOR) RETURN INTEGER IS VARIABLE result : INTEGER := 0; VARIABLE weight : INTEGER := 1; BEGIN FOR i IN input'LOW TO input'HIGH LOOP IF input(i) = '1' THEN result := result + weight; ELSE result := result + 0; -- if unknowns, default to logic 0 END IF; weight := weight * 2; END LOOP; RETURN result; END TO_INTEGER; -- Convert STD_ULOGIC_VECTOR to INTEGER FUNCTION TO_INTEGER (input : STD_ULOGIC_VECTOR) RETURN INTEGER IS VARIABLE result : INTEGER := 0; VARIABLE weight : INTEGER := 1; BEGIN FOR i IN input'LOW TO input'HIGH LOOP IF input(i) = '1' THEN result := result + weight; ELSE result := result + 0; -- if unknowns, default to logic 0 END IF; weight := weight * 2; END LOOP; RETURN result; END TO_INTEGER; -- Conver INTEGER to BIT_VECTOR PROCEDURE TO_BITVECTOR (VARIABLE input : IN INTEGER; VARIABLE output : OUT BIT_VECTOR) IS VARIABLE work,offset,outputlen,j : INTEGER := 0; BEGIN --length of vector IF output'LENGTH > 32 THEN --' outputlen := 32; offset := output'LENGTH - 32; --' IF input >= 0 THEN FOR i IN offset-1 DOWNTO 0 LOOP output(output'HIGH - i) := '0'; --' END LOOP; ELSE FOR i IN offset-1 DOWNTO 0 LOOP output(output'HIGH - i) := '1'; --' END LOOP; END IF; ELSE outputlen := output'LENGTH; --' END IF; --positive value IF (input >= 0) THEN work := input; j := outputlen - 1; FOR i IN 1 to 32 LOOP IF j >= 0 then IF (work MOD 2) = 0 THEN output(output'HIGH-j-offset) := '0'; --' ELSE output(output'HIGH-j-offset) := '1'; --' END IF; END IF; work := work / 2; j := j - 1; END LOOP; IF outputlen = 32 THEN output(output'HIGH) := '0'; --' END IF; --negative value ELSE work := (-input) - 1; j := outputlen - 1; FOR i IN 1 TO 32 LOOP IF j>= 0 THEN IF (work MOD 2) = 0 THEN output(output'HIGH-j-offset) := '1'; --' ELSE output(output'HIGH-j-offset) := '0'; --' END IF; END IF; work := work / 2; j := j - 1; END LOOP; IF outputlen = 32 THEN output(output'HIGH) := '1'; --' END IF; END IF; END TO_BITVECTOR; function conv_std_logic_vector(i : integer; w : integer) return std_logic_vector is variable tmp : std_logic_vector(w-1 downto 0); begin tmp := std_logic_vector(to_unsigned(i, w)); return(tmp); end; procedure char2hex(C: character; result: out bit_vector(3 downto 0); good: out boolean; report_error: in boolean) is begin good := true; case C is when '0' => result := x"0"; when '1' => result := x"1"; when '2' => result := X"2"; when '3' => result := X"3"; when '4' => result := X"4"; when '5' => result := X"5"; when '6' => result := X"6"; when '7' => result := X"7"; when '8' => result := X"8"; when '9' => result := X"9"; when 'A' => result := X"A"; when 'B' => result := X"B"; when 'C' => result := X"C"; when 'D' => result := X"D"; when 'E' => result := X"E"; when 'F' => result := X"F"; when 'a' => result := X"A"; when 'b' => result := X"B"; when 'c' => result := X"C"; when 'd' => result := X"D"; when 'e' => result := X"E"; when 'f' => result := X"F"; when others => if report_error then assert false report "hexread error: read a '" & C & "', expected a hex character (0-F)."; end if; good := false; end case; end; procedure hexread(L:inout line; value:out bit_vector) is variable OK: boolean; variable C: character; constant NE: integer := value'length/4; --' variable BV: bit_vector(0 to value'length-1); --' variable S: string(1 to NE-1); begin if value'length mod 4 /= 0 then --' assert false report "hexread Error: Trying to read vector " & "with an odd (non multiple of 4) length"; return; end if; loop -- skip white space read(L,C); exit when ((C /= ' ') and (C /= CR) and (C /= HT)); end loop; char2hex(C, BV(0 to 3), OK, false); if not OK then return; end if; read(L, S, OK); -- if not OK then -- assert false report "hexread Error: Failed to read the STRING"; -- return; -- end if; for I in 1 to NE-1 loop char2hex(S(I), BV(4*I to 4*I+3), OK, false); if not OK then return; end if; end loop; value := BV; end hexread; procedure hexread(L:inout line; value:out std_ulogic_vector) is variable tmp: bit_vector(value'length-1 downto 0); --' begin hexread(L, tmp); value := TO_X01(tmp); end hexread; procedure hexread(L:inout line; value:out std_logic_vector) is variable tmp: std_ulogic_vector(value'length-1 downto 0); --' begin hexread(L, tmp); value := std_logic_vector(tmp); end hexread; END mti_pkg;