WebElektronika

Összeadó struktúrális megvalósítása VHDL nyelven

person access_time 2015.10.12.
Megnézünk most egy aritmetikai összeadó VHDL nyelven történő megvalósítását. Struktúrálisan valósítjuk meg, a következő részben pedig ugyanezt az összeadót készítjük el, de már viselkedésszintű leírás alkalmazásával.


Először egy teljes összeadót készítünk el VHDL nyelven, mert ezt eggyel magasabb hiearchia szinten komponensként fogjuk alkalmazni.

A teljes összeadónak (full adder, fa) három bemenete (A, B, Cin) és két kimenete (S, Cout) van, és az átvitel be- és kimenettel tudjuk sorbakötni ezeket az alapáramköröket.

A teljes összeadónak a VHDL kódját mutatja a következő program :

library IEEE;
use ieee.std_logic_1164.all;

entity fa is
    port(A, B, Cin : in std_logic;
        S, Cout : out std_logic);
end fa;

architecture strukt of fa is
begin

    S <= A xor B xor Cin;
    Cout <= (A and B) or (A and Cin) or (B and Cin);

end strukt;

 

A következő program annak a nyolcbites összeadónak a VHDL kódját mutatja, amely a teljes összeadóból épül fel. Tekintettel arra, hogy ez az összeadó paraméteresen készült el, ezért (is) került sor a for ciklus használatára.

library IEEE;
use ieee.std_logic_1164.all;

entity addersoros is
    generic(m : integer := 8);
    port(A, B : in std_logic_vector(m-1 downto 0);
        Cin : in std_logic;
        S : out std_logic_vector(m-1 downto 0);
        Cout : out std_logic);
end addersoros;

architecture strukt of addersoros is
    component fa is
        port(A, B, Cin : in std_logic;
            S, Cout : out std_logic);
    end component;
signal atv : std_logic_vector(m downto 0);
begin
    atv(0) <= Cin;
    osszead : for i in 0 to m-1 generate
        nev : fa port map(A(i), B(i), atv(i), S(i), atv(i+1));
        end generate osszead;
    Cout <= atv(m);

end strukt;

 

Készítsük el azt a tesztkörnyezetet, amelyet ennél a megoldásnál (addersoros), illetve a következő cikkben szerepelő megvalósításnál is használhatunk.

Noha lehetett volna komponensként behelyezni a szimulálandó áramkörünket a tesztkörnyezetbe, egy másik megoldás kerül inkább bemutatásra. Nem kell használnunk component-et, hanem ehelyett a programban vastagon jelölt megoldás is alkalmazható.
Fontos, hogy ennek a cikknek az írásakor a projekt neve "projekt4" volt, ezért szerepel ez a név a tesztkörnyezetben.

library IEEE;
use ieee.std_logic_1164.all;

entity addersim is
    generic(m : integer := 8);
    port(S : out std_logic_vector(m-1 downto 0);
        Cout : out std_logic);
end addersim;

architecture sim of addersim is
signal    SA, SB : std_logic_vector(m-1 downto 0);
signal    SCin : std_logic;
begin

    nev: entity projekt4.addersoros port map(SA, SB, SCin, S, Cout);
    
    process
    begin
        SCin <= '0';
        SA <= "00000000";
        SB <= "10101010";
        wait for 10 ns;
        SA <= "10000000";
        wait for 10 ns;
        SA <= "01010101";
        wait for 10 ns;
        SA <= "11111111";
        wait for 10 ns;
        SCin <= '1';
        wait for 10 ns;
        SB <= "11111111";
        SCin <= '0';
        wait for 10 ns;
        SA <= "10000001";
        SB <= "00000001";
        wait for 10 ns;
    end process;
end sim;

 

A szimulációs eredmény látható a következő ábrán.

kep
1. ábra   Szimulációs eredmény   (Kattints a képre)