📄 xhdl_bit.vhdl
字号:
---- Copyright Notice and Proprietary Information---- Copyright (C) 1997-2002 X-Tek Corporation. All rights reserved. This Software -- and documentation are owned by X-Tek Corporation, and may be used only as -- authorized in the license agreement controlling such use. No part of this -- publication may be reproduced, transmitted, or translated, in any form or by -- any means, electronic, mechanical, manual, optical, or otherwise, without prior -- written permission of X-Tek Corporation, or as expressly provided by the license -- agreement.---- Disclaimer---- X-Tek Corporation makes no warranty of any kind, express or implied, with regard -- to this material, including, but not limited to, the implied warranties of -- merchantability and fitness for a particular purpose.---- X-Tek Corporation reserves the right to make changes without further notice to -- the products described herein. X-Tek Corporation does not assume any liability -- arising out of the application or use of any product or circuit described -- herein. The X-Tek products described herein are not authorized for use as -- components in life-support devices.------ Rev 2001.0226---- Rev 2001.0324-- a) Added function -- FUNCTION conv_bit_vector (-- val : IN boolean;-- len : IN integer) RETURN bit_vector;---- Rev 2002.0521-- a) Removed non-synthesizable functions to_time and to_*string--LIBRARY ieee;USE ieee.std_logic_1164.all;LIBRARY std;USE std.textio.all;PACKAGE xhdl_bit IS FUNCTION conv_bit ( val : IN boolean) RETURN bit; FUNCTION conv_bit_vector ( val : IN boolean; len : IN integer) RETURN bit_vector; FUNCTION conv_bit_vector ( val : IN integer; len : IN integer) RETURN bit_vector; FUNCTION to_bit ( val : IN boolean) RETURN bit; FUNCTION to_bitvector ( val : IN integer; len : IN integer) RETURN bit_vector; FUNCTION to_bitvector ( val : IN boolean; len : IN integer) RETURN bit_vector; FUNCTION to_integer ( val : bit) RETURN integer; FUNCTION to_integer ( val : bit_vector) RETURN integer; FUNCTION "SRL" ( l : bit_vector; r : integer) RETURN bit_vector; FUNCTION ShiftRight ( val : bit_vector; shft : integer) RETURN bit_vector; FUNCTION "SLL" ( l : bit_vector; r : integer) RETURN bit_vector; FUNCTION ShiftLeft ( val : bit_vector; shft : integer) RETURN bit_vector; FUNCTION "+" ( l : bit; r : bit) RETURN bit_vector; FUNCTION or_br ( val : bit_vector) RETURN bit; FUNCTION and_br ( val : bit_vector) RETURN bit; FUNCTION xor_br ( val : bit_vector) RETURN bit; FUNCTION xnor_br ( val : bit_vector) RETURN bit; FUNCTION nor_br ( val : bit_vector) RETURN bit; FUNCTION nand_br ( val : bit_vector) RETURN bit; FUNCTION select_expr ( sel : boolean; op1 : bit_vector; op2 : bit_vector) RETURN bit_vector; FUNCTION select_expr ( sel : boolean; op1 : bit; op2 : bit) RETURN bit;END;PACKAGE BODY xhdl_bit IS FUNCTION conv_bit ( val : IN boolean) RETURN bit IS BEGIN RETURN(to_bit(val)); END conv_bit; FUNCTION to_bit ( val : IN boolean) RETURN bit IS BEGIN IF (val) THEN RETURN('1'); ELSE RETURN('0'); END IF; END to_bit; FUNCTION conv_bit_vector ( val : IN boolean; len : IN integer) RETURN bit_vector IS VARIABLE rtn : bit_vector(len-1 DOWNTO 0) := (OTHERS => '0'); VARIABLE b : bit; BEGIN IF (val) THEN b := '1'; ELSE b := '0'; END IF; FOR index IN 0 TO len-1 LOOP rtn(index) := b; END LOOP; RETURN(rtn); END conv_bit_vector; FUNCTION conv_bit_vector ( val : IN integer; len : IN integer) RETURN bit_vector IS BEGIN RETURN(to_bitvector(val, len)); END conv_bit_vector; -- FUNCTION to_bitvector ( val : IN integer; len : IN integer) RETURN bit_vector IS VARIABLE rtn : bit_vector(len-1 DOWNTO 0) := (OTHERS => '0'); VARIABLE num : integer := val; VARIABLE r : integer; BEGIN FOR index IN 0 TO len-1 LOOP r := num rem 2; num := num/2; IF (r = 1) THEN rtn(index) := '1'; ELSE rtn(index) := '0'; END IF; END LOOP; RETURN(rtn); END to_bitvector; -- FUNCTION to_bitvector ( val : IN boolean; len : IN integer) RETURN bit_vector IS VARIABLE rtn : bit_vector(len-1 DOWNTO 0) := (OTHERS => '0'); BEGIN rtn(0) := to_bit(val); RETURN(rtn); END to_bitvector; -- FUNCTION to_integer ( val : bit) RETURN integer IS VARIABLE rtn : integer := 0; BEGIN IF (val = '1') THEN rtn := 1; ELSE rtn := 0; END IF; RETURN(rtn); END to_integer; -- FUNCTION to_integer ( val : bit_vector) RETURN integer IS CONSTANT vec : bit_vector(val'high-val'low DOWNTO 0) := val; VARIABLE rtn : integer := 0; BEGIN FOR index IN vec'RANGE LOOP IF (vec(index) = '1') THEN rtn := rtn + (2**index); END IF; END LOOP; RETURN(rtn); END to_integer; -- FUNCTION "SRL" ( l : bit_vector; r : integer) RETURN bit_vector IS BEGIN RETURN(ShiftRight(l, r)); END "SRL"; FUNCTION ShiftRight ( val : bit_vector; shft : integer) RETURN bit_vector IS VARIABLE int : bit_vector(val'LENGTH+shft-1 DOWNTO 0); VARIABLE rtn : bit_vector(val'RANGE); VARIABLE fill : bit_vector(shft-1 DOWNTO 0) := (others => '0'); BEGIN int := fill & val; rtn := int(val'LENGTH+shft-1 DOWNTO shft); RETURN(rtn); END ShiftRight; -- FUNCTION "SLL" ( l : bit_vector; r : integer) RETURN bit_vector IS BEGIN RETURN(ShiftLeft(l, r)); END "SLL"; FUNCTION ShiftLeft ( val : bit_vector; shft : integer) RETURN bit_vector IS VARIABLE int : bit_vector(val'LENGTH+shft-1 DOWNTO 0); VARIABLE rtn : bit_vector(val'RANGE); VARIABLE fill : bit_vector(shft-1 DOWNTO 0) := (others => '0'); BEGIN int := val & fill; rtn := int(val'LENGTH-1 DOWNTO 0); RETURN(rtn); END ShiftLeft; FUNCTION "+" ( l : bit; r : bit) RETURN bit_vector IS VARIABLE rtn : bit_vector(1 downto 0); VARIABLE tmp : bit_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"; END CASE; RETURN(rtn); END "+"; -- FUNCTION or_br ( val : bit_vector) RETURN bit IS VARIABLE rtn : bit := '0'; BEGIN FOR index IN val'RANGE LOOP rtn := rtn OR val(index); END LOOP; RETURN(rtn); END or_br; -- FUNCTION and_br ( val : bit_vector) RETURN bit IS VARIABLE rtn : bit := '1'; BEGIN FOR index IN val'RANGE LOOP rtn := rtn AND val(index); END LOOP; RETURN(rtn); END and_br; -- FUNCTION xor_br ( val : bit_vector) RETURN bit IS VARIABLE rtn : bit := '0'; BEGIN FOR index IN val'RANGE LOOP rtn := rtn XOR val(index); END LOOP; RETURN(rtn); END xor_br; -- FUNCTION xnor_br ( val : bit_vector) RETURN bit IS VARIABLE rtn : bit := '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 : bit_vector) RETURN bit IS VARIABLE rtn : bit := '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 : bit_vector) RETURN bit IS VARIABLE rtn : bit := '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 : bit_vector; op2 : bit_vector) RETURN bit_vector IS VARIABLE rtn : bit_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 : bit; op2 : bit) RETURN bit IS VARIABLE rtn : bit; BEGIN IF(sel) THEN rtn := op1; ELSE rtn := op2; END IF; RETURN (rtn); END select_expr; END;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -