WebElektronika

Összeadó viselkedésszintű megvalósítása VHDL nyelven

person access_time 2015.10.15.
Megnézzük most egy összeadó VHDL nyelvben történő megvalósítását. Az aritmetikai áramkört viselkedési leírással valósítjuk meg, és a összeadandó operandusok szélessége változtatható a generic használatának köszönhetően.


Az előző részben egy paraméteres (alapesetben 8 bites) aritmetikai összeadót készítettünk el. Most is egy ilyen összeadó elkészítése a cél, de nem struktúrális, hanem viselkedési leírással valósítjuk meg ezt az aritmetikai áramkört. Látni fogjuk, hogy a működésben nincs különbség.

Szintén a paraméteres megadás mellett döntöttünk a megvalósítás során, hiszen így nagyon kényelmesen lehet megváltoztatni az összeadó felbontását, amelynek a felbontása alapesetben 8 bit, de fordítás előtt kényelmesen módosítható ez.

Ennek az összeadónak a bemeneti típusa unsigned, a kimenete (S) viszont std_logic_vector. Azért történt ez a típusváltoztatás, hogy az előzőekben bemutatott tesztkörnyezetnek ne kelljen megváltoztatni a típusát.

library IEEE;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

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

architecture beh of adder1 is
signal    temp : unsigned(m downto 0);
begin

    temp <= ('0' & A) + B;
    Cout <= temp(m);
    SUM <= std_logic_vector(temp(m-1 downto 0));
end beh;

 

Láthatjuk a következő programon, hogy csak minimális változtatás van az előző cikkben közölt tesztkörnyezethez képest. Tekintettel arra, hogy a most bemutatott összeadó bemenetének a típusa unsigned, illetve az entitásában nem öt, hanem csak négy port van, ezeket módosítani kellett. Az eredeti is bent maradt a kódban, csak kikommentelésre került. A módosított programsorokat vastagon jelöltük.

library IEEE;
use ieee.std_logic_1164.all;
use ieee.numeric_std.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    SA, SB : unsigned(m-1 downto 0);
signal    SCin : std_logic;
begin

    --nev: entity projekt4.addersoros port map(SA, SB, SCin, S, Cout);
    nev: entity projekt4.adder1 port map(SA, SB, 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ényt mutatja a következő ábra. Könnyen észrevehető, hogy a SCin, tehát az átvitel bemenete hiányzik.

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

Összevetve az előző megoldás szimulációs eredményével, csak ott találunk különbséget, ahol ott az SCin logikai 1-ben volt (40-50 ns között).