📄 89_pack_2_0.vhd
字号:
--***************************************************************************
-- pack.vhdl *
-- VHDL BIT_VECTOR Operations *
--***************************************************************************
package BIT_FUNCTIONS is
function SHL0 (v2: BIT_VECTOR; dist: INTEGER) return BIT_VECTOR;
function SHL1 (v2: BIT_VECTOR; dist: INTEGER) return BIT_VECTOR;
function SHL (v2: BIT_VECTOR; fill: BIT) return BIT_VECTOR;
function SHR0 (v2: BIT_VECTOR; dist: INTEGER) return BIT_VECTOR;
function SHRS (v2: BIT_VECTOR; dist: INTEGER) return BIT_VECTOR;
function SHR1 (v2: BIT_VECTOR; dist: INTEGER) return BIT_VECTOR;
function SHR (v2: BIT_VECTOR; fill: BIT) return BIT_VECTOR;
function INT_TO_BIN (number, length1:integer) return BIT_VECTOR;
function SIGNED_INT_TO_BIN (number, length1:integer) return BIT_VECTOR;
function BIN_TO_INT (v2: BIT_VECTOR) return INTEGER;
function SIGNED_BIN_TO_INT (v2: BIT_VECTOR) return INTEGER;
function ONES_COMP (v2: BIT_VECTOR) return BIT_VECTOR;
function TWOs_COMP (v2: BIT_VECTOR) return BIT_VECTOR;
---function "-" (x1, x2: BIT_VECTOR) return BIT_VECTOR;
function "-" (x1, x2: BIT_VECTOR) return BIT_VECTOR;
function DEC(v2: BIT_VECTOR) return BIT_VECTOR;
function "+" (x1, x2: BIT_VECTOR) return BIT_VECTOR;
function INC (v2: BIT_VECTOR) return BIT_VECTOR;
function ODD_PARITY ( v1 : BIT_VECTOR ) return BIT;
function EVEN_PARITY ( v1 : BIT_VECTOR ) return BIT;
function REVERSE (v2: BIT_VECTOR) return BIT_VECTOR;
function SUM(v2 : BIT_VECTOR) return integer;
function BIT_SLICE (v2: BIT_VECTOR;high_val,low_val:integer)return BIT_VECTOR;
function ASSIGN_TO_SLICE (v1: BIT_VECTOR;
high_val, low_val: integer;
x2: BIT_VECTOR ) return BIT_VECTOR;
function "*" ( x1, x2 : BIT_VECTOR ) return BIT_VECTOR;
end BIT_FUNCTIONS;
package body BIT_FUNCTIONS is
--********************************************************************
function SHL0 (v2: BIT_VECTOR; dist: INTEGER) return BIT_VECTOR is
--********************************************************************
variable v1 : BIT_VECTOR(v2'high downto v2'low);
variable shift_val: BIT_VECTOR(v1'range);
variable I: INTEGER;
begin
v1 := v2;
for I in v1'high downto (v1'low + dist) loop
shift_val(I) := v1(I - dist);
end loop;
for I in (v1'low + dist - 1) downto v1'low loop
shift_val(I) := '0';
end loop;
return shift_val;
end SHL0;
--********************************************************************
function SHL1 (v2: BIT_VECTOR; dist: INTEGER) return BIT_VECTOR is
--********************************************************************
variable v1 : BIT_VECTOR(v2'high downto v2'low);
variable shift_val: BIT_VECTOR(v1'range);
variable I: INTEGER;
begin
v1 := v2;
for I in v1'high downto (v1'low + dist) loop
shift_val(I) := v1(I - dist);
end loop;
for I in (v1'low + dist - 1) downto v1'low loop
shift_val(I) := '1';
end loop;
return shift_val;
end SHL1;
--********************************************************************
function SHL (v2: BIT_VECTOR; fill: BIT) return BIT_VECTOR is
--********************************************************************
variable v1 : BIT_VECTOR(v2'high downto v2'low);
variable shift_val: BIT_VECTOR(v1'range);
variable I : integer;
begin
v1 := v2;
for I in v1'high downto (v1'low + 1) loop
shift_val(I) := v1(I - 1);
end loop;
shift_val(v1'low) := fill;
return shift_val;
end SHL;
--********************************************************************
function SHR0 (v2: BIT_VECTOR; dist: INTEGER) return BIT_VECTOR is
--********************************************************************
variable v1 : BIT_VECTOR(v2'high downto v2'low);
variable shift_val: BIT_VECTOR(v1'range);
variable I: INTEGER;
begin
v1 := v2;
for I in v1'low to (v1'high - dist) loop
shift_val(I) := v1(I + dist);
end loop;
for I in (v1'high - dist + 1 ) to v1'high loop
shift_val(I) := '0';
end loop;
return shift_val;
end SHR0;
--********************************************************************
function SHRS (v2: BIT_VECTOR; dist: INTEGER) return BIT_VECTOR is
--********************************************************************
variable v1 : BIT_VECTOR(v2'high downto v2'low);
variable shift_val: BIT_VECTOR(v1'range);
variable I: INTEGER;
begin
v1 := v2;
for I in v1'low to (v1'high - dist -1) loop
shift_val(I) := v1(I + dist);
end loop;
for I in (v1'high - dist ) to (v1'high - 1) loop
shift_val(I) := '0';
end loop;
shift_val(v1'high) := v1(v1'high);
return shift_val;
end SHRS;
--********************************************************************
function SHR1 (v2: BIT_VECTOR; dist: INTEGER) return BIT_VECTOR is
--********************************************************************
variable v1 : BIT_VECTOR(v2'high downto v2'low);
variable shift_val: BIT_VECTOR(v1'range);
variable I: INTEGER;
begin
v1 := v2;
for I in v1'low to (v1'high - dist) loop
shift_val(I) := v1(I + dist);
end loop;
for I in (v1'high - dist + 1 ) to v1'high loop
shift_val(I) := '1';
end loop;
return shift_val;
end SHR1;
--********************************************************************
function SHR (v2: BIT_VECTOR; fill: BIT) return BIT_VECTOR is
--********************************************************************
variable v1 : BIT_VECTOR(v2'high downto v2'low);
variable shift_val: BIT_VECTOR(v1'range);
begin
v1 := v2;
for I in v1'low to (v1'high - 1) loop
shift_val(I) := v1(I + 1);
end loop;
shift_val(v1'high) := fill;
return shift_val;
end SHR;
--********************************************************************
function SIGNED_INT_TO_BIN(Number,Length1 : integer) return BIT_VECTOR is
--********************************************************************
variable NUM : integer;
variable temp, temp1 : BIT_VECTOR (length1 - 1 downto 0 ) ;
begin
if (Number < 0) then
NUM := 0 - Number;
else
NUM := Number;
end if;
temp1 := INT_TO_BIN(NUM, Length1);
if (Number < 0) then
temp := twos_comp(temp1);
else
temp := temp1;
end if;
return temp;
end SIGNED_INT_TO_BIN;
--********************************************************************
function INT_TO_BIN(Number,Length1 : integer) return BIT_VECTOR is
--********************************************************************
variable temp : BIT_VECTOR (length1 - 1 downto 0 ) ;
variable NUM, QUOTIENT : integer := 0;
begin
QUOTIENT := Number;
for I in 0 to length1 - 1 loop
NUM := 0;
while QUOTIENT > 1 loop
QUOTIENT:= QUOTIENT-2;
NUM := NUM + 1;
end loop;
case QUOTIENT is
when 1 => temp(I) := '1';
when 0 => temp(I) := '0';
when others => null;
end case;
QUOTIENT := NUM;
end loop;
return temp;
end INT_TO_BIN;
--********************************************************************
function SIGNED_BIN_TO_INT (v2: BIT_VECTOR) return integer is
--********************************************************************
variable v1 : BIT_VECTOR(v2'high downto v2'low);
variable num : integer;
variable SUM: integer := 0;
begin
if (v2(v2'high) = '1') then
v1 := twos_comp(v2);
else
v1 := v2;
end if;
num := BIN_TO_INT(v1);
if (v2(v2'high) = '1') then
SUM := 0 - num;
else
SUM := num;
end if;
return SUM;
end SIGNED_BIN_TO_INT;
--********************************************************************
function BIN_TO_INT (v2: BIT_VECTOR) return integer is
--********************************************************************
variable v1 : BIT_VECTOR(v2'high downto v2'low);
variable SUM: integer := 0;
begin
v1 := v2;
for N in v1'low to v1'high loop
if v1(N) = '1' then
SUM := SUM + (2**(N - v1'low));
end if;
end loop;
return SUM;
end BIN_TO_INT;
--********************************************************************
function ones_comp (v2: BIT_VECTOR) return BIT_VECTOR is
--********************************************************************
variable v1 : BIT_VECTOR(v2'high downto v2'low);
variable temp: BIT_VECTOR(v1'range);
variable I: INTEGER;
begin
v1 := v2;
for I in v1'range loop
if v1(I) = '0' then
temp(i) := '1';
else
temp(i) := '0';
end if;
end loop;
return temp;
end ones_comp;
--********************************************************************
function twos_comp (v2: BIT_VECTOR) return BIT_VECTOR is
--********************************************************************
variable v1 : BIT_VECTOR(v2'high downto v2'low);
variable temp: BIT_VECTOR(v1'range);
variable one_occured : BIT;
variable N : integer;
begin
v1 := v2;
one_occured := '0';
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -