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);
begintemp <= ('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.
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).
Elkészítünk most VHDL nyelven egy PWM modult. Természetesen digitális úton állítunk elő PWM jelet.. . . .
Készítünk VHDL nyelven most egy programozható szélességű multiplexert, amelyet azután elhelyezünk egy Spartan 6-os FPGA-ban. A bemenet (és a kiválasztó jel) szélessége paraméteresen állítható be a fordítás előtt.. . . .
Készítünk VHDL nyelven most egy programozható szélességű multiplexert, amelyet azután elhelyezünk egy Spartan 6-os FPGA-ban. A bemenet (és a kiválasztó jel) szélessége paraméteresen állítható be a fordítás előtt.. . . .