Příkladný úvod do VHDL

Rozměr: px
Začít zobrazení ze stránky:

Download "Příkladný úvod do VHDL"

Transkript

1 Příkladný úvod do VHDL Richard Šusta Katedra řídicí techniky ČVUT-FEL v Praze Verze. ze dne 3. září 23

2 Obsah. Úvod VHDL stylem "Dataflow" Majorita ze tří úvod do VHDL a prostředí Quartus II a) Schéma obvodu v symbolickém editoru b) Vytvoření VHDL kódu c) Jak VHDL program použijeme v grafickém editoru schémat? d) Vysvětlení VHDL majority: knihovny na řádku 2 až e) Vysvětlení VHDL majority: Blok entita řádky 5 až f) Vysvětlení VHDL majority: Definice port řádky 6 až g) Vysvětlení VHDL majority: Architektura řádky 2 až h) Vysvětlení VHDL majority: Příkazový blok řádka Rozšířená majorita ze tří VHDL signály a) Postup rozšíření VHDL majority o další výstup b) O definici "signal" na řádce c) Více o <= "concurrent assignment" d) Otestování upravené majority e) Co když potřebujeme nerozšířenou verzi majority? Dekodér pro ukazatel příkazy with select jazyka VHDL a) Příkaz with select b) Datový typ std_logic versus std_logic_vector c) Tvorba vlastních typů a atributy VHDL d) Dekodér pro lineární ukazatel s výstupy na jednotlivé vodiče Prioritní dekodér VHDL příkaz when else a) Operátory porovnání a logické operátory ve VHDL b) Pohled do nitra překladače přes RTL Viewer Tříbitový prioritní inhibitor cyklus for-generate a) Jak vložit do výjimky do VHDL příkazy generic a assert b) Co programu ještě chybí? VHDL stylem "Structural" Použití prioritního inhibitoru ve VHDL a) Sekce port map a generic map c) Sekce map a schéma c) Mapování vstupů a výstupů pro desku DE Rozšíření prioritního inhibitoru o enable a) Inicializace proměnných vektorů asociací others=> Vytvoření vlastní knihovny ("package") a) Dekodér pro lineární ukazatel s výstupy na jednotlivé bity pomocí knihovny Zapojení prioritního dekodéru a lineárním ukazatelem Závěr Příloha A: Testbench pro ModelSim A- Vytvoření programu typu Testbench A-2 Spuštění Testbench v ModelSim Altera

3 Seznam programů Program - Majorita ze tří... 6 Program 2 - Pořadí vstupů a výstupů v entitě a ve schematické značce... Program 3 - Majorita s pomocným výstupem jednoho signálu... 2 Program 4 - Dekodér pro lineární ukazatel... 6 Program 5 - Dekodér pro ukazatel s oddělenými výstupy... 9 Program 6 - Prioritní dekodér... 2 Program 7 - Zbytečné podmínky v příkazu when...else... 2 Program 8 - Program pro demonstraci práce s proměnnými datového typu Boolean... 2 Program 9 - Minimalizovaná kaskáda multiplexorů Program - Java metoda pro vyzkoušení prioritního inhibitoru Program - Prioritní inhibitor pro 8 vstupů a výstupů Program 2 - Prioritní inhibitor s generic Program 3 - Prioritní inhibitor ve strukturálním popisu Program 4 - Nedoporučené použití neúplných definic v bloku "component"! Program 5 - Automaticky generovaný VHDL kód Program 6 - Prioritní inhibitor s enable vstupem... 3 Program 7 - Demonstrace použití others pro inicializaci... 3 Program 8 - Knihovna kódů vytvořených v úvodu do VHDL Program 9 - Dekodér pro lineární ukazatel s výstupy na jednotlivé bity pomocí knihovny Program 2 - Prioritní dekodér s výstupem na lineární ukazatel Program 2 - VHDL testbech pro dekoder dekodér s výstupem na lineární ukazatel Seznam obrázků Obrázek - Majorita ze tří... 5 Obrázek 2 - Realizace módů v obvodu... 9 Obrázek 3 - Schéma odpovídající přiřazení y <= a AND b OR a AND c OR b AND c;... Obrázek 4 - Upravená majorita... 3 Obrázek 5 - Důsledek chybného dvojího přiřazení hodnot do signálu ytmp... 3 Obrázek 6 - Aktualizace změněného symbolu... 4 Obrázek 7 - Výsledné schéma v test.bdf... 5 Obrázek 8 - Rozšířená majorita s nezapojeným výstupem y... 5 Obrázek 9 - Operace s std_logic_vector... 7 Obrázek - Dekodér pro lineární ukazatel s bitovými I/O... 9 Obrázek - Prioritní dekodér z multiplexorů... 2 Obrázek 2 - Vyvolání RTL Viewer z top-level entity Obrázek 4 - Ukázka použití prioritního inhibitoru ve schématu Obrázek 3 - Příklad použití prioritního inhibitoru Obrázek 5 - Příkaz "Create HDL Design File" Obrázek 6 - Test inhibitoru 2 vložený do schématu... 3 Obrázek 7 - Prioritní dekodér s lineárním ukazatelem Obrázek 8 - Breakpoint při simulaci

4 . Úvod Proč zrovna VHDL? VHDL patří mezi HDL programovací jazyky ("Hardware Description Languages") určené pro návrhy obvodů. V USA se převážně používá HDL jazyk Verilog, se syntaxí podobnou jazyku C, zatímco v Evropě se více programuje ve VHDL ("Very-high-speed integrated circuits Hardware Description Language"), vzdáleně se podobajícímu PASCALu. (Přesněji VHDL si vypůjčilo mnoho své syntaxe z jazyka ADA, u nás méně známého, který se mírně podobá PASCALu.) Když jsme se v roce 29 rozhodovali, zda studenty učit VHDL či Verilog, mnozí profesionální návrháři, kteří léta používají oba jazyky, se klonili k VHDL. Jde o jazyk sice upovídaný a typově ještě striktnější než PASCAL, avšak návrhy v něm mají lepší šanci fungovat. Jazyk Verilog má ve své podobnosti s jazykem C jen zdánlivou výhodu; postupy osvojené z C programů se nehodí pro obvody. Zde si nutno poznamenat, že HDL jazyky mají trojí použití: / pro specifikaci obvodů, 2/ pro jejich simulaci a 3/ pro jejich fyzickou syntézu. Kvůli tomu obsahují široké spektrum programových konstrukcí, ale pro syntézu obvodů se hodí jen některé z nich. Účel učebního textu Následující text vznikl na základě dlouholetých zkušeností s výukou kurzu SPS (Struktury počítačových systémů) na Katedře řídicí techniky Elektrotechnické fakultě v Praze. Používá se v něm VHDL jako pomocný nástroj pro laboratorní experimenty s počítačovými systémy a paralelním chováním jejich obvodů bez HDL jazyků se dnes již nedá rozumně pracovat. Studenti ale nebudou většinou profesionálně navrhovat hardware a potřebují jen jeho základy, ale i ty by měli znát na technické úrovni odpovídající vysoké škole. Při psaní dobrých VHDL programů je třeba občas pomyslet na strukturu vytvářeného zapojení a nelze jen mechanicky "bušit" jakési programové příkazy. V češtině existuje několik učebnic VHDL i webových stránek s jeho popisy, avšak často bývají příliš programátorské, soustředěné na samotný jazyk, a navíc postrádají vazby k vhodnému vývojovému prostředí, ve kterém by se daly návrhy obratem vyzkoušet. Organizace textu Výklad bude vycházet z příkladů cílených na FPGA vývojovou desku DE2 firmy Altera. Začneme od lehké majority ze tří, kterou použijeme nejen k úvodu do VHDL, ale současně i k návodu jak pracovat s VHDL v prostředí Altera Quartus II. Kvůli tomu doporučuji i pokročilejším čtenářům, aby si úvodní příklad udělali úplně celý. Další části pak budou věnované více jazyku VHDL. Prerekvizity V úvodu do VHDL budeme přepokládat, že čtenáři mají instalované programovací prostředí Quartus II od firmy Altera, jehož bezplatnou verzi Quartus II Web Edition Software si lze stáhnout ze stránek firmy po registraci či z webu SPS. Umožní práci jen s některými FPGA, ale se všemi potřebnými v kurzu SPS, a nepovoluje dílčí překlady částí obvodů; vždy překládá vše, což u menších návrhů nevadí. Jinak nabízí stejnou funkčnost jako komerční verze. mají správně vytvořený projekt v Quartus II určený pro desku DE2, a to včetně přiřazení odpovídajících "Pin Assignments" desky DE2 ze souboru "DE2_pin_assignments.csv" ; ovládají práci ve vývojovém prostředí Quartus II na úrovni symbolického editoru. Pokud někomu uvedené znalosti chybí, může je získat z materiálů na stránce předmětu SPS: Rada: Text obsahuje krátké příklady. Úmyslně nepřikládám jejich zdrojové kódy. Nekopírujte si je z obrazovky. Prostudujte si vždy celý příklad a pak si ho vytvořte zpaměti od začátku a pokud možno s minimem pohledů na text. Metodou "Copy-Paste" se ještě nikdo nic nenaučil! 4

5 . VHDL stylem "Dataflow" Popis stylem "dataflow", tedy pomocí toku dat, se hodí pro části popsané kombinačními obvody, v nichž závislost výstupů na vstupech lze popsat logickými operacemi. - Majorita ze tří úvod do VHDL a prostředí Quartus II Zadání: Navrhněte logický obvod se třemi vstupy A, B a C a jedním výstupem Y, který bude v logické, pokud dva nebo tři vstupy budou v logické, jinak bude v logické. -.a) Schéma obvodu v symbolickém editoru C A B C A B A.B + A.C + B.C Majorita ze tří Y Obrázek - Majorita ze tří -.b) Vytvoření VHDL kódu Řešení: Výstup má být v logické při libovolných dvou vstupech v. Ze tří vstupů lze vytvořit tři dvojice A-B, A-C a B-C. Pokud jejich členy spojíme v AND-termy (oba vstupy v dvojici jsou v ) a ty sloučíme OR operacemi (aspoň jedna dvojice musí být v ), pak dostaneme Y = (A and B) or (A and C) or (B and C). Stejný výsledek dá i SoP (Sum-of-Products) pokrytí Karnaughovy mapy. Navržený obvod lze vytvořit v grafickém editoru souborů *.bdf (Block Diagram/Schematic File) ze tří hradel AND a jednoho hradla OR. Lze použít jakýkoliv textový editor. Výborně se hodí interní VHDL editor v Quartus II, který už od verze nabízí zvýraznění syntaxe a automatické doplňování kódu po napsání prvních tří písmen. Vytvoříme nový soubor VHDL z hlavního menu Quartusu (File->New -> VHDL file) a uložíme ho (File->Save As) pod názvem vytvářeného obvodu tím bude název v jeho bloku entity, viz dále. Zvolíme-li pro entitu název majorita, pak VHDL soubor musíme nazvat majorita.vhd. Poznámka: Ve VHDL se každý obvod (entita) ukládá do stejnojmenného souboru, jelikož překladač právě tohle předpokládá. o Alternativní možností je komerční editor Sigasi ( Jeho bezplatná verze nabízí vše pro menší soubory a pro větší se přepne na omezené možnosti. Obsahuje i trochu pokročilejší ediční funkce; jako třeba přejmenování proměnných ("Refactor") a zvýraznění chyb při psaní. V budově FEL na Karlově náměstí lze používat i jeho plnou verzi jako pomocný editor Quartus II detekuje externě změněné soubory a nabídne jejich aktualizaci. Komentáře ve VHDL začínají dvojicí pomlček "--" a končí s koncem řádku. Neexistuje sice možnost jak komentovat celé bloky, třeba označit každý řádek zvlášť, ale Quartus II i Sigasi dovedou vložit komentářové pomlčky na začátky všech řádek ve vybraných blocích a případně je zas odebrat. Raději nepoužívejte diakritiku, a to ani v komentářích. Překladače ji někdy vezmou, jindy ne. Spolehlivě rozumí jen čistému ASCII. Pozn. VHDL programy nebudete překládat jen v Quartusu, ale pro simulace i v ModelSim, a tak se hodí dodržet kompatibilitu pro oba překladače. VHDL nerozlišuje malá a velká písmena. Nicméně bývá dobrým zvykem psát proměnné a klíčová slova pořád stejně. I když "entity", "Entity", "ENTITY" i "EnTiTy" bere překladač jako stejné slovo, program bude mnohem přehlednější, budeme-li psát vždy "entity". 5

6 VHDL kód uvedeme napřed celý, poté ukážeme jeho použití v editoru schémat, což nám posléze umožní lépe vysvětlit jeho části: -- Majorita ze tri -- library ieee; -- 2 use ieee.std_logic_64.all; entity majorita is -- 5 port -- 6 ( a, b, c : in std_logic; -- 7 y : out std_logic -- 8 ); -- 9 end; architecture dataflow of majorita is -- 2 begin -- 3 y <= (a AND b) OR (a AND c) OR (b AND c); -- 4 end; -- 5 Program - Majorita ze tří -.c) Jak VHDL program použijeme v grafickém editoru schémat? Pro začlenění do schématu volíme následující postup. VHDL program napřed otestujeme, zda neobsahuje syntaktickou chybu (ikona nad T šipkou) v obrázku dole, či ho přeložíme; označíme majorita.vhd za hlavní entitu a spustíme buď částečný překlad ikonou pod C šipkou či úplný ikonou pod P šipkou. Symbol (tj. schematickou značku) pro majoritu vytvoříme buď: / v okně "Project Navigator" přepnutém na záložku "Files" vybereme soubor majorita.vhd, pravou myší otevřeme jeho kontextové menu a volíme "Create Symbol File for Current File." (S-šipka); nebo 2/ při VHDL souboru otevřeném v editoru volíme z hlavního menu Quartusu: "File-> Create/Update ->Symbol Files for Current Files". Nyní můžeme program vyzkoušet. Vytvoříme nový "Block Diagram/Schematic File" (File->New), a nazveme ho třeba jako test.bdf a otevřeme v něm "Symbol Tool" buď z lišty nástrojů editoru schémat (viz dole obr. a), nebo alternativně pravým dvojklikem myši kamkoliv na prázdné místo grafické plochy. 6

7 a) Vložení bloku přes Symbol Tool b) Vygenerování vstupů a výstupů V dialogovém okně "Symbol" se nám přidala knihovnu "Project", z níž vybereme entitu majorita. Vložíme ji do schématu. Připojíme k ní vstupy a výstupy pro její vyzkoušení, a to buď manuálně, nebo si můžeme ušetřit trochu práce, když pravou myší vyvoláme kontextové menu vložené schematické značky majorita (viz předchozí obr. b) a necháme si pro ni automaticky vygenerovat vstupy a výstupy volbou "Generate Pins for Symbol Ports". Vložené "pins" jen přejmenujeme podle "assignments" desky DE2. Nyní zvolíme test.bdf za hlavní entitu, přeložíme ji a nahrajeme do desky DE2. Přepínači SW vyzkoušíme, že výstup je v jen tehdy, když nejméně dva SW jsou v pozici nahoru, tj. v. Nemáte-li desku, alternativní možností je využití c) Schéma po přejmenování podle definic desky DE2 v simulátoru, viz materiály na stránce kurzu. Překladači nezáleží na tom, zda jsme entitu vytvořili ve VHDL nebo v symbolickém editoru. Oba přístupy jsou v mnohých operacích skoro rovnocenné, ovšem ne v pracnosti, složitější obvody se rychleji navrhnou ve VHDL, kde se dají i snáze porovnávat verze programu než u schémat. -.d) Vysvětlení VHDL majority: knihovny na řádku 2 až 3 Probírání strukturu kódu VHDL začneme od knihoven. -- Majorita ze tri -- library ieee; -- 2 use ieee.std_logic_64.all; entity majorita is -- 5 port -- 6 ( a, b, c : in std_logic; -- 7 y : out std_logic -- 8 ); -- 9 end; architecture dataflow of majorita is -- 2 begin -- 3 y <= (a AND b) OR (a AND c) OR (b AND c); -- 4 end; -- 5 Příkaz "library" (řádek 2) aktivuje knihovnu, zde standardní ieee navrženou v "Institute of Electrical and Electronics Engineers (IEEE)". Na řádku 3 se z ní vybírá balíček ("package") deklarující standardní logiku "std_logic_64" a z něho vezmeme vše (all). Pozn. Volba "all" je nejčastější, ale z knihovny lze též vybrat i jeden prvek, což se někdy hodí pro řešení konfliktů u složitějších projektů. Řádky 2 a 3 jsou v úvodu téměř každého VHDL programu napsaného pro standardní logické obvody. Můžete je mechanicky vkládat na začátek každého nového souboru, který vytvoříte v kurzu SPS. 7

8 Poznámka: Snadná práce s knihovnami představuje výhodu VHDL oproti Verilogu, který zde nabízí mnohem omezenější možnosti. -.e) Vysvětlení VHDL majority: Blok entita řádky 5 až 2 Návrh obvodu povinně obsahuje deklaraci bloku entity, v našem programu na řádku 5: entity majorita is kde entity je klíčové slovo a "majorita" představuje námi přiřazený název obvodu shodný se jménem VHDL souboru (majorita.vhd). Blok entity může obsahovat několik definic (ale nemusí mít ani jednu, může být i prázdný). Náš příklad má jedinou definici, a to "port", proměnných vstupů a výstupů. Na řádku blok entity končí klíčovým slovem end; Zakončení lze napsat zkráceně, tak jako v našem příkladu, nebo případně za end zopakovat i klíčové slovo entity nebo také název, což se povoluje od verze VHDL-93 (používané v kurzu SPS). Konec našeho bloku entity může mít tedy některý z tvarů: entity majorita is -- deklarace end; entity majorita is -- deklarace end entity; entity majorita is -- deklarace end majorita; Tabulka - možnosti zakončení deklarace entity ve VHDL-93 a vyšším 8 entity majorita is -- deklarace end entity majorita; Zkracování ukončujících "end" se povoluje i u některých dalších deklarací, například také u bloku architecture na rádcích 2 až 5, kde možno uplatnit stejný princip. Volba zakončení závisí jen na programátorovi. U kratších bloků se volí jen end, u delších deklarací bývá lepší pro zvýšení přehlednosti programu zopakovat klíčové slovo úvodní deklarace bloku, zde entity, nebo přidat i název bloku či obojí. Blok entity určuje vnější vzhled obvodu, čili jak obvod uvidíme po vložení jeho instance do schématu, viz ukázka použití v editoru schémat; kvůli tomu jsme ji uvedli před rozborem programu. VHDL blok entity se obecně chová úplně jinak než třídy známé z C++, Javy a C#, nicméně můžeme říct, že lze najít nepatrnou analogie v tom, že název uvedený v úvodu bloku entity odpovídá jménu třídy s odvoláním na něj vytváříme instance třídy, ve VHDL obvodu. -.f) Vysvětlení VHDL majority: Definice port řádky 6 až 9 Definice port se může objevit jen uvnitř deklarace entity a nejvýše jen jednou. Specifikuje proměnné vstupů a výstupů, tedy jakési analogie prvků "public" tříd viditelných zvnějšku. Obsahuje seznamy proměnných spolu se seznamy jejich názvů (signal-names), datovými typy (signal-type) a módy (mode) určujícími druh vstupu či výstupu. Pozn. Všimněte si, že za posledním signal-type chybí středník jeho napsání bývá častou syntaktickou chybou začátečníků. -- Majorita ze tri -- library ieee; -- 2 use ieee.std_logic_64.all; entity majorita is -- 5 port -- 6 ( a, b, c : in std_logic; -- 7 y : out std_logic -- 8!! ZA POSLEDNI DEFINICI NENI ;!! ); -- 9 end; architecture dataflow of majorita is -- 2 begin -- 3 y <= (a AND b) OR (a AND c) OR (b AND c); -- 4 end; -- 5

9 Názvy proměnných a bloků: VHDL názvy začínají písmenem A-Z a pokračují písmeny a číslicemi -9. Malá a velká písmena se nerozlišují, ale doporučuje se psát názvy pořád stejně. Název nesmí být klíčovým slovem. Může obsahovat znaky podtrhávače _, avšak nikoliv na začátku nebo konci názvu, nebo dva podtrhávače za sebou. Povolené názvy: A, A_, A2_b7_Z Nepovolené názvy: A_ (podtrhávač na konci), A (dva podtrhávače), end (klíčové slovo), A$B (nepovolený znak $.). VHDL od verze 93 dovoluje i rozšířené názvy ohraničené znaky \ \ v těch lze použít i zakázané konstrukce. Například dovolené rozšířené názvy jsou \23.45\, \END\ či \A$B\. Slouží pro speciální operace a kódy automaticky generované překladači. V běžných programech se z důvodu kompatibility doporučuje používat normální názvy. V delších programech volíme názvy vždy výstižné, specifikující účel či použití. Mód proměnné: Ve většině návrhů se používají jen módy in a out. Mód in označuje vstup, jehož hodnotu lze zvnitřku obvodu jen číst, ale nelze do něho zapisovat. Naproti tomu mód out specifikuje výstup, jemuž můžeme zvnitřku obvodu přiřadit hodnotu, ale nelze ho číst. Pokud musíme hodnotu výstupu i číst, lze použít mód buffer, ovšem pro něj musí překladač vyhradit trochu obsažnější element, jelikož z výstupu vede drát zpět do vnitřku obvodu. Posledním módem je typ inout, který dovoluje data jak číst tak do nich zapisovat. Vyžaduje ovšem složitý prvek obousměrného budiče, a tak se používá jedině Obrázek 2 - Realizace módů v obvodu výjimečně, například pro obousměrné směrnice jako třeba sběrnice I2C (na desce DE2 je přes ni připojený audio výstup). V návrzích určených pro syntézu obvodů se doporučuje používat přednostně módy in a out. Pozn. O portech se zmíníme ještě v sekci "-2.b) O definici "signal" na řádce 3" na str. 3. Datové typy: Pro vstupy a výstupy se používají typy odvozené od std_logic, což je proměnná výčtového typu obsahující 9 hodnot: '', '', 'X', 'Z','U', '-', 'L', 'H', 'W' vícehodnotové logiky zvané MVL-9 (Multi Value Logic 9). Pomocí ní lze dobře popsat i neurčitost při návrhu a simulacích obvodů. Datové typy odvozené od std_logic se při VHDL syntéze volí pro další proměnné spojené v toku dat se vstupy a výstupy, neboť překladače je mohou lépe syntetizovat. Unitialized U objeví se zpravidla jen při simulaci obvodu, kdy díky nezadané inicializaci není možné stanovit hodnotu výstupu Don t Care - v návrhu dosud nezadaná hodnota Forcing logická Forcing logická Forcing Unknown X neznámá hodnota, při simulaci ji nelze stanovit Weak, Weak, Weak unknown H, L, W vhodné pro obvody s otevřeným kolektorem, FPGA řady Cyclone je ale neobsahují, a tak u nich nelze použít High Impedance Z odpojení výstupu, třetí stav vysoké impedance Tabulka 2 - Typ std_logic Pozn. VHDL obsahuje i jednobitové datové typy "Boolean" a "Bit", oba opět realizované jako výčtové typy. Typ "Boolean" s hodnotami TRUE a FALSE lze použít jedině pro podmínky, viz dále. Typ "Bit" s hodnotami a se zase hodí jen pro generátory simulací či podobné pomocné výpočetní části. Striktně se nedoporučuje používat ho v programech pro syntézu obvodů, protože překladač pak nedetekuje některé obvodové chyby, jako například dva zdroje signálu ve zkratu. 9

10 Pozor datové typy std_logic a bit nejsou převoditelné žádným přetypováním. Pořadí definic v bloku port je sice libovolné, ale určujeme tím pořadí vstupů a výstupů na schematické značky, a proto ji pro schéma musíme po každé změně definice port znovu vygenerovat pomocí již zmíněného "Create Symbol File for Current File". V definicích port lze použít buď seznam proměnných od sebe oddělených čárkami, tak jako v Program na str. 6, nebo každou proměnnou psát na samostatný řádek, což dovoluje přidat k ní komentář jejího významu. Komentáře zde vynecháváme jen pro zkrácení délek řádek, ale v dobrém kódu by je měly být u každého vstupu a výstupu. entity majorita is port ( b : in std_logic; y : out std_logic; c : in std_logic; a : in std_logic ); end; Program 2 - Pořadí vstupů a výstupů v entitě a ve schematické značce -.g) Vysvětlení VHDL majority: Architektura řádky 2 až 5 Blok architektury popisuje vlastní obvod. V programu majorita začíná na řádku 2, a to klíčovým slovem architecture, za nímž následuje jméno vytvářené architektury a název entity, pro niž je architektura určená. Poté následuje příkazový blok begin end; připomínající bloky v Pascalu. Blok entity se v některých publikacích připodobňuje k interface v Pascalu a blok architektury zase k vlastní implementaci. Lépe by se možná hodila jiná podobnost přirovnávající obvod ke krabičce s elektronickým přístrojem, třeba se zesilovačem. Entita pak představuje ovládací prvky vyvedené na povrch krabičky, jako třeba vstupy signálu z mikrofonu, kytary nebo přehrávače, zdířky pro připojení výstupů na reproduktory či sluchátka a voliče zesílení. Architektura se zde podobá vnitřnímu zapojení zesilovače, skrytému před vnějším pozorovatelem uvnitř krabičky. Lze měnit ovládací prvky na povrchu krabičky (tj. entitu) a přizpůsobit jim vnitřní zapojení (tj. architekturu), nebo naopak měnit jen vnitřní zapojení pro vylepšení funkce a plně zachovat ovládací prvky, či změnit oboje. -- Majorita ze tri -- library ieee; -- 2 use ieee.std_logic_64.all; entity majorita is -- 5 port -- 6 ( a, b, c : in std_logic; -- 7 y : out std_logic -- 8 ); -- 9 end; architecture dataflow of majorita is -- 2 begin -- 3 y <= (a AND b) OR (a AND c) OR (b AND c); -- 4 end; -- 5 Název architektury dataflow byl zvolený podle stylu programu. Naši entitu majorita popisujeme architekturou ve stylu "dataflow", a tak jsme ji tak nazvali. Každý název architektury patří jen do jmenného prostoru identifikátorů své entity. Jinými slovy u dalších entit můžeme jejich architektury opět nazvat dataflow, budou-li popsané tímto stylem. Pozn. Povinný název architektury slouží pro případy, kdy entita má několik různých architektur, tj. více bloků architecture pro jednu entitu. Víc různých architektur se hodí například tehdy, když potřebujeme jednu funkci obvodu pro jeho samotnou realizaci a další pro jeho urychlení při simulacích. Používání několika architektur, samozřejmě odlišených různými názvy, představuje už pokročilejší téma v kurzu SPS vystačíte s jednou architekturou pro každou entitu. majorita b c a inst y

11 Pro zakončení bloku architektury klíčovým slovem end platí podobné možnosti jako pro zakončení bloku entity. Za klíčovým slovem end možno zopakovat i klíčové slovo architecture i její název dataflow, podobně jako u zakončení bloku entity, viz Tabulka na straně 8. -.h) Vysvětlení VHDL majority: Příkazový blok řádka 4 Vlastní implementace architektury zaujímá jedinou řádku 4. Obsahuje logický výraz a přiřazovací příkaz <= označovaný jako "concurrent assignment", tedy souběžné, resp. paralelní přiřazení. Všechna taková přiřazení se provádějí současně, bez ohledu na jejich pořadí. V našem jednoduchém příkladu máme však jen jedno, a tak ho více rozebereme v další části, kde si náš příklad rozšíříme o další výstup. Logický výraz obsahuje operátory AND a OR. VHDL jazyk definuje následující operátory se jmény odpovídajícími běžným názvům hradel, ale rozeznává pouze dvě priority. Nejvyšší má unární operátor negace NOT, zbylé operátory mají stejnou prioritu, závorky jsou ve výrazech nezbytností. Vyšší priorita Nižší priorita not and or nand nor xor xnor Tabulka 3 - Logické operátory jazyka VHDL Pokud bychom v našem výrazu y <= (a AND b) OR (a AND c) OR (b AND c); vynechali závorky a napsali ho jako y <= a AND b OR a AND c OR b AND c; pak by se ve skutečnosti realizovalo zapojení odpovídající výrazu y <= (((((a AND b) OR a) AND c ) OR b) AND c); a schématu s úplně jinou funkcí: a b c y Obrázek 3 - Schéma odpovídající přiřazení y <= a AND b OR a AND c OR b AND c; -2 Rozšířená majorita ze tří VHDL signály Zadání: Rozšiřte majoritu o další výstup Y, který bude signalizovat, že jen jeden vstup je ve stavu logické a ostatní jsou v. Řešení: Máme dvě možnosti. ) Přidáme rovnici pro další výstup Y, ten bude v pouze při jednom vstupu v, tzn. za některé kombinace vstupů ABC = "", "" a "". Podmínku můžeme vyjádřit logickou rovnicí: Y <= (A AND not B AND not C) or (not A AND B AND not C) OR (not A AND not B AND C); 2) Uplatníme skupinovou minimalizaci, tj. využijeme již stávající rovnice pro Y. Výstup Y je v jen při dvou nebo třech vstupech v, ve zbývajících případech bude v, tedy při všech vstupech v a právě při jednom vstupu v. Stačí tedy selektivně vybrat poslední podmínku, k čemuž můžeme použít OR-term všech vstupů a ten následně spojit AND s negací Y. Y <= not Y AND (A OR B OR C); Rovnice nám říká, výstup Y bude v právě tehdy, pokud nebude splněna podmínka majority (not Y) a aspoň jeden vstup bude v, což spolehlivě vyloučí nechtěný případ, kdy všechny vstupy jsou v. -2.a) Postup rozšíření VHDL majority o další výstup V deklaraci entity přidáme pouze výstup Y. -- Majorita ze tri s výstupem jednoho signálu -- library ieee; -- 2

12 use ieee.std_logic_64.all; entity majorita is -- 5 port -- 6 ( a, b, c : in std_logic; -- 7 y, y : out std_logic -- 8 ); -- 9 end; -- V architektuře nelze napsat přímo y <= not y AND (a OR b OR c); protože překladač by ohlásil chybu, že výstup y nelze číst, protože je módu out, viz část "-.f) Vysvětlení VHDL majority: Definice port řádky 6 až 9" na straně 8. Museli bychom buď změnit mód výstupu y na buffer, čímž ale zbytečně ztížíme implementaci kódu. Lepší řešení nabízí možnost vložení pomocného vodiče; ten se ve VHDL nazývá signal. Pojmenujeme ho ytmp a bude stejného datového typu jako proměnná y, tedy datového typu std_logic. Definici signálu "signal ytmp : std_logic;" vložíme před příkazový blok begin end architektury Původní výraz y <= (a AND b) OR (a AND c) OR (b AND c); změníme. Jeho pravou stranu přiřadíme do signálu ytmp zápisem: ytmp <= (a AND b) OR (a AND c) OR (b AND c); a poté ytmp přiřadíme do y. Signál ytmp již smíme číst a lze ho použít ve výrazu pro y. Celý program bude nyní vypadat takto: -- Majorita ze tri s výstupem jednoho signálu -- library ieee; -- 2 use ieee.std_logic_64.all; entity majorita is -- 5 port -- 6 ( a, b, c : in std_logic; -- 7 y, y : out std_logic -- 8 ); -- 9 end; architecture dataflow of majorita is -- 2 signal ytmp : std_logic; -- 3 begin -- 4 ytmp <= (a AND b) OR (a AND c) OR (b AND c); -- 5 y <=ytmp; -- 6 y <= not ytmp AND (a OR b OR c); -- 7 end; -- 8 Program 3 - Majorita s pomocným výstupem jednoho signálu 2

13 -2.b) O definici "signal" na řádce 3 Signály jsou ve skutečnosti pojmenované vodiče neboli propojky. Můžeme je libovolněkrát číst dle potřeby. Čtení jejich hodnoty vlastně znamená, že z vodiče uděláme odbočku, čili na něj připojíme. Upravený program majorita vnáší změnu, která je zvýrazněna na obrázku dole. Zakroužkované hradlo už nemá k sobě připojené přímo Y, (viz dřívější obrázek na str. 5), ale pojmenovaný vodič ytmp (signal ytmp : std_logic;), připojený <= příkazem: ytmp<=(a AND b) OR (a AND c) OR (b AND c); Vodič ytmp vede na výstup y, a to příkazem "y <= ytmp;". Hodnota vodiče (signálu) ytmp se připojuje i na vstup hradla not (invertoru), a to čtením hodnoty ytmp v y <= not ytmp AND (a OR b OR c); a ytmp b y Obrázek 4 - Upravená majorita c y Jelikož signály představují vodiče, můžeme jim hodnotu přiřadit pouze jednou v celém obvodu, jinými slovy lze je připojit jen na jeden zdroj signálu. Dvojí přiřazení by vlastně znamenalo, že vodič budíme ze dvou zdrojů najednou, například máme spojené výstupy dvou hradel do zkratu a ty se přetahují o výslednou hodnotu. architecture dataflow of majorita is signal ytmp : std_logic; begin ytmp <= (a AND b) OR (a AND c) OR (b AND c); y <=ytmp; ytmp<= ytmp AND (a OR b OR c); -- chybné dvojí přiřazení do ytmp y <= ytmp; end; Pokus o dvojí přiřazení, které je v předchozím špatném programu, vyvolá chybu překladače "Can't resolve multiple constant drivers for net "ytmp" at majorita.vhd". Co vlastně teď od překladače chceme, to nám přibližuje obrázek dole, v němž je hypotetická, neproveditelná spojka zvýrazněná červeně. a b c ytmp y y důsledek chybného dvojího přiřazení hodnot do signálu ytmp Obrázek 5 - Důsledek chybného dvojího přiřazení hodnot do signálu ytmp Pozn. Spojení dvou výstupů se obecně povoluje pouze ve výjimečných případech, například u již zmíněných obvodů s otevřeným kolektorem, tzv. Wired-Or. DE2 deska s FPGA Cyclone neobsahuje speciality umožňující zkratovat výstupy, a tak podobné "krkolomnosti" jsou pro ni nepřeložitelné. Signály a definice vstupů a výstupů sekci v port I vstupy a výstupy definované v sekci port uvnitř bloku entity jsou ve skutečnosti pojmenované vodiče, ovšem vedoucí vně našeho obvodu. Z toho vyplývají všechna jejich omezení Vodič portu vstupu módu "in" smíme zvnitřku obvodu jen číst, protože bude buzený ze zdroje signálu přivedeného zvnějšku, tedy ze zapojení, které se připojí k našemu obvodu. 3

14 Naopak do vodiče portu výstupu módu "out" lze zvnitřku obvodu přiřadit hodnotu jenom jedenkrát, podobně jako do signálů. Jeho hodnota bude k dispozici pro jiná vnější zařízení. Jelikož z výstupu nevede spojka zpět do obvodu, nemůžeme ji zvnitřku obvodu číst. Do vodiče portu výstupu módu "buffer" se opět smí také zapsat jenom jedenkrát hodnota, ale jelikož od něho vede spojka dovnitř, smíme i číst jeho hodnotu. Pokud něco takového potřebujeme, pak je mnohem lepší použít pomocný signál tak, jako v příkladu upravené majority. Definicí buffer bychom jenom zbytečně komplikovali vnitřní implementaci obvodu. -2.c) Více o <= "concurrent assignment" Všechny příkazy <= "concurrent assignment" se provádějí paralelně bez ohledu, kde a v jakém pořadí se v obvodu vyskytují. Například, pokud příkazy z předchozího programu proházíme, třeba úplně obráceně, pak program bude dál pracovat stejně jako prve bez jakéhokoliv snížení efektivity: y <= not ytmp AND (a OR b OR c); y <=ytmp; ytmp <= (a AND b) OR (a AND c) OR (b AND c); Příkazy definují zapojení a každé zapojení v obvodu pracuje současně se všemi ostatními. Zkuste si představit, že máte tři lampy či jiná elektrická zařízení. Všechna budou pracovat pořád stejně bez ohledu na to, v jakém pořadí je připojíte k přívodům přívodů elektrické energie. Důležité je jenom to, že jsou k němu připojené. Přesně takhle pracují příkazy <= "concurrent assignment". -2.d) Otestování upravené majority Chceme-li upravenou majoritu vyzkoušet ve schématu, musíme provést následující kroky: a) Napřed potřebujeme vygenerovat nový symbol obvodu majorita, protože jsme změnili definici port v deklaraci jeho entity. Postup se probíral v podkapitole "-.c) Jak VHDL program použijeme v grafickém editoru schémat?" na straně 6. b) Poté musíme aktualizovat stávající schéma obvodu v souboru test.bdf, což nejsnáze provedeme, když test.bdf otevřeme v grafickém editoru, pravou myší vyvoláme kontextové menu symbolu majority. Volíme "Update symbol or Block ". Aktualizaci schématu můžeme samozřejmě alternativně provést i tím, že starý symbol smažeme a na jeho místo vložíme nový. Obrázek 6 - Aktualizace změněného symbolu c) Do aktualizovaného schématu přidáme výstup na port y pojmenovaný třeba LEDR[] d) Nakonec přeložíme test.bdf úplným překladem a nahrajeme výsledek do desky DE2. 4

15 majorita SW[] SW[] SW[2] INPUT VCC INPUT VCC INPUT VCC a b c y y OUTPUT OUTPUT LEDR[] LEDR[] inst Obrázek 7 - Výsledné schéma v test.bdf -2.e) Co když potřebujeme nerozšířenou verzi majority? Dvě různé majority s odlišnými výstupy v jednom projektu by si žádaly i odlišné názvy souborů a jejich entit. V našem případě jsme upřednostnili jen jeden název, tj. nechali si jen rozšířený obvod. Budeme-li někdy potřebovat obyčejnou majoritu, tj. bez rozšíření o výstup y aktivace právě jednoho signálu, tak y jednoduše nepoužijeme, tj. k ničemu ho nepřipojíme, viz obrázek dole: majorita SW[] SW[] SW[2] INPUT VCC INPUT VCC INPUT VCC a b c y y OUTPUT LEDR[] Obrázek 8 - Rozšířená majorita s nezapojeným výstupem y Z protokolu překladače (Quartus okno "Compilation Report") plynou následující skutečnosti: Rozšířená majorita, Obrázek 7, se všemi zapojenými výstupy má složitost 2 LE, tedy dva logické elementy použitého FPGA. Zapojení, u něhož není zapojený výstup y, Obrázek 8, má složitost LE, tedy stejnou složitost jako původní nerozšířená majorita, viz Obrázek na straně 5. Nezapojené rozšíření si překladač Quartus II automaticky vystřihl. Liší-li se obvody jen v přidaném rozšíření a zachovávají přitom svoji původní funkčnost, pak nemusíme nutně mít několik verzí pod různými názvy, ale stačí nám jen jeden univerzální obvod. inst 5

16 -3 Dekodér pro ukazatel příkazy with select jazyka VHDL Zadání: Navrhněte dekodér pro lineární ukazatel hodnoty. V jeho tříbitovém výstupu bude tolik bitů v logické, kolik má adresa hodnotu, jak ukazuje pravdivostní tabulka vpravo. Pravdivostní tabulka dekodéru Vstup adresy Výstupy Hodnota A A Q 2 Q Q 2 3 Řešení: Můžeme snadno napsat tři logické rovnice, pro každý výstup jednu. Podobný postup není však univerzální a ani přehledný. Nehodil se pro delší ukazatele hodnoty, např. u dekodéru se čtyřbitovou adresou by měl patnáct výstupů a potřeboval by 5 rovnic. Hledáme jiné, mnohem přehlednější řešení. A A "" "" "" "" A A Q 2Q Q "" "" "" "" 2 3 Q 2 Q Q Vhodné řešení nabízí přepínač. Poloha jeho jezdce je určena adresou a na kontakty jsou připojené požadované výstupní kombinace hodnot bitů. K přepínači existuje analogie v podobě multiplexoru propouštějícímu na výstup jen hodnotu ze vstupu vybraného adresou. Ve VHDL se multiplexor definuje příkazovou konstrukcí with...select. Řešení ve VHDL: Opět uvedeme napřed celý VHDL kód a pak rozebereme jeho zajímavé části odděleně. -- Dekoder pro linearni ukazatel -- library ieee; use ieee.std_logic_64.all; entity dekoder2linearni is -- 4 port -- 5 ( A : in std_logic_vector( downto ); -- 6 Q : out std_logic_vector(2 downto ) -- 7 ); -- 8 end; architecture dataflow of dekoder2linearni is -- begin -- 2 with A select -- 3 Q <= "" when "", -- 4 "" when "", -- 5 "" when "", -- 6 "" when others; -- 7 end; a) Příkaz with select Program 4 - Dekodér pro lineární ukazatel Vstup A i výstup Q jsou definované jako vektory, kterým v obvodech odpovídají sběrnice neboli skupiny číslovaných vodičů A má dva vodiče A() a A(); Q tři vodiče Q(2), Q() a Q(). Začátek příkazu with A select specifikuje adresní vstup multiplexoru. Do Q se přiřazují hodnoty vybrané A. Jejich mapování určí konstanta za klíčovým slovem when rovná hodnotě vstupu adresy. Musí se vždy vyčerpat všechny možnosti přepínač (multiplexor) pokaždé vrací nějakou hodnotu. Kvůli tomu poslední volba obsahuje klíčové slovo others, což znamená všechny dosud neuvedených možností. 6

17 -3.b) Datový typ std_logic versus std_logic_vector Proměnné typu std_logic představují výčtový typ, jehož hodnoty byly uvedené na straně 9. Budeme-li mít definici signal t, x, y, z :std_logic;, pak do těchto proměnných můžeme přiřadit logický výraz nebo konstanty jeho výčtového typu, např. t<= Z ; x<= ; y<= ; z <= x AND y; Konstanty a jsou v uvozovkách, nejde o čísla, ale o hodnoty z definice std_logic výčtového typu v knihovně ieee.std_logic_64 seznamem hodnot, tj. analogicky k typům enum v Java či C#: type std_logic is ( 'U', 'X', '', '', 'Z', 'W', 'L', 'H', '-'); Datový typ std_logic_vector představuje naproti tomu jednorozměrné polem složené z prvků datového typu std_logic a standardní knihovna ieee.std_logic_64 ho definuje jako type std_logic_vector is array (natural range<>) of s td_logic ; kde type je klíčové slovo definice typu a std_logic_vector název vytvořeného typu; natural znamená datový subtyp specifikující číslo typu integer omezené na rozsah až ma- ximální celé číslo definované v typu integer; (to můžeme zjistit atributem integer HIGH, viz dále na str. 8 ). Knihovna ieee definuje 32bitvové integer, tj. v rozsahu od -2-3 do 23-; range je klíčové slovo specifikující interval. Ve spojení s natural určuje interval popsaný celými čísly od do maximálního čísla integer. range < > znamená nespecifikovaný rozsah, jeho hodnota bude doplněna při použití typu. Budeme-li mít v architektuře například definice: pak jim odpovídá následující uspořádání: signal A, B, C: std_logic_vector (7 downto ); A, B a C: signal Z: std_logic_vector ( to 6) Z: preferované pořadí downto Interval (range) u A, B a C směřuje od 7 do, tj. odshora dolů, tedy shodně s číslováním bitů v binárních číslech, což se upřednostňuje. Směr "to" se používá zpravidla jen pro interní proměnné. Konstanty typu std_logic jsou v apostrofech, zatímco u typu std_logic_vector jsou v " " uvozovkách, a to i v případě, když vektor má délku jen jeden člen. Vektorům totiž odpovídají řetězce. Dlouhé řetězce, pokud mají počet členů rovný přesně mocnině 2, můžeme zkráceně zapsat hexadecimálním řetězcem, v němž je znak X před první uvozovkou. Vše nejlépe přiblíží příklad použití výše uvedených proměnných: A<=""; B<=X"5F"; C<=A AND B; Z(2 to 9)<=C; Z(4 to 5)<= C(4 downto 3); A B 7 7 C A<=""; B<=X"5F"; C<=A and B; Z(4 to 5)<=C(4 downto 3); Z(2 to 9)<=C; Z Obrázek 9 - Operace s std_logic_vector POZOR, proměnné polí (vektorů) se musí pořád používat se směrem číslování určeným v jejich definici, tj. s downto nebo s to. Směr se nesmí nikdy obrátit. Napíšeme-li Z(5 downto 4), překladač ohlásí chybu obsahující text: " range direction of object slice must be same as range direction of object ". 7

18 Z vektoru (pole) můžeme zvolit jeden člen nebo několik prvků, tedy podvektor. Napíšeme-li definice: signal A: std_logic_vector (7 downto ); signal xv, yv: std_logic_vector ( downto ); signal x, y: std_logic; pak můžeme použít následující příkazy: x <= A(); A() <= ''; yv <= ""; xv <= A(2 downto 2); A() vybere z pole prvek na indexu, ten bude datového typu std_logic. Inicializace prvku datového typu std_logic v poli A na indexu. Inicializace vektoru std_logic_vector, který má délku člen. Z vektoru A se vybere vektor datového typu std_logic_vector o délce člen; ten bude rovný prvku na indexu 2 vektoru A. Pozn. Editor schémat (*.bdf) v Quartus II používá pro rozsahy polí stručné zápisy stylu Pascal. Schématu s popisy signálů A[2..], Z[..7] a A[] odpovídají ve VHDL zápisy: A(2 downto ), Z( to 7) a A(). -3.c) Tvorba vlastních typů a atributy VHDL VHDL je typově velmi striktní. Definujeme-li si dva vlastní typy se shodnou strukturou, budou z hlediska překladače různé. Mějme například: type std_ l o g i c _ v e c t o r _ A i s a rra y ( 7 downto ) of std_ logic ; type std_ l o g i c _ v e c t o r _ B i s a rra y ( 7 downto ) of std_ logic; sign al s l v A, s l v A2 : s t d _ l o g i c _ v e c t o r _ A ; sign al s l vb, sl vb 2 : s t d _ l o g i c _ v e c t o r _ B ; Inicializace proběhne v pořádku; ta pracuje s členy vektorů a ty jsou shodného datového typu std_logic. slva <= X"2"; slvb <= X"34"; -- OK, lze Pokud se pokusíme vzájemně přiřadit proměnné obou skupin, nepůjde to: slvb2<=slva; slva2<=slvb; -- Chyba při překladu - typy nesouhlasi U silně typových jazyků, mezi které patří i VHDL, se shoda struktury datového typu netestuje, důležitá jsou výhradně jména typů, a ta se liší. Existuje však možnost definovat si subtyp zužující originální typ. Přepíšeme-li výše uvedené definice na subtypy: subtype std_logic_vector_a is std_logic_vector (7 downto ); subtype std_logic_vector_b is std_logic_vector (7 downto ); signal sl va, sl va2 : std_logic_vector_a ; signal sl vb, sl vb2 : std_logic_vector_b ; pak se příkazy předchozího programu přeloží bez chyby. Subtypy se pokládají za plně kompatibilní s výchozím datovým typem a všemi jeho subtypy: slva <= X"2"; slvb <= X"34"; slvb2<=slva; slva2<=slvb; U neznámých typů se lze dotazovat na parametry jejich definic pomocí vlastností nazývaných ve VHDL atributy, které mají stejné užití jako "property" známé z tříd v Java či v C#, jen se neoddělují tečkou, ale apostrofem. Pro typy odvozené od std_logic_vector se hodí následující atributy: Příklad použití slva left slva right slva low slva high slva length Integer hodnota výsledku Popis levá hodnota indexu rozsahu pravá hodnota indexu rozsahu nižní číselná hodnota indexu rozsahu vyšší číselná hodnota indexu rozsahu počet prvku Tabulka 4 - Vybrané atributy V definicích nových proměnných či v příkazech lze použít také atributy rozsahu: signal X : std_logic_vector(3 downto ); signal novy : std_logic_vector(x'range); signal novy2 : std_logic_vector(x'reverse_range); 8 -- (3 downto ) -- ( to 3)

19 -3.d) Dekodér pro lineární ukazatel s výstupy na jednotlivé vodiče Může se stát, že předchozí dekodér nevyhovuje a chceme jiný, kde vstupy a výstupy nejsou sběrnice, ale jednotlivé vodiče, jak ukazuje požadované schéma. Můžeme využít velkou část předchozího kódu, ve kterém provedeme drobné změny, v programu dole vyznačené zvýrazněním: --Dekoder pro linearni ukazatel s oddelenymi vystupy -- library ieee; use ieee.std_logic_64.all; entity dekoder2linearnib is -- 4 port -- 5 ( A, A : in std_logic; -- 6 Q2, Q, Q : out std_logic -- 7 ); -- 8 end; architecture dataflow of dekoder2linearnib is -- signal A : std_logic_vector( downto ); -- 2 signal Q : std_logic_vector(2 downto ); -- 3 begin -- 4 A <= A & A; -- 5 with A select -- 6 Q <= "" when "", -- 7 "" when "", -- 8 "" when "", -- 9 "" when others; -- 2 Q2<=Q(2); Q<=Q(); Q <= Q(); -- 2 end; Postup: Program 5 - Dekodér pro ukazatel s oddělenými výstupy dekoder2linearnib SW[] INPUT OUTPUT VCC A Q2 LEDR[2] SW[] INPUT OUTPUT VCC A Q LEDR[] OUTPUT Q LEDR[] a) Napřed jsme program uložili jako zcela nový soubor pod názvem dekoder2linearnib.vhd a blok entity přejmenovali na dekoder2linearnib, abychom mohli v projektu stále používat obě entity. b) Původní definice vstupů a výstupů v sekci port jsme přesunuli do architektury a udělali z nich signály, řádky 2 a 3, abychom mohli použít stávající kód, který se na ně odvolává. c) Do bloku port jsme vložili nové definice vstupů a výstupů jako jednotlivých signálů, řádky 6 a 7. d) Vektorový signál A jsme naplnili hodnotami vstupů A a A pomocí operátoru & jejich spojení do vektorové proměnné typu std_logic_vector, řádka 5. Lze samozřejmě použít i příkazy A()<=A; A()<=A;, ale operátor & je stručnějším zápisem. e) Výstupy žel musíme rozdělit po jednotlivých prvcích vektoru na řádce 2. Zde neexistuje žádná zkratka operátor & nemůže stát jen na levé straně <= přiřazení. Pozn. V obvodech se spíše snažíme vodiče sjednocovat do vektorů (sběrnic), aby se s nimi lépe a rychleji pracovalo než z nich udělat mnoho samostatných drátků. f) Vygenerujeme-li symbolu dekoder2linearnib a vložíme-li ho do schématu, můžeme obvod vyzkoušet. Nevýhoda naší úpravy spočívá v duplicitě kód pro lineární ukazatel máme nyní nakopírovaný do dvou entit. Bude-li potřeba opravit jednu kopii, nesmíme zapomenout provést změnu i ve druhé. V části o strukturálním popisu si ukážeme jinou metodu, a to jednodušší a mnohem bezpečnější. inst Obrázek - Dekodér pro lineární ukazatel s bitovými I/O 9

20 -4 Prioritní dekodér VHDL příkaz when else Zadání: Pro tři vstupy žádostí o přerušení procesoru Int3 až Int navrhněte prioritní dekodér, který posílá na sběrnici číslo periférie žádající o přerušení. Při aktivním vstupu Int3 s nejvyšší prioritou bude na výstupu číslo 3, ostatní vstupy se ignorují. Int má nejnižší prioritu a posílá číslo, jsou-li zbývající vstupy v. Nežádá-li nikdo se o přerušení, výstup bude číslo, viz zkrácená pravdivostní tabulka. Prioritní dekodér Vstupy Výstupy Int 3 Int 2 Int Q Q Číslo Řešení: Mohli bychom samozřejmě sestavit logické rovnice, což by lehce šlo u takhle malého obvodu, ale takový postup se nedá snadno rozšířit například na případ pro 5 vstupů se čtyřbitovým výstupem. Opět budeme hledat univerzálnější řešení. "" Int = Minule jsme si pomohli přepínačem, zde se ho uplatníme také, ale nikoliv jako jeden přepínač s mnoha pozicemi. Použijeme několik dvoupólových přepínačů řazených do kaskády, čím přirozeně vytvoříme prioritu. Bude-li sepnutý první přepínač Int3, pak na výstup Q Q bude přivedena kombinace "", tj. číslo 3, bez ohledu na pozice ostatních přepínačů. Nebude-li sepnutý Int3, teprve pak se uplatní další přepínače dle pořadí (priority). Ve schématu přepínače nahradíme multiplexory dvou sběrnic o šířce dva bity; ty označují dvojité čáry. Multiplexory budou řazené za sebou stejně jako přepínače a jejich jednobitové adresní vstupy budou vstupy přerušení INT[x], a to v pořadí jejich požadované priority. "" "" "" "" "" Podobné konstrukci odpovídá ve VHDL podmíněné přiřazeni when else. Po jeho vložení dostaneme kód: --Prioritni dekoder -- library ieee; use ieee.std_logic_64.all; entity prioritni_dekoder is -- 4 port ( INT : in std_logic_vector(3 downto ); -- 5 Q : out std_logic_vector( downto ) ); -- 6 end; -- 7 architecture dataflow of prioritni_dekoder is -- 8 begin -- 9 Q<= "" when INT(3)='' else -- "" when INT(2)='' else -- "" when INT()='' else -- 2 ""; -- 3 end; -- 4 Program 6 - Prioritní dekodér Int 2 = Int 3 = "" Q Q "" "" Chování příkazu when.. else, řádky až 3, vyplývá z jeho implementace pomocí kaskády dvouvstupových multiplexorů dvoubitových sběrnic. Pokud bude nějaká podmínka splněna, její multiplexor se přepne a stav všech dalších multiplexorů ležící za ním, nemá již vliv na výsledek. Kvůli tomu Int = Int 2 = "" Q Q "" "" INT[] "" INT[2] "" Int 3 = INT[3] Q[..] Obrázek - Prioritní dekodér z multiplexorů 2

21 v dalších podmínkách ležících níže již nemusíme opakovat případné nesplnění předchozích podmínek. Bylo by zbytečné a matoucí mít na řádcích až 3 v Program 6 něco takového jako: Q<= "" when INT(3)='' else -- "" when INT(3)='' and INT(2)='' else -- "" when INT(3)='' and INT(2)='' and INT()='' else -- 2 ""; -- 3 Program 7 - Zbytečné podmínky v příkazu when...else Pokud by někdo napsal příkaz takhle, nedopustil by se chyby, ale jen by zbytečnými testy opomíjel prioritní strukturu příkazu when else, viz podtržené části. Např. hodnota na řádku se použije jen při nesplnění podmínky na řádku ; tak proč zde testovat INT(3)=''? Kód ztrácí na přehlednosti vnucováním zbytečné otázky: "Kvůli čemu je tam tohle? Aha, už vím; jen mňamka pro klávesu delete!" -4.a) Operátory porovnání a logické operátory ve VHDL Priorita Datový typ výsledku Operátory Nejvyšší stejný jako operandy*) not Boolean (true, false) = /= < <= > >= Nejnižší stejný jako operandy*) and or nand nor xor xnor *) Logické operátory jsou v ieee.std_logic_64 definované jak pro typ std_logic, kdy vracejí výsledek typu std_logic, tak pro std_logic_vector kde dávají výsledek typu std_logic_vector, a také pro typ Boolean; zde je jejich výsledkem opět Boolean. Tabulka 5 - Porovnávací operátory a logické operátory Porovnávací operátory mají obvyklou syntaxi, až méně běžný zápis /= pro nerovnost, a prioritně leží mezi operátorem not a ostatními logickými operátory. U složitějších výrazů se proto vyplatí používat závorky, aby se not aplikovalo správně. Datový typ Boolean, který vracejí porovnávací operátory, se dá použít jedině jako parametr podmínky; z příkazů s podmínkami zatím známe jen when..else. Opakované podmínky lze případně uložit do proměnné typu Boolean ta nebude ale přiřaditelná do typů std_logic; zde nutno použít konstrukci when..else, viz řádky a 7 dole. --Prioritni dekoder -- library ieee; use ieee.std_logic_64.all; -- 2 entity prioritni_dekoder is -- 3 port ( INT : in std_logic_vector(3 downto ); -- 4 Q : out std_logic_vector( downto ); -- 5 NoInt : out std_logic ); -- 6 end; -- 7 architecture dataflow of prioritni_dekoder is -- 8 signal jeint3, zadnyint :Boolean; -- 9 begin -- jeint3 <= INT(3)=''; -- Q<= "" when jeint3 else -- 2 "" when INT(2)='' else -- 3 "" when INT()='' else -- 4 ""; -- 5 zadnyint <= not jeint3 and INT(2)='' and INT()=''; -- 6 NoInt <= '' when zadnyint else ''; -- 7 end; -- 8 Program 8 - Program pro demonstraci práce s proměnnými datového typu Boolean Konstrukce na řádcích 6 a 7 je samozřejmě krajně krkolomná a slouží pouze jako demonstrativní ukázka práce s podmínkami. Dala by se samozřejmě nahradit: NoInt <= not INT(3) and not INT(2) and not INT(); Pozn. Jako podmínku nelze použít samotný logický výraz proměnných typu std_logic, např. napsat v programu nahoře na řádku 3 when INT(2) else ; protože INT(2) není datového typu Boolean; ten nám vrátí až operátor porovnání. Musíme psát when INT(2)='' else. 2

22 -4.b) Pohled do nitra překladače přes RTL Viewer Tato podkapitola probírá mírně pokročilejší témata. Začátečníkům ji doporučuji přeskočit a vrátit se k ní později. Není zde uvedeno cokoliv, na co by se navazovalo v dalším textu. Prioritní dekodér jsme si začali tvořit jako schéma z multiplexorů, viz Obrázek na straně 2. Bude ho překladač skutečně tak i implementovat? Poví nám to meziprodukty překladu; ty uvidíme až po přeložení top-level entity programu. Za tu vybereme buď / soubor prioritni_dekoder.vhd, nebo 2/ schéma, do kterého jsme vložili prioritni_dekoder. Při způsobu / najedeme myší na priority_dekoder v bloku entity, pravou myší vyvoláme kontextové menu, z něhož zvolíme Locate->Locate in RTL Viewer. Zvolili-li jsme cestu 2, vybereme ve schématu vloženou instanci a pravou myší vyvoláme její kontextové menu, kde provedeme stejnou volbu a poté ješte levou myší otevřeme zobrazený blok instance prioritni_dekoder. Obrázek 2 - Vyvolání RTL Viewer z top-level entity Ukáže se "RTL Viewer" (Register Transfer Logic Viewer) schéma ukazující, jak překladač pochopil náš program a jaký jeho model si sestavil po minimalizaci opravdu použil kaskádu, ale jen ze dvou multiplexorů, ne tří jako na schématu Vytvořeno v Quartus II verze 3.sp "Obrázek " na straně 2. Vyvoláváním nápověd u vodičů (najetím na ně myší), zjistíme, že schéma je zapojeno zjednodušeně. Na obrázku dole vlevo je překreslené RTL vnitřní schéma překladače a vpravo část hypotetického VHDL programu, který by mu logicky odpovídal. INT[2] INT[3] Q[] INT[] Q[] bitový 2bitový architecture dataflow_rtl_viewer of prioritni_dekoder is begin Q()<= '' when INT(3)='' else INT(2); Q()<= '' when INT(3)='' else '' when INT(2)='' else INT(); end; Program 9 - Minimalizovaná kaskáda multiplexorů Pokud se dobře podíváme na Obrázek na straně 2, uvidíme, že překladač má pravdu. Levý multiplexor lze nahradit & INT() posílá "" při INT(), jinak "". Postřední multiplexor se zase dá zmenšit na jednobitový. Nicméně určitě můžeme označit za přehlednější úplný příkaz when else v "Program 6 - Prioritní dekodér" na straně 2 než jeho super-minimalizovanou verzi v Program 9. I ve VHDL platí zásada, že programy píšeme především přehledně a srozumitelně. V drtivé většině případů můžeme dokonalé minimalizace nechat překladači umí je lépe a taky rychleji než my. 22

23 -5 Tříbitový prioritní inhibitor cyklus for-generate Zadání: Navrhněte obvod s osmnácti vstupy A[7..] a výstupy Q[7..] propouštějící pouze nejvyšší vstup ve stavu na jemu číselně odpovídající výstup, takže nejvýše jen jeden výstup je v kvůli tomu jsme obvod nazvali prioritní inhibitor. Pozn. Osmnáct vstupů a výstupů volíme kvůli desce DE2, která obsahuje osmnáct přepínačů SW a červených led diod LEDR. Kde bychom takový obvod použili? Představte si, že máte 8 přepínačů ovládajících nějaké funkce, přičemž se žádá, aby se najednou zapnul jen jeden přepínač. Uživatel může nechtěně, či úmyslně ("pokušitel jeden"), provést i několik voleb najednou. Pokud se za přepínače zapojí náš prioritní inhibitor, duplicitní zapnutí se potlačí podle priorit přepínačů a máme jistotu volby jen jedné funkce. Řešení: Příklad představuje prioritní úlohu a šel by řešit pomocí kaskády multiplexorů, stejně jako předchozí prioritní dekodér, tedy pomocí konstrukce when else. Nedal by se ale lehce modifikovat pro jinou délku vektorů bez dlouhavého přepisování. Zkusíme najít elegantnější řešení. Napřed si napíšeme logickou tabulku pro dekodér se třemi vstupy a třemi výstupy, abychom zjistili, zda v ní najdeme možné zákonitosti: Úplná pravdivostní tabulka Vstupy Výstupy A2 A A Q2 Q Q Zkrácená pravdivostní tabulka Vstupy Výstupy A2 A A Q2 Q Q Z pravdivostní tabulky, a to především z její zkrácené verze, vidíme, že Výstup Q2 je evidentně kopií A2, čili Q2 = A2. Q bude v jedině tehdy, pokud A2= a A=, což lze napsat rovnicí: Q = not A2 and A. Výstup Q bude v pouze při vstupech A2=, A= a A=, což zapíšeme logickou rovnicí Q = not A2 and not A and A. Vidíme, že výstup Qi bude v jedině tehdy, když všechny odpovídající vyšší bity A (tj. Aj pro j>i) jsou v. Označíme-li N počet bitů a názvem enable pole N proměnných, můžeme napsat rekurzivní vztah: QN- := AN-; enablen- := not AN-; Qi := enable i+ and Ai; enablei := enable i+ and not Ai; pro i = N-2 až Proč jsme místo jedné proměnné enable použili pole? Program budeme přepisovat do VHDL, kde signálům můžeme hodnotu přiřadit maximálně jen jednou, a tak jsme rekurzivní vztah záměrně vytvořili tak, aby respektoval podmínku jednoho zápisu do proměnné. Správnost našeho rekurzivního vztahu si můžete vyzkoušet třeba v Java metodě třídy: public void PriotritniInhibitor(boolean A[], boolean Q[]) { boolean[] enable = new boolean[q.length]; if (A.length!= Q.length A.length < 2) throw new IllegalArgumentException("Obe pole musi mit stejnou delku>"); Q[Q.length - ] = A[Q.length - ]; enable[q.length-] =! (A[Q.length - ]); for (int i = Q.length - 2; i >= ; i--) { Q[i] = enable[i+] && A[i]; enable[i] = enable[i+] &&!A[i]; } } } Program - Java metoda pro vyzkoušení prioritního inhibitoru 23 // //2 //3 //4 //5 //6 //7 //8 //9 //

24 Pole proměnných Java typu boolean nahradíme doporučeným typem std_logic_vector s číslování odshora dolů (downto). Cyklům for bude v hardwaru odpovídat opakování příkazů. Podobným způsobem se někdy i optimalizuje kód na rychlost; kratší cykly se nahradí rozbalením jejich příkazů. Například, mělo-li by pole Q z Java kódu Program délku 3 prvky, tj. Q.length = 3, pak cyklus bude: for (int i = 2; i >= ; i--) //6 { Q[i] = enable[i+] && A[i]; enable[i] = enable[i+] &&!A[i]; } //7 a při jeho optimalizaci na rychlost by se nahradil sérií příkazů: Q[2] = enable[3] && A[2]; enable[2] = enable[3] &&!A[2]; //7-i=2 Q[] = enable[2] && A[]; enable[] = enable[2] &&!A[]; //7-i= Q[] = enable[] && A[]; enable[] = enable[] &&!A[]; //7-i= Výsledek má sice větší délku, ale ušetřilo se načítání a testování parametru cyklu a výpočty adres polí; jejich indexy jsou teď konstanty. Podobnou expanzi provede i VHDL pomocí generace. Výsledkem bude VHDL kód: -Prioritni inhinitor -- library ieee; use ieee.std_logic_64.all; -- 2 entity prioritni_inhibitor is -- 3 port ( A : in std_logic_vector(7 downto ); -- 4 Q : out std_logic_vector(7 downto ) ); -- 5 end; -- 6 architecture dataflow of prioritni_inhibitor is -- 7 signal enable: std_logic_vector(q'range); -- 8 begin -- 9 Q(Q'LENGTH-)<=A(Q'LENGTH-); -- enable(q'length-)<= not A(Q'LENGTH-); -- cyklus : for i in Q'LENGTH-2 downto generate -- 2 Q(i)<=enable(i+) and A(i); -- 3 enable(i)<= enable(i+) and not A(i); -- 4 end generate; -- 5 end; -- 6 Program - Prioritní inhibitor pro 8 vstupů a výstupů Generační cyklus začíná na řádku 2. Jeho obecná syntaxe je label : for <parameter> in <range> generate <concurrent-statements> end generate [label] ; kde label je povinné návěští oddělené dvojtečkou. Musíme ho zadat, i když ho nikde dál již nepoužijeme. Zvolili jsme název "cyklus", ale mohli i jiný, třeba "opakuj" apod. <parameter> představuje parametr cyklu, který bude nabývat hodnot v rozsahu <range>; <range> udává rozsah hodnot; ten má stejný tvar jako rozsahy polí, je buď downto nebo to ; end generate [label] ; cyklus se musí zakončit buď end generate nebo end generate label; Klíčové slovo generate je povinné, zde ho nelze vynechat; <concurrent-statements> označuje blok příkazů řazených mezi "concurrent", tj. probíhajících paralelně. Sem patří přiřazení <= a konstrukce with..select, when..else, dále také for-generate (cykly lze vnořit) a lze použít i podmíněnou generaci if-generate a příkaz port map; ten probereme ve strukturálním stylu VHDL. Příkazy musí být vždy úplné; nelze tedy vkládat jen jejich dílčí části, jako třeba jednotlivé řádky podmínek ve "when..else" či přidávat členy do výrazů. Pozn. Příkaz for-generate lze použít jedině v architektuře, v entitě ne. Dále může i své mít lokální proměnné. Zájemci najdou podrobnější informace na webu ve VHDL referenčních příručkách. 24

25 prioritni_inhibitor SW[7..] INPUT VCC A[7..] Q[7..] OUTPUT LEDR[7..] -5.a) Jak vložit do výjimky do VHDL příkazy generic a assert Java metoda Program na str. 23, ve které jsme testovali rekurzivní vztah pro prioritní inhibitor, obsahovala příkaz "throw" pro metání výjimky v kódu. Ve VHDL programu jsme nic takového nepoužili; nemuseli jsme, vektory měly zatím pevné délky. Lze však mít i pole variabilní délky určené externím generic parametrem, který se zadává zvnějšku, a tak každá instance obvodu může jeho hodnotu mít odlišnou. Parametr definujeme v bloku entity, viz řádek 4 dole: --Prioritni inhin itor -- library ieee; use ieee.std_logic_64. all; -- 2 entity prioritni_inhibitor is -- 3 generic( N: natural := 8); -- delka vektoru > -- 4 port ( A : in std_logic_vector(n- downto ); -- 5 Q : out std_logic_vector(n- downto )); -- 6 end; -- 7 architecture dataflow of prioritni_inhibitor is -- 8 signal enable: std_logic_vector(q'range); -- 9 begin -- assert N> report "Chybny parametr N. Pozadovano N>" -- severity failure; -- 2 Q(Q'LENGTH-)<=A(Q'LENGTH-); -- 3 enable(q'length-)<= not A(Q'LENGTH-); -- 4 cyklus : for i in Q'LENGTH-2 downto generate -- 5 Q(i)<=enable(i+) and A(i); -- 6 enable(i)<= enable(i+) and not A(i); -- 7 end generate; -- 8 end; -- 9 Program 2 - Prioritní inhibitor s generic Definice generic může obsahovat i několik různých parametrů: generic( name: type := default_value; name2: type2 := default_value2; inst Obrázek 3 - Příklad použití prioritního inhibitoru... namen: typen := default_valuen ); Zadané parametry se v programu vždy chovají jako konstanty. Quartus II u nich požaduje výchozí hodnotu, která se přiřazuje pomocí :=, nikoliv <= "concurrent assignment", protože nejde o propojení; všechny parametry se v době překladu nahradí hodnotami uvedenými v jejich instancích entity. Konstantu N jsme v našem programu použili u definic rozsahu vstupů a výstupů. Zbytek kódu jsme nemuseli přepisovat, jelikož jsme "prozíravě" použili atributy, což je obecně doporučovaný postup. Parameter Value Type N 8 Signed Integer prioritni_inhibitor SW[7..] INPUT OUTPUT VCC A[n-..] Q[n-..] LEDR[7..] inst Obrázek 4 - Ukázka použití prioritního inhibitoru ve schématu Pozn. / Všimněte si, že stejně jako u bloku port se ani v generic nepíše ; za poslední prvkem seznamu. 2/ V editoru schémat lze zapnout/vypnout zobrazování hodnot parametrů u instancí v kontextovém menu editoru (pravou myší kamkoliv na volnou plochu a "Show->Show Parameter Assignments"). 25

26 Příkaz assert použitý v programu na řádcích a 2 není přesnou analogií výjimky throw v Java, protože se nevyvolává při činnosti obvodu; to by ani nešlo. Při syntéze obvodu se vyhodnocuje už v době překladu a odpovídá stejnojmenným příkazům či metodám realizovaným různými formami i v Java, C# a C++. Ve VHDL má příkaz assert syntaxi: assert <condition> report <string> severity <severity_level>; kde <condition> je jakýkoliv výraz vracející datový typ Boolean; <string> označuje řetězec, který překladač vypíše uživateli, pokud nebude podmínka splněná, tj. při podmínce s hodnotou false; <severity_level> specifikuje požadovanou reakci překladače, ta je buď note, warning, error, failure, note text se vypíše mezi informacemi; warning vypíše se varováními a bude se pokračovat v sestavování obvodu; error udává chybu zcela bránící v sestavení obvodu; failure znamená inkonsistenci, nesmyslné zadání, které by nikdy nemělo nastat. Pozn. V příkazu assert lze vynechat část "severity <severity_level>", poté se pro <severity_level> automaticky zvolí výchozí hodnota error. Příklad vypsaných chyb při nedovolené hodnotě parametru ve schématu dole [Quartus II 3.sp]: Parameter Value Type N Signed Integer prioritni_inhibitor SW[] INPUT OUTPUT VCC A[n-..] Q[n-..] LEDR[] Error (652): VHDL Assertion Statement at prioritni_inhibitor.vhd(): assertion is false - report "Parametr N musi byt vetsi jak " (FAILURE or ERROR) Error (252): Can't elaborate user hierarchy "prioritni_inhibitor:inst" V hlášení se uvádí odkaz "prioritni_inhibitor.vhd()" na soubor prioritni_inhibitor.vhd řádek, kde se nachází příkaz assert, u něhož se nesplnila požadovaná podmínka. -5.b) Co programu ještě chybí? inst Poslední program se již blíží skutečným VHDL programům pro svou vysokou univerzalitu. Můžeme ho beze změny aplikovat na různé šířky sběrnic, ale přesto není příliš dobrý. Chybí zde především komentáře, jak jsme již uvedli zde úmyslně vynechané pro zkrácení řádek. Při nejmenším by se v dobrém programu měly pečlivě komentovat definice v bloku entity a hlavních proměnných, aby se nemusel luštit jejich význam. Hodí se i vkládat komentářové řádky před celky kódu specifikující, co se v nich vlastně provádí. Pozn. Hodně programátorů časem zjistí, že komentáře psali hlavně kvůli sobě, aby i dnes pořád věděli, co tehdy dávno napsali a proč právě takhle. První řádky programu by měly obsahovat více informací než název --Prioritni inhibitor; tohle víme už ze jména souboru! Hodilo by se přidat hlavně stručný popis, k čemu program vlastně slouží a případně i jméno jeho autora. Vhodná bývá i specifikace licence, pod níž je kód distribuován, aby ostatní věděli, jak ho mohou bez obav používat. U akademických programů se často volí "GNU General Public License". Jazyk čeština může zůstat základem pro naše lokální programy v kurzu SPS. Chceme-li ale VHDL kód zpřístupnit více lidem, pak bývá lepší zvolit si angličtinu, a to nejen pro komentáře, ale také od ní odvozovat všechna jména proměnných. 26

27 2. VHDL stylem "Structural" VHDL umožňuje popsat návrhy i hierarchickou strukturou můžeme obvod rozdělit na dílčí jednodušší entity, které samostatně odladíme, a poté popíšeme jejich propojení, podobně jako v editoru schémat. Musíme zde poznamenat, že pro menší celky nenabízí VHDL vždy takovou přehlednost jako grafická schéma. Jelikož opět použijeme jednoduché příklady, a tak výhody strukturálního popisu zde příliš nevyniknou. Nicméně hodí se ho znát; často ušetří hodně práce. Textový program přece jen: dovoluje lehčí porovnávání jednotlivých verzí než grafická schémata; s počtem prvků (entit) roste i množství potřebných propojek. Od určité složitosti se grafická schémata stávají nepřehledná a nepřinášejí už výhody, spíš naopak; VHDL program lze lépe procházet ladicími nástroji, jak ukazuje příloha o simulacích. 2- Použití prioritního inhibitoru ve VHDL V předchozí kapitole "-5 Tříbitový prioritní inhibitor cyklus for-generate" jsme si vytvořili program prioritní inhibitor. Umíme ho vložit do schématu a otestovat s deskou DE2. Lze ho však použít i samostatně, přímo z VHDL, což demonstrujeme na jednoduchém programu, který plně nahrazuje schéma "Obrázek 4" na straně 25: --Test prioritniho inhibitoru -- library ieee; use ieee.std_logic_64.all; -- 2 entity test_inhibitoru is -- 3 port ( SW : in std_logic_vector(7 downto ); -- 4 LEDR : out std_logic_vector(7 downto ) ); -- 5 end; -- 6 architecture structural of test_inhibitoru is -- 7 component prioritni_inhibitor is -- 8 generic( N: natural := 8); -- 9 port ( A : in std_logic_vector(n- downto ); -- Q : out std_logic_vector(n- downto ) ); -- end component; -- 2 begin -- 3 inst_prioinhib : prioritni_inhibitor -- 4 generic map (N => 8) -- 5 port map ( A => SW, -- 6 Q => LEDR ); -- 7 end; Program 3 - Prioritní inhibitor ve strukturálním popisu Řádky až 7 obsahují běžný začátek VHDL programu odkazují na knihovny (na řádku 2) a poté deklarují entitu nazvanou test_inhibitoru, a proto soubor uložíme pod názvem test_inhibitoru.vhd. V entitě definujeme v bloku port vstupy a výstupy, použijeme odkazy na desku DE2 coby přímé analogie vstupů a výstupů ze schématu "Obrázek 3" na straně 22. Na řádce 7 je pak začátek architektury, opět pojmenované dataflow. Řádky 8 až 2 se vyskytují na místě definic lokálních proměnných sekce architektury, kam jsme dříve vkládali i definice signálů. Nyní jsme tam uvedli blok entity přesně okopírovaný z řádek 3 až 7 "Program 2 - Prioritní inhibitor s generic" na straně 25. U okopírovaného bloku entity jsme jedině hradili původní entity klíčovým slovem component, které jsme vložili i za end ukončující bloku, zde ho nelze vynechat. Alternativně jsme mohli i uvést delší určení "end component prioritni_inhibitor". Vložení deklarace bloku component lze považovat za něco podobného vkládání prototypů známé funkcí z jazyka C nebo deklarací bloku interface PASCALu

28 Pozn. Kód se nám přeloží, i kdybychom v bloku component uvedli neúplné deklarace ("incomplete type declarations") zavedené ve VHDL-93 pro složitější konstrukce, tedy vynechali default hodnotu u N v generic nebo opominuli rozsahy vektorů v port. Zmiňujeme se o tom, protože VHDL kódy nalezené na webu to občas používají, ale doporučuje se používat úplné deklarace ty mají menší problémy s kompatibilitou. component prioritni_inhibitor is -- 8 generic( N: natural); -- 9 port ( A : in std_logic_vector; -- Q : out std_logic_vector ); -- end component; -- 2 Program 4 - Nedoporučené použití neúplných definic v bloku "component"! Elegantnější i pohodlnější možnost pro zkrácení kódu si ukážeme později na straně 3 v kapitole věnované tvorbě knihoven pomocí deklarace knihovních balíčků ("packages"). 2-.a) Sekce port map a generic map Řádky 4 až 7 vytvoří instanci inhibitoru, tu pojmenujeme inst_prioinhib, dlouhý název se zde sice nepoužije, ale hodí se později v simulaci pomocí ModelSim. Mapování generic parametru N, které mu přiřadí hodnotu, a dále zapojení vstupů A a výstupů Q z define port lze provést dvěma způsoby: a) Jmenné asociace ("keyword notation") mají syntaxi: POZOR - všimněte si, že generic map( generic_name => value, generic_name2 => value2, Členy jsou od sebe oddělené čárkami, nikoliv středníky jde o seznam asociací.... generic_namen => valuen ) Za závorkou není ; mapa pokračuje. port map ( port_name => signal_name, port_name2 => signal_name2, Zde jde opět o seznam s členy oddělenými od sebe čárkami.... port_namen => signal_namen ); Až zde se za ) vyskytuje středník konec mapy. Jelikož jde o asociativní seznamy, můžeme jejich členy uvést v libovolném pořadí, ale pro přehlednost se doporučuje zachovávat ho. Označení generic_namex udává jméno parametru zcela shodné s jeho deklarací v sekci component generic a hodnota valuex specifikuje jemu přiřazenou hodnotu ve vytvářené instanci. Použijeme-li místo hodnoty výraz, pak jeho výsledek musí být známý v době překladu jde o konstantu. Stejně tak port_namex udává název vstupu nebo výstupu, a to opět, shodný s deklarací v component port a signal_name určuje, k jakému signálu bude připojen. Pokud se jedná o vstup, lze jeho hodnotu specifikovat výrazem, který nemusí mít konstantní hodnotu v době překladu, na rozdíl od generických parametrů. Výstup musí být samozřejmě vždy mapován na signál. Pozn. Použití výrazů v mapování port map dovolí Quartus, žel překladač v ModelSimu je zpravidla odmítne z implementačních důvodů, kvůli tomu bývá lepší výrazy napřed přiřadit do signálů a teprve ty mapovat na vstupy. b) Poziční asociace ("positional notation") mají syntax: generic map( value, value2, port map (... valuen ) signal_name, signal_name2,... signal_namen ); Hodnoty se v pozičních asociacích musí pochopitelně objevit přesně v pořadí deklarací jednotlivých parametrů, vstupů a výstupům v bloku component. Pro případné použití výrazů zde platí pravidla uvedená v odrážce "a) Jmenné asociace". Rozhodnutí zda použit jmenných či poziční asociace závisí plně na programátorovi. Pro jednodušší komponenty lze volit méně upovídané poziční asociace, zejména v případech, kdy deklarace použitých 28

29 component jsou vložené do entity, a tak si z nich lze snadno přečíst, čemu hodnoty vlastně přiřazujeme. U složitějších komponent a u komponent definovaných v externích knihovnách se vyplatí napsat mnohem přehlednější jmenné asociace, které navíc nabízejí vyšší imunitu vůči změnám v originálních entitách. 2-.c) Sekce map a schéma Program 3 na str. 27 odpovídá schématu "Obrázek 3" na straně 22. Můžeme ho přeložit jako "top-level entity" a nahrát do desky DE2. Opačně lze i ze schématu vygenerovat VHDL soubor. Uložíme schéma "Obrázek 3" jako "test_inhibitoru2.bdf", otevřeme ho a z hlavního menu Quartusu volíme "File-> Create/Update -> Create HDL Design File from Current File" a poté v dialogu zadáme VHDL. Obrázek 5 - Příkaz "Create HDL Design File" Ve složce projektu se nám vygeneroval soubor "test_inhibitoru2.vhd", který se však automaticky nepřidal do projektu. Jeho entita má název test_inhibitoru2, tedy stejný jako entita vytvořená ze schématu "test_inhibitoru2.bdf". V projektu lze mít buď "test_inhibitoru2.vhd" nebo "test_inhibitoru2.bdf", nikoliv oba soubory, aby nám překladač nehlásil chybu duplicity. Odstraníme tedy "test_inhibitoru2.bdf" (okno Project Navigator záložka Files -> Remove File from Project") a můžeme vložit "test_inhibitoru2.vhd" (např. hlavní menu Quartus:Project->Add Remove Files in Project, najdeme soubor [ ], dáme [Add] a [OK]): -- Copyright (C) Altera Corporation -- LIBRARY ieee; USE ieee.std_logic_64.all; LIBRARY work; -- 2 ENTITY test_inhibitoru2 IS -- 3 PORT( SW : IN STD_LOGIC_VECTOR(7 DOWNTO ); -- 4 LEDR : OUT STD_LOGIC_VECTOR(7 DOWNTO ) ); -- 5 END test_inhibitoru2; -- 6 ARCHITECTURE bdf_type OF test_inhibitoru2 IS -- 7 COMPONENT prioritni_inhibitor -- 8 GENERIC (N : INTEGER); -- 9 PORT( A : IN STD_LOGIC_VECTOR(7 DOWNTO ); -- Q : OUT STD_LOGIC_VECTOR(7 DOWNTO ) ); -- END COMPONENT; -- 2 BEGIN -- 3 b2v_inst : prioritni_inhibitor -- 4 GENERIC MAP(N => 8) -- 5 PORT MAP( A => SW, -- 6 Q => LEDR); -- 7 END bdf_type; -- 8 Program 5 - Automaticky generovaný VHDL kód Vygeneroval se nám stejný kód; zde ho jen uvádíme zhuštěněji formátovaný a se zkrácenými úvodními komentáři. Na řádce 2 má jen jeden nový prvek oproti našemu ručně udělanému programu odkaz na "LIBRARY work;", tj. případné knihovny v balíčcích ("packages") definované ve složce projektu; ty zatím nemáme; povíme si o nich dále. Tvorba strukturálního VHDL popisu ze schémat může u složitějších obvodů ztrácet přehlednost díky pomocným proměnných, které si překladač někdy vytváří. Hodí se však pro začátky pomůže nám pro začátek jako šablona pro názornější manuální sestavení. 29

30 2-.c) Mapování vstupů a výstupů pro desku DE2 Pro Program 3 na straně 27 můžeme vygenerovat symbol, stejně jako pro každou jinou entitu, a vložit ho do schématu, tedy mít další vrstvu. Vůbec nevadí skutečnost, že jsme vstupy a výstupy u entity "test_inhibitoru" pojmenovali shodně s přiřazením na vývojové desce DE2 ("Assignments"). Naopak, volbou "Generate Pins for Symbol Ports", již dříve popsanou, rychle přiřadíme správně popsané vstupy a výstupy, a to prakticky bez práce. test_inhibitoru SW[7..] INPUT VCC SW[7..] LEDR[7..] OUTPUT LEDR[7..] inst2 Obrázek 6 - Test inhibitoru 2 vložený do schématu Pozn. Zde raději připomeneme, že mapování vstupů a výstupů na FPGA "assignments" (desky DE2) se provádí jedině pro vstupy a výstupy uvedené na úrovni "top-level entity", tedy jen pro zvýrazněné prvky v obr. nahoře. U všech vložených entit se názvy berou jen jako jejich lokální proměnné. 2-2 Rozšíření prioritního inhibitoru o enable Zadání: Přidejte k prioritnímu inhibitoru vstup en (enable), který se při en= uvede maximálně rychle do na všechny výstupy, zatímco při stavu en=, bude inhibitor normálně pracovat. Řešení: Úloha by šla vyřešit použitím inhibitoru s N+ vstupy a na jeho nejvyšší vstup s indexem A[N] připojit negovaný en, takže při en= by A[N]= a výstupy Q[N-] až Q[] by přešly do. Nicméně náš programátorský úmysl bude jasnější, pokud použijeme prioritní inhibitor s N vstupy a za něj připojíme multiplexor. Jako předlohu ("template") použijeme "Program 3 - Prioritní inhibitor ve strukturálním popisu", který upravíme přejmenováním a doplněním deklarace en. --Prioritni inhibitor s enable vstupem -- library ieee; use ieee.std_logic_64.all; -- 2 entity priroritni_inhibitor_enable is -- 3 generic( N: natural := 8); -- 4 port ( A : in std_logic_vector(n- downto ); -- 5 en : in std_logic; -- 6 Q : out std_logic_vector(n- downto ) ); -- 7 end; -- 8 architecture structural of priroritni_inhibitor_enable is -- 9 component prioritni_inhibitor is -- generic( N: natural := 8); -- port ( A : in std_logic_vector(n- downto ); -- 2 Q : out std_logic_vector(n- downto ) ); -- 3 end component; -- 4 signal Qtmp : std_logic_vector(q range); -- 5 begin -- 6 inst_prioinhib : prioritni_inhibitor -- 7 generic map (N => N) -- 8 port map ( A => A, Q => Qtmp ); -- 9 Q <= Qtmp when en='' else (others=>''); -- 2 end; -- 2 Program 6 - Prioritní inhibitor s enable vstupem Novou entitu jsme pojmenovali "priroritni_inhibitor_enable " a uložili do "priroritni_inhibitor_enable.vhd". Na řádku 6 jsme přidali definici nového vstupu en. Pro vstup zvnějšku jsme použili A (řádek 5), pro výstupy opět Q (řádek 7) a pro generický parametr N (řádek 4). Záměrně jsme napsali názvy shodné s komponentou prioritni_inhibitor, abychom mohli demonstrovat skutečnost, zvýrazněnou i barvami pozadí, že 3

31 proměnné z hlavičky vložené komponenty (řádek až 4) jsou dostupné jedině u mapování její instance (řádek 7 až 9), a to na levé straně členů => asociativního listu, jinde se na ně nedá odkázat. Pokud uvedeme v generic map nebo port map asociaci XX=>YY, pak její levý člen XX se automaticky hledá mezi jmény komponenty, kterou právě mapujeme, tj. mezi jejími generickými parametry, či mezi vstupy a výstupy. Pravý člen asociace YY se bude hledat mezi proměnnými definovanými v našem obvodu v entitě a v architektuře. Napíšeme-li asociaci N=>N, pak levé N bude vztaženo k N v sekci generic map na řádku 8 a pravé N se vezme z generic na řádku 4. Řádek 2 obsahuje příkaz pro vytvoření multiplexoru. Příkaz when else obecně vede na kaskádu multiplexorů při více podmínkách, tj. máme-li více řádků s when else. Pro jednu jednoduchou podmínku (en='') je úplně jedno, zda použijeme příkaz Q <= Qtmp when en='' else (others=>''); nebo delší konstrukci: with en select Q<= Qtmp when '', (others=>'') when others; výsledkem bude vždy jeden multiplexor. Upřednostnili jsme pochopitelně kratší zápis when else. 2-2.a) Inicializace proměnných vektorů asociací others=> Klíčové slovo others znamená veškeré nepoužité hodnoty. Kromě příkazů, viz nahoře, ho lze užít i pro vytváření asociačních listů inicializujících proměnné, ovšem jedině za předpokladu, že bude přesně známa délka výsledku už v době překladu, tj. z našeho kódu půjde jednoznačně odvodit velikost proměnné, do níž zapisujeme. Na levé straně asociace inicializací stojí určení indexů v poli s možnými směry směry jak to tak downto a na pravé straně pak požadovaná hodnota jeho členu či členů. Možnosti nejlépe přiblíží následující demo-příklad: library ieee;use ieee.std_logic_64.all; entity asociace is generic(n:natural:=8); port ( X, X2, X3, X4, X5, X6, X7 : out std_logic_vector(n- downto ) ); end entity; architecture structural of asociace is begin -- Pro N = 8 Pro N = 2 X <= (others=>''); -- X="" X="" X2 <= (others=>''); -- X2="" X2="" X3 <= (others=>'z'); -- X3="ZZZZZZZZ" X3="ZZZZZZZZZZZZ" X4 <= (=>'', others=>''); -- X4="" X4="" X5 <= (N-=>'', others=>''); -- X5="" X5="" X6 <= (N-=>'', =>'', others=>''); -- X6="" X6="" X7 <= (N- downto N-3=>'', to 3=>'', others=>''); -- X7="" X7="" end; Program 7 - Demonstrace použití others pro inicializaci Všimněte si, že hodnota u inicializační asociace se specifikuje shodně s datovým typem prvků pole, i když výsledek ovlivní více členů; jde o asociace na indexované prvky pole. Pole std_logic_vector má členy výčtového datového typu std_logic, a tak píšeme pravé strany asociací v apostrofech. Při inicializace X7 jsme v rozsazích použili jak směr downto tak i to, což zde můžeme, protože definujeme asociaci pro vytvoření inicializační konstanty, až její výsledek se přiřadí vektoru. Kdybychom chtěli X7 dát stejnou hodnotu bez asociativního listu, měli bychom více <= příkazů: X7(N- downto N-3) <= ""; X7(N-4 downto 4) <=(others=>''); X7(3 downto ) <=""; X7()<=''; Aplikaci others jsme se v nich stejně nevyhnuli prostřední část vektoru X7(N-4 downto 4) má proměnlivou délku a bez others to tady nejde. V příkazech jsme již museli dodržovat směr downto určený v definicí vektoru. Pokus o použití směru to (např. X7( to 3) <=""; ) by samozřejmě vyvolal chybové hlášení obsahující text: " range direction of object slice must be same as range direction of object". 3

32 2-3 Vytvoření vlastní knihovny ("package") V kapitole "-3.d) Dekodér pro lineární ukazatel s výstupy na jednotlivé " na straně 9 jsme slíbili, že modifikaci dekodéru vytvoříme elegantněji, bez opakování kódu. Samozřejmě můžeme postupovat stejným stylem jako v předchozí kapitole "2-2 Rozšíření prioritního inhibitoru o enable", tj. vložit hlavičku component a poté provést její mapování. Nicméně neustálé vkládání deklarací komponent před každým jejich použitím je, jak se to lidově říká, "votravné". Vždyť pro podobné situace existuje v jazyce C direktiva preprocesoru "#include" a v C# se zase používá příkaz using. V Java máme možnost odkázat na vytvořený "package". Stejný koncept se používá i ve VHDL. Vytvoříme package obsahující potřebné deklarace, na který jen odkazujeme: -- Knihovna kodu vytvorenych v uvodu do VHDL -- library ieee; use ieee.std_logic_64.all; package uvod_knihovna is component majorita is -- 6 port ( a, b, c : in std_logic; -- 7 y, y : out std_logic ); -- 8 end component; component dekoder2linearni is -- port ( A : in std_logic_vector( downto ); -- 2 Q : out std_logic_vector(2 downto ) ); -- 3 end component; component prioritni_dekoder is -- 6 port ( INT : in std_logic_vector(3 downto ); -- 7 Q : out std_logic_vector( downto ) ); -- 8 end component; component prioritni_inhibitor is -- 2 generic( N: natural := 8); port ( A : in std_logic_vector(n- downto ); Q : out std_logic_vector(n- downto ) ); end component; component priroritni_inhibitor_enable is generic(n: natural := 8); port ( A : in std_logic_vector(n- downto ); en : std_logic; -- 3 Q : out std_logic_vector(n- downto ) ); -- 3 end component; end; Program 8 - Knihovna kódů vytvořených v úvodu do VHDL Na řádku 2 odkazujeme na standardní knihovny, neboť v nich se nacházejí definice datových typů std_logic a std_logic_vector, které používáme v deklaracích komponent. Na řádku 4 definujeme náš název knihovny "uvod_knihovna" za klíčovým slovem package. Poté následují deklarace komponent. Vložili jsme sem všechny dosud vytvořené. Jejich definice zůstávají ve stejnojmenných souborech, takže je překladač snadno najde. Na řádku 34 končí deklarace knihovna klíčovým slovem end, ve VHDL-93 a vyšším lze za něj přidat i klíčové slovo package a případně i název knihovny uvod_knihovna, podobně jako u entity, viz "Tabulka - možnosti zakončení deklarace entity" na str. 8. Náš balíček obsahuje pouze hlavičky komponent. Alternativně lze do něho přidat: 32

33 definice datových typů a subtypů pro použití v našich programech. Baliček představuje ostatně jedinou možnost jak naše vlastní typy a subtypy používat už v bloku entity; definice konstant; pro VHDL psané stylem "behavioral", který úvod nezahrnuje, a pro testovací části kódu nazývané "testbench" může knihovna obsahovat i deklarace funkcí, procedur a jiných prvků, ale pak v ní musí existovat i další blok package body end, kde jsou tyto prvky definované. Zájemce o podobné speciality převyšující rámec kurzu možno odkázat na webové stránky, hledání "vhdl package". 2-3.a) Dekodér pro lineární ukazatel s výstupy na jednotlivé bity pomocí knihovny Nyní můžeme lehce vytvořit modifikaci dekodéru pro lineární ukazatel s výstupy na jednotlivé bity ze strany 9, neboť už nemusíme vkládat deklaraci použité komponenty ta je obsažena v naší knihovně. --Dekoder pro linearni ukazatel s nevektorovymi I/O -- library ieee; use ieee.std_logic_64.all; -- 2 library work; use work.uvod_knihovna.all; entity dekoder2linearnic is -- 5 port ( A, A : in std_logic; -- 6 Q2, Q, Q : out std_logic ); -- 7 end; architecture structural of dekoder2linearnic is -- signal Q : std_logic_vector(2 downto ); -- begin -- 2 inst_dek2lin : dekoder2linearni -- 3 port map (A=> A & A, Q=>Q); -- 4 Q2<=Q(2); Q<=Q(); Q <= Q(); -- 5 end; -- 6 Program 9 - Dekodér pro lineární ukazatel s výstupy na jednotlivé bity pomocí knihovny Na řádku 3 vkládáme odkaz na knihovnu; která se nachází v projektu; na ten odkazuje určení work. Syntaxe zápisu je podobná jako u standardní knihovny na řádku 2. Řádek 5 až 8 deklaruje vstupy a výstupy entity dekoder2linearnic. Řádek 3 a 4 vytvoří instanci dekodéru dekoder2linearni nazvanou inst_dek2lin. Pro mapování vstupů můžeme v Quartus použít výraz "A & A" sjednocení bitových signálů do vektoru, zatímco výstupy je nutné opět rozepsat po jednotlivých bitech přes pomocnou proměnnou. Kód je nyní dokonce kratší než původní Program 5 na straně 9 a navíc i zachovává zásadu sdílení kódu. 2-4 Zapojení prioritního dekodéru a lineárním ukazatelem Zadání: Vytvořte ve VHDL obvod skládající se z prioritního dekodéru přerušení a indikátoru výstupního čísla pomocí dekodéru pro lineární displej, dle schématu: prioritni_dekoder dekorer2linearni KEY[3..] INPUT VCC NOT inst2 INT[3..] Q[..] Qtmp[..] A[..] Q[2..] inst inst OUTPUT LEDG[2..] Obrázek 7 - Prioritní dekodér s lineárním ukazatelem V zapojení si všimněte pojmenovaného vodiče, zvýrazněného červeně pojmenování lze provést v editoru přes kontextové menu vodiče volbou "Properties". Hodilo by se nám, kdybychom generovali VHDL 33

34 kód ze schématu, což si můžete zkusit za domácí úkol, pokud chcete překladač pak vytvoří pomocný signál stejného jména. Nicméně kód není složitý, lze ho lehce napsat přímo ve VHDL: --Prioritni dekoder s linearnim ukazatelem -- library ieee; use ieee.std_logic_64.all; -- 2 library work; use work.uvod_knihovna.all; -- 3 entity prioritni2linearni is -- 4 port ( KEY : in std_logic_vector(3 downto ); -- 5 LEDG : out std_logic_vector(2 downto ) ); -- 6 end; -- 7 architecture stuctural of prioritni2linearni is -- 8 signal Qtmp : std_logic_vector( downto ); -- 9 signal nkey : std_logic_vector(3 downto ); -- begin -- nkey<= not KEY; -- 2 inst_priodek : prioritni_dekoder -- 3 port map (INT=> nkey, Q=>Qtmp); -- 4 inst_dek2lin : dekoder2linearni -- 5 port map (A=>Qtmp, Q=>LEDG); -- 6 end; -- 7 Program 2 - Prioritní dekodér s výstupem na lineární ukazatel Řádky 2 a 3 deklarují knihovny a můžeme je beze změny okopírovat z předchozího kódu v Program 9 na straně 33. Řádek 4 až 7 obsahuje entitu, v níž zadáme název našeho obvodu " prioritni2linearni " a poté běžným způsobem definujeme vstupy a výstupy, které připojíme na desku DE2. Řádek 8 a 9 zahajuje architekturu. V její hlavičce definujeme pomocný signál Qtmp pro propojení obou obvodů a signál nkey. Řádek 2 do signálu nkey připojíme negaci vstupů KEY; nestisknuté KEY dávají totiž. Signál použijeme pro mapování port map bez použití výrazu v příloze plánujeme totiž otestovat kód v prostředí ModelSim, kde překladač nebere nekonstantní výrazy u mapování instancí. Řádek 3 a 4 obsahuje vytvoření instance prioritního dekodéru. Na jeho vstup INT mapujeme negaci signál nkey. Výstupy Q vyvedeme na pomocný vodič Qtmp bez něho nelze propojení provést. Na vstupy, výstupy a parametry instancí odvolávat jen uvnitř jejich mapování (příkazy port map a generic map). Pozn. Ve VHDL nelze odkazovat na prvky instancí zápisy v objektovém stylu, tedy např. psát něco jako " inst.q" apod. Řádek 5 a 6 mapuje druhou instanci dekodér na lineární displej. Na jeho vstup A připojíme vodič Qtmp a na výstupy Q zelené led-diody LEDG. Pozn. Pro obě instance jsme použili delší názvy, což nám umožní lepší orientaci při simulaci obvodu Obvod je hotový, můžeme ho přeložit a vyzkoušet. Zde lze postupovat dvěma způsoby. Buď ) přeložíme " prioritni2linearni.vhd", vytvoříme pro něj *.vwf soubor a provedeme simulaci v prostředí Quartus, viz stránky SPS kurzu. 2) nebo si napíšeme testbench a zkusíme obvod simulovat, což je preferovaný způsob používaný v profesionální praxi; teprve při něm vyniknou výhody VHDL oproti schématu. Popis postupu 2) je poněkud rozsáhlý a kvůli tomu byl zařazený do přílohy. 34

35 Závěr Příkladný úvod do VHDL není úplný. Nevznikl jako kompletní učebnice, ale jako rychlé seznámení se základy VHDL v prostředí Quartus. Chybí zde například části o reprezentaci čísel a dále především styl "behavioral", v němž se obvod popisuje svojí funkčností, která se od něho žádá. Po zkušenostech s předchozí výukou můžeme konstatovat, že studentům obvykle nedělá větší potíže tvořit v "behavioral" stylu, protože VHDL kód se v něm podobá klasickému programu. Problémy jim činí jedině provést vhodný popis řešení, ze kterého lze obvod dobře syntetizovat. Někteří "experti" z minulých let vyčerpali téměř celou kapacitu FPGA obvodu i jednoduchými stopkami se sedmisegmentovým displejem. Neprobrané části vyžadují delší vysvětlení, a tak si je necháme na přednášky. Úvod může obsahovat nejasnosti ve výkladu, případně překlepy, nepřesnosti či jiné prohřešky, které unikly korekturám. Autor uvítá, pokud mu o nich napíšete, nebo pošlete své připomínky a náměty na rozšíření stávajících částí pro příští školní rok. ~ o ~ 35

36 Příloha A: Testbench pro ModelSim Ukážeme si, jak lze vytvořit simulaci pro ModelSim. Jde o profesionální techniku, kterou doporučujeme ve VHDL používat. Není rozhodně podmínkou pro absolvování kurzu SPS. Jakmile však zvládnete jednu simulaci, další vytvoříte již rychleji postupy jsou podobné. Naučíte-li se aspoň krapánek "simulovat", můžete získat špetku výhod, minimálně ždibec úspory svého času pro trošku jiné aktivity. A- Vytvoření programu typu Testbench Pokud chceme nějaký program zkoušet, musíme pro něj napřed napsat testbench, jakýsi generátor příslušných testovacích signálů. Při simulacích v Quartus se automaticky vytvářel ze souboru *.vwf, do kterého se v jeho editoru "Simulation Vaweform Editor" nakreslily požadované průběhy vstupů. Z nich se pak vygeneroval testbench. Pro vyzkoušení našeho "Program 2 - Prioritní dekodér s výstupem na lineární ukazatel" ze strany 34, by vstupní soubor "prioritni2linearni.vwf" mohl vypadat třeba takto: Kreslíme se změnami po 2 ns postupně všechny možné vstupní kombinace pro klávesy KEY (tlačítko KEY dává při stisknutí, a proto máme průběhy negované). Poté můžeme spustit Quartus II Simulator.Napřed nastavíme "Simulation->Options - Quartus II Simulator" a poté spustíme funkční simulaci, která testuje jen rovnice, a to příkazem "Simulation->Run Functional Simulation": Funkční simulaci jsme sice provedli relativně rychle, ale tady končí naše časová úspora. Nyní začínáme pomalu luštit průběhy, zdalipak se náš obvod chová mravně a netropí nějaké neplechy. Louskání průběhů simulací si případně zopakujeme po každé změně v kódu. Po čase si položíme otázku, jestli by testování nešlo zautomatizovat. Podobnou možnost nabízí právě VHDL testbench. Pozn. U úloh zadávaných v kurzu SPS vystačíte s funkčními simulacemi doplněnými zprávami z Quartus překladače v položce" TimeQuest Timing Analyzer". Nebudete řešit tak náročné obvody, abyste museli zkoumat časové simulace uvažující i charakteristiky interních prvků FPGA. Ty sice ukáže i Quartus simulátor "Simulation->Run Timing Simulation", ale jen v méně přesné formě. 36

37 VHDL testbench uvedeme v podobě vhodné pro kombinační obvody a poté ho postupně vysvětlíme. Kód není těžký a lze ho velmi lehce modifikovat pro další obvody: --Testbench - Prioritni dekoder s linearnim ukazatelem -- library ieee; use ieee.std_logic_64.all; -- 2 entity tb_prioritni2linearni is -- 3 end; -- 4 architecture testbench of tb_prioritni2linearni is -- 5 component prioritni2linearni is -- 6 port ( KEY : in std_logic_vector(3 downto ); -- 7 LEDG : out std_logic_vector(2 downto ) ); -- 8 end component; type stimuls is array ( to 7) of std_logic_vector(2 downto ); -- constant skey : stimuls := ("","","","","","","",""); -- 2 constant sledg : stimuls := ("","","","","","","",""); -- 3 signal tbkey : std_logic_vector(3 downto ); -- 4 signal tbledg : std_logic_vector(2 downto ); begin -- 7 inst_prio2lin : prioritni2linearni -- instance testovaného programu -- 8 port map (KEY=> tbkey,ledg=>tbledg); -- 9 generator : process -- 2 begin -- 2 for i in stimuls'range loop tbkey <=not skey (i); -- KEY davaji negovanou hodnotu wait for 2 ns; -- cekej 2 ns assert tbledg = sledg (i) report "vystupy odlisne pri indexu " & integer'image(i); end loop; wait; -- nekonecne cekani, simulace se zde zastavi end process; end architecture testbench; -- 3 Program 2 - VHDL testbech pro dekoder dekodér s výstupem na lineární ukazatel Řádek 2 obsahuje standardní knihovny. Řádek 3 a 4 definuje entitu - pro programy typu testbech má vždy tento tvar, tj. uvádí se pouze její název tb_prioritni2linearni a chybí deklarace port nebo generic. Řádek 5 zahajuje architekturu. Nazvali jsme ji testbench. Řádek 6 až 9 vkládá deklaraci component zkoušené entity prioritni2linearni. Snadno ji vytvoříme známým postupem, a to okopírováním bloku entity ze souboru prioritni2linearni.vhd. Řádek vektory vstupů i výstupů prioritni2linearni mají stejné délky 3 členy, a tak si pro ně vytvoříme datový typ stimuls popisující pole osmi prvků typu std_logic_vector(2 downto ); Řádek 2 obsahuje konstantní pole definující požadované simulační vstupy skey. Ty jsou přímou analogií vstupních signálů zadaných ve "Vaweform" editoru na předchozí stránce, akorát jsme je pro přehlednost zde nenapsali negované tohle uděláme raději programově. Řádek 3 obsahuje definice požadovaných simulačních výstupů sledg, které budeme v programu automaticky kontrolovat. Řádek 4 a 5 obsahuje definice proměnných shodných se vstupy a výstupy testované komponenty, pro přehlednost jsme před jejich názvy napsali prefix tb od testbench. Řádek 8 a 9 obsahuje příkaz vytvoření instance zkoušeného obvodu prioritni2linearni, instanci pojmenujeme inst_prio2lin, a její vstupy a výstupy se připojíme na naše testovací signály. Řádek 2 deklaruje blok procesu. Příkaz patří do zde neprobraného stylu "behavioral" programování. Uvnitř procesů se používají příkazy zařazené do skupiny "Sequential Statements" ty se neprovádějí 37

38 paralelně, ale vykonávají se sekvenčně jeden po druhém tak jako v běžných programech. Musíme však zdůraznit, že způsob, jakým je zde napsaný proces, se povoluje jedině v simulacích, ale v těch má zase většinou tento tvar. Pro syntézu obvodů se proces musí psát jiným způsobem, o němž si budeme povídat na přednáškách - tenhle proces by v reálném obvodu nefungoval. Strukturu procesu a jeho součinnost s testovaným obvodem ilustruje následující obrázek. Z něho vidíme, že z procesu vznikl obvod generátoru připojený k testované entitě.: tb_prioritni2linearni generator : process "","","","","","","","" skey(i) tbkey priority2linearni KEY[3..] LEDG[2..] i "","","","","","","","" sledg(i) shodné? 2 ns různé "odlišné při indexu i" tbledg inst_prio2lin Řádek 22 zahajuje programový sekvenční cyklus for - loop, který do proměnné cyklu i typu integer přiřazuje postupně hodnoty až 7, tj. všechny indexy pole simulačních vstupů. Řádek 23 načte testovací vstup z indexu i a jeho negovanou hodnotu pošle po signálu tbkey příkazem "tbkey <=not skey (i); " vedoucím na vstup KEY ( port map na řádku 9). Řádek 24 obsahuje pokyn pro simulátor, aby se další příkaz bloku procesu vykonal až za 2 nanosekund. Zdržení jsme vložili kvůli tomu, aby nové hodnoty na vstupech KEY měly čas k ovlivnění výstupů LEDR. Pauza se týká jen procesu, simulátor bude dál pilně počít reakce inst_prio2lin na vstupy. Řádek 25 až 26 testuje, samozřejmě až po uplynutí předchozího čekání 2 ns, zda výstupy obvodu se shodují s požadovanými. Při neshodě se vypíše chybové hlášení obsahující zadaný text a hodnotu indexu převedenou na řetězec pomocí atributu integer'image(i); Pozn. Hodnoty vstupů a výstupů nevypisujeme záměrně. Konverze typu std_logic_vector na řetězec je sice možná, ale potřebné funkce nejsou zahrnuté ve standardních knihovnách a musely by se vkládat celé jejich definice. Pro zjednodušení kódu jsme je raději vynechali. Zájemci naleznou vše potřebné na webu. Řádek 27 končí cyklus a musí mít tvar "end loop;" zde za end zde nelze vynechat loop. Řádek 28 obsahuje příkaz wait, avšak bez zadaného času. Simulátor bude čekat nekonečně dlouho, tj. zastaví se simulace. Řádek 29 ukončuje blok procesu a opět zde nelze za end vynechat klíčové slovo process. Řádek 3 končí architekturu. Máme již trochu delší kód, a tak jsme místo jednoduchého koncového end zvolili i přidání klíčového slova architecture a názvu architektury testbench. Budeme-li chtít náš testbench použít pro zkoušení jiného obvodu, vyměníme jen prioritni2linearni komponentu za novou a upravíme kód pro její instanci. Jakmile definujeme požadované testovací vektory, můžeme zkoušet. Testbench stačí jen spustit a ihned víme, zda pracuje dle našich požadavků. Pozn. V Quartusu II není tb_prioritni2linearni.vhd přeložitelný kvůli použití wait for <time>. Můžeme program maximálně otestovat z lišty nástrojů VHDL editoru tlačítkem "Analyze Current File". Úplný překlad by skončil chybou "Error (533): VHDL Wait Statement error at tb_prioritni2linearni.vhd(25): Wait Statement must contain condition clause with UNTIL keyword". Nicméně příkazy wait se v syntéze už nepoužívají, a to ani wait until zmíněné v chybové hlášce to zůstalo kvůli ve VHDL kvůli simulacím a pro zpětnou kompatibilitu se staršími verzemi VHDL. Pro syntézu existují lepší konstrukce. 38

39 A-2 Spuštění Testbench v ModelSim Altera Program ModelSim-Altera Starter Edition se nainstaluje přímo s vývojovým nástrojem Quartus při jeho instalaci z ISO-image. Lze ho používat bezplatně, ale neumožní některé postupy potřebné pro profesionální vývoj. V bezplatné verzi provádí jen funkční simulace, tj. bez uvažování skutečných časů v přeloženém FPGA. Dovoluje však vkládat do VHDL kódu "breakpointy", takže snáze zjistíme nepovedené části. Zde předpokládáme, že máte instalovaný "ModelSim-Altera.d (Quartus II 3.sp)", tedy verzi shodnou s výukovými laboratořemi. Ve vašem Quartus projektu existuje podadresář "<project_root_directory>\simulation\modelsim\" pro Model- Sim vytvořte ho, pokud tam dosud není, a máte-li ho, raději smažte vše v něm, aby se vytvářel nový ModelSim projekt bez interakce s možnými soubory automaticky generovanými Quartusem. Předpokládáme dále, že zkoušená entita v souboru "prioritni2linearni.vhd" se Vám po označení jako top-level entity přeložila bez chyb úplným překladem v Quartusu. Spusťte ModelSim. Pozn. Návody k ModelSim najdete v menu Help->PDF Není ale potřeba číst je dopředu, další text bude srozumitelný i bez nich, ale hodí se později pro případné rozšíření vědomostí. Doporučujeme především Tutorial, a to jeho kapitoly až 4 a 6, které obsahují základní věci, a kapitolu 2 příručky "User s Manual", kde se vysvětluje uživatelské rozhraní ModelSim. Vytvoření projektu ModelSim Z hlavního menu ModelSim volíme File->New->Project V dialogu "Create Project" vyplníme libovolné jméno projektu, např. "test"; v Project Location nastavíme cestu k simulačnímu adresáři v projektu Quartusu, abychom měli vše pohromadě pro lepší zobrazení cest v obrázcích jsme přesunuli Quartus projekt do "E:/Uvod/", takže zadáme "E:/Uvod/simulation/modelsim". Ostatní položky necháme ve výchozím stavu a dialog potvrdíme [Ok]. Po zavření "Create Project" tlačítkem [OK], se objeví nabídka "Add Items ", volíme "Add Existing File" pro přidání souborů, které chceme simulovat. Objeví se nám dialog "Add file to Project", v němž stiskem [Browse] otevřeme "Select files to add to project" dialog pro prohlížení disku. Z projektu vybereme všechny soubory, které bude simulace potřebovat: tb_prioritni2linearni.vhd prioritni2linearni.vhd prioritni_dekoder.vhd dekoder2linearni.vhd uvod_knihovna.vhd a poté ukončíme výběr tlačítkem [Open]. Vybraná jména se objeví v dialogu "Add file to Project". Ponecháme "Reference from current location" volbu vybranou, aby se na soubory jen odkazovalo. Poté dialog zavřeme [OK]. 39

40 Seznam souborů uvidíme v ModelSim okně na záložce "Project". Pokud jsme zapomněli na nějaký soubor, můžeme ho přidat, když pravou myší klikneme do okna Project a volíme "Add to project"->"existing File" v jeho kontextovém menu. Alternativní přidání souboru nabízí hlavní menu "Project"->"Add to project"->"existing File". Máme-li nějaký soubor omylem navíc, odstraníme z projektu pomocí klávesy [delete]. ModelSim vložil soubory a nastavil jejich pořadí, které nemusí být správné. Volba "Compile"->"Compile Order " z hlavního menu otevře dialog, v němž lze pořadí upravit i ručně. Zde ale dáme přednost automatické korekci volbou [Auto Generate], která vyvolá i překlad. Po něm zavřeme dialog [OK]. Soubory se přeložily a jejich pořadí se změnilo na správné: V dolním okně Transcript by se měly objevit spokojené hlášky překladače potvrzující bezchybný průběh. Pozn. ModelSim generuje výrazně méně hlášek než Quartus, ale zato často píše dost podstatné věci, takže doporučuji pečlivě sledovat okno Transcript. Je-li příliš plné, lze ho vymazat přes jeho kontextové menu volbou Clear. Opětovný překlad souborů lze kdykoliv později spustit z hlavního menu "Compile"->"Compile All". Nyní přepneme na záložku [Library], kde v knihovně "work" máme přeložené soubory. U uvod_knihovna je typ "package" a u ostatních "entity". Pozn. Souborům s testbench bývá někdy zvykem dávat příponu "*.vht", ten náš by se mohl jmenovat "tb_prioritni2linearni.vht". Není to však povinné. Volili jsme "*.vhd" z ryze praktických důvodů. Quartus překladač odmítá "*.vht" soubory jako nepřípustné typy a nedají se v něm ani otestovat. Spustíme simulaci, avšak ne z hlavního menu "Simulate->Start Simulation"; které nabízí mnoho parametrů pro speciální případy. Nám stačí výchozí nastavení pro něj lze simulaci spustit jednodušeji. Vybereme v [Library] "work" soubor s naším testbench tb_prioritni2linearni. Pravou myší vyvoláme jeho kontextové menu, v němž zvolíme simulaci bez optimalizace, aby se nám neredukovaly proměnné a příkazy a viděli jsme vše. 4

41 ModelSim změnil svůj vzhled - přepnul svůj Layout (uspořádání oken) z původního "NoDesign" na nový "Simulate". Pozn. ModelSim dovoluje uchovat uspořádání oken. Zpočátku máme 4 výchozí a k nim lze přidat svoje vlastní, když momentální uspořádání oken uložíme z hlavního menu "Layout->Save layout As ". Mezi uspořádáními pak můžeme volně přepínat. Entita tb_prioritni2linearni obsahuje ve svém stromu do ní vložené entity. Kvůli tomu jsme instance pojmenovávali raději delšími názvy, aby nám při simulacích usnadnily orientaci. V stromu výpisu vidíme také odkazy na čísla řádek kódu, na ty lze vložit breakpointy. Nastavíme dále graf průběhů. Pravou myší vyvoláme kontextové menu u tb_prioritni2linearni a volíme "Add to->wave->all items in region and below". Ukáže se nám okno typu Wave, do kterého se nám vložily všechny proměnné z našich VHDL souborů. Pozn. Okno Wave se nám může objevit buď zahloubené do hlavního okna ModelSim nebo jako samostatné okno, které lze umístit kdekoliv na plochu. Stav jeho zahloubení se mění volbou Dock/Undock z kontextového menu jeho podokna pravou myší na ikonu pod hlavním menu Wave. Nyní již lze spustit simulaci volbou z hlavního menu "ModelSim Simulate->Run->Run -All". Simulace poběží až po první breakpoint nebo až ke skončení testbench, což bude náš případ, protože na konci procesu generate máme vložené nekonečné čekání příkazem wait. Pozn. Velké černošedé plochy okna Wave v obrázku dole byly graficky upravené pro tisk inverzemi barev. 4

42 Vybereme okno Wave obsahující záznam průběhů všech proměnných. Stiskneme klávesu F (Zoom Full), abychom viděli celé průběhy. Alternativně můžeme na liště nástrojů Zoom kliknout na ikonu, která plní stejnou funkci. V okně Transcript se nám zatím nevypsala žádná chybová hláška náš program neobsahuje chybu. Úmyslně ji vložíme, abychom viděli, co se stane. Na záložce [sim] vybereme levým dvojklikem myši entity tb_prioritni2linearni obsahující náš testbench. Zobrazí se kód VHDL Program 2 ze str. 37. Vypneme jeho ochranu proti náhodnému přepsání zrušením volby Read Only v kontextovém menu (pravou myší na text v editoru). Nyní změníme v hodnotách inicializaci pole řádku 3 constant sledg : stimuls := ("","","","","","","",""); Na indexu 3 přepíšeme původní "" na chybné "": ("","","","","","","",""); Soubor uložíme a zapneme jeho Read Only ochranu. Přeložíme vše (Compile->Compile All) a spustíme simulaci od začátku (Simulate->Restart ). V Restart dialogu, který se objeví, necháme všechny položky vybrané, aby se zachovaly stávající prvky, a potvrdíme to volbu [OK]. Poté opět spustíme simulaci (Simulate->Run->Run -All). Proběhne znovu celá od začátku až do konce. V okně Transcript se však objevila hláška příkazu report: # ** Error: vystup nesouhlasi pri indexu 3 # Time: 8 ns Iteration: Instance: /tb_prioritni2linearni Necháme si tedy simulaci programu zastavit na chybě, abychom věděli, co se děje. Vložíme breakpoint do tb_prioritni2linearni.vhd na řádek 26, tj. na příkaz report (dvojklikem levou myší na číslo řádku). Zadáme zas "Simulate->Restart " a novou simulaci "Simulate->Run->Run -All". Simulace se zastaví na našem breakpointu. Najedemeli myším kurzorem na proměnnou, která nás zajímá, uvidíme její hodnotu. Na obrázku vlevo jsme zvolili tbledg na řádku 9. Obrázek 8 - Breakpoint při simulaci Klávesou F lze pokračovat v simulaci. Máme-li více breakpointů, pak se její běh zastaví na dalším z nich; více viz již zmíněné návody v menu Help. Program lze také krokovat, k tomu slouží tlačítka na liště nástrojů: ~. ~ Naučíme-li se využívat ModelSim, ušetříme si čas, a to zejména při psaní VHDL stylem "behavioral" blízkému klasickým programům. Bez pořádného simulování lze program ladit leda metodou pokus-omyl: ZnovuALépe: PoEditujeme(); Přeložíme(); NahrajemeDoDE2(); BedlivěZkoumáme(); if("neběží? Hmmm, zas ne, a tak zas") goto ZnovuALépe; Každý návrh se musí nakonec ověřit pokusem na desce DE2, abychom se ujistili, že nám pracuje i v reálném obvodu, avšak dobrá simulace zkrátí naši dobu kroužení ve smyčce ZnovuALépe. ~ o ~ 42

Digitální obvody. Doc. Ing. Lukáš Fujcik, Ph.D.

Digitální obvody. Doc. Ing. Lukáš Fujcik, Ph.D. Digitální obvody Doc. Ing. Lukáš Fujcik, Ph.D. Realizace kombinačních logických funkcí Realizace kombinační logické funkce = sestavení zapojení obvodu, který ze vstupních proměnných vytvoří výstupní proměnné

Více

Souhrn Apendixu A doporučení VHDL

Souhrn Apendixu A doporučení VHDL Fakulta elektrotechniky a informatiky Univerzita Pardubice Souhrn Apendixu A doporučení VHDL Práce ke zkoušce z předmětu Programovatelné logické obvody Jméno: Jiří Paar Datum: 17. 2. 2010 Poznámka k jazyku

Více

Simulace v Quartus II 13.0sp1

Simulace v Quartus II 13.0sp1 Simulace v Quartus II 13.0sp1 Richard Šusta, Katedra řídicí techniky ČVUT-FEL v Praze V Quartus II 13.0sp1 postup simulace mnohem jednodušší než v předchozích verzích. Předpokládejme, že máte vytvořený

Více

Příklad č. 1 Přepis informace ze vstupů (SW0 až SW3) na ledky (LEDG0 až LEDG3)

Příklad č. 1 Přepis informace ze vstupů (SW0 až SW3) na ledky (LEDG0 až LEDG3) VHAD - Návod k VHDL hadovi Obsah Příklad č. 1 Přepis informace ze vstupů (SW0 až SW3) na ledky (LEDG0 až LEDG3)... 1 Příklad č. 2 Blikající LED... 3 Příklad č. 3 Časovač 1s... 4 Příklad č. 4 Had 8 x LED

Více

Digitální obvody. Doc. Ing. Lukáš Fujcik, Ph.D.

Digitální obvody. Doc. Ing. Lukáš Fujcik, Ph.D. Digitální obvody Doc. Ing. Lukáš Fujcik, Ph.D. Základní invertor v technologii CMOS dva tranzistory: T1 vodivostní kanál typ N T2 vodivostní kanál typ P při u VST = H nebo L je klidový proud velmi malý

Více

Programovací jazyk Pascal

Programovací jazyk Pascal Programovací jazyk Pascal Syntaktická pravidla (syntaxe jazyka) přesná pravidla pro zápis příkazů Sémantická pravidla (sémantika jazyka) pravidla, která každému příkazu přiřadí přesný význam Všechny konstrukce

Více

Vzorový příklad. Postup v prostředí ISE. Zadání: x 1 x 0 y. Rovnicí y = x 1. x 0. Přiřazení signálů: ČESKÉ VYSOKÉ UČENÍ TECHNICKÉ V PRAZE

Vzorový příklad. Postup v prostředí ISE. Zadání: x 1 x 0 y. Rovnicí y = x 1. x 0. Přiřazení signálů: ČESKÉ VYSOKÉ UČENÍ TECHNICKÉ V PRAZE Vzorový příklad. Zadání: Na přípravku realizujte kombinační obvod představující funkci logického součinu dvou vstupů. Mající následující pravdivostní tabulku. x 1 x 0 y 0 0 0 0 1 0 1 0 0 1 1 1 Rovnicí

Více

Jazyk VHDL zápis čísel, znaků a řetězců. Jazyk VHDL základní datové typy a operátory. Kurz A0B38FPGA Aplikace hradlových polí

Jazyk VHDL zápis čísel, znaků a řetězců. Jazyk VHDL základní datové typy a operátory. Kurz A0B38FPGA Aplikace hradlových polí ČESKÉ VYSOKÉ UČENÍ TECHNICKÉ V PRAZE Fakulta elektrotechnická Ing. Radek Sedláček, Ph.D., katedra měření K13138 Jazyk VHDL zápis čísel, znaků a řetězců Jazyk VHDL základní datové typy a operátory Kurz

Více

Richard Šusta, verze 1.0 ze dne 10. září 2014, publikováno pod GNU Free Documentation License

Richard Šusta, verze 1.0 ze dne 10. září 2014, publikováno pod GNU Free Documentation License Vytvoření projektu pro desku DE2 v Altera Quartus Richard Šusta, verze 1.0 ze dne 10. září 2014, publikováno pod GNU Free Documentation License Obsah Vytvoření projektu pro desku DE2 v Altera Quartus...

Více

Vzorový příklad. Postup v prostředí ISE. Zadání: x 1 x 0 y Rovnicí y = x 1. Přiřazení signálů:

Vzorový příklad. Postup v prostředí ISE. Zadání: x 1 x 0 y Rovnicí y = x 1. Přiřazení signálů: Vzorový příklad. Zadání: Na přípravku realizujte kombinační obvod představující funkci logického součinu dvou vstupů. Mající následující pravdivostní tabulku. x 1 x 0 y 0 0 0 0 1 0 1 0 0 1 1 1 Rovnicí

Více

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme: 1. lekce 1. Minimální program do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme: #include #include int main() { printf("hello world!\n"); return 0; 2.

Více

Vývoj VHDL. Verilog HDL

Vývoj VHDL. Verilog HDL Popis systémů pomocí VHDL Vývoj VHDL HDL - Hardware Description Language VHDL - Very High Speed Integrated Circuits HDL Vývoj od roku 1983 v rámci projektu VHSIC 1987 - standard IEEE 1076-1987 1993 - revize

Více

Úvod do jazyka VHDL. Jan Kořenek korenek@fit.vutbr.cz. Návrh číslicových systémů 2007-2008

Úvod do jazyka VHDL. Jan Kořenek korenek@fit.vutbr.cz. Návrh číslicových systémů 2007-2008 Úvod do jazyka VHDL Návrh číslicových systémů 2007-2008 Jan Kořenek korenek@fit.vutbr.cz Jak popsat číslicový obvod Slovně Navrhněte (číslicový) obvod, který spočte sumu všech členů dané posloupnosti slovní

Více

Cíle. Teoretický úvod. BDIO - Digitální obvody Ústav mikroelektroniky Základní logická hradla, Booleova algebra, De Morganovy zákony Student

Cíle. Teoretický úvod. BDIO - Digitální obvody Ústav mikroelektroniky Základní logická hradla, Booleova algebra, De Morganovy zákony Student Předmět Ústav Úloha č. DIO - Digitální obvody Ústav mikroelektroniky Základní logická hradla, ooleova algebra, De Morganovy zákony Student Cíle Porozumění základním logickým hradlům NND, NOR a dalším,

Více

KAPITOLA 4 ZPRACOVÁNÍ TEXTU

KAPITOLA 4 ZPRACOVÁNÍ TEXTU KAPITOLA 4 ZPRACOVÁNÍ TEXTU TABULÁTORY Jsou to značky (zarážky), ke kterým se zarovná text. Můžeme je nastavit kliknutím na pravítku nebo v dialogovém okně, které vyvoláme kliknutím na tlačítko Tabulátory

Více

Algoritmizace a programování

Algoritmizace a programování Algoritmizace a programování Výrazy Operátory Výrazy Verze pro akademický rok 2012/2013 1 Operace, operátory Unární jeden operand, operátor se zapisuje ve většině případů před operand, v některých případech

Více

Čtvrtek 8. prosince. Pascal - opakování základů. Struktura programu:

Čtvrtek 8. prosince. Pascal - opakování základů. Struktura programu: Čtvrtek 8 prosince Pascal - opakování základů Struktura programu: 1 hlavička obsahuje název programu, použité programové jednotky (knihovny), definice konstant, deklarace proměnných, všechny použité procedury

Více

Vytvoření nového projektu ve vývojovém prostředí Quartus II Version 9.1 Servise Pack 2

Vytvoření nového projektu ve vývojovém prostředí Quartus II Version 9.1 Servise Pack 2 Vytvoření nového projektu ve vývojovém prostředí Quartus II Version 9.1 Servise Pack 2 Nový projekt vytvoříme volbou New Project Wizard: Introduction z menu File, po které se objeví úvodní okno (obr. 1).

Více

HROMADNÉ ÚPRAVY NAJÍT A NAHRADIT

