
Бібліотека:
library IEEE;
use IEEE.STD_LOGIC_1164.all;
package CONVERTERS is
function CONVW (X :STD_LOGIC_VECTOR) return BIT_VECTOR;
function CONV (X :BIT_VECTOR) return STD_LOGIC_VECTOR;
function CONVK (X :STD_LOGIC_VECTOR (7 downto 0)) return CHARACTER;
function CONVB (X :CHARACTER) return STD_LOGIC_VECTOR;
function CONVR (X :STD_LOGIC_VECTOR) return INTEGER;
function CONV8 (X :INTEGER) return STD_LOGIC_VECTOR;
end CONVERTERS;
package body CONVERTERS is
------------------------------------------------------------------------------
-- From STD_LOGIC_VECTOR to BIT_VECTOR converter
------------------------------------------------------------------------------
function CONVW (X :STD_LOGIC_VECTOR) return BIT_VECTOR is
constant XMAP :BIT :='0';
variable RESULT :BIT_VECTOR (X'RANGE);
begin
for i in RESULT'RANGE loop
case X(i) is
when '0' | 'L' => RESULT(i) := '0';
when '1' | 'H' => RESULT(i) := '1';
when others => RESULT(i) := XMAP;
end case;
end loop;
return RESULT;
end CONVW;
------------------------------------------------------------------------------
-- From BIT_VECTOR to STD_LOGIC_VECTOR converter
------------------------------------------------------------------------------
function CONV (X :BIT_VECTOR) return STD_LOGIC_VECTOR is
variable RESULT :STD_LOGIC_VECTOR (X'RANGE);
begin
for i in RESULT'RANGE loop
case X(i) is
when '0' => RESULT(i) := '0';
when '1' => RESULT(i) := '1';
end case;
end loop;
return RESULT;
end CONV;
------------------------------------------------------------------------------
-- From STD_LOGIC_VECTOR to CHARACTER converter
------------------------------------------------------------------------------
function CONVK (X :STD_LOGIC_VECTOR (7 downto 0)) return CHARACTER is
constant XMAP :INTEGER :=0;
variable TEMP :INTEGER :=0;
begin
for i in X'RANGE loop
TEMP:=TEMP*2;
case X(i) is
when '0' | 'L' => null;
when '1' | 'H' => TEMP :=TEMP+1;
when others => TEMP :=TEMP+XMAP;
end case;
end loop;
return CHARACTER'VAL(TEMP);
end CONVK;
------------------------------------------------------------------------------
-- From CHARACTER to STD_LOGIC_VECTOR (7 downto 0) converter
------------------------------------------------------------------------------
function CONVB (X :CHARACTER) return STD_LOGIC_VECTOR is
variable RESULT :STD_LOGIC_VECTOR (7 downto 0);
variable TEMP :INTEGER :=CHARACTER'POS(X);
begin
for i in RESULT'REVERSE_RANGE loop
case TEMP mod 2 is
when 0 => RESULT(i):='0';
when 1 => RESULT(i):='1';
when others => null;
end case;
TEMP:=TEMP/2;
end loop;
return RESULT;
end CONVB;
------------------------------------------------------------------------------
-- From STD_LOGIC_VECTOR to unsigned INTEGER converter
------------------------------------------------------------------------------
function CONVR (X :STD_LOGIC_VECTOR) return INTEGER is
constant XMAP :INTEGER :=0;
variable RESULT :INTEGER :=0;
begin
for i in X'RANGE loop
RESULT:=RESULT*2;
case X(i) is
when '0' | 'L' => null;
when '1' | 'H' => RESULT :=RESULT+1;
when others => RESULT :=RESULT+XMAP;
end case;
end loop;
return RESULT;
end CONVR;
------------------------------------------------------------------------------
-- From INTEGER to 8-bit STD_LOGIC_VECTOR converter
------------------------------------------------------------------------------
function CONV8 (X :INTEGER) return STD_LOGIC_VECTOR is
constant L :INTEGER :=8; -- result's length
variable RESULT :STD_LOGIC_VECTOR (L-1 downto 0);
variable TEMP :INTEGER;
begin
if X<0 then
TEMP:=(2**RESULT'LENGTH)+X;
else
TEMP:=X;
end if;
for i in
RESULT'REVERSE_RANGE loop
case TEMP mod 2 is
when 0 => RESULT(i):='0';
when 1 => RESULT(i):='1';
when others => null;
end case;
TEMP:=TEMP/2;
end loop;
return RESULT;
end CONV8;
end CONVERTERS;
Часова діаграма нашого проекту