📄 xhdl_std_ulogic.vhdl
字号:
FUNCTION "SLL" ( l : std_ulogic_vector; r : integer) RETURN std_ulogic_vector IS BEGIN RETURN(ShiftLeft(l, r)); END "SLL"; FUNCTION ShiftLeft ( val : std_ulogic_vector; shft : integer) RETURN std_ulogic_vector IS VARIABLE int : std_ulogic_vector(val'LENGTH+shft-1 DOWNTO 0); VARIABLE rtn : std_ulogic_vector(val'RANGE); VARIABLE fill : std_ulogic_vector(shft-1 DOWNTO 0) := (others => '0'); BEGIN int := val & fill; rtn := int(val'LENGTH-1 DOWNTO 0); RETURN(rtn); END ShiftLeft; FUNCTION "+" ( l : std_ulogic; r : std_ulogic) RETURN std_ulogic_vector IS VARIABLE rtn : std_ulogic_vector(1 downto 0); VARIABLE tmp : std_ulogic_vector(1 downto 0); BEGIN tmp := l & r; CASE tmp IS WHEN "00" => rtn := "00"; WHEN "01" => rtn := "01"; WHEN "10" => rtn := "01"; WHEN "11" => rtn := "10"; WHEN OTHERS => rtn := "XX"; END CASE; RETURN(rtn); END "+"; -- FUNCTION or_br ( val : std_ulogic_vector) RETURN std_ulogic IS VARIABLE rtn : std_ulogic := '0'; BEGIN FOR index IN val'RANGE LOOP rtn := rtn OR val(index); END LOOP; RETURN(rtn); END or_br; -- FUNCTION and_br ( val : std_ulogic_vector) RETURN std_ulogic IS VARIABLE rtn : std_ulogic := '1'; BEGIN FOR index IN val'RANGE LOOP rtn := rtn AND val(index); END LOOP; RETURN(rtn); END and_br; -- FUNCTION xor_br ( val : std_ulogic_vector) RETURN std_ulogic IS VARIABLE rtn : std_ulogic := '0'; BEGIN FOR index IN val'RANGE LOOP rtn := rtn XOR val(index); END LOOP; RETURN(rtn); END xor_br; -- FUNCTION xnor_br ( val : std_ulogic_vector) RETURN std_ulogic IS VARIABLE rtn : std_ulogic := '0'; BEGIN FOR index IN val'RANGE LOOP rtn := rtn XOR val(index); END LOOP; RETURN(NOT rtn); END xnor_br; -- FUNCTION nor_br ( val : std_ulogic_vector) RETURN std_ulogic IS VARIABLE rtn : std_ulogic := '0'; BEGIN FOR index IN val'RANGE LOOP rtn := rtn OR val(index); END LOOP; RETURN(NOT rtn); END nor_br; -- FUNCTION nand_br ( val : std_ulogic_vector) RETURN std_ulogic IS VARIABLE rtn : std_ulogic := '0'; BEGIN FOR index IN val'RANGE LOOP rtn := rtn AND val(index); END LOOP; RETURN(NOT rtn); END nand_br; -- FUNCTION select_expr ( sel : boolean; op1 : std_ulogic_vector; op2 : std_ulogic_vector) RETURN std_ulogic_vector IS VARIABLE rtn : std_ulogic_vector(op1'RANGE); BEGIN IF(sel) THEN rtn := op1; ELSE rtn := op2; END IF; RETURN (rtn); END select_expr; -- FUNCTION select_expr ( sel : boolean; op1 : std_ulogic; op2 : std_ulogic) RETURN std_ulogic IS VARIABLE rtn : std_ulogic; BEGIN IF(sel) THEN rtn := op1; ELSE rtn := op2; END IF; RETURN (rtn); END select_expr; -- FUNCTION to_time ( val : std_ulogic_vector) RETURN time IS VARIABLE rtn : time; BEGIN rtn := to_integer(val) * 1 ns; RETURN(rtn); END to_time; -- FUNCTION to_string ( val : std_ulogic_vector) RETURN string IS VARIABLE rtn : string(1 TO val'LENGTH); ALIAS normal : std_ulogic_vector(1 to val'LENGTH) IS val; BEGIN FOR index IN normal'RANGE LOOP CASE normal(index) IS WHEN '0' => rtn(index) := '0'; WHEN 'L' => rtn(index) := 'L'; WHEN '1' => rtn(index) := '1'; WHEN 'H' => rtn(index) := 'H'; WHEN 'U' => rtn(index) := 'U'; WHEN 'Z' => rtn(index) := 'Z'; WHEN 'W' => rtn(index) := 'W'; WHEN OTHERS => rtn(index) := 'X'; END CASE; END LOOP; RETURN rtn; END to_string; -- FUNCTION to_string ( val : std_ulogic) RETURN character IS VARIABLE rtn : character; BEGIN CASE val IS WHEN '0' => rtn := '0'; WHEN 'L' => rtn := 'L'; WHEN '1' => rtn := '1'; WHEN 'H' => rtn := 'H'; WHEN 'U' => rtn := 'U'; WHEN 'Z' => rtn := 'Z'; WHEN 'W' => rtn := 'W'; WHEN OTHERS => rtn := 'X'; END CASE; RETURN rtn; END to_string; FUNCTION to_octstring ( val : IN std_ulogic_vector) RETURN string IS constant extra : integer := val'length rem 3; constant len : integer := ((val'length-1)/3)+1; variable rtn : string(1 to len); variable vec : std_ulogic_vector((extra + val'length-1) downto 0); BEGIN case extra is when 0 => vec := val; when 1 => vec := '0' & val; when 2 => vec := "00" & val; when others => vec := val; end case; for x in len downto 1 loop case vec(2 downto 0) is when "000" => rtn(x) := '0'; when "001" => rtn(x) := '1'; when "010" => rtn(x) := '2'; when "011" => rtn(x) := '3'; when "100" => rtn(x) := '4'; when "101" => rtn(x) := '5'; when "110" => rtn(x) := '6'; when "111" => rtn(x) := '7'; when "UUU" => rtn(x) := 'U'; when "ZZZ" => rtn(x) := 'Z'; when "XXX" => rtn(x) := 'X'; when others => rtn(x) := '?'; end case; vec := "000" & vec(val'length-1 downto 3); end loop; return(rtn); END to_octstring; FUNCTION to_decstring ( val : IN std_ulogic_vector) RETURN string IS variable int : integer; BEGIN int := to_integer(val); return(to_string(val)); END to_decstring; FUNCTION to_hexstring ( val : IN std_ulogic_vector) RETURN string IS constant extra : integer := val'length rem 4; constant len : integer := ((val'length-1)/4)+1; variable rtn : string(1 to len); variable vec : std_ulogic_vector((extra + val'length-1) downto 0); BEGIN case extra is when 0 => vec := val; when 1 => vec := '0' & val; when 2 => vec := "00" & val; when 3 => vec := "000" & val; when others => vec := val; end case; for x in len downto 1 loop case vec(3 downto 0) is when "0000" => rtn(x) := '0'; when "0001" => rtn(x) := '1'; when "0010" => rtn(x) := '2'; when "0011" => rtn(x) := '3'; when "0100" => rtn(x) := '4'; when "0101" => rtn(x) := '5'; when "0110" => rtn(x) := '6'; when "0111" => rtn(x) := '7'; when "1000" => rtn(x) := '8'; when "1001" => rtn(x) := '9'; when "1010" => rtn(x) := 'A'; when "1011" => rtn(x) := 'B'; when "1100" => rtn(x) := 'C'; when "1101" => rtn(x) := 'D'; when "1110" => rtn(x) := 'E'; when "1111" => rtn(x) := 'F'; when "UUUU" => rtn(x) := 'U'; when "ZZZZ" => rtn(x) := 'Z'; when "XXXX" => rtn(x) := 'X'; when others => rtn(x) := '?'; end case; vec := "0000" & vec(val'length-1 downto 4); end loop; return(rtn); END to_hexstring; END;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -