• Nem Talált Eredményt

Strukturális áramköri modellek

2. Programozható logikai kapuáramkörök,

2.5. Strukturális és viselkedési áramköri modellek megvalósítása

2.5.1. Strukturális áramköri modellek

A strukturális modellek esetén a blokkok teljes belső felépítését hierarchikus szinteken ke-resztül adjuk meg. A tervezési metodika történhet a hagyományos bottom-up vagy top-down stílus szerint. A modell és hierarchikus alrendszerei közötti kapcsolatot – a viselkedési mo-dellhez hasonlóan – itt is speciális irányított változók, az ún. portok teremtik meg (in- bejövő,

out –kimenő, inout – kétirányú adatáramlás).

Feladat 1: 4-bites regiszter strukturális áramköri modellje, szimulációval

Tervezzünk meg egy elemi D- tárolókból (FlipFlop) felépített 4-bites párhuzamos betöltésű, és párhuzamos kiolvasású regisztert strukturális modellt alkalmazva, és bottom-up tervezési metodikát használva (2.14. ábra). A bemeneteket jelöljük d(i)-vel, a kimeneteket q(i)-vel).

Az órajel engedélyező logika egy ÉS kapu, amely az en engedélyező jel hatására juttatja az ún. kapuzott órajelet clk az egyes elemi D-tárolók órajel bemeneteire. A top modul neve legyen reg_4bit_top.vhd. Használjunk szekvenciális hozzárendelő utasításokat.

A fenti ábra szerinti 4-bites regiszter összeállításához, először a legalacsonyabb hierarchia szinten meg kell tervezni az órajel logikát, illetve az elemi 1-bites D-tárolókat, amelyeket azután a következő egyel magasabb hierarchia szinten példányosítani fogunk.

Az egy bites elemi tároló neve legyen d_ff, az architektúra leírás neve pedig legyen

struct. Ennek VHDL kódja látható a következő példán:

d q clk

d q

clk

d q

clk

d q

clk

a y

b

d(1)

d(2)

d(3) d(0)

q(0)

q(1)

q(2)

q(3)

en clk

d_latch

d_latch

d_latch

d_latch

Clock_logic

(struct)

(struct)

(struct)

(struct)

(struct) reg_4bit_top (struct)

int_clk

2.14. ábra: 4-bites párhuzamos betöltésű és kiolvasású regiszter strukturális modellje

-- D tároló library IEEE;

use IEEE.std_logic_1164.all;

entity d_ff is

port ( d, clk : in std_logic;

q : out std_logic );

end d_ff;

architecture struct of d_ff is begin

ff_inst : process (clk, d) is begin

if clk’event and clk = '1' then

q <= d after 2 ns; --egyedi késleltetés modellezése: aktuális időponthoz --képest 2ns múlva fogja felvenni a d értékét a q

end if;

end process ff_inst;

end architecture struct;

A fenti kódrészletben a process törzsének a végére betehetjük a következő sort is:

wait on clk, d;

és helyettesítjük, hogy a clk, és d bemeneti jeleket a process érzékenységi listájába nem közvetlenül tesszük.

Az órajel engedélyező logika VHDL forráskódja a következő:

-- D flipflop library IEEE;

use IEEE.std_logic_1164.all;

entity clock_logic is

port ( a, b : in std_logic;

y : out std_logic );

end clock_logic;

architecture struct of clock_logic is begin

clock_logic_inst: process (a, b) is begin

y <= a and b after 5 ns; --egyedi késleltetés modellezése: aktuális -- időponthoz képest 5 ns múlva fogja felvenni a d értékét a q

end process clock_logic_inst;

end architecture struct;

A következő, eggyel magasabb hierarchia szinten lévő reg_4bit_top entitásban a fenti 2.14. ábrának megfelelően kell példányosítani az egyes entitásokat (4x d_ff , 1x

clock_logic).

-- órejel logika library IEEE;

use IEEE.std_logic_1164.all;

entity reg_4bit_top is

port ( d : in std_logic_vector(3 downto 0);

q : out std_logic_vector(3 downto 0);

clk : in std_logic;

en : in std_logic );

end reg_4bit_top;

architecture struct of reg_4bit_top is

signal int_clk : std_logic; --belső ún. kapuzott óra jel!

begin

--port map VHDL 93 szabvány szerint, nem kell component bit0 : entity work.d_ff(struct)

port map (d(0), int_clk, q(0));

bit1 : entity work.d_ff(struct) port map (d(1), int_clk, q(1));

bit2 : entity work.d_ff(struct) port map (d(2), int_clk, q(2));

bit3 : entity work.d_ff(struct) port map (d(3), int_clk, q(3));

gate : entity work. clock_logic (struct) port map (en, clk, int_clk);

end architecture struct;

A következő lépésben ehhez a magas szintű entitáshoz (reg_4bit_top) készítsünk teszt-pad-ot, és ágyazzuk be, amelynek a neve legyen reg4_test_bench . Az testbench-nek a VHDL forrását a következőképpen adjuk meg.

-- tesztágy 4-bites regiszterhez library IEEE;

use IEEE.std_logic_1164.all;

entity reg4_test_bench is end entity reg4_test_bench;

architecture test of reg4_test_bench is -- komponens deklarációk a teszteléshez COMPONENT reg_4bit_top

PORT(

d : IN std_logic_vector(3 downto 0);

q : OUT std_logic_vector(3 downto 0);

clk : IN std_logic;

en : IN std_logic );

END COMPONENT;

--belső jelek bemenetekhez

signal d : std_logic_vector(3 downto 0) := (others => '0');

signal clk : std_logic := '0';

signal en : std_logic := '0';

--belső jelek kimenetekhez

signal q : std_logic_vector(3 downto 0);

--belső órajel, szimulációhoz

constant clk_period : time := 20 ns; -- 50MHz órajel szimulátorhoz, -- time: fizikai típus deklarációval megadott mennyiség

begin

-- Unit Under Test: a tesztelni kívánt top-level entitás példányosítása, -- amit előtte a komponens deklarációs részen megadtunk

uut: reg_4bit_top PORT MAP ( d => d,

q => q, clk => clk, en => en );

-- Clock process definíciók clk_process :process

begin

clk <= '0';

wait for clk_period/2;

clk <= '1';

wait for clk_period/2;

end process;

-- gerjesztések definíciói stimulus_proc : process begin

-- kezdetben ún. reset állapot 100ns-ig, jelenleg nem adtunk meg reset -- jelet

wait for 100 ns;

d <= "1111";

en <= '0';

wait for 25 ns;

en <= '1';

wait for clk_period*2;

d <= "0011";

wait for clk_period*2;

d <= "1100";

wait for clk_period*2;

en <= '0';

wait for clk_period*2;

d <= "1001";

wait for clk_period*2;

-- . . . további esetek wait;

end process stimulus_proc;

end architecture test;

A megfelelően példányosított és a tesztpadba beágyazott entitásokra gerjesztést kell adni, hogy meg tudjuk vizsgálni a kimenetek q(3:0) változásait. Természetesen a fenti kódban a

std_logic_vector(3 downto 0) adattípust is deklaráltuk úgy, hogy a gerjesztés során előszőr ’1111’, majd pedig engedélyezve ’0011’, ’1100’ és végül ’1001’ bitmintázatokat rendeltünk. A szimulációban megjelenik a gerjesztő folyamat mellett egy másik, órajel gene-ráló process() is, amely a peridódus idő feléig ’0’-át, majd a másik felében ’1’-et szolgáltatva váltakozik. Ez a processz szükséges az clk órajel szimulációjához, hisszen ehhez rendeltük a VHDL leírásban a d_ff tárolását, felfutó élre vezérelve. A clk órajel impulzusidejének beállításához a konstans fizikai (’time’) típus deklarációt használunk, amelynek periódus ideje 20 ns. A VHDL leírásszimulációhoz a Xilinx ISim szimulátor használható, mellyel kapcsolat-ban bővebb leírást a 2.4. fejezetben találhatunk.

A szimuláció során a következő hullámforma alakot kapjuk (2.15. ábra):

2.15. ábra: reg_4bit_top szimulációja során kapott hullámforma

Szimulációs eredmény részletes vizsgálata: látható, hogy a ’0000’ bitmintázat hiába adott a szimuláció 0 ns-os idejétől kezdve, mivel nem érkezik engedélyező jel (en = ’1’), ezért az

órajelet sem kapuzza be az egyes D-tárolók bemeneteire a 4-bites regiszterben. Az ’1111’

bitmintázat 100 ns –nál érkezik, de az engedélyező még mindig inaktív marad (en = ’0’).

Az engedélyező jel 125 ns-nál vált ’1’-be, azaz a következő felfutó órajel hatására (clk’event and clk = ’1’) a bemeneten d(3:0) lévő ’1111’ bitmintázat a 4-bites regisz-terbe kerül, és 125+7 ns múlva jelenik meg a táróló q(3:0) kimenetein (ezt jelzi a két sárga ún. marker közötti időkülönbség). A 7ns-os időkésleltetés a példányosított d_ff -ek beállított 2 ns-os késleltetéséből, illetve az órajel logika (and) 5 ns-os késleltetésének összegéből adó-dik. Ezután a következő érvényes ’0011’bitmintázat 150 ns időben érkezik, amely 150+7 ns múlva jelenik meg a q kimeneteken. A tesztelés során gerjesztésként beállított utolsó ’1001’

bitmintázat az inaktív engedélyező jel (en = ’0’) miatt már nem kerül a 4-bites regiszterbe.

Feladat 2. 2-1 multiplexer strukturális modell szerinti egyidejű értékadással felépítve

Tervezzünk meg egy 2-1 MUX áramkört, amely egyidejű (konkurens) hozzárendelési utasítá-sokat és strukturális áramköri VHDL leírást használ. A 2-1 multiplexer áramkör strukturális felépítése a következő 2.16. ábrán látható. Az áramkör bemeneteit jelölje a_in, b_in;

kiválasztó jelét s_in;illetve kimenetét y_out. A legfelsőbb szintű entitás neve legyen

mux2_1_top.

2.16. ábra: 2-1 Multiplexer áramkör strukturális modellje

Az áramkör strukturális leírásának VHDL forrása a következő:

-- 2-to-1 MUX kapu szintű strukturális leírása library IEEE;

architecture struct of mux2_1_top is --belső jelek deklarációja

signal a_out : STD_LOGIC;

signal b_out : STD_LOGIC;

signal not_s_in : STD_LOGIC;

begin

--konkurrens értékadások logikai operátorok felhasználásával a_out <= not_s_in and a_in;

b_out <= s_in and b_in;

not_s_in <= not(s_in);

y_out <= b_out or a_out;

end struct;

Gyakorlati feladat: tovább feladatként érdemes ehhez a feladathoz is egy tesztpadot létre-hozni, amelybe a legfelsőbb szintű entitást be kell ágyazni. A gerjesztésekre adott válaszokat vizsgálja meg az ISim szimulációs program segítségével, mellyel kapcsolatban bővebb leírást a 2.4. fejezetben találhat.

További feladatként írjon a modellhez egy tesztpad-ot, és vizsgálja meg a működését ISim szimulátor segítségével.