WebElektronika

Programozható felbontású multiplexer VHDL nyelven

person access_time 2015.12.07.
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.


Megvalósítunk most egy programozható szélességű multiplexert, amelynek a select bemenete változtatható a generic-nél. Ezáltal közvetve a bemenetnek a méretét tudjuk módosítani.

Ehhez konverziót kell alkalmaznunk, az általunk használt konverziós függvény a numeric_std csomagban található.

A példaprogramban a select (SEL bemenet 3 bites, ezért az adatbemenet (BE) 8 bites (23). Ebből a SEL bemenetből készítünk először unsigned típust, utána abból integer-t.

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

entity muxparam is
    generic(m : integer := 3);
    port(BE : in std_logic_vector(2**m-1 downto 0);
        SEL : in std_logic_vector(m-1 downto 0);
        Y : out std_logic);
end muxparam;

architecture BEH of muxparam is
begin

    Y <= BE(to_integer(unsigned(SEL)));

end BEH;

 

Fontos megemlíteni azt, hogy két lehetőségünk van a multiplexer méretének a megadására. Vagy a SEL méretét állítjuk be a generic-nél, vagy az adatbemenet (BE) szélességét. Első megoldásnál a hatványozás műveletét kell alkalmaznunk, a másodiknál a gyökvonást.

Szimuláljuk le ennek a VHDL kódnak a működését. Tekintettel arra, a szimulálandó VHDL file paraméterezhető, ezért a teszkörnyezetben is alkalmazzunk paramétert. Ekkor viszont szintén szükséges a konverziók alkalmazása.

A VHDL file-ok a "webelektronika" nevű projektben kerültek kipróbálásra, ezért látjuk ezt a sort :  
nev : entity webelektronika.muxparam port map(SA, SSEL, Y);

Az SA signal-lal az adatbemenetet, az SSEL-lel a SEL bemenetet tesszük egyenlővé (nincs értelme a tesztkörnyezetnek bemenetet adni az entitásban).

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

entity muxparamsim is
    generic(m : integer := 3);
    port(Y : out std_logic);
end muxparamsim;

architecture sim of muxparamsim is
signal    SA : std_logic_vector(2**m-1 downto 0);
signal    SSEL : std_logic_vector(m-1 downto 0);
begin

    nev : entity webelektronika.muxparam port map(SA, SSEL, Y);
    
    process
    begin
        SA <= std_logic_vector(to_unsigned(32, 2**m));
        for i in 0 to 2**m-1 loop
            SSEL <= std_logic_vector(to_unsigned(i, m));
            wait for 10 ns;
        end loop;
    end process;

end sim;

 

A for ciklusban az "i" ciklusváltozót konvertáljuk át std_logic típussá, amelyet utána egyenlővé teszünk az SSEL jellel. Az adatbemenetre az SA jel értéke kerül, szintén konverzió után. Az adatbemenetre 32-t (binárisan : 100000) teszünk, amelyet egész típusként adtunk meg, de 2m biten ábrázolunk, hiszen az adatbemenet is std_logic típus.

A szimulációs eredménye látható az első ábrán (kattints a képre).

kep
1. ábra   A programozható szélességű multiplexer működése (kattints a képre)
 

A szimuláció után valósítsuk meg ezt a multiplexert egy Spartan 6-os FPGA-ban, például a Nexys 3 tesztpanelon! 

Először a SEL szélessége 3 bit tehát 8 bemenetű lehet az adat.

kep
2. ábra   8 adatbemenetű multiplexer megvalósítása a Floorplan editortban
 

Módosítsuk most a paraméterünk értékét, legyen a mutiplexerünk 128 bites bemenetű, tehát a SEL szélessége 7 bites legyen.

A fordítás után nézzük meg a szintézis eredményét, láthatjuk a megvalósított multiplexerünknek a logikai áramköri megfelelőjét.

kep
3. ábra   A szintetizált multiplexer (kattints a képre)
 

Helyezzük el a multiplexerünk "alkotóelemeinek" nagy részét az FPGA-nkban a Floorplan editor segítségével. 

kep
4. ábra   Az elrendezett LUT-ok (kattints a képre)
 

A fordítás után újra indítsuk el a Floorplan editort és nézzünk bele az FPGA belsejébe (5. ábra)!

kep
5. ábra   Floorplan editor használata
 

Végül nagyítsunk rá arra a területre, amelynél elhelyeztük korábban a multiplexer alkotórészeinek egy részét (6. ábra).

kep
6. ábra   A felhasznált LUT-ok