WebElektronika

Csomag használata a VHDL nyelvben

person access_time 2016.04.18.
Elkészítjük VHDL nyelven a webelektronika nevű csomagot, amelyben altípusokat, eljárásokat és függvényeket adunk meg. Ez a csomag felhasználható a későbbi projektjeinkben, de természetesen ki is egészíthető egyéb típusokkal, altípusokkal, alprogramokkal, stb.


 

1. csomag

A csomagban megvalósítunk most egy "byte", egy "char", "int" és egy "uint" altípust, amelyeket más VHDL file-okban felhasználhatunk típusként. 
De ebben a csomagban találunk paritást megvalósító eljárást, nyolcbites soros összeadót, illetve olyan konverziós függvényeket, amelyek segítségével std_logic-ból integer-t (vagy fordítva) tudunk konvertálni. Hasonló megoldásokat találunk a "ieee.numeric_std" csomagban, de ott az std_logic -> integer konverzió két lépésből áll (std_logic -> unsigned -> integer). 

library IEEE;
use ieee.std_logic_1164.all;

package webelektronika is

    subtype    byte is integer range 0 to 255;
    subtype    char is integer range -128 to 127;
    subtype    int is integer range -256 to 255;
    subtype    uint is integer range 0 to 2**16-1;

    procedure paritas (X : in std_logic_vector; signal Y : out std_logic);
    procedure add8bit(A, B : in std_logic_vector; Cin : in std_logic; 
                  signal S : out std_logic_vector; signal Cout : out std_logic; 
                  index : in positive);
    function getNagy(A, B : in std_logic_vector) return std_logic_vector;
    function StdToInt(index : in integer; be : in std_logic_vector) return integer;
    function IntToStd(index, be : in integer) return std_logic_vector;
end;

package body webelektronika is

    procedure paritas (X : in std_logic_vector; signal Y : out std_logic) is
    variable temp : std_ulogic := '0';
    begin
        for i in X'range loop
            temp := temp xor X(i);
        end loop;
        Y <= temp;
    end;
    
    procedure add8bit(A, B : in std_logic_vector; Cin : in std_logic; 
                  signal S : out std_logic_vector; signal Cout : out std_logic; 
                  index : in positive) is
    variable temp : std_logic_vector(index downto 0);
    begin
        temp := (others => '0');
        temp(0) := Cin;
        for i in 0 to index-1 loop
            S(i) <= A(i) xor B(i) xor temp(i);
            temp(i):= (A(i) and B(i)) or (A(i) and temp(i)) or (B(i) and temp(i));
        end loop;
        Cout <= temp(index);
    end;
    
    function getNagy(A, B : in std_logic_vector) return std_logic_vector is
    begin
        if A >= B then
            return A;
        else
            return B;
        end if;
    end;
    
    function StdToInt(index : in integer; be : in std_logic_vector) return integer is
    variable eredmeny : integer:= 0;
    begin
        for i in (index-1) downto 0 loop
            if be(i) = '1' then
                eredmeny :=eredmeny + 2**i;
            end if;
        end loop;
        return eredmeny;
    end;
    
    function IntToStd(index, be : in integer) return std_logic_vector is
    variable SV : std_logic_vector(index-1 downto 0);
    variable s1 : integer;
    begin
        s1 := be;
            for i in (index-1) downto 0 loop
                if (s1 / 2**i) >= 1 then
                    SV(i) := '1';
                    s1 := s1 - (2**i);
                else
                    SV(i) := '0';
                end if;
            end loop;
        return SV;
    end;

end webelektronika;

 

2. tesztprogram

A tesztprogramunkban a lefordított VHDL file-unkat csomagként meghivatkozzuk, ez látható feketén kiemelve a programban.

library IEEE;
use ieee.std_logic_1164.all;

use work.webelektronika.all;

entity teszt is
    generic(m : integer := 8);
end teszt;

architecture BEH of teszt is

signal    b0 : byte;
signal    ui0 : uint := 15;
signal    Cout : std_logic;
signal    A : std_logic_vector(7 downto 0) := "01010101";
signal    B : std_logic_vector(7 downto 0) := "10101010";
signal    S, T : std_logic_vector(7 downto 0);

begin
    T <= IntToStd(m, ui0);
    b0 <= StdToInt(m, A);
    
    add8bit(A, B, '0', S, Cout, m);
end BEH;