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

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

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

Souhrn Apendixu A doporučení VHDL

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

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

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

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

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

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

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

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

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

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

Programovací jazyk Pascal

Vývoj VHDL. Verilog HDL

14. Složitější konstrukce

- speciální symboly + - * / =., < > <> <= >= a další. Klíčová slova jsou chráněnými útvary, které nelze použít ve významu identifikátorů.

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

Algoritmizace a programování

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

Architektura počítačů Logické obvody

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

Architektura počítačů Logické obvody

- znakové konstanty v apostrofech, např. a, +, (znak mezera) - proměnná zabírá 1 byte, obsahuje kód příslušného znaku

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

Úvod do programovacích jazyků (Java)

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

1 Stručný popis jazyku VHDL

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

Úvod do jazyka VHDL. Jan Kořenek Návrh číslicových systémů

Datové typy a struktury

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

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

MQL4 COURSE. By Coders guru -4 Operace & Výrazy

Základní znaky. - Ve srovnání se Spice jsou velmi složité a vyžadují dlouhou dobu na plné osvojení. - Velmi nákladné simulační programy.

Předmluva k aktuálnímu vydání Úvod k prvnímu vydání z roku Typografické a syntaktické konvence... 20

Programování v jazyce JavaScript

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

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

Výrazy, operace, příkazy

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

VISUAL BASIC. Práce se soubory

Object Pascal je přísně typový procedurální jazyk, který umožňuje jak strukturované, tak objektově orientované programování.

LabView jako programovací jazyk II

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

Sada 1 - Základy programování

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

NPRG030 Programování I, 2010/11

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

Data v počítači. Informační data. Logické hodnoty. Znakové hodnoty

Aplikovaná informatika. Podklady předmětu Aplikovaná informatika pro akademický rok 2006/2007 Radim Farana. Obsah. Obsah předmětu

O datových typech a jejich kontrole

NPRG030 Programování I, 2016/17 1 / :58:13

Test prvočíselnosti. Úkol: otestovat dané číslo N, zda je prvočíslem

EVROPSKÝ SOCIÁLNÍ FOND. Úvod do PHP PRAHA & EU INVESTUJEME DO VAŠÍ BUDOUCNOSTI

VÝRAZY výrazy = operandy prokládané operátory, vyhodnocované podle priority operátorů

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

7. Datové typy v Javě

Ahoj mami. Uložení dat v počítači. Příklady kódování dat. IAJCE Přednáška č. 4

2 Strukturované datové typy Pole Záznam Množina... 4

Opakování programování

VÝUKOVÝ MATERIÁL. Bratislavská 2166, Varnsdorf, IČO: tel Číslo projektu

Úvod do programování. Lekce 1

Princip funkce počítače

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

Struktura a architektura počítačů (BI-SAP) 10

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

Zápis programu v jazyce C#

Jazyk PL/SQL Úvod, blok

Ukazka knihy z internetoveho knihkupectvi

a operačních systémů

Elementární datové typy

Úvod do jazyka C. Ing. Jan Fikejz (KST, FEI) Fakulta elektrotechniky a informatiky Katedra softwarových technologií

LEKCE 6. Operátory. V této lekci najdete:

PŘETĚŽOVÁNÍ OPERÁTORŮ

Strojový kód. Instrukce počítače

Sada 1 - Základy programování

Bitové operátory a bitová pole. Úvod do programování 2 Tomáš Kühr

Maturitní otázky z předmětu PROGRAMOVÁNÍ

Reprezentace dat v informačních systémech. Jaroslav Šmarda

NPRG030 Programování I, 2017/18 1 / :22:16

ADT/ADS = abstraktní datové typy / struktury

Algoritmizace a programování. Ak. rok 2012/2013 vbp 1. ze 44

Java reprezentace dat, výrazy. A0B36PR1-Programování 1 Fakulta elektrotechnická České vysoké učení technické

Data, výrazy, příkazy

Jazyk C# a platforma.net

Programovací jazyk C++ Hodina 1

7 Formátovaný výstup, třídy, objekty, pole, chyby v programech

Odvozené a strukturované typy dat

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

- znakové konstanty v apostrofech, např. a, +, (znak mezera) - proměnná zabírá 1 byte, obsahuje kód příslušného znaku

Programování v C++, 2. cvičení

Proměnné a parametry. predn_08.odt :00:38 1

dovolují dělení velkých úloh na menší = dekompozice

BI-PA1 Programování a algoritmizace 1 Katedra teoretické informatiky

Semestrální práce z předmětu. Jan Bařtipán / A03043 bartipan@studentes.zcu.cz

Ing. Igor Kopetschke TUL, NTI

SHIFTIN sclk, sdata, mode, (data{/ bits} {, data {/ bits},...}) SPIIN sclk, sdata, mode, (data{/ bits} {, data {/ bits},...})

Stručný obsah První týden Druhý týden 211 Třetí týden 451 Rejstřík 787

Úvod do problematiky obvodů FPGA pro integrovanou výuku VUT a VŠB-TUO

Transkript:

Evropský sociální fond Praha & EU: Investujeme do vaší budoucnosti Simulace číslicových obvodů (MI-SIM) zimní semestr 2010/2011 Jiří Douša, katedra číslicového návrhu (K18103), České vysoké učení technické v Praze, fakulta informačních technologií Přednáška 3: VHDL - datové typy Stručný obsah: přehled datových typů, jejich atributů a příslušných operátorů, inicializace proměnných a signálů, přístupy k polím, přiřazení hodnot polím, datový typ std_logic a příslušné operátory, konverze typů, knihovny std_logic_1164, std_logic_signed, std_logic_unsigned, std_logic_arith,.

Datové typy Přehled datových typů ve VHDL: 1) skalární typy (lze uspořádat, nelze dekomponovat) existují jako předdefinované typy (lze definovat i nové typy) diskrétní (lze použít pro indexování polí) integer výčtový real fyzikální 2) složené typy pole záznamy 3) přístupový typ ( ukazatel ) 4) soubor Poznámky: VHDL : silný typový systém s jmennou ekvivalencí, pro přesun hodnot mezi objekty různých typů jsou nutné explicitní konverse VHDL dovoluje definovat podtypy dat: vymezení podmnožiny hodnot určitého předem deklarovaného typu; v tomto případě nejde o nový typ => při mixování s původním bázovým typem není třeba konverse 21.10.2011 MI-SIM Jiří Douša 2

Skalární datové typy syntax deklarace: type < ident zakl. typu> is <definice typu>; subtype <ident podtypu> is <ident základ. typu> < vymezení rozsahu> předdefinované typy a podtypy ( knihovna STANDARD): integer: type integer is range - (2**31) to (2**31) - 1; subtype natural is integer range 0 to integer high; subtype positive is integer range 1 to integer high; real: type real is range -1.0E 308 to 1.0 E 308; výčtový: type bit is ( 0, 1 ); type boolean is (false, true); type character is (. A ); fyzikální type time is range - imlementačně závislé modelový čas je automaticky udržován pro získání okamžité hodnoty: funkce now 21.10.2011 MI-SIM Jiří Douša 3

Skalární datové typy pro fyzikální typy lze definovat jednotky jednotky předdefinovaného typu time: units fs; --základní jednotka ps = 1000 fs; --odvozené ns = 1000 ps; --jednotky us = 1000 ns; ms = 1000 us; sec = 1000 ms; min = 60 sec; hr = 60 min; end units; Příklady uživatelem nově definovaných typů: type I1 is range 0 to 3; -- definice nového typu subtype I2 is integer range 0 to 3; -- definice podtypu type R1 is range 0.0 to 5.0; type op is (add, sub, mul,.); --výčtový typ type resistance is range 0 to integer high units mohm; Ohm = 1000 mohm; kohm = 1000 Ohm; end units; 21.10.2011 MI-SIM Jiří Douša 4

Aritmetické operátory označení: I-integer, IL-integer. literál, R-real, RL-real literál., T-time, binární: +, -, *, /, rem, mod, ** unární: +, -, abs požadují stejný typ operandů, jsou definovány pro datové typy takto: +, - : I, I ->I; R, R ->R; T, T -> T, rem, mod : I, I -> I, Poznámka: rem, mod.zbytek po celočíselném dělení rem: A rem B = A - (A / B) * B znaménko výsledku = znaménko dělence př: 4 rem 3=1, - 4 rem 3= - 1, 4 rem (- 3)= 1, - 4 rem (- 3 )= - 1 mod: A mod B = A - B * N; znaménko výsledku = znaménko dělitele př: 4 mod 3= 1, -4 mod 3= 2, 4 mod (-3)= -2, - 4 mod (-3)= -1 *, / : I,I ->I; R,R ->R, T*IL ->T; T*RL ->T T/IL ->T; T/RL ->T; T/T ->I ** : I** (+IL) -> I, R** (+IL) -> R; R**(-IL) -> R abs : I -> I; R ->R; T -> T Poznámka: některé z aritmetických operátorů jsou definovány v dalších knihovnách i pro jiné typy. 21.10.2011 MI-SIM Jiří Douša 5

Logické a relační operátory Logické operátory binární: and, or, nand, nor, xor, nxor ( pouze VHDL-93) unární: not předdefinovány ve VHDL pro typy: bit, bit_vector, boolean a jednorozměrné pole s prvky typu boolean, typ výsledku: stejný jako typ operandů, oba operandy musí být stejného typu a stejné délky. Relační operátory všechny jsou binární: =, /=, >, <, <=, >=, jsou definovány pro předdefinované skalární typy a pro jednodimensionální pole s prvky celočíselného nebo výčtového typu, oba operandy musí být stejného typu, výsledek je vždy typu boolean, operátory = a /= jsou definovány pro všechny předdefinované datové typy kromě typu file. 21.10.2011 MI-SIM Jiří Douša 6

Předdefinované datové typy a operace typ operátory podmínka typ výsledku bit logické bit relační boolean (&) zřetězení bit_vector boolean logické stejná délka boolean relační bolean & pole boolean integer +, -, rem, mod, *, /, **, abs integer natural +, -, rem, mod, *, /, **, abs natural positive +, -, rem, mod, *, /, **, abs positive real +, -, *, /, **, abs real time +, -, *, /, abs time delay_length +, -, *, /, abs delay_length character relační boolean & string bit_vector logické stejná délka bit_vector relační boolean & bit_vector string relační boolean & string 21.10.2011 MI-SIM Jiří Douša 7

Literály symboly, jejichž hodnoty jsou zřejmé z jejich representace Příklady: typ integer: 0, 123, 10E4 -- dekadická soustava 8#730# -- oktalová soustava 16#DEAC# -- hexadecimální soustava 2#10111# -- binární soustava typ real: 65.73, 43.6E-4, 8#31.1#, 2#1.11# typ character: A, H typ string: ABCDEFG typ bit_vector: B 010111110 -- binární soustava 010111110 -- binární soustava X F7 -- hexadecimální soustava O 77 -- oktalová soustava typ time: 15 ns, 10 min, 45 hr 21.10.2011 MI-SIM Jiří Douša 8

Atributy datových typů hodnota atributu : <jméno typu> <jméno atributu> předdefinované atributy všech skalárních datových typů: left.vrací levou mez ( z oboru hodnot) right.vrací pravou mez high.vrací horní mez (viz. integer high) low.vrací dolní mez diskrétní a fyzikální typy mají navíc: succ (h) vrací hodnotu následující za hodnotou h pred (h) vrací hodnotu předcházející h leftof (h) vrací hodnotu levého souseda h rightof (h) vrací hodnotu pravého souseda h atributy leftof, rightof - citlivé na uspořádání každý výčtový typ definuje vzestupné uspořádání leftof = pred, rightof = succ vzestupné uspořádání leftof = succ, rightof = pred...sestupné uspořádání pos (h) vrací posici hodnoty h stanovení posice: výčtový typ: <jméno typu> pos (<jméno typu> left) = 0 typ integer: <jméno typu> pos (<jméno typu> left) = <jméno typu> left val (p)....vrací hodnotu na posici p 21.10.2011 MI-SIM Jiří Douša 9

Atributy datových typů Příklad : type p1 is range 5 downto 0; hodnoty atributů typu p1: p1 left = 5, p1 right = 0, p1 high = 5, p1 low = 0, p1 pred (4) = 3, p1 succ (4) = 5, p1 leftof (4) = 5, p1 rightof (4) = 3, p1 pos (0) = 0, p1 val(5) = 5, p1 pos (5)=5, p1 val(0)=0 Příklad : type p11 is range 0 to 5; hodnoty atributů typu p11: p11 val (0) = 0, p11 pos (0) = 0, p11 před (4) = 3, p11 leftof (4) = 3, p11 rightof (4) = 5, Příklad : type p2 is ( A, B, C, D ); hodnoty atributů typu p2: p2 left = A, p2 right= D, p2 high= D, p2 low= A, p2 pred ( B ) = A, p2 succ ( B ) = C, p2 leftof ( C ) = B, p2 rightof ( C ) = D, p2 pos ( A ) = 0, p2 val (0)= A, p2 pos ( D ) = 3, aplikace na fyzický typ time: time succ (23.5 ps) = 23501 fs; time před (23.5 ps) = 23499 fs; 21.10.2011 MI-SIM Jiří Douša 10

Inicializace objektů ve VHDL implicitně: implicitní hodnota = <jméno typu> left př.: type bit is ( 0, 1 ); type std_logic is ( U, 0, 1,.); type operace is (add, mul, div,..); type boolean (false, true); type integer... ( -2 147 483 648,.); type time.. ( -9 223 372 036 854 775 807,.); subtype positive. ( 1, ); subtype natural (0, 1..); explicitně: při deklaraci proměnných i signálů: př.: signal x : bit := 1 ; signal reg: std_logic_vector (7 downto 0) := to_stdlogicvector ( X A3 ); -- konverse hodnoty variable pom : boolean := true; variable citac: integer := 123; constant y: real := 2.73; 21.10.2011 MI-SIM Jiří Douša 11

concatenation: & binární operátor, Operátor zřetězení vyžaduje operandy stejného typu, operand: může být jednorozměrné pole nebo prvek, jednorozměrného pole, může být prvkem druhého operandu, nejčastější použití: paralelní sjednocení vodičů, rozšíření operandů, sjednocení stringů, Posuvy. Příklad: předpokládané deklarace vodičů (pro použití následujícím slajdu): signal A1: bit_vector (1 downto 0); signal A2: bit_vector (1 downto 0); signal C: bit_vector (3 downto 0); signal CC: bit_vector (7 downto 0); 21.10.2011 MI-SIM Jiří Douša 12

Operátor sjednocení: příklady sjednoceni vodičů a přenos hodnot: A1 C <= A1 & A2; A2 test hodnot: if A1 & A2 = 0101 then.end if; rozšíření řádové mřížky (na 8 bitů): CC <= C(3) & C(3) & C(3) & C(3) & C; realizace posuvů: C <= C (2 downto 0) & 0 ; C <= C(3) & C (3 downto 1) ; C <= C (2 downto 0) & 0 ; C <= 0 & C (3 downto 1); C <= C (2 downto 0) & C(3); C <= C(0) & C (3 downto 1); -- SLA -- SRA -- SLL -- SRL -- ROL -- ROR Poznámka: operátor nelze použít v cílovém objektu např.: A1 & A2 <= C; -- chyba 21.10.2011 MI-SIM Jiří Douša 13

Operátory posuvů VHDL-93: nabízí nové operátory pro posuvy SLL, SRL.logický posuv vlevo, vpravo ROL, ROR,.rotace vlevo, vpravo SLA, SRA..aritmetický posuv vlevo, vpravo příklady: nechtˇ a = 01101, b = 11100 q1 <= a sll 2; -- q1 = 10100 q2 <= a sla 2; -- q2 = 10111.zachovává nejnižší bit??? q3 <= b sla 2; -- q3 = 10000. zachovává nejnižší bit??? q4 <= a ror 2; -- q4 = 01011 q5 <= a sra 2; -- q5 = 00011. zachovává nejvyšší bit q6 <= b sra 2; -- q6 = 11111. zachovává nejvyšší bit prostředek pro zavedení alternativního jména: alias -- důvody: přejmenování nevhodných názvů nebo speciální pojmenování částí vektorů signal instr: bit_vector (15 downto 0); -- alternativní jména částí instrukce: alias op_kod: bit_vector (3 downto 0) is instr (15 downto 12); alias reg: bit_vector (2 downto 0) is instr (11 downto 9); alias adresa: bit_vector (8 downto 0) is instr ( 8 downto 0); 21.10.2011 MI-SIM Jiří Douša 14

lze definovat vícerozměrná pole Datový typ pole prvkem pole může být opět pole (pole polí) nedeterminovaná (unconstrained) pole: nespecifikovaný rozsah indexů v deklaraci typu dimensi lze specifikovat při deklaraci proměnných, signálů, konstant předdefinované typy (knihovna STANDARD): type string is array (positive range <>) of character; type bit_vector is array (natural range <>) of bit; Příklad: deklarace proměnné typu bit_vector: variable b1: bit_vector (7 downto 0); --typ proměnné -- b1 je vytvořen jako podtyp typu bit_vector s dimensí 8 bitů determinovaná (constrained) pole: specifikovaný rozsah indexů index: musí být diskrétní typ ( integer, výčtový) Příklad: typ dvourozměrné pole : type mem1 is array (integer range 0 to 31, 7 downto 0) of bit; také: type mem1 is array (0 to 31, 7 downto 0) of bit; jinak: type b8 is range 7 downto 0; type adresa is range 0 to 31; type mem2 is array (adresa, b8) of bit; 21.10.2011 MI-SIM Jiří Douša 15

Příklady: Datový typ pole subtype cele_cislo is integer range 0 to 128; subtype byte1 is bit_vector (7 downto 0); -- podtyp -- podtyp subtype male_pis is character range a to z ; -- podtyp subtype byte2 is array (7 downto 0) of bit; type byte3 is bit_vector (7 downto 0); -- chyba -- v definici podtypu není uveden typ -- chyba -- podtyp nelze použít k deklaraci typu type byte4 is array (7 downto 0) of bit; --jde o zcela nový typ; Poznámka: podtyp a příslušný typ jsou kompatibilní (hodnoty podtypu musí vyhovovat omezení) Explicitní konverse polí: jméno signálu typu t <= t (jméno signálu konvertibilního typu); type t is array ( 0 to 3) of bit; type tt is array ( 0 to 3) of bit; signal st :t; signal stt : tt; st <= t (stt); -- konverse typu tt na t stt <= tt (st); -- konverse typu t na tt Podmínka explicitní konverse pro pole: stejné dimense polí, stejné typy indexů, stejné typy prvků 21.10.2011 MI-SIM Jiří Douša 16

Přístupy k prvkům polí individuální přístup: indexy skupinový přístup: řezy polí ke všem prvkům pole: identifikátor pole a) indexování: Příklad 1: bitově orientovaná paměť s koincidenčním výběrem požité typy: viz dříve variable RAM2: mem2; -- bitově orientovaná paměť variable adr: adresa; -- index bajtů variable index: b8; -- index bitů variable d_bit: bit; -- jednobitová proměnná d_bit := RAM2 (adr, index); --čtení bitu Příklad 2: bajtově orientovaná paměť type byte is array (7 downto 0) of bit; --typ byte type mem3 is array (adresa) of byte; --typ pole bajtů variable d_byte: byte; -- proměnné typu byte variable RAM3: mem3; --bajtově orientovaná paměť d_byte := RAM3 (adr); --čtení bajtu d_bit := RAM3 (adr) (index); -- čtení bitu 21.10.2011 MI-SIM Jiří Douša 17

Přístupy k prvkům polí b) řezy polí (slices): umožňují pracovat se spojitou podmnožinou pole, v řezu je nutno zachovat stejný směr v rozsahu indexů jako v deklaraci( downto nebo to ) a stejné délky na obou stranách přiřazovacího příkazu. Příklady: variable c: bit_vector (3 downto 0); variable d_byte: bit_vector (7 downto 0); d_byte ( 7 downto 4 ) := 1010 ; --zápis do horních bitů c := d_byte ( 3 downto 0); -- čtení dolních bitů c ) celá pole identifikátor pole representuje všechny hodnoty pole signal reg1, reg2: bit_vector ( 7 downto 0); signal reg3: bit_vector ( 0 to 7); reg1 <= reg2; -- MOV reg1, reg2 reg3 <= reg2; --reg3 (0) <= reg2 (7)... --reg3 (7) <= reg2 (0) 21.10.2011 MI-SIM Jiří Douša 18

Přiřazení hodnot polím použití: zápis množiny hodnot do registrů, pamětí Příklad: možné způsoby přiřazení hodnot vektoru předpoklad: deklarace pole: signal a: bit_vector ( 3 downto 0 ); řetězec bitů délky 4: a <= 0101 ; použití agregátů (specifikace složených hodnot): ( *<výběr>+ <výraz>,..., *<výběr>+ <výraz> ) mapování bez výběru: poziční (záleží na pořadí) a <= ( 0, 1, 0, 1 ) ; --poziční mapování čtyř hodnot mapování s výběrem: jmenné (nezáleží na pořadí) možnosti pro <výběr>: 0 => -- výběr indexu 0 3 to 5 => -- výběr řezu 5 downto 3 => -- výběr řezu others => -- výběr všech zbývajících indexů pokud se výběr others nevztahuje na všechny prvky musí být vždy poslední Příklady přiřazení: symbol označuje a: a <= (3 1=> 0, 2 0 => 1 ); -- efekt jako 0101 a <= (0 => 1, 2 => 1, others => 0 );-- 0101 a <= (others => 0 ); --ekvivalentní s a <= 0000 ; 21.10.2011 MI-SIM Jiří Douša 19

Přiřazení hodnot polím následující signálové přiřazovací příkazy demonstrují možnosti zápisů hodnot do pamětí v průběhu výpočtu: ----------předpokládané deklarace typů: subtype byte is bit_vector (7 downto 0); type memory_4x8 is array (0 to 3) of byte; ----------předpokládané deklarace signálů: signal r1, r2, r3, r4: byte; --deklarace registru signal Mem: memory_4x8; --deklarace paměti ----------příklady přiřazení hodnot: Mem(0) < = 01010101 ; --přiřazení 0. řádku Mem(3) <= ; --přiřazení 3. řádku Mem <= (r1, r2, r3, r4); --přepis celého pole Mem (3)(0) < = 1 ; --přepis jediného bitu Mem (0) <= (others => 0 ); --nuluje 0. řádek Mem (3) <= (others => 0 ); --nuluje 3. řádek Mem<=(others =>(others => 0 ));--nuluje celé pole 21.10.2011 MI-SIM Jiří Douša 20

Přiřazení hodnot polím Příklad: inicializaci pevné paměti nechtˇ subtype byte is bit_vector (7 downto 0) ; type memory_4x8 is array (0 to 3) of byte; constant ROM: memory_4x8 := memory_4x8 -- toto je kvalifikace literálu pro typ memory_4x8: (( 0,.., 0 ), -- 0. osmice bitů ( ), (...), (...)); -- 3. osmice bitů Poznámka: další možnosti zápisu téhož příkladu: constant ROM: mem_4x8 := mem_4x8 (B"0000_0000", B"0000_0001", B"0001_0000", B"0011_0000") ; constant ROM: mem_4x8 := mem_4x8 ("00000000", "00000001", "00010000", "00110000") ; constant ROM: mem_4x8 := mem_4x8 ( X 00, X"01", X"10, X"11 ) ; 21.10.2011 MI-SIM Jiří Douša 21

Atributy polí získání hodnoty atributu: < jméno objektu> <jméno atributu > nebo < jméno typu> <jméno atributu> atributy jednorozměrných polí (aplikovány na indexy pole) left, right, high, low, length.vrací délku pole, range, inverse_range. vrací rozsah pole, resp. invertovaný rozsah pole. Příklad deklarace: subtype byte is bit_vector (7 downto 0); variable a1: byte; a1 length = 8; a1 inverse_range =0 to 7, a1 range= 7 downto 0 Použití: v cyklech (uvnitř procesů a podprogramů) které operují s porty či parametry typu nedeterminovaná pole, atributy vícerozměrných polí: každá dimense má svou sadu atributů, atributy jednotlivých dimensí jsou indexovány. Příklad deklarace: type mem is array (0 to 3) of byte; signal a2: mem; a2 left(1)=0, a2 right(1) = 3, a2 left (2) = 7, a2 right (2) = 0, a2 length (1) = 4 --1. index, a2 length (2) = 8 -- 2. index a2 range (1) = 0 to 3, a2 range (2) = 7 downto 0, a2 inverse_range (1) = 3 to 0, a2 inverse_range (2) = 0 to 7, 21.10.2011 MI-SIM Jiří Douša 22

Datový typ soubor (file) použití: čtení budících vstupů, naplňování pamětí ze souborů (položkou souboru nemůže být ukazatel, vícerozměrné pole, soubor) VHDL-87 : soubor lze otevřít pouze pro čtení nebo zápis, file vstup: data_file is [in] test1.dat ; -- deklarace binárního souboru a otevření pro čtení file vystup: data_file is out test2.dat ; -- deklarace binárního souboru a otevření pro zápis předdefinované operace se souborem: READ (<soubor>, <prom.>); -- fyzické čtení ze souboru WRITE( <soubor> <prom>); --fyzický zápis do souboru ENDFILE (<soubor>) --funkce: test na konec binární ukládání do souborů netextových typů Příklad: čtení ze souboru vstup -- předpoklad deklarací: type byte is array ( 7 downto 0) ; type data_file is file of byte; -- deklarace typu soubor variable V: byte; signal PAM: array (.) of byte;.; -- následujeící příkazy musí být v sekvenčním prostředí while not endfile ( vstup) loop read (vstup, V); PAM (.) <= V; ; end loop; 21.10.2011 MI-SIM Jiří Douša 23

Datový typ soubor VHDL-93: file vstup1: zavádí další možnosti pro otevírání a zavírání souborů data_file; -- pouze deklarace (pozdější otevřění) file vstup2: data_file is test2.dat ; -- stejné jako ve VHDL-87 (deklarace souboru a otevření pro čtení) file soubor: data_file open <mode> is test2.dat -- deklarace souboru a otevření dle hodnoty <mode> <mode>: read_mode..otevření pro čtení write_mode.otevření pro zápis append_mode...otevření pro připojení FILE_OPEN ( vstup1, test1.dat, < mode>);.explicitní otevření a vazba na konkrétní fyzický soubor FILE_CLOSE (vstup1);.explicitní zavření READ, WRITE, ENDFILE..jako ve VHDL-87 VHDL-87 i VHDL-93: podpora textových souborů - knihovna TEXTIO: umožňuje formátování, vhodné pro analýzy výstupů, přenosy souborů mezi platformami, vypracování testovacích souborů (v ASCII kódu). 21.10.2011 MI-SIM Jiří Douša 24

Knihovna TEXTIO Předdefinované typy: type text is file of string; type line is access string; -- typ textový soubor -- ukazatel na vyrovnávací paměť Předdefinované operace pro práci s textovými soubory : označení: TSB objekt typu textový soubor, BUF..proměnná typu line, PROM proměnná typu bit, bit_vector, boolean, string, character, integer, real, time readline (TSB, BUF) fyzické čtení ze souboru TSB do vyrovnávací paměti odkazované proměnnou BUF read (BUF, PROM) extrakce jedné hodnoty z vyrovnávací paměti a její zápis do proměnné PROM (přetížené procedury definované pro všechny typy PROM) write (BUF, PROM) připojení hodnoty proměnné PROM na konec textu ve vyrovnávací paměti (přetížené procedury ) writeline (TSB, BUF).fyzický zápis vyrovnávací paměti do souboru TSB endfile (TSB)..test souboru TSB; v případě konce souboru vrací hodnotu true endline (BUF) dle normy: vrací hodnotu true v případě vyprázdnění bufferu v ModelSimu neimplementována náhrada: testem (BUF = NULL ) nebo (BUF length = 0) 21.10.2011 MI-SIM Jiří Douša 25

Příklad: čtení ze souboru; Knihovna TEXTIO formát řádku = hodnota času + hodnota typu bit_vector (0 to7) file vstup: text is [in] ; -- otevření pro čtení -- následuje varianta otevření je přípustná pouze pro VHDL-93 --file vstup: text open read_mode is. ; -- následují deklarace proměnných a čtecí cyklus ( pouze v -- sekvenčním prostředí): variable buf: line; -- ukazatel na vyrovnávací paměť variable cas: time; variable vst: bit_vector (0 to 7); while not endfile (vstup) loop readline (vstup, buf ); --fyzické čtení read ( buf, cas ); -- zápis do cas --logické čtení read ( buf, vst ); -- zápis do vst end loop; 21.10.2011 MI-SIM Jiří Douša 26

Knihovna std_logic_1164 Typy definované v knihovně std_logic_1164: type -- hodnota síla std_ulogic is ( U, -- uninitialized X, -- unknown forsing 0, -- 0 forsing 1, -- 1 forsing Z, -- high Impedance W, -- unknown resistive L, -- 0 resistive H, -- 1 resistive - ); -- do not care Poznámka: signály typu std_ulogic nelze budit více budiči!! type std_ulogic_vector is array (natural range <>) of std_ulogic; subtype std_logic is resolved std_ulogic; resolved identifikátor příslušné resoluční funkce std_ulogic.identifikátor základního typu type std_logic_vector is array (natural range <>) of std_logic ; 21.10.2011 MI-SIM Jiří Douša 27

Matematické knihovny Označení: I -integer, L -std_logic, LV -std_logic_ vector knihovna ieee.std_logic_unsigned: definuje přetížené aritmetické operátory pro binární hodnoty, které interpretuje jako hodnoty bez znaménka +, - : pro kombinace typů: LV, LV - > LV LV, I - > LV; I, LV - > LV LV, L - > LV; : pro typ LV, LV - > LV L, LV - > LV Přiklad použití: variable a,b: array (3 downto 0) of std_logic_vector; variable i: integer ; variable l: std_logic; přípustné výrazy: a * b, a + b, a + i, i - b, a + l,... knihovna ieee.std_logic_signed: definuje tytéž aritmetické operátory pro binární hodnoty, které interpretuje jako hodnoty v doplňkovém kódu ; navíc: abs (LV) -> LV knihovna ieee.std_logic_arith: zavádí další typy signed a unsigned a pro tyto typy definuje tytéž aritmetické operátory 21.10.2011 MI-SIM Jiří Douša 28

Aritmetické operace nad binárními vektory Předpoklad deklarací: signal a, b : std_logic_vector (3 downto 0); signal c : std_logic_vector (3 downto 0); signal d : std_logic_vector (7 downto 0); signal ci, di: integer := 0; a <= 0110 ; b<= 1111 ; -- efekt operátorů knihovny std_logic_unsigned: c <= a + b; -- výsledek 0101 ci <= conv_integer (c); -- výsledek 5 d <= a * b; -- výsledek 01011010 di <= conv_integer (d); -- výsledek 90 -- efekt operátorů knihovny std_logic_signed: c <= a + b; -- výsledek 0101 ci <= conv_integer (c); -- výsledek 5 d <= a * b; -- výsledek 11111010 di <= conv_integer (d); -- výsledek -6 21.10.2011 MI-SIM Jiří Douša 29

Aritmetické operace nad binárními vektory -- efekt operátorů knihovny std_logic_arith: c <= signed(a) + signed (b); -- výsledek 0101 ci <= conv_integer (signed(c)); -- 5 d <= signed(a) * signed(b); -- 11111010 di <= conv_integer (signed(d)); -- -6 c <= unsigned(a) + unsigned (b); -- 0101 ci <= conv_integer (signed(c)); -- 5 d <= unsigned(a) * unsigned(b); -- 01011010 di <= conv_integer (signed(d)); -- 90 -- pro následující kombinace jsou nutné deklarace delších vektorů pro -- uložení výsledku: signal c : std_logic_vector (4 downto 0); signal d : std_logic_vector (8 downto 0); c <= signed(a) + unsigned (b); -- 10101 ci <= conv_integer (signed(c)); -- -11 d <= signed(a) * unsigned(b); -- 001011010 di <= conv_integer (signed(d)); -- 90 c <= unsigned(a) + signed (b); -- 00101 ci <= conv_integer (signed(c)); -- 5 d <= unsigned(a) * signed(b); -- 111111010 di <= conv_integer (signed(d)); -- -6 21.10.2011 MI-SIM Jiří Douša 30

Logické operátory Označení: I - integer, L - std_logic, LV - std_logic_ vector UL - std_ulogic, ULV - std_ulogic_vector, UX01.čtyř hodnotový podtyp odvozený od typu std_ulogic binární: and, or, nand, nor, xor, nxor (pouze VHDL-93) unární: not vyžadují operandy stejného typu a stejné délky, knihovna ieee.std_logic_1164 definuje: binární logické operace pro kombinace typů: UL, UL -> UX01, ULV, ULV - > ULV, LV, LV -> LV operaci not pro: UL -> UX01, ULV -> ULV, LV -> LV Příklad: definice operátoru not pro hodnoty UL: U -> U, X -> X, 0 -> 1, 1 -> 0, Z -> X, W -> X, L -> 1, H -> 0, - -> X 21.10.2011 MI-SIM Jiří Douša 31

Relační operátory nad vektory Označení: I - integer, BO boolean, LV - std_logic_ vector všechny operace jsou binární: =, /=, >, <, <=, >=, stejný typ operandů, výsledek vždy typu boolean, následující knihovny definují přetížené relační operátory pro tyto kombinace datových typů LV, LV - > BO; LV, I - > BO; I, LV - > BO ieee.std_logic_unsigned : považuje všechny binární hodnoty zmíněných typů jako representaci čísel bez znaménka ieee.std_logic_signed: považuje binární hodnoty jako representaci čísel se znaménkem příklad: signal a, b : std_logic_vector (7 downto 0);..; a <= abs_(b).; ieee.std_logic_arith: zavádí nové typy signed a unsigned a rozlišuje obě representace 21.10.2011 MI-SIM Jiří Douša 32

Konverse datových typů implementovány jako přetížené funkce knihovna std_logic_1164 pokrývá: vzájemné konverse mezi typy B, UL: to_stdulogic: B -> UL to_bit: UL -> B vzájemné konverse mezi typy BV, ULV, LV: to_bitvector: ULV -> BV, LV -> BV to_stdlogicvector: BV -> LV, ULV -> LV to_stdulogicvector: BV ->ULV, LV -> ULV knihovny ieee.std_logic_signed, ieee.std_logic_unsigned: conv_integer: LV -> I, knihovna ieee.std_logic_arith: conv_std_logic_vector: conv_integer: conv_unsigned: conv_ signed: I -> LV, unsigned -> LV, signed -> LV, UL -> LV unsigned ->integer, signed -> integer, UL -> integer I -> unsigned, signed -> unsigned, UL -> unsigned I -> signed, unsigned -> signed, UL -> signed 21.10.2011 MI-SIM Jiří Douša 33

Konverse datových typů Příklad: zápis a čtení do paměti 16 x 8 addr 4 RAM předpoklad deklarací: 8 data signal addr: bit_vector ( 3 downto 0 ); signal data :std_logic_vector ( 7 downto 0); subtype byte is bit_vector ( 7 downto 0); type mem_16x8 is array ( 0 to 15) of byte; signal RAM : mem_16x8; -- zápis do paměti: RAM ( conv_integer ( to_stdlogicvector (addr))) <= to_bitvector (data); -- čtení z paměti: data <= to_stdlogicvector ( RAM (conv_integer (to_stdlogicvector (addr))) ); Příklad: násobení vektorů pomocí operátoru * pro typ integer signal a, b : std_logic_vector ( 3 downto 0); --pro operandy signal soucin : std_logic_vector ( 7 downto 0); --pro výsledek soucin <= conv_std_logic_vector ( conv_integer (a) * conv_integer (b), 8 ); 21.10.2011 MI-SIM Jiří Douša 34