HROMADNÉ ÚPRAVY NAJÍT A NAHRADIT HROMADNÉ ÚPRAVY NAJÍT A NAHRADIT Funkce Najít a nahradit slouží k rychlému vyhledávání určitých slov a jejich nahrazování jinými slovy. Lze hledat i určité varianty slov a nahrazovat je buď hromadně (všechny

Více

Dokument a jeho části oddíly, záhlaví, zápatí

Dokument a jeho části oddíly, záhlaví, zápatí Dokument a jeho části oddíly, záhlaví, zápatí Nejčastějším úkolem bývá ukončení stránky a pokračování textu na další stránce nebo vložení stránky před napsaný text. Podobným úkolem je jiné svislé zarovnání

Více

Jazyk VHDL konstanty, signály a proměnné. Jazyk VHDL paralelní a sekvenční doména. Kurz A0B38FPGA Aplikace hradlových polí

Jazyk VHDL konstanty, signály a proměnné. Jazyk VHDL paralelní a sekvenční doména. Kurz A0B38FPGA Aplikace hradlových polí ČESKÉ VYSOKÉ UČENÍ TECHNICKÉ V PRAZE Fakulta elektrotechnická Ing. Radek Sedláček, Ph.D., katedra měření K13138 Jazyk VHDL konstanty, signály a proměnné Jazyk VHDL paralelní a sekvenční doména Kurz A0B38FPGA

Více

Příklady popisu základních obvodů ve VHDL

Příklady popisu základních obvodů ve VHDL Příklady popisu základních obvodů ve VHDL INP - cvičení 2 Michal Bidlo, 2008 bidlom@fit.vutbr.cz entity Circuit is port ( -- rozhraní obvodu ); end Circuit; Proces architecture Behavioral of Circuit is

Více

KOMBINAČNÍ LOGICKÉ OBVODY

KOMBINAČNÍ LOGICKÉ OBVODY Projekt: Inovace oboru Mechatronik pro Zlínský kraj Registrační číslo: CZ.1.07/1.1.08/03.0009 KOMBINAČNÍ LOGICKÉ OBVODY U těchto obvodů je vstup určen jen výhradně kombinací vstupních veličin. Hodnoty

Více

ČESKÉ VYSOKÉ UČENÍ TECHNICKÉ V PRAZE

ČESKÉ VYSOKÉ UČENÍ TECHNICKÉ V PRAZE Vzorový příklad pro práci v prostředí MPLAB Zadání: Vytvořte program, který v intervalu 200ms točí doleva obsah registru reg, a který při stisku tlačítka RB0 nastaví bit 0 v registru reg na hodnotu 1.

Více

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme: 1. lekce 1. Minimální program do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme: #include #include int main() { printf("hello world!\n"); return 0; 2.

Více

PROGRAMOVATELNÁ LOGICKÁ POLE A JAZYKY HDL

PROGRAMOVATELNÁ LOGICKÁ POLE A JAZYKY HDL PROGRAMOVATELNÁ LOGICKÁ POLE A JAZYKY HDL Doc. Ing. Jaromír Kolouch, CSc. Ústav radioelektroniky FEKT VUT v Brně, Purkyňova 118, kolouch@feec.vutbr.cz Přednáška má přinést informaci o současném stavu v

Více

Způsoby realizace této funkce:

Způsoby realizace této funkce: KOMBINAČNÍ LOGICKÉ OBVODY U těchto obvodů je výstup určen jen výhradně kombinací vstupních veličin. Hodnoty výstupních veličin nezávisejí na předcházejícím stavu logického obvodu, což znamená, že kombinační

Více

1. Seznamte se s výukovou platformou FITkit (http://merlin.fit.vutbr.cz/fitkit/).

1. Seznamte se s výukovou platformou FITkit (http://merlin.fit.vutbr.cz/fitkit/). Zadání: Fakulta informačních technologií VUT v Brně Ústav počítačových systémů Technika personálních počítačů, cvičení ITP FITkit Řízení 7mi-segmentového displeje Úloha č. 3. 1. Seznamte se s výukovou

Více

Návrh. číslicových obvodů

Návrh. číslicových obvodů Návrh číslicových obvodů SW Aritmetika HW Periférie CPU function AddSub(a,b,s); var c; a b k k a+b mpx c if (s==1) c=a+b; else c=a-b; a-b return c; End; PAMĚŤ s Princip: univerzální stroj Výhoda: univerzalita

Více

Jak vytvořit vlastní ikonu bloku a faceplate v PCS7 V6.x a 7.x

Jak vytvořit vlastní ikonu bloku a faceplate v PCS7 V6.x a 7.x Jak vytvořit vlastní ikonu bloku a faceplate v PCS7 V6.x a 7.x Otázka: Jak postupovat při tvorbě vlastní ikony bloku a faceplate pro uživatelsky vytvořený funkční blok PCS7 Odpověď: Pro každý uživatelský

Více

1. 5. Minimalizace logické funkce a implementace do cílového programovatelného obvodu CPLD

1. 5. Minimalizace logické funkce a implementace do cílového programovatelného obvodu CPLD .. Minimalizace logické funkce a implementace do cílového programovatelného obvodu Zadání. Navrhněte obvod realizující neminimalizovanou funkci (úplný term) pomocí hradel AND, OR a invertorů. Zaznamenejte

Více

Simulace číslicových obvodů (MI-SIM) zimní semestr 2010/2011

Simulace číslicových obvodů (MI-SIM) zimní semestr 2010/2011 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íce

MAXScript výukový kurz

MAXScript výukový kurz MAXScript výukový kurz Díl čtvrtý jazyk MAXScript, část I. Jan Melichar, březen 2008 Jan Melichar (aka JME) strana 1 OBSAH ÚVOD... 4 ZÁKLADNÍ PŘÍKAZY... 5 OPERÁTORY... 6 PROMĚNNÉ... 6 POLE... 7 ZÁVĚREM...

Více

Logické operace. Datový typ bool. Relační operátory. Logické operátory. IAJCE Přednáška č. 3. může nabýt hodnot: o true o false

Logické operace. Datový typ bool. Relační operátory. Logické operátory. IAJCE Přednáška č. 3. může nabýt hodnot: o true o false Logické operace Datový typ bool může nabýt hodnot: o true o false Relační operátory pravda, 1, nepravda, 0, hodnoty všech primitivních datových typů (int, double ) jsou uspořádané lze je porovnávat binární

Více

Operátory, výrazy. Tomáš Pitner, upravil Marek Šabo

Operátory, výrazy. Tomáš Pitner, upravil Marek Šabo Operátory, výrazy Tomáš Pitner, upravil Marek Šabo Operátor "Znaménko operace", pokyn pro vykonání operace při vyhodnocení výrazu. V Javě mají operátory napevno daný význam, nelze je přetěžovat jako v

Více

VÝUKOVÝ MATERIÁL. Bratislavská 2166, 407 47 Varnsdorf, IČO: 18383874 www.vosassvdf.cz, tel. +420412372632 Číslo projektu

VÝUKOVÝ MATERIÁL. Bratislavská 2166, 407 47 Varnsdorf, IČO: 18383874 www.vosassvdf.cz, tel. +420412372632 Číslo projektu VÝUKOVÝ MATERIÁL Identifikační údaje školy Vyšší odborná škola a Střední škola, Varnsdorf, příspěvková organizace Bratislavská 2166, 407 47 Varnsdorf, IČO: 18383874 www.vosassvdf.cz, tel. +420412372632

Více

1.1 Struktura programu v Pascalu Vstup a výstup Operátory a některé matematické funkce 5

1.1 Struktura programu v Pascalu Vstup a výstup Operátory a některé matematické funkce 5 Obsah Obsah 1 Programovací jazyk Pascal 1 1.1 Struktura programu v Pascalu.................... 1 2 Proměnné 2 2.1 Vstup a výstup............................ 3 3 Operátory a některé matematické funkce 5

Více

Tematický celek Proměnné. Proměnné slouží k dočasnému uchovávání hodnot během provádění aplikace Deklarace proměnných

Tematický celek Proměnné. Proměnné slouží k dočasnému uchovávání hodnot během provádění aplikace Deklarace proměnných Tematický celek 03 3.1 Proměnné Proměnné slouží k dočasnému uchovávání hodnot během provádění aplikace. 3.1.1 Deklarace proměnných Dim jméno_proměnné [As typ] - deklarace uvnitř procedury platí pouze pro

Více

Pascal. Katedra aplikované kybernetiky. Ing. Miroslav Vavroušek. Verze 7

Pascal. Katedra aplikované kybernetiky. Ing. Miroslav Vavroušek. Verze 7 Pascal Katedra aplikované kybernetiky Ing. Miroslav Vavroušek Verze 7 Proměnné Proměnná uchovává nějakou informaci potřebnou pro práci programu. Má ve svém oboru platnosti unikátní jméno. (Připadne, musí

Více

Kódy pro odstranění redundance, pro zabezpečení proti chybám. Demonstrační cvičení 5 INP

Kódy pro odstranění redundance, pro zabezpečení proti chybám. Demonstrační cvičení 5 INP Kódy pro odstranění redundance, pro zabezpečení proti chybám Demonstrační cvičení 5 INP Princip kódování, pojmy Tady potřebujeme informaci zabezpečit, utajit apod. zpráva 000 111 000 0 1 0... kodér dekodér

Více

5 Přehled operátorů, příkazy, přetypování

5 Přehled operátorů, příkazy, přetypování 5 Přehled operátorů, příkazy, přetypování Studijní cíl Tento studijní blok má za cíl pokračovat v základních prvcích jazyka Java. Konkrétně budou uvedeny detaily týkající se operátorů. Doba nutná k nastudování

Více

24-2-2 PROMĚNNÉ, KONSTANTY A DATOVÉ TYPY TEORIE DATUM VYTVOŘENÍ: 23.7.2013 KLÍČOVÁ AKTIVITA: 02 PROGRAMOVÁNÍ 2. ROČNÍK (PRG2) HODINOVÁ DOTACE: 1

24-2-2 PROMĚNNÉ, KONSTANTY A DATOVÉ TYPY TEORIE DATUM VYTVOŘENÍ: 23.7.2013 KLÍČOVÁ AKTIVITA: 02 PROGRAMOVÁNÍ 2. ROČNÍK (PRG2) HODINOVÁ DOTACE: 1 24-2-2 PROMĚNNÉ, KONSTANTY A DATOVÉ TYPY TEORIE AUTOR DOKUMENTU: MGR. MARTINA SUKOVÁ DATUM VYTVOŘENÍ: 23.7.2013 KLÍČOVÁ AKTIVITA: 02 UČIVO: STUDIJNÍ OBOR: PROGRAMOVÁNÍ 2. ROČNÍK (PRG2) INFORMAČNÍ TECHNOLOGIE

Více

Číslicové obvody a jazyk VHDL

Číslicové obvody a jazyk VHDL Číslicové obvody a jazyk VHDL Návrh počítačových systémů 2007-2008 Jan Kořenek korenek@fit.vutbr.cz Proč HW realizace algoritmu Vyšší rychlost paralelní nebo zřetězené zpracování, přizpůsobení výpočetních

Více

2. LOGICKÉ OBVODY. Kombinační logické obvody

2. LOGICKÉ OBVODY. Kombinační logické obvody Hardware počítačů Doc.Ing. Vlastimil Jáneš, CSc, K620, FD ČVUT E-mail: janes@fd.cvut.cz Informace a materiály ke stažení na WWW: http://www.fd.cvut.cz/personal/janes/hwpocitacu/hw.html 2. LOGICKÉ OBVODY

Více

Integrované obvody. Obvody malé, střední a velké integrace Programovatelné obvody

Integrované obvody. Obvody malé, střední a velké integrace Programovatelné obvody Integrované obvody Obvody malé, střední a velké integrace Programovatelné obvody Integrovaný obvod zkratka: IO anglický termín: integrated circuit = IC Co to je? elekrotechnická součástka na malé ploše

Více

6 Příkazy řízení toku

6 Příkazy řízení toku 6 Příkazy řízení toku Studijní cíl Tento studijní blok má za cíl pokračovat v základních prvcích jazyka Java. Konkrétně bude věnována pozornost příkazům pro řízení toku programu. Pro všechny tyto základní

Více

Simulace číslicových obvodů (MI-SIM) zimní semestr 2010/2011

Simulace číslicových obvodů (MI-SIM) zimní semestr 2010/2011 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íce

Inovace a zkvalitnění výuky prostřednictvím ICT Základy programování a algoritmizace úloh. Ing. Hodál Jaroslav, Ph.D. VY_32_INOVACE_25 09

Inovace a zkvalitnění výuky prostřednictvím ICT Základy programování a algoritmizace úloh. Ing. Hodál Jaroslav, Ph.D. VY_32_INOVACE_25 09 Střední průmyslová škola a Vyšší odborná škola technická Brno, Sokolská 1 Šablona: Název: Téma: Inovace a zkvalitnění výuky prostřednictvím ICT Základy programování a algoritmizace úloh Operátory Autor:

Více

Sčítačky Válcový posouvač. Demonstrační cvičení 6

Sčítačky Válcový posouvač. Demonstrační cvičení 6 Sčítačky Válcový posouvač INP Demonstrační cvičení 6 Poloviční sčítačka (Half Adder) A B S C 0 0 0 0 0 1 1 0 1 0 1 0 1 1 0 1 A B HA S C S: A C: A 0 1 0 0 1 0 B 0 1 B S

Více

ALGORITMIZACE A PROGRAMOVÁNÍ

ALGORITMIZACE A PROGRAMOVÁNÍ Metodický list č. 1 Algoritmus a jeho implementace počítačovým programem Základním cílem tohoto tematického celku je vysvětlení pojmů algoritmus a programová implementace algoritmu. Dále je cílem seznámení

Více

Vzorce. StatSoft. Vzorce. Kde všude se dá zadat vzorec

Vzorce. StatSoft. Vzorce. Kde všude se dá zadat vzorec StatSoft Vzorce Jistě se Vám již stalo, že data, která máte přímo k dispozici, sama o sobě nestačí potřebujete je nějak upravit, vypočítat z nich nějaké další proměnné, provést nějaké transformace, Jinak

Více

Obsah. Předmluva 13 Zpětná vazba od čtenářů 14 Zdrojové kódy ke knize 15 Errata 15

Obsah. Předmluva 13 Zpětná vazba od čtenářů 14 Zdrojové kódy ke knize 15 Errata 15 Předmluva 13 Zpětná vazba od čtenářů 14 Zdrojové kódy ke knize 15 Errata 15 KAPITOLA 1 Úvod do programo vání v jazyce C++ 17 Základní pojmy 17 Proměnné a konstanty 18 Typy příkazů 18 IDE integrované vývojové

Více

PHP - úvod. Kapitola seznamuje se základy jazyka PHP a jeho začleněním do HTML stránky.

PHP - úvod. Kapitola seznamuje se základy jazyka PHP a jeho začleněním do HTML stránky. PHP - úvod Kapitola seznamuje se základy jazyka PHP a jeho začleněním do HTML stránky. Klíčové pojmy: PHP, webový prohlížeč, HTTP, FTP Základní pojmy služba WWW = 1990 první prototyp serveru, od roku 1994

Více

Úvod do programovacích jazyků (Java)

Úvod do programovacích jazyků (Java) Úvod do programovacích jazyků (Java) Michal Krátký Katedra informatiky VŠB Technická univerzita Ostrava Úvod do programovacích jazyků (Java), 2007/2008 c 2006 2008 Michal Krátký Úvod do programovacích

Více

Styly odstavců. Word 2010. Přiřazení stylu odstavce odstavci. Změna stylu odstavce

Styly odstavců. Word 2010. Přiřazení stylu odstavce odstavci. Změna stylu odstavce Styly odstavců V textu, který přesahuje několik stránek a je nějakým způsobem strukturovaný (což znamená, že se dá rozdělit na části (v knize jim říkáme kapitoly) a jejich podřízené části (podkapitoly),

Více

Vytvoření tiskové sestavy kalibrace

Vytvoření tiskové sestavy kalibrace Tento návod popisuje jak v prostředí WinQbase vytvoříme novou tiskovou sestavu, kterou bude možno použít pro tisk kalibračních protokolů. 1. Vytvoření nového typu sestavy. V prvním kroku vytvoříme nový

Více

MS Excel makra a VBA

MS Excel makra a VBA Autor: RNDr. Obsah: MS Excel makra a VBA 1 Využití, ukázky, výhody a nevýhody... 2 2 Makra a zabezpečení... 2 2.1 Nastavení zabezpečení Excelu... 2 2.2 Uložení maker do sešitu a osobního sešitu maker...

Více

Návrh synchronního čítače

Návrh synchronního čítače Návrh synchronního čítače Zadání: Navrhněte synchronní čítač mod 7, který čítá vstupní impulsy na vstupu x. Při návrhu použijte klopné obvody typu -K a maximálně třívstupová hradla typu NAND. Řešení: Čítač

Více

Assembler - 5.část. poslední změna této stránky: Zpět

Assembler - 5.část. poslední změna této stránky: Zpět 1 z 5 19.2.2007 7:52 Assembler - 5.část poslední změna této stránky: 9.2.2007 1. Pseudoinstrukce a direktivy Zpět Kromě instrukcí můžete v Assembleru psát také další konstrukce, které se obšem nepřekládají

Více

Výhody a nevýhody jednotlivých reprezentací jsou shrnuty na konci kapitoly.

Výhody a nevýhody jednotlivých reprezentací jsou shrnuty na konci kapitoly. Kapitola Reprezentace grafu V kapitole?? jsme se dozvěděli, co to jsou grafy a k čemu jsou dobré. rzo budeme chtít napsat nějaký program, který s grafy pracuje. le jak si takový graf uložit do počítače?

Více

Popis programu: Popis přípon důležitých souborů: *.qpf projektový soubor Quartusu

Popis programu: Popis přípon důležitých souborů: *.qpf projektový soubor Quartusu Software Quartus II Popis programu: Quartus II Web Edition je označení bezplatného software, s jehož pomocí lze napsat, zkompilovat, odsimulovat a naprogramovat FPGA a CPLD obvody firmy Altera. Cílem tohoto

Více

Digitální obvody. Doc. Ing. Lukáš Fujcik, Ph.D.

Digitální obvody. Doc. Ing. Lukáš Fujcik, Ph.D. Digitální obvody Doc. Ing. Lukáš Fujcik, Ph.D. Klopné obvody jsou nejjednodušší sekvenční součástky Záleží na předcházejícím stavu Asynchronní klopné obvody reagují na změny vstupu okamžitě Synchronní

Více

1 Stručný popis jazyku VHDL

1 Stručný popis jazyku VHDL 1 Stručný popis jazyku VHDL Jazyk VHDL (Very High Speed Integrated Circuits Hardware Description Language) je spolu s jazykem Verilog HDL jedním z nejpoužívanějším jazykům pro popis hardwarových struktur

Více

Jak v Javě primitivní datové typy a jejich reprezentace. BD6B36PJV 002 Fakulta elektrotechnická České vysoké učení technické

Jak v Javě primitivní datové typy a jejich reprezentace. BD6B36PJV 002 Fakulta elektrotechnická České vysoké učení technické Jak v Javě primitivní datové typy a jejich reprezentace BD6B36PJV 002 Fakulta elektrotechnická České vysoké učení technické Obsah Celočíselný datový typ Reálný datový typ Logický datový typ, typ Boolean

Více

Algoritmizace. 1. Úvod. Algoritmus

Algoritmizace. 1. Úvod. Algoritmus 1. Úvod Algoritmizace V dnešní době již počítače pronikly snad do všech oblastí lidské činnosti, využívají se k řešení nejrůznějších úkolů. Postup, který je v počítači prováděn nějakým programem se nazývá

Více

Ovládání Open Office.org Calc Ukládání dokumentu : Levým tlačítkem myši kliknete v menu na Soubor a pak na Uložit jako.

Ovládání Open Office.org Calc Ukládání dokumentu : Levým tlačítkem myši kliknete v menu na Soubor a pak na Uložit jako. Ukládání dokumentu : Levým tlačítkem myši kliknete v menu na Soubor a pak na Uložit jako. Otevře se tabulka, v které si najdete místo adresář, pomocí malé šedočerné šipky (jako na obrázku), do kterého

Více

Soukromá střední odborná škola Frýdek-Místek, s.r.o. VY_32_INOVACE_03_IVT_MSOFFICE_02_Excel

Soukromá střední odborná škola Frýdek-Místek, s.r.o. VY_32_INOVACE_03_IVT_MSOFFICE_02_Excel Číslo projektu Název školy Název Materiálu Autor Tematický okruh Ročník CZ.1.07/1.5.00/34.0499 Soukromá střední odborná škola Frýdek-Místek, s.r.o. VY_32_INOVACE_03_IVT_MSOFFICE_02_Excel Ing. Pavel BOHANES

Více

Práce se styly 1. Styl

Práce se styly 1. Styl Práce se styly 1. Styl Styl se používá, pokud chceme, aby dokument měl jednotný vzhled odstavců. Můžeme si nadefinovat styly pro různé úrovně nadpisů, jednotlivé popisy, charakteristiky a další odstavce.

Více

Architektura počítačů Logické obvody

Architektura počítačů Logické obvody Architektura počítačů Logické obvody http://d3s.mff.cuni.cz/teaching/computer_architecture/ Lubomír Bulej bulej@d3s.mff.cuni.cz CHARLES UNIVERSITY IN PRAGUE faculty of mathematics and physics Digitální

Více

Paměť počítače. alg2 1

Paměť počítače. alg2 1 Paměť počítače Výpočetní proces je posloupnost akcí nad daty uloženými v paměti počítače Data jsou v paměti reprezentována posloupnostmi bitů (bit = 0 nebo 1) Připomeňme: paměť je tvořena řadou 8-mi bitových

Více

1. D Y N A M I C K É DAT O V É STRUKTUR Y

1. D Y N A M I C K É DAT O V É STRUKTUR Y 1. D Y N A M I C K É DAT O V É STRUKTUR Y Autor: Petr Mik Abychom se mohli pustit do dynamických datových struktur, musíme se nejdřív podívat na datový typ ukazatel. 1. D AT O V Ý TYP U K A Z AT E L Datové

Více

Gabriela Janská. Středočeský vzdělávací institut akademie J. A. Komenského www.sviajak.cz

Gabriela Janská. Středočeský vzdělávací institut akademie J. A. Komenského www.sviajak.cz PŘÍRUČKA KE KURZU: ZÁKLADY PRÁCE NA PC MS WORD 2003 Gabriela Janská Středočeský vzdělávací institut akademie J. A. Komenského www.sviajak.cz Obsah: 1. Písmo, velikost písma, tučně, kurzíva, podtrhnout

Více

Vyučovací hodina. 1vyučovací hodina: 2vyučovací hodiny: Opakování z minulé hodiny. Procvičení nové látky

Vyučovací hodina. 1vyučovací hodina: 2vyučovací hodiny: Opakování z minulé hodiny. Procvičení nové látky Vyučovací hodina 1vyučovací hodina: Opakování z minulé hodiny Nová látka Procvičení nové látky Shrnutí 5 min 20 min 15 min 5 min 2vyučovací hodiny: Opakování z minulé hodiny Nová látka Procvičení nové

Více

Pohled do nitra mikroprocesoru Josef Horálek

Pohled do nitra mikroprocesoru Josef Horálek Pohled do nitra mikroprocesoru Josef Horálek Z čeho vycházíme = Vycházíme z Von Neumannovy architektury = Celý počítač se tak skládá z pěti koncepčních bloků: = Operační paměť = Programový řadič = Aritmeticko-logická

Více

Architektura počítačů Logické obvody

Architektura počítačů Logické obvody Architektura počítačů Logické obvody http://d3s.mff.cuni.cz/teaching/computer_architecture/ Lubomír Bulej bulej@d3s.mff.cuni.cz CHARLES UNIVERSITY IN PRAGUE faculty of mathematics and physics 2/36 Digitální

Více

Algoritmizace a programování

Algoritmizace a programování Algoritmizace a programování Řídicí struktury jazyka Java Struktura programu Příkazy jazyka Blok příkazů Logické příkazy Ternární logický operátor Verze pro akademický rok 2012/2013 1 Struktura programu

Více

Stěžejní funkce MS Excel 2007/2010, jejich ovládání a možnosti využití

Stěžejní funkce MS Excel 2007/2010, jejich ovládání a možnosti využití Stěžejní funkce MS Excel 2007/2010, jejich ovládání a možnosti využití Proč Excel? Práce s Excelem obnáší množství operací s tabulkami a jejich obsahem. Jejich jednotlivé buňky jsou uspořádány do sloupců

Více

Sada 1 - Základy programování

Sada 1 - Základy programování S třední škola stavební Jihlava Sada 1 - Základy programování 06. Proměnné, deklarace proměnných Digitální učební materiál projektu: SŠS Jihlava šablony registrační číslo projektu:cz.1.09/1.5.00/34.0284

Více

Koncept pokročilého návrhu ve VHDL. INP - cvičení 2

Koncept pokročilého návrhu ve VHDL. INP - cvičení 2 Koncept pokročilého návrhu ve VHDL INP - cvičení 2 architecture behv of Cnt is process (CLK,RST,CE) variable value: std_logic_vector(3 downto 0 if (RST = '1') then value := (others => '0' elsif (CLK'event

Více

2 Strukturované datové typy 2 2.1 Pole... 2 2.2 Záznam... 3 2.3 Množina... 4

2 Strukturované datové typy 2 2.1 Pole... 2 2.2 Záznam... 3 2.3 Množina... 4 Obsah Obsah 1 Jednoduché datové typy 1 2 Strukturované datové typy 2 2.1 Pole.................................. 2 2.2 Záznam................................ 3 2.3 Množina................................

Více

Zobrazení zdrojových dat u krabicového grafu

Zobrazení zdrojových dat u krabicového grafu StatSoft Zobrazení zdrojových dat u krabicového grafu Krabicový graf zobrazuje informace o poloze i variabilitě dat. Zachycujeme na něm různé charakteristiky a někdy může být žádoucí zobrazit si v grafu

Více

Simulace číslicových obvodů (MI-SIM) zimní semestr 2010/2011

Simulace číslicových obvodů (MI-SIM) zimní semestr 2010/2011 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íce

Systém řízení sběrnice

Systém řízení sběrnice Systém řízení sběrnice Sběrnice je komunikační cesta, která spojuje dvě či více zařízení. V určitý okamžik je možné aby pouze jedno z připojených zařízení vložilo na sběrnici data. Vložená data pak mohou

Více

MS SQL Server 2008 Management Studio Tutoriál

MS SQL Server 2008 Management Studio Tutoriál MS SQL Server 2008 Management Studio Tutoriál Vytvoření databáze Při otevření management studia a připojením se ke konkrétnímu sql serveru mám v levé části panel s názvem Object Explorer. V tomto panelu

Více

Popis ovládání. Po přihlášení do aplikace se objeví navigátor. Navigátor je stromově seřazen a slouží pro přístup ke všem oknům celé aplikace.

Popis ovládání. Po přihlášení do aplikace se objeví navigátor. Navigátor je stromově seřazen a slouží pro přístup ke všem oknům celé aplikace. Popis ovládání 1. Úvod Tento popis má za úkol seznámit uživatele se základními principy ovládání aplikace. Ovládání je možné pomocí myši, ale všechny činnosti jsou dosažitelné také pomocí klávesnice. 2.

Více

P4 LOGICKÉ OBVODY. I. Kombinační Logické obvody

P4 LOGICKÉ OBVODY. I. Kombinační Logické obvody P4 LOGICKÉ OBVODY I. Kombinační Logické obvody I. a) Základy logiky Zákony Booleovy algebry 1. Komutativní zákon duální forma a + b = b + a a. b = b. a 2. Asociativní zákon (a + b) + c = a + (b + c) (a.

Více

VYTVÁŘENÍ DATABÁZÍ, VKLÁDÁNÍ ÚDAJŮ

VYTVÁŘENÍ DATABÁZÍ, VKLÁDÁNÍ ÚDAJŮ Úvod do problematiky VYTVÁŘENÍ DATABÁZÍ, VKLÁDÁNÍ ÚDAJŮ Databáze je uspořádaná množina velkého množství informací (dat). Příkladem databáze je překladový slovník, seznam PSČ nebo telefonní seznam. Databáze

Více

8 Třídy, objekty, metody, předávání argumentů metod

8 Třídy, objekty, metody, předávání argumentů metod 8 Třídy, objekty, metody, předávání argumentů metod Studijní cíl Tento studijní blok má za cíl pokračovat v základních prvcích jazyka Java. Konkrétně bude věnována pozornost třídám a objektům, instančním

Více

KAPITOLA 5 - POKROČILÉ ZPRACOVÁNÍ TEXTU

KAPITOLA 5 - POKROČILÉ ZPRACOVÁNÍ TEXTU KAPITOLA 5 - POKROČILÉ ZPRACOVÁNÍ TEXTU KLÍČOVÉ POJMY Oddíly, styly, poznámka pod čarou, revize, obsah, rejstřík, záložka, citace a seznamy literatury, vzorce, vložené a propojené objekty, oddíly, zabezpečení.

Více

Programování v jazyku LOGO - úvod

Programování v jazyku LOGO - úvod Programování v jazyku LOGO - úvod Programovací jazyk LOGO je určen pro výuku algoritmizace především pro děti školou povinné. Programovací jazyk pracuje v grafickém prostředí, přičemž jednou z jeho podstatných

Více

Návrh ovládání zdroje ATX

Návrh ovládání zdroje ATX Návrh ovládání zdroje ATX Zapínání a vypínání PC zdroj ATX se zapíná spojením řídicího signálu \PS_ON se zemí zapnutí PC stiskem tlačítka POWER vypnutí PC (hardwarové) stiskem tlačítka POWER a jeho podržením

Více

Simulace číslicových obvodů (MI-SIM) zimní semestr 2010/2011

Simulace číslicových obvodů (MI-SIM) zimní semestr 2010/2011 Evropský sociální fond Praha & EU: Investujeme do vaší budoucnosti Simulace číslicových obvodů (MI-SIM) imní semestr 2/2 Jiří Douša, katedra číslicového návrhu (K83), České vysoké učení technické v Prae,

Více

Číselné vyjádření hodnoty. Kolik váží hrouda zlata?

Číselné vyjádření hodnoty. Kolik váží hrouda zlata? Čísla a logika Číselné vyjádření hodnoty Au Kolik váží hrouda zlata? Dekadické vážení Když přidám osmé závaží g, váha se převáží => závaží zase odeberu a začnu přidávat závaží x menší 7 závaží g 2 závaží

Více

Programování v C++ Úplnej úvod. Peta (maj@arcig.cz, SPR AG 2008-9)

Programování v C++ Úplnej úvod. Peta (maj@arcig.cz, SPR AG 2008-9) Programování v C++ Úplnej úvod Co se naučíte? tak samozřejmě C++, s důrazem na: dynamické datové struktury Objektově Orientované Programování STL (standardní knihovna šablon) vytváření vlastních šablon

Více

Voltampérová charakteristika diody

Voltampérová charakteristika diody Voltampérová charakteristika diody Pozn.: Voltampérovou charakteristiku diod, resp. i rezistorů, žárovek aj. lze proměřovat se soupravou ISES-PCI a též i s ISES-USB. Souprava ISES-PCI, resp. ISES-PCI Professional

Více

5a. Makra Visual Basic pro Microsoft Escel. Vytvořil Institut biostatistiky a analýz, Masarykova univerzita J. Kalina

5a. Makra Visual Basic pro Microsoft Escel. Vytvořil Institut biostatistiky a analýz, Masarykova univerzita J. Kalina 5a. Makra Visual Basic pro Microsoft Escel Vytvořil Institut biostatistiky a analýz, Masarykova univerzita J. Kalina Cyklické odkazy a iterativní výpočty Zde bude stránka o cyklických odkazech a iteracích.

Více

Webové stránky. 4. Tvorba základní HTML webové stránky. Datum vytvoření: 25. 9. 2012. str ánk y. Vytvořil: Petr Lerch. www.isspolygr.

Webové stránky. 4. Tvorba základní HTML webové stránky. Datum vytvoření: 25. 9. 2012. str ánk y. Vytvořil: Petr Lerch. www.isspolygr. Webové stránky 4. Tvorba základní HTML Vytvořil: Petr Lerch www.isspolygr.cz Datum vytvoření: 25. 9. 2012 Webové Strana: 1/9 Škola Ročník Název projektu Číslo projektu Číslo a název šablony Autor Tématická

Více

Excel Asistent Magazín 06/2003

Excel Asistent Magazín 06/2003 Excel Asistent Magazín 06/2003 Pojmenované oblasti Jiří Číhař, Dataspectrum http:// // ExcelAsistentMagazín je určen k volnému šíření. Pokud Vás jeho obsah zaujal, zašlete jej prosím svým kolegům a přátelům.

Více

Digitální obvody. Doc. Ing. Lukáš Fujcik, Ph.D.

Digitální obvody. Doc. Ing. Lukáš Fujcik, Ph.D. Digitální obvody Doc. Ing. Lukáš Fujcik, Ph.D. Obvody s třístavovým výstupem dva tranzistory: vodivostní kanál typ N vodivostní kanál typ P X CS 3 stavový sa výstup Y P logika X 3 stavový výstup W N CS

Více

6. Příkazy a řídící struktury v Javě

6. Příkazy a řídící struktury v Javě 6. Příkazy a řídící struktury v Javě Příkazy v Javě Příkazy v Javě Řídicí příkazy (větvení, cykly) Přiřazovací příkaz = Řízení toku programu (větvení, cykly) Volání metody Návrat z metody - příkaz return

Více