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.