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