Evropský sociální fond Praha & EU: Investujeme do vaší budoucnosti Simulace číslicových obvodů (MI-SIM) zimní semestr 2010/2011 Jiří Douša, katedra číslicového návrhu (K18103), České vysoké učení technické v Praze, fakulta informačních technologií Program cvičení: Cvičení 1: analýza jednoduchých modelů v jazyku VHDL, Cvičení 2: vypracování 1. projektu, Cvičení 3: vypracování 1. projektu, Cvičení 4: test 1, dokončení a odevzdání 1. projektu, Cvičení 5: vypracování 2. projektu, Cvičení 6: vypracování 2. projektu, Cvičení 7: test 2, dokončení a odevzdání 2. projektu, zápočet.
Cvičení 1: analýza ukázkových modelů Předmětem 1. cvičení je seznámit studenty se simulačním systémem ModelSim. K tomu účelu jsou na následujících slajdech předloženy demonstračnimi příklady jednoduchých kombinačních i sekvenčních obvodů v jazyku VHDL. V těchto demostračních příkladech jsou s předstihem (vůči přednáškám) použity základní a nejpotřebnější konstrukce jazyka VHDL včetně náznaku jednoduchých testovacích programů. Tyto ukázky mají posloužit studentům jako inspirace při řešení jejich projektů. Podrobnosti jazyka VHDL budou postupně probírány na přednáškách. Pomocí uvedených ukázkových programů lze rovněž demonstrovat jednotlivé funkce systému ModelSim (editace zdrojových programů, jejich překlad, zpracování výsledného modelu, spuštění simulace, trasování programu a jeho ladění, zobrazení časových průběhů). 21.10.2011 MI-SIM: Jiří Douša 2
Cvičení 1: model invertoru library IEEE; use IEEE.std_logic_1164.all; entity INVERTOR is port ( A : in std_logic; -- input port Y : out std_logic); -- output port end INVERTOR; architecture INVERTOR_BODY of INVERTOR is // no local declarations are needed INV : process if A = '0' then Y <= '1' after 20 ns; else Y <= '0' after 13 ns; end if; -- statements with the transport delay: -- if A = '0' then Y <= transport '1' after 20 ns; -- else Y <= transport '0' after 13 ns; end if; wait on A; end process INV; end INVERTOR_BODY; 21.10.2011 3 MI-SIM: Martin Novvotný, Jiří Douša
Cvičení 1: test invertoru library IEEE; use IEEE.std_logic_1164.all; entity TB_INVERTOR is end TB_INVERTOR; -- no ports architecture TB_INVERTOR_BODY of TB_INVERTOR is -- declaration of inner sinals follows: signal INP, OUTP : std_logic; -- declaration of a socket for the entity INVERTOR ( with the same -- interface) component INVERTOR port ( A : in std_logic; Y : out std_logic ); end component; -- architecture operating part follows -- named port mapping is used: INV : INVERTOR port map (A => INP, Y => OUTP); --INV : INVERTOR port map (Y => OUTP, A => INP); -- process to generace stimulus for the INVERTOR follows GEN: process INP <= '1'; wait for 100 ns; INP <= '0'; wait for 100 ns; INP <= '1'; wait; -- wait for ever end process GEN; end TB_INVERTOR_BODY; 21.10.2011 MI-SIM: Martin Novotný, Jiří Douša 4
Cvičení 1: model multiplexoru entity MUX is port ( B : in bit_vector (3 downto 0); SEL : in bit_vector (1 downto 0); Y : out bit); end MUX; architecture MUX_BODY of MUX is // architecture operation part follows MX: process (B, SEL) case SEL is when "00" => Y <= B(0); when "01" => Y <= B(1); when "10" => Y <= B(2); when "11" => Y <= B(3); end case; end process; end MUX_BODY; 21.10.2011 MI-SIM: Martin Novotný, Jiří Douša 5
entity TESTER is end TESTER; Cvičení 1: test multiplexoru architecture TESTER_body of TESTER is signal TB : bit_vector (3 downto 0); signal TSEL : bit_vector (1 downto 0); signal TY : bit; component MUX port ( B : in bit_vector (3 downto 0); SEL: in bit_vector (1 downto 0); Y : out bit); end component; MX1: MUX port map (TB, TSEL, TY); -- installation of the tested entity GEN: process -- process to drive inputs of the tested entity TB <= "0101"; TSEL <= "00"; wait for 100 ns; TB <= "1111"; wait for 100 ns;..; end process; end TESTER_body; 21.10.2011 MI-SIM: Martin Novotný, Jiří Douša 6
Cvičení 1: aritmeticko logická jednotka package ALU_TYPY is type OPERATION is (add, sub, mul, div); end ALU_TYPY; use work.alu_typy.all; entity ALU is port (A, B : in integer; OPER : in OPERATION; Y : out integer); end ALU; architecture ALU_BODY of ALU is ALU_P: process (A, B, OPER) case OPER is when add => Y <= A + B after 10 ns; when sub => Y <= A - B after 10 ns; when mul => Y <= A * B after 10 ns; when div => Y <= A / B after 10 ns; when others => null; end case; end process; end ALU_BODY; 21.10.2011 MI-SIM: Martin Novotný, Jiří Douša 7
Cvičení 1: komparátory library IEEE; use IEEE.std_logic_1164.all; entity COMP1 is -- one bit comparator port (R, S : in std_logic; T : out std_logic); end KOMP1; architecture COMP1_body of COMP1 is T <= not (R xor S) after 5 ns; end COMP1_body; library IEEE; use IEEE.std_logic_1164.all; entity COMP4 is -- four bit comparator port ( U, V : in std_logic_vector (3 downto 0); W : out std_logic_vector (3 downto 0) ); end COMP4; architecture COMP4_body of COMP4 is component COMP1 port (R, S : in std_logic; T : out std_logic); end component; C0: COMP1 port map (R=>U(0), S=>V(0), T=>W(0)); C1: COMP1 port map (R=>U(1), S=>V(1), T=>W(1)); C2: COMP1 port map (R=>U(2), S=>V(2), T=>W(2)); C3: COMP1 port map (R=>U(3), S=>V(3), T=>W(3)); end COMP4_body; 21.10.2011 MI-SIM: Martin Novotný, Jiří Douša 8
Cvičení 1: klopný obvod library IEEE; use IEEE.STD_LOGIC_1164.all; entity DFF is port ( D : in std_logic; -- data input CLK : in std_logic; -- clock signal Q : out std_logic -- output ); end DFF; architecture DFF_BODY of DFF is DP: process (CLK) -- why FF and not latch? if CLK = '1' then Q <= D after 10 ns; end if; end process; end DFF_BODY; 21.10.2011 MI-SIM: Martin Novotný, Jiří Douša 9
Cvičení 1: klopný obvod library IEEE; use IEEE.STD_LOGIC_1164.all; entity DFF_SYN is port ( D : in std_logic; CLK : in std_logic; RES_SYN : in std_logic; Q : out std_logic ); end DFF_SYN; -- reset input architecture DFF_SYN_BODY of DFF_SYN is DP: process (CLK) -- why synchronous reset? if CLK = '1' then -- why FF and not latch? if RES_SYN = '1' then Q <= '0' after 10 ns; else Q <= D after 10 ns; end if; end if; end process; end DFF_SYN_BODY; 21.10.2011 MI-SIM: Martin Novotný, Jiří Douša 10
Cvičení 1: klopný obvod chybný model library IEEE; use IEEE.STD_LOGIC_1164.all; entity DFF_ASYN is port ( ); end DFF_ASYN; D : in std_logic; CLK : in std_logic; RES_ASYN : in std_logic; Q : out std_logic -- wrong version follows: two simultaneously driven processes => -- conflict on signal Q architecture WRONG of DFF_ASYN is P1: process (RES_ASYN) -- asynchronous reset if RES_ASYN = '1' then Q <= '0'; end if; end process; P2: process (CLK) if CLK = '1' and RES_ASYN = '0' then Q <= D; end if; end process; end WRONG; 21.10.2011 MI-SIM: Martin Novotný, Jiří Douša 11
Cvičení 1: klopný obvod správný model library IEEE; use IEEE.STD_LOGIC_1164.all; entity DFF_ASYN is port ( D : in std_logic; CLK : in std_logic; RES_ASYN : in std_logic; Q : out std_logic ); end DFF_ASYN; architecture CORRECT of DFF_ASYN is // one process drives the signal Q => only one driver of Q exists DP: process (CLK, RES_ASYN) if RES_ASYN = '1' then Q <= '0' after 10 ns; elsif CLK = '1' and CLK'event then Q <= D after 10 ns; end if; end process; end CORRECT; 21.10.2011 MI-SIM: Martin Novotný, Jiří Douša 12
Cvičení 1: model čítače library IEEE; use IEEE.STD_LOGIC_1164.all; use IEEE.STD_LOGIC_UNSIGNED. all; entity COUNTER is port ( ); CLK -- variant using the mode buffer : in std_logic; RES_ASYN : in std_logic; end COUNTER; DOUT : buffer std_logic_vector (3 downto 0) architecture COUNTER _BODY of COUNTER is CNT: process (CLK, RES_ASYN) if RES_ASYN = '1' then DOUT <= (others => '0') after 10 ns; end if; elsif CLK = '1' and CLK'event then // following statement reads the signal DOUT!!!!! DOUT <= DOUT + '1' after 10 ns; end process; end COUNTER_BODY; 21.10.2011 MI-SIM: Martin Novotný, Jiří Douša 13
Cvičení 1: model čítače -- variant without using buffer library IEEE; use IEEE.STD_LOGIC_1164.all; use IEEE.STD_LOGIC_UNSIGNED.all; entity COUNTER_1 is port ( CLK : in std_logic; RES_ASYN : in std_logic; DOUT : out std_logic_vector (3 downto 0) ); -- mode out end COUNTER_1; architecture COUNTER_BODY_1 of COUNTER_1 is signal C : std_logic_vector (3 downto 0); -- needed inner signal CNT: process (CLK, RES_ASYN) -- asynchronous reset if RES_ASYN = '1' then C <= (others => '0') after 10 ns; elsif CLK = '1' and CLK'event then C <= C + '1' after 10 ns; -- other possibilities of increment : C <= C + 1 after 10 ns; -- C <= C + "0001"after 10 ns; end if; end process; OUTP: process ( C ) DOUT <= C; end process ; -- equivalent parallel statement : DOUT <= C; end COUNTER_BODY_1; 21.10.2011 MI-SIM: Martin Novotný, Jiří Douša 14
Cvičení 1: model automatu package AUTO_TYPES is type TYPE_INPUT is (A, B, C); type TYPE_OUTPUT is (P, Q); end AUTO_TYPY; -- input symbols -- output symbols library IEEE; use IEEE.STD_LOGIC_1164.all; use work.auto_types.all; entity AUTOMATON is port ( INP : in TYPE_INPUT; OUTP : out TYPE_OUTPUT; CLK, RESET : in std_logic ); end AUTOMATON; architecture AUTOMATON_MOORE of AUTOMATON is type TYPE_STATE is (ASBS, ASBL, ALBS, ALBL); -- inner states signal STATE, NEXT_STATE : TYPE_STATE; OUT_FUN : process (STATE) -- specification of output function case STATE is when ASBL => OUTP <= Q; when others => OUTP <= P; end case; end process; 21.10.2011 MI-SIM: Martin Novotný, Jiří Douša 15
Cvičení 1: model automatu DS : process (INP, STATE) -- specification of transient function case STATE is -- testing current state when ASBS => case INP is when A => NEXT_STATE <= ALBS; when B => NEXT_STATE <= ASBL; when C => NEXT_STATE <= ASBS; end case; when ASBL => case INP is when A => NEXT_STATE <= ALBL; when B => NEXT_STATE <= ASBS; when C => NEXT_STATE <= ASBL; end case; when ALBS => case INP is when A => NEXT_STATE <= ASBS; when B => NEXT_STATE <= ALBL; when C => NEXT_STATE <= ALBS; end case; when ALBL => case INP is when A => NEXT_STATE <= ASBL; when B => NEXT_STATE <= ALBS; when C => NEXT_STATE <= ALBL; end case; end case; end process; 21.10.2011 MI-SIM: Martin Novotný, Jiří Douša 16
Cvičení 1: model automatu REG : process (CLK, RESET) -- flip-flop with asynchronous reset if RESET = '1' then STATE <= ASBS; elsif CLK = '1' and CLK'event then STATE <= NEXT_STATE; end if; end process; end AUTOMATON_MOORE; 21.10.2011 MI-SIM: Martin Novotný, Jiří Douša 17
Cvičení 2 3: projekt 1 Náplní druhého, třetího a částečně i čtvrtého cvičení je řešení prvého projektu, které spočívá v implementaci simulačního modelu vybraného číslicového obvodu v jazyku VHDL. Níže uvedený seznam uvádí konktrétní číslicové obvody, jejichž modely mohou být v rámci tohoto projektu implementovány. Přiřazení úloh studentům provede cvičicí. V odůvodněných případech může student v rámci daného projektu řešit nějaký problém na základě vlastní specifikace. Zadání: 1. Datové registry výukového procesoru DOP. 2. Aritmeticko-logická jednotka výukového procesoru DOP. 3. Registr příznaků výukového procesoru DOP. 4. Rozhraní mezi vnitřní a vnější sběrnicí výukového procesoru DOP. 5. Řadič výukového procesoru DOP. 6. Operační paměť procesoru DOP. 7. Procesor DOP sestavený z předchozích částí. 8. Generátor tabulkou zadané periodické funkce. Poznámka: Kompletní strukturní schéma procesoru DOP je uvedeno v dokumentaci cvičení předmětu BI-JPO. Podrobná specifikace požadavků na zpracování modelu generátoru funkce je uvedena na následujících slajdech. 21.10.2011 MI-SIM: Jiří Douša 18
Cvičení 2-3: generátor funkce Stručný popis celkové koncepce generátoru: Předmětem projektu je návrh generátoru periodické funkce dle následujícího obrázku: Funkční hodnoty z prvého kvadrantu periody funkce jsou uloženy v pevné paměti typu ROM. Tyto jsou z paměti postupně čteny a posílány na výstup generátoru. Paměť je adresována reversibilním čítačem, který je řízen řadičem generátoru. Celkové schéma je na následujícím obrázku: 21.10.2011 MI-SIM: Jiří Buček, Jiří Douša 19
Cvičení 2-3: generátor funkce Při inkrementaci čítače jsou adresovány hodnoty z kvadrantů 1 a 3, při jeho dekrementaci se adresují hodnoty kvadrantů 2 a 4. Výpočet záporných hodnot kvadrantů 3 a 4 zajišťuje negátor, který počítá dvojkový doplněk vstupní hodnoty. Specifikace zadání: Vypracujte funkční modely dílčích částí generátoru (tj. NEGATOR, MULTIPLEXOR, COUNTER, MEMORY, CONTROLLER), tyto pak použijte k návrhu výsledného strukturního modelu generátoru. Dimenzi adresové, resp datové sběrnice paměti parametrizujte hodnotou aw, resp. w, které z důvodu jejich možného sdílení v entitách dílčích modelů deklarujte jako konstanty ve vlastní knihovně GEN_CONST. V deklaraci této knihovny použijte hodnot aw = 4 a w = 8. Pro representaci logických veličin použijte datový typ std_logic. Výsledný model celého generátoru otestujte automatickým testem realizovaným entitou TEST s architekturou TESTBENCH. Poznámka: následující slajdy stanoví předepsaný způsob řěšení. 21.10.2011 MI-SIM: Jiří Buček, Jiří Douša 20
Cvičení 2-3: generátor funkce Negator Negátor plní funkci dvojkového doplňku; jde o kombinační obvod dle následujícího obrázku: A Y Vstupy: w-bitový operand A (výstup paměti). Výstup: w-bitový výsledek Y (výstup generátoru). Poznámka: po inversi všech bitů operandu A je třeba k takto získanému číslu přičíst hodnotu 1. Toto lze provest zjednodušenou sčítačkou (inkrementorem) dle následujícího obrázku: 21.10.2011 MI-SIM: Jiří Buček, Jiří Douša 21
Cvičení 2-3: generátor funkce Pokyny k návrhu negátoru: Jako model negátoru realizujte entitu NEGATOR s architekturou NEGATOR_BODY. Funkci inkrementoru v dané architektuře implementujte pomocí procesu, který v cyklu vypočítává jednotlivé bity výsledku. Pro záznam mezistupňových přenosů inkrementoru použijte proměnnou C. Samotnou inversi bitů proveďte s využitím paralelního signálového příkazu. Pro specifikaci portů entity NEGATOR použijte konstantu w z knihovny GEN_CONST. Pro zpoždění invertoru, resp. inkrementoru uvažujte hodnoty 1 ns, resp. 3 ns. Nástin řešení: library ieee; use ieee.std_logic_1164.all; use work.gen_const.all; entity NEGATOR is port ( A : in std_logic_vector (w-1 downto 0); Y : out std_logic_vector (w-1 downto 0) ); end NEGATOR; architecture NEGATOR_BODY of NEGATOR is.; -- implementace NEGATORU end architecture; 21.10.2011 MI-SIM: Jiří Buček, Jiří Douša 22
Cvičení 2-3: generátor funkce Pokyny k návrhu multiplexoru: Navrhněte model multiplexoru se dvěma w-bitovými vstupy A, B, jedním jednobitovým výběrovým vstupem SEL a jedním w-bitovým výstupem Y. Příslušnou architekturu implementujte pomocí jednoho procesu. Předpokládejte zpoždění multiplexoru 2 ns. library ieee; use ieee.std_logic_1164.all; use work.gen_const.all; entity MULTIPLEXER is port ( SEL : in std_logic; A, B : in std_logic_vector (w-1 downto 0); Y : out std_logic_vector (w-1 downto 0) ); end MULTIPLEXER; architecture MULTIPLEXER_BODY of MULTIPLEXER is.; -- implementace MULTIPLEXORU end archtecture MULTIPLEXER_BODY; 21.10.2011 MI-SIM: Jiří Douša, Jiří Buček 23
Cvičení 2-3: generátor funkce Paměť funkčních hodnot (typu ROM) Paměť je kombinační obvod s jedním aw-bitovým vstupem A (adresová sběrnice) a jedním w-bitovým výstupem D (datová sběrnice). Pokyny k návrhu paměti: Navrhněte entitu MEMORY s architekturou MEMORY_BODY. Vlastní model paměti implementujte pomocí přednastavené konstanty typu MEM_TYPE, který koncipujte jako pole délky (2**aw) - 1, jehož elementy tvoří w - bitové vektory typu std_logic_vector. Vlastní deklaraci konstanty aw přidejte do knihovny GEN_CONST. Pro uvažovaný případ celkové kapacity paměti 16 bajtů ( aw = 4 a w = 8 ) použijte následující hodnoty jako hodnoty prvého kvadrantu generované funkce: 00000000, 00001111, 00011101, 00101010, 00110110, 01000001, 01001011, 01010100, 01011100, 01100011, 01101001, 01101110, 01110010, 01110101, 01110111, 01111000. Pro reprezentaci vybavovací doby paměti uvažujte 5 ns. 21.10.2011 MI-SIM: Jiří Buček, Jiří Douša 24
Cvičení 2-3: generátor funkce Cítač: Definujte entitu COUNTER a architekturu COUNTER_BODY jako funkční model synchronního čítače a asynchronním signálem RESET. Vstupy čítače: CLK..hodinové pulsy, RESET..nulování čítače, UP..1, resp. 0 pro vzestupné, resp. sestupné čítání. Výstupy čítače: TOP, resp. BOTTOM. hlášení o naplnění, resp. vyprázdnění čítače, CNT současný stav čítače (pro adresování paměti s aw-bitovou adresovou sběrnicí).. Pokyny k návrhu čítače: Pro representaci výstupu i vnitřního stavu čítače použijte typ std_logic_vector a knihovnu std_logic_unsigned pro implementaci operátorů sčítání a odčítání nad vektory. K buzení výstupů TOP a BOTTOM použijte paralelní příkazy. Pro reprezentaci zpoždění výstupních signálů TOP a BOTTOM, resp. CNT vůči náběžné hraně CLK předpokládejte hodnotu 3 ns, resp. 2 ns. 21.10.2011 MI-SIM: Jiří Buček, Jiří Douša 25
Cvičení 2-3: generátor funkce Řadič: Úkolem řadiče je generovat výběrový signál SEL pro multiplexor a řídící signál UP pro reversibilní čítač tak, aby generátor generoval periodický průběh na základě uložených hodnot prvého kvadrantu celé periody. Pokyny k návrhu řadiče: Implementujte řadič generátoru jako konečný automat typu Mealy pomocí entity CONTROLLER a příslušné architektury CONTROLLER_BODY sestavené ze tří procesů (pro definici výstupní funkce, pro definici přechodové funkce a pro popis klopných obvodů). Vstupy řadiče: TOP ( plný čítač: poslední adresa paměti), BOTTOM (prázdný čítač: počáteční adresa paměti) RESET (nulování čítače), CLK (hodinový signál). 21.10.2011 MI-SIM: Jiří Buček, Jiří Douša 26
Cvičení 2-3: generátor funkce Návrh celkového modelu generátoru: Specifikujte entitu GENERATOR ( vstupy RESET a CLK, výstup DATA) s příslušnou strukturní architekturou GENERATOR_BODY, vytvořenou pomocí dílčích modelů CONTROLLER, COUNTER, MEMORY, NEGATOR a MULTIPLEXOR. Test generátoru: Navrhněte entitu TEST s architekturou TESTBENCH pro automatickou kontrolu generovaných hodnot. Dekadické hodnoty y i ( i= 0,1.15) z 1. kvadrantu funkce, které jsou uložené v paměti generátoru jsou uvedeny v následující tabulce: i x i y i 0 15 0 1 14 15 2 13 29... i x i 1 1 y i 1 + x i 1 14 1 119 15 0 120 Pro kontrolní výpočet výstupů generátoru lze požít následující vztahy: y 0 = 0, y i + 1 = x i + y i, kde x i a y i jsou hodnoty z předešlé tabulky. 21.10.2011 MI-SIM: Jiří Buček, Jiří Douša 27
Cvičení 2-3: generátor funkce Nástin testovací entity a architektury: library ieee; use ieee.std_logic_1164.all; use work.gen_const.all; use ieee.std_logic_unsigned.all; entity TEST is end TEST; architecture TESTBENCH of TEST is component GENERATOR port ( -- deklarace portů ); end component; -- signal... deklarace signálů ( Clk, Reset, Vystup ) Gen: GENERATOR port map (clk => Clk,...); -- instalace generátoru tst: process variable y : integer; -- proměnná pro uložení očekávaných hodnot for i in. loop cyklus pro testování jednotlivých výstupů wait until..; -- synchronizace s clk y :=. ; -- výpočet očekávané hodnoty wait for... ; -- čekej na ustálení výstupního signálu -- následuje srovnání dodnoty testovaného vektoru (Vystup) s -- očekávanou hodnotou (y), assert y = conv_integer ( Vystup ) report chyba severity failure; end loop; ; -- případná zpráva o testu wait; -- případné ukončení testu end process; -- tst end TESTBENCH; 21.10.2011 MI-SIM: Jiří Buček, Jiří Douša 28
Cvičení 4 Dokončení 1. projektu: Podmínkou dokončení projetu je úspěšné provedení úplného automatického testu zadaného obvodu v jazyku VHDL. Test 1: Předmětem testu 1 je znalost základních principů jazyka VHDL a analýza chování vybraných časových specifikací. Důraz je kladen především na sémantiku; syntax není předmětem testu. Jako ukázka možné náplně 1. testu může sloužit následující slajd 21.10.2011 MI-SIM: Jiří Douša 29
Ukázka 1. testu Otázky: 1) Vysvětlete význam zápisu a quiet (2ns). 2) Které příkazy mohou vytvořit budič signálu? 3) Vysvětlete význam signálu guard a uveďte kde je použitelný. Uvažujte následující deklarace a příkazy. Pro následující příklady nakreslete časové průběhy zmíněných signálů v intervalu <0, 12>. signal a1, b1, a5: std_logic; signal a2 : std_logic_vector (3 downto 0); signal b2: std_logic_vector (1 downto 0); signal a51: std_logic register; Příklad 1: process a1 <= '1','0' after 2 ns, '1' after 3 ns; wait for 5 ns; endprocess; process (a1) b1 <= not a1 after 1 ns; end process; Priklad 2: process wait for 1 ns; a2(3 downto 0) <= "1001"; wait for 1 ns; a2(3 downto 0) <= "0010"; wait for 1 ns; end process; process (a2) variable i: integer; for i in 2 downto 0 loop b2 <= a2(i+1) & a2(i); end loop; end process; Priklad 3: : a5 <= '0', '1' after 3 ns; BL1: block ( a5 = '0') a51 <= guarded a5 after 1 ns; end block; 21.10.2011 MI-SIM: Jiří Douša 30
Cvičení 5-6: projekt 2 Náplní pátého a šestého cvičení je realizace druhého projektu, která spočívá v implementaci modelu číslicového obvodu v jazyku VERILOG. Jako příklad možného zadání slouží následující seznam. Přiřazení konkrétních úloh studentům provede cvičicí. V odůvodněných případech lze v rámci daného projektu rovněž řešit nějaký problém na základě vlastní specifikace, případně použít některé zadání ze seznamu prvého projektu. Zadání: 1. Násobička osmibitových celých nezáporných čísel. 2. Násobička osmibitových celých čísel v doplňkovém kódu (Boothova metoda). 3. Dělička celých osmibitových nezáporných čísel (varianta s průběžným obnovováním nezáporného zbytku). 4. Dělička celých osmibitových nezáporných čísel (varianta bez obnovování nezáporného zbytku). Poznámka: Požadavky na zpracování zbývajících projektů jsou zcela analogické požadavkům 1. projektu. 21.10.2011 MI-SIM: Jiří Douša 31
Cvičení 7: test 2, zápočet. Dokončení 2. projektu: Podmínkou dokončení projetu je úspěšné provedení úplného automatického testu modelu zadaného obvodu v jazyku VERILOG.. Test 2: Předmětem testu 2 je znalost základních principů jazyka VERILOG a analýza chování vybraných časových specifikací.. Důraz je kladen především na sémantiku; syntax není předmětem testu. Jako ukázka možné náplně 2. testu může sloužit následující slajd. Zápočet: Podmínkou pro udělení zápočtu je získání předepsaného počtu bodů, které lze získat vypracováním obou projektů včetně automatického otestování příslušných modelů a napsáním obou testů. 21.10.2011 MI-SIM: Jiří Douša 32
Cvičení 7: 2. test Otázky: 1) Uvažujte modul, jehož hlavička je module T #( ) (output reg y, output z, input x); a) Vyjmenujte typy příkazů, pomocí kterých lze uvnitř modulu typu T přiřadit hodnotu formálnímu výstupu y, b) Uvažujte nějaký nadřazený modul, uvnitř něhož existují deklarace reg u, v; wire c, d; wand e, f; wor g, h; a uvnitř kterého se nachází instalace instance t1 typu T # (.) t1 (.); b1) vyjmenujte všechny deklarované identifikátory, které lze při instalaci instance t1 mapovat na její formální port y, B2) vyjmenujte všechny deklarované identifikátory, které lze při instalaci instance t1 použít jako aktuální porty formálního portu x. 2) Popište jak je v systému Verilog řešeno delta zpoždění a v kterých případech ho potřebujete použít. V dále uvedených příkladech nakreslete časové průběhy všech proměnných a sítí na intervalu (0, 13). Příklad 1: initial a11 <= #2 1; #3 a11 <= 0; a11 = #4 1; a11<= #3 0; end initial b11 = repeat (1)@(negedge a11) 1; #1 b11= 0; end Priklad 2: initial a21 =1; b21 = 0; #3; fork a21 = b21; b21 = 1; #2; join #3; a21 = #2 b21; b21 = #2 ~a21; end 21.10.2011 MI-SIM: Jiří Douša 33