Sunteți pe pagina 1din 23

UNIVERSITATEA TEFAN CEL MARE SUCEAVA FACULTATEA DE INGINERIE ELECTRIC I TIINA CALCULATOARELOR

LABORATOR nr. 6
VHDL. Tipuri de date. Atribute Proiectarea unui microprocesor. ALU

Scopul laboratorului
n cadrul acestei lucrri se urmresc dou obiective: 1. Prezentarea tipurilor de date i a atributelor din VHDL. 2. Proiectarea Unitii Aritmetice i Logice, Multiplexoarelor, Circutelor cu trei stri i a Registrelor de deplasare (Shifter i Barrel Shifter).

2. Consideraii teoretice
2.1 Tipuri de date
Fiecare obiect de date are asociat un tip. Tipul definete setul de valori pe care obiectul le poate lua i setul de operaii care i sunt permise. Noiunea de tip este cheie n VHDL din moment ce este un limbaj foarte puternic orientat pe tip care necesit ca fiecare obiect s fie cu siguran un anumit tip. n general nu este permis s se asigneze o valoare corespunztoare unui tip de date pentru un obiect definit cu alt tip de date (de ex., nu este permis asignarea unui ntreg date de tip bit). Exist patru clase de tipuri de date: scalare, compuse, de acces i tipuri de fiiere. Tipurile scalare reprezint o singur valoare i sunt ordonate astfel nct se poate realiza pe ele operaiile relaionale. Tipul scalar include ntreg, real i tipurile enumerate Booleane i Caracter. Vor fi date n continuare cteva exemple dintre acestea.

2.1.1 Tipuri de date definite n Pachetul Standard


VHDL are cteva tipuri predefinite n pachetul standard aa cum este prezentat n tabelul urmtor. Pentru a utiliza unul dintre aceste pachete trebuie s includ clauza urmtoare: library std, work ; use std.standard.all ; Tipuri bit bit_vector boolean character Tipuri definite n Pachetul Standard din Librria std Nivelul de valori Exemplu 0, 1 signal A: bit:=1; O arie cu fiecare element de tip signal INBUS: bit_vector(7 bit downto 0); FALS, ADEVRAT variable TEST:Boolean:= FALSE Orice caracter legal VHDL (a se variable VAL: character:=$; 1

UNIVERSITATEA TEFAN CEL MARE SUCEAVA FACULTATEA DE INGINERIE ELECTRIC I TIINA CALCULATOARELOR vedea pachetul standard); caracterele printabile trebuie s fie plasate ntre ghilimele simple (de ex. #) file_open_kind* modul_citire, modul_scriere, modul_cutare file_open_status* deschis_ok, stare_eroare, nume_eroare, mod_eroare integer Nivelul este dependent de constant CONST1 : implementare dar include totui integer :=129 ; (231 - 1) pn la +(231 1) natural ntregul ncepe cu 0 pn la variable VAR1: natural := 2; maximul specificat n implementare positive ntregul ncepe de la 1 pn la variable VAR2: positive :=2; maximul specificat n implementare real* Numr n virgul flotant de la variable VAR3: real :=+64.2E12; 38 38 -1.0 x 10 pn la +1.0 x 10 (se poate implementa independent). Nu este suportat de ctre progarmul de sinteza Foundation. severity_level Not, avertizare, eroare, greeal string O arie n care fiecare element variable VAR4: este de tipul caracter string(1to12) := @$ABC*()_%Z; time* Un numr ntreg pentru care variable DELAY: time :=5ns; gama valorilor este definit de implementare; unitile pot fi exprimate n secunde, ms, us, ns, ps, fs, minute i ore. Nu este suportat de ctre programul de sintetizare Foundation. * Nu este suportat de ctre programul de sinteza FOUNDATION.

2.1.2 Tipuri definite de utilizator


Sintaxa este urmtoarea: type identificator is definiia_tipului; Sunt date cteva exemple de definiii ale tipului dup cum urmeaz : a. Tipurile ntreg type small_int is range 0 to 1024; type my_word_length is range 31 downto 0; subtype data_word is my_word_length range 7 downto 0; 2

UNIVERSITATEA TEFAN CEL MARE SUCEAVA FACULTATEA DE INGINERIE ELECTRIC I TIINA CALCULATOARELOR Un subtip este un subset al tipului definit anterior. Ultimul exemplu prezentat anterior prezint utilizarea subtipurilor. El definete un tip numit data_word care este un subtip al my_word_length al crui nivel este restricionat de la 7 la 0. Un alt exemplu de subtip este: subtype int_small is integer range -1024 to +1024; b. Tipuri n virgul flotant type cmos_level is range 0.0 to 3.3; type pmos_level is range -5.0 to 0.0; type probability is range 0.0 to 1.0; subtype cmos_low_V is cmos_level range 0.0 to +1.8; De notat c tipurile n virgul flotant nu sunt suportate de ctre programul de sintez Xilinx Foundation. c. Tipurile fizice Definiia tipului fizic include un identificator al unitilor dup cum urmeaz: type conductance is range 0 to 2E-9 units mho; mmho = 1E-3 mho; umho = 1E-6 mho; nmho = 1E-9 mho; pmho = 1E-12 mho; end units conductance; Sunt date, n continuare, cteva exemple de declaraii ale obiectelor care utilizeaz aceste tipuri : variable BUS_WIDTH: small_int :=24; signal DATA_BUS: my_word_length; variable VAR1: cmos_level range 0.0 to 2.5; constant LINE_COND: conductance:= 125 umho; De notat c trebuie lsat un spaiu nainte de numele unitii. Tipurile de date fizice nu sunt suportate de ctre programul de sintez al Foundation Express. Atunci cnd vom folosi tipurile noastre, vom avea nevoie s includem definiia tipului n interiorul corpului arhitecturii sau s declarm tipul ntr-un pachet. Poate fi folosit, mai departe, pentru un pachet numit my_types. package my_types is type small_int is range 0 to 1024; type my_word_length is range 31 downto 0; subtype data_word is my_word_length is range 7 downto 0; type cmos_level is range 0.0 to 3.3;

UNIVERSITATEA TEFAN CEL MARE SUCEAVA FACULTATEA DE INGINERIE ELECTRIC I TIINA CALCULATOARELOR type conductance units is range 0 to 2E-9;

mho; mmho = 1E-3 mho; umho = 1E-6 mho; nmho = 1E-9 mho; pmho = 1E-12 mho; end units conductance; end package my_types;

2.1.3 Tipurile enumerate


Un tip enumerat este alctuit dintr-o list de caractere literale sau identificatori. Tipul enumerat poate fi foarte manevrabil atunci cnd se scriu modelele unui nivel abstract. Sintaxa pentru un tip enumerat este urmtoarea: type numele_tipului is (list de identificatori sau caracter literal); Sunt date cteva exemple: type my_3values is (0, 1, Z); type PC_OPER is (load, store, add, sub, div, mult, shiftl, shiftr); type hex_digit is (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F ); type state_type is (S0, S1, S2, S3); Exemple de obiecte care utilizeaz tipurile de mai sus: signal SIG1: my_3values; variable ALU_OP: pc_oper; variable first_digit: hex_digit :=0; signal STATE: state_type :=S2; Dac nu se iniializeaz semnalul, iniializarea se face cu valoare cea mai din stnga din list. Tipurile enumerate trebuie s fie definite n corpul arhitecturii sau n interiorul unui pachet aa cum a fost prezentat n seciunea de mai sus. Un exemplu de tip enumerat care a fost definit n pachetul std_logic_1164 este tipul std_ulogic i este prezentat astfe: type STD_ULOGIC is ( U, -- neiniializat X, -- foreaz o valoare necunoscut 0, -- foreaz 0 1, -- foreaz 1 Z, -- impedan nalt W, -- stare slab necunoscut L, -- o slab

UNIVERSITATEA TEFAN CEL MARE SUCEAVA FACULTATEA DE INGINERIE ELECTRIC I TIINA CALCULATOARELOR H. -); -- 1 slab -- nu conteaz.

Pentru a putea folosi tipul acesta trebuie inclus n clauza de dinaintea fiecrei declaraii a entitii. library ieee; use ieee.std_logic_1164.all; Este posibil ca mai multe drivere s comande acelai semnal. n acest caz, ar aprea un conflict iar semnalele de ieire ar fi nedeterminate. De exemplu, ieirile unei pori AND i a unei pori NOT vor fi conectate mpreun la ieirea OUT1. Pentru a rezolva valoarea ieirii, se poate apela funcia rezoluie. Aceasta este de obicei o funcie scris de utilizator care va rezolva semnalul. Dac semnalul nu este un tip std_ulogic i are drivere multiple, atunci trebuie folosit funcia de rezoluie. Pachetul std_logic_1164 are o astfel de funcie de rezoluie, numit RESOLVED predefinit. Se poate astfel folosii declaraia pentru semnalul OUT1: signal OUT1: resolved: std_ulogic; Dac exist vreun conflict, funcia REZOLVED va fi folosit s intermedieze conflictul i s determine valoarea semnalului. Alternativ, se poate declara direct semnalul ca fiind un tip std_logic din moment ce subtipul std_logic a fost definit n pachetul std_logic_1164. signal OUT1: std_logic;

2.1.4 Tipurile compuse: Array i Record


a. Tipul array Un tip array este declarat astfel: type numele_array is array (indexarea schemei) of tipul_elementului; type type type type MY_WORD is array (15 downto 0) of std_logic; YOUR_WORD is array (0 to 15) of std_logic; VAR is array (0 to 7) of integer; STD_LOGIC_1D is array (std_ulogic) of std_logic;

n primele dou exemple de mai sus am definit o arie unidimensional pentru elementelor tipului std_logic indexate de la 15 cobornd pn la 0 i respectiv, de la 0 urcnd pn la 15. Ultimul exemplu definete o arie unidimensional a elementelor tipului std_logic care utilizeaz un tip std_ulogic pentru a defini constrngeri privind tipul De aceea, aceast arie arat n felul urmtor : Index : U X 0 1 Z W L H -

UNIVERSITATEA TEFAN CEL MARE SUCEAVA FACULTATEA DE INGINERIE ELECTRIC I TIINA CALCULATOARELOR Element : Acum putem s declarm obiectele ale acestor tipuri de date. Sunt date cteva exemple: signal MEM_ADDR: MY_WORD; signal DATA_WORD: YOUR_WORD := B1101100101010110; constant SETTING: VAR := (2,4,6,8,10,12,14,16); n primul exemplu, semnalul MEM_ADDR este o arie pe 16 bii, iniializai toti pe 0. Trebuie specificat indexul pentru a accesa individual elementele unei arii. De exemplu, MEM_ACCR(15) acceseaz bitul cel mai din stnga al ariei, n timp ce DATA_WORD(15) acceseaz bit cel mai din dreapta al ariei care este iniializat cu valoarea 0. Pentru a accesa un subnivel, trebuie s se specifice nivelul indexului, MEM_ADDR(15 downto 8) sau DATA_WORD (0 to 7). Ariile multidimensionale pot fi foarte bine declarate utiliznd i o sintax similar dup cum urmeaz: type MY_MATRIX3X2 is array (1 to 3, 1 to 2) of natural; type YOUR_MATRIX4X2 is array (1 to 4, 1 to 2) of integer; type STD_LOGIC_2D is array (std_ulogic, std_ulogic) of std_logic; variable DATA_ARR: MY_MATRIX := ((0,2), (1,3), (4,6), (5,7)); Aria de tip variabile de tip ntreg va fi atunci iniializat cu: 0 2 1 3 4 6 5 7 Pentru a accesa un element se specific indexul, de ex. DATA_ARR (3,1) returneaz valoarea 4. Ultimul exemplu definete o arie 9x9 sau un tabel cu un index de elemente al tipului std_ulogic. Cteodata este mult mai convenabil s nu se specifice dimensiunea ariei atunci cnd este declarat tipul array. Acest tip este denumit arie fr constrngeri. Sintaxa pentru declararea acestui tip de arie este: type numele_ariei is array (type range <>) of tipul_elementelor; Se dau cteva exemple: type MATRIX is array (integer range <>) of integer; type VECTOR_INT is array (natural range <>) of integer; type VECTOR2 is array (natural range <>, natural range <>) of std_logic; Gama (domeniul ) este specificat acum atunci cnd se declar obiectul array:

UNIVERSITATEA TEFAN CEL MARE SUCEAVA FACULTATEA DE INGINERIE ELECTRIC I TIINA CALCULATOARELOR variable MATRIX8: MATRIX (2 downto -8) := (3, 5, 1, 4, 7, 9, 12, 14, 20, 18); variable ARRAY3x2: VECTOR2 (1 to 4, 1 to 3) := ((1, 0), (0, -), (1, Z)); b. Tipul record (nregistrare) Al doilea tip compus este tipul record. Un record este alctuit din elemente multiple care pot fi de tipuri diferite. Sintaxa pentru tipul record este urmtoarea: type nume is record identificator :indicaia_subtipului : identificator :indicaia_subtipului end record ; Ca un exemplu, type MY_MODULE is record RISE_TIME FALL_TIME SIZE DATA end record ;

:time ; :time ; :integer range 0 to 200; :bit_vector (15 downto 0);

signal A, B: MY_MODULE; Pentru a accesa sau asigna valorile pentru nregistrare, se poate folosi una dintre urmtoarele metode : A.RISE_TIME <= 5ns; A.SIZE <= 120 ; B <= A ;

2.1.5 Conversiile tipul


Din moment ce VHDL este un limbaj foarte puternic orientat pe tip, nu se poate asigna o valoare corespunztoare unui tip de date pentru un semnal care are alt tip de date. n general, este de preferat aceleai tipuri de date pentru aceleai semnale dintr-o schem, precum std_logic (n locul uni amestec dintre std_logic i tipul bit). Cteodat nu se poate evita utilizarea tipurilor diferite. Pentru a permite asignarea datei ntre diferite tipuri ale obiectelor, este nevoie ca s se realizeze conversia de la un tip la altul. Din fericire, exist funcii disponibile n cteva pachete din librria ieee, precum pachetele std_logic_1164 i std_logic_arith. Ca un exemplu, pachetul std_logic_1164 permite urmtoarele conversii :

UNIVERSITATEA TEFAN CEL MARE SUCEAVA FACULTATEA DE INGINERIE ELECTRIC I TIINA CALCULATOARELOR Conversiile suportate de ctre pachetul std_logic_1164 Conversia Funcia std_logic la bit to_bit (expresie) std_logic_vector la bit_vector to_bitvector (expresie) std_ulogic_vector la bit_vector to_bitvector (expresie) bit la std_ulogic To_StdUlogic (expresie) bit_vector la std_logic_vector To_StdLogicVector (expresie) bit_vector la std_ulogic_vector To_StdUlogicVector (expresie) std_ulogic la std_logic_vector To_StdLogicVector (expresie) std_logic la std_ulogic_vector To_StdUlogicVector (expresie) Pachetele IEEE std_logic_unsigned i IEEE std_logic_arith permite n plus i conversii din integer la std_logic_vector i invers. Se d urmtorul exemplu :

entity

QUAD_NAND2 is port (A, B: in bit_vector (3 downto 0); out4: out std_logic_vector (3 downto 0)); end QUAD_NAND2;

architecture behavioral_2 of QUAD_NAND2 is begin out4 <= to_stdlogicvector (A and B); end Atribute behavioral_2; 2.1.6

Expresia A and B, care are tipul bit_vector, trebuie s fie convertit la tipul std_logic_vector ca s fie ca acelai tip ca i semnalul de ieire out4. Sintaxa conversiei tipului este urmtoarea : numele_tipului (expresie) ; n ordinea n care conversia trebuie s fie legal, expresia trebuie s returneze un tip care s poat fi convertit la tipul numele_tipului. Sunt date cteva condiii care trebuie s fie ndeplinite pentru ca, conversia s fie posibil: Sunt posibile conversiile tipului dintre tipurile de ntregi i dintre tipurile de arii similare; Este posibil conversia dintre tipurile array dac au aceeai lungime i dac au tipuri ale elementelor identice sau dac tipurile elementelor sunt convertibile ; Tipurile enumerate nu pot fi convertite.

UNIVERSITATEA TEFAN CEL MARE SUCEAVA FACULTATEA DE INGINERIE ELECTRIC I TIINA CALCULATOARELOR

2.1.5 Atributele
VHDL suport 5 tipuri de atribute. Atributele predefinite sunt ntotdeauna aplicate ca un prefix la numele semnalului, numele variabilei sau tip. Atributele sunt folosite pentru a returna tipuri variate ale informaiei despre un semnal, variabil sau tip. Atributele sunt precedate de un apostrof urmat de ctre numele atributului. a. Atributele semnalului Urmtorul tabel ne ofer cteva atribute ale semnalului : Atribut signal_nameevent signal_nameactive signal_nametransaction signal_namelast_event signal_namelast_active signal_namelast_value signal_namedelayed(T) signal_namestable(T) Funcie Returneaz o valoare Boolean True dac apare un eveniment pe semnal semnalului, altfel returneaz False. Returneaz o valoare Boolean True dac a avut loc o tranzacie ( sau o asignare) pe semnal, altfel returneaz False. Returneaz un semnal de tip bit care comut (0 n 1 sau 1 n 0) de fiecare dat cnd exist o tranzacie pe semnal. Returneaz intervalul de timp de la ultimul eveniment de pe semnal. Returneaz intervalul de timp de la ultima tranzacie de pe semnal. Ne d valoarea semnalului dinaintea ultimului eveniment aprut pe semnal. Ne d un semnal care este versiunea ntrziat (de ctre timpul T) al celui original. [T este opional, implicit T=0]. Returneaz o valoare Boolean, True, dac nu a aprut nici un eveniment pe semnal n intervalul T, altfel returneaz False. [T este opional, implicit T=0]. Returneaz o valoare Boolean, True, dac nu apare nici o tranzacie pe semnal n intervalul T, altfel returneaz False. [T este opional, implicit T=0].

signal_namequiet(T)

Este dat un exemplu de atribut : if (CLOCKevent and CLOCK=1) then Aceast expresie verific apariia unui front pozitiv al ceasului. Pentru a afla ct timp a trecut de la ultimul front al ceasului, se poate folosi urmtorul atribut: CLOCKlast_event 9

UNIVERSITATEA TEFAN CEL MARE SUCEAVA FACULTATEA DE INGINERIE ELECTRIC I TIINA CALCULATOARELOR b. Atribute scalare Sunt suportate cteva atribute ale tipului scalar, scalar_type. Urmtorul tabel ne arat cteva dintre aceste atribute: Atribut scalar_typeleft scalar_typeright scalar_typelow scalar_typehigh scalar_typeascending scalar_typevalue(s) Valoare Returneaz prima sau valoarea cea mai din stnga a tipului de scalar n gama definit. Returneaz ultima sau valoarea cea mai din dreapta a tipului scalar n ordinea definit. Returneaz valoarea cea mai mic a tipului scalar n ordinea definit. Returneaz valoarea cea mai mare a tipului scalar n ordinea definit. True dac T este n ordinea cresctoare, altfel False. Returneaz valoarea din T care este reprezentat prin s (s ateapt valoarea string).

Sunt date cteva exemple: type conductance is range 1E-6 to 1E3 units mho; end units conductance; type my_index is range 3 to 15; type my_levels is (low, high, dontcare, highZ); conductanceright conductancehigh conductancelow my_indexleft my_indexvalue(5) my_levelsleft my_levelslow my_levelshigh my_levelsvalue(dontcare) c. Atributele ariilor Prin utilizarea atributelor ariilor se returneaz o valoare index corespunztoare gamei ariei. returns: 1E3 1E3 1E-6 3 5 low low highZ dontcare

10

UNIVERSITATEA TEFAN CEL MARE SUCEAVA FACULTATEA DE INGINERIE ELECTRIC I TIINA CALCULATOARELOR Sunt suportate urmtoarele atribute: Atribut MATRIXleft(N) MATRIXright(N) MATRIXhigh(N) MATRIXlow(N) MATRIXlength(N) MATRIXrange(N) MATRIXreverse_range(N) MATRIXascending(N) Returneaz Indexul elementului cel mai din stnga Indexul elementului cel mai din dreapta Valoarea cea mai mare Valoarea cea mai mic Numrul de elemente Intervalul (gama) Intervalul (gama )inversat () O valoare Boolean TRUE dac indexul este o ordinea cresctoare, altfel FALSE

Numrul N dintre paranteze se refer la dimensiune. Pentru un vector unidimensional, se poate omite numrul N aa cum este prezentat n exemplul urmtor : type MYARR8x4 is array (8 downto 1, 0 to 3) of boolean; type MYARR1 is array (-2 to 4) of integer; MYARR1left returns: MYARR1right MYARR1high MYARR1reverse_range MYARR8x4left(1) MYARR8x4left(2) MYARR8x4right(2) MYARR8x4high(1) MYARR8x4low(1) MYARR8x4ascending(1) -2 4 4 4 downto to -2 8 0 3 8 1 False.

3. ALU (Arithmetic Logic Unit Unitatea Aritmetic Logic)


Unitatea aritmetic i logic (ALU) este una dintre cele mai importante componente din interiorul microprocesorului. Este responsabil pentru rezolvarea operaiilor logice i aritmetice, precum adunarea, scderea, AND logic i OR logic. Totui, ALU nu este folosit pentru a rezolva nmulirile i mpririle. Pe de alt parte, atunci cnd se realizeaz circuitul pentru ALU, putem folosi aceeai idee ca i la circuitul combinaional pentru sumator-scztor. Din nou, vom folosi sumatorul n cascad ca bloc de baz iar apoi vom introduce cteva circuite logice combinaionale n faa celor doi operanzi de intrare pentru fiecare sumator complet. n acest mod, intrrile primare vor fi modificate corespunztor. n general, circuitul total pentru un ALU pe 4 bii este prezentat n figura 3.1 (a) iar simbolul logic n 3.1 (b). Dup cum putem vedea din figur, cele dou circuite combinaionale din faa sumatorului complet (FA) sunt etichetate LE i AE. Extinderea logic (LE) este pentru a manipula toate operaiile logice; n timp ce, extinderea aritmetic (AE) este pentru a

11

UNIVERSITATEA TEFAN CEL MARE SUCEAVA FACULTATEA DE INGINERIE ELECTRIC I TIINA CALCULATOARELOR manipula operaiile aritmetice. LE execut operaiile logice actuale ale celor doi operanzi primari, ai i bi nainte de a trece rezultatul primului operand, xi, din FA. Pe de alt parte, AE modific doar al doilea operand, bi, i l transmite la al doilea operand, yi, din FA unde este realizat operaia aritmetic actual.

Figura 3.1 ALU pe 4 bii: (a) circuit; (b) simbolul logic. Am vzut din circuitul sumator-scztor c, pentru a realiza adunrile i scderile, avem nevoie s modificm doar yi (al doilea operand din FA) astfel nct toate operaiile s fie fcute prin adunri. De aceea, AE ia doar al doilea operand de la intrarea primar, bi, ca i intrare i modific valoarea n funcie de ce operaie va fi realizat. Ieirea yi este conectat la al doilea operand de intrare din FA. Ca i n circuitul sumator-scztor, adunarea este realizat n FA. Atunci cnd sunt realizate operaiile aritmetice, LE trebuie s treac primul operand nemodificat de la intrarea primar ai pn la ieirea xi din FA. Din nefericire pentru AE (care modific doar operandul), LE realizeaz i operaiile logice actuale. Astfel, de exemplu, dac dorim s realizm operaia A or B, LE va lua pentru fiecare bit n parte biii corespunztori, ai i bi, i va aplica operaia SAU. Apoi ieirea lui LE este trecut la primul operand, xi, din FA. Din moment ce aceast valoare este deja rezultat din operaia logic, nu vom dori ca FA s modifice rezultatul operaiei logice care va trebui s se regseasc nemodificat. Acest lucru se realizeaz prin setarea ambilor operanzi secunzi, yi din FA i c0 pe 0. Circuitul combinaional denumit CE (pentru extinderea transportului) este pentru a modifica transportul iniial c0, astfel nct s se realizeze operaiile aritmetice ct mai 12

UNIVERSITATEA TEFAN CEL MARE SUCEAVA FACULTATEA DE INGINERIE ELECTRIC I TIINA CALCULATOARELOR corect. Operaiile logice nu folosesc semnalul de transport, astfel nct c0 este setat pe 0 pentru toate operaiile logice. s2 0 0 0 0 1 1 1 1 s1 0 0 1 1 0 0 1 1 s0 0 1 0 1 0 1 0 1 Numele operaiei Trecere AND OR NOT Adunare Scdere Incrementare Decrementare (a) Operaia Trecerea lui A ctre ieire A AND B A OR B A A + B A - B A + 1 A - 1 xi(LE) ai ai AND bi ai OR bi ai ai ai ai ai yi(AE) 0 0 0 0 bi bi 0 1 c0(CE) 0 0 0 0 0 1 1 0

Figura 3.2. Operaiile ALU: (a) tabela de funcii; (b) tabela de adevr LE; (c) tabela de adevr AE; tabela de adevr CE. n circuitul prezentat n figura 3.2, cele trei linii selectate, s 2, s1 i s0, sunt utilizate pentru a selecta operaiile din ALU. Cu aceste trei linii selectate, circuitul ALU poate implementa pn la 8 operaii diferite. Presupunem c operaiile pe care dorim s le implementm n ALU nostru sunt definite n Figura 3.2. (a). Coloana xi prezint valorile pe care LE trebuie s le genereze pentru operaii diferite. Coloana yi prezint valorile pe care trebuie s le genereze AE. Coloana c0 prezint semnalele de transport pe care CE trebuie s le genereze. De exemplu, pentru operaia de trecere mai departe, valoarea ai este trecut mai departe fr nici o alt modificare la xi. Pentru operaia AND, xi ia rezultatele lui ai AND bi. Aa cum s-a spus i anterior, ambele yi i c0 sunt setate pe 0 pentru toate operaiile logice, deoarece nu dorim ca FA s modifice rezultatul. FA este utilizat doar pentru a trece rezultatul de la LE direct ctre ieirea F. Pentru operaia de scdere, n loc s scdem B, dorim s adunm -B. Schimbarea lui B la B n formatul complementului fa de doi necesit inversarea biilor lui B iar apoi adunarea cu 1. Prin urmare, yi ia inversul lui bi i este adunat cu 1 prin setarea pe 1 a lui c 0. Pentru incrementarea lui A, vom seta toate valorile din yi pe 0 iar apoi adunarea cu un 1 se realizeaz prin setarea cui c0 pe 1. Pentru decrementare lui A, vom aduna -1 n loc. Negativul lui 1 n complement fa de 2 are toi 13

UNIVERSITATEA TEFAN CEL MARE SUCEAVA FACULTATEA DE INGINERIE ELECTRIC I TIINA CALCULATOARELOR biii pe 1. Ca urmare setm toi yi pe 1. Pentru toate operaiile aritmetice operandul A trebuie s treac prin LE fr modificri. Astfel xi ia valorile lui ai pentru toate operaiile aritmetice. Figurile 3.2 b,c i d prezint tabelele de adevr pentru LE AE i CE. Circuitul CE deriv din coloana xi din figura 3.2 b. Circuitul AE deriv din coloana yi a tabelului de adevr din figura 3.2. c. Circuitul CE deriv din coloana c0 a tabelului de adevr din figura 3.2 d. De notat c este dependent de cinci variabile s0, s1,s2,ai i bi, yi este dependent doar de 4 variabile s0, s1,s2, i bi, iar c0, este dependent doar de trei variabile i anume s0, s1, s2. Hrile K, ecuaiile i schemele aferente sunt prezentate n figura 3.3 a, b i c.

14

UNIVERSITATEA TEFAN CEL MARE SUCEAVA FACULTATEA DE INGINERIE ELECTRIC I TIINA CALCULATOARELOR

Figura CE.

3.3. Diagrame K (Karnaugh), ecuaii i scheme pentru (a) LE; (b) AE i (c)

15

UNIVERSITATEA TEFAN CEL MARE SUCEAVA FACULTATEA DE INGINERIE ELECTRIC I TIINA CALCULATOARELOR

LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY alu IS PORT ( S: IN STD_LOGIC_VECTOR(2 DOWNTO 0); A, B: IN STD_LOGIC_VECTOR(3 DOWNTO 0); F: OUT STD_LOGIC_VECTOR(3 DOWNTO 0)); END alu; ARCHITECTURE Behavior OF alu IS BEGIN PROCESS(S, A, B) BEGIN CASE S IS WHEN "000" => -- pass A through F <= A; WHEN "001" => -- AND F <= A AND B; WHEN "010" => -- OR F <= A OR B; WHEN "011" => -- NOT A F <= NOT A; WHEN "100" => -- add F <= A + B; WHEN "101" => -- subtract F <= A - B; WHEN "110" => -- increment F <= A + 1; WHEN OTHERS => -- decrement F <= A - 1; END CASE; END PROCESS; END Behavior;

Figura 3.4. Codul VHDL comportamental pentru un ALU.

Figura 3.5. Trasarea simulrii simple cu doi operanzi de intrare 5 i 3 pentru toate cele 8 operaii.

16

UNIVERSITATEA TEFAN CEL MARE SUCEAVA FACULTATEA DE INGINERIE ELECTRIC I TIINA CALCULATOARELOR

3.1 Decodorul

Figura 3.6. Decodor cu 3 intrri i 8 ieiri: (a) tabela de adevr; (b) circuit; (c) simbolul logic

Figura 3.7. Decodorul cu 3 intrri i 8 ieiri implementat cu apte decodoare cu 1 intrare i 2 ieiri

17

UNIVERSITATEA TEFAN CEL MARE SUCEAVA FACULTATEA DE INGINERIE ELECTRIC I TIINA CALCULATOARELOR
LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY Decoder E: A: Y: END Decoder; IS PORT( IN STD_LOGIC; -- enable IN STD_LOGIC_VECTOR(2 DOWNTO 0); -- 3 bit address OUT STD_LOGIC_VECTOR(7 DOWNTO 0)); -- data bus output

ARCHITECTURE Behavioral OF Decoder IS BEGIN PROCESS (E, A) BEGIN IF (E = '0') THEN -- disabled Y <= (OTHERS => '0'); -- 8-bit vector of 0 ELSE CASE A IS -- enabled WHEN "000" => Y <= "00000001"; WHEN "001" => Y <= "00000010"; WHEN "010" => Y <= "00000100"; WHEN "011" => Y <= "00001000"; WHEN "100" => Y <= "00010000"; WHEN "101" => Y <= "00100000"; WHEN "110" => Y <= "01000000"; WHEN "111" => Y <= "10000000"; WHEN OTHERS => NULL; END CASE; END IF; END PROCESS; END Behavioral;

Figura 3.8 Codul VHDL comportamental pentru un decodor cu 3 intrri i 8 ieiri.

3.2 Multiplexor

Figura 3.9. Multiplexor cu 8 intrri i 1 ieire: (a) tabela de adevr; (b) circuit; (c) simbolul logic. 18

UNIVERSITATEA TEFAN CEL MARE SUCEAVA FACULTATEA DE INGINERIE ELECTRIC I TIINA CALCULATOARELOR

Figura 3.10. Implementarea unui multiplexor cu 8 intrri i 1 ieire utiliznd: (a) un decodor cu 3 intrri i 8 ieiri; (b) apte multiplexoare cu 2 intrri i 1 ieire.

-- A 4-to-1 8-bit wide multiplexer LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY Multiplexer IS PORT(S: IN STD_LOGIC_VECTOR(1 DOWNTO 0); D0, D1, D2, D3: IN STD_LOGIC_VECTOR(7 DOWNTO 0); Y: OUT STD_LOGIC_VECTOR(7 DOWNTO 0)); END Multiplexer; -- Behavioral level code ARCHITECTURE Behavioral OF Multiplexer IS BEGIN PROCESS (S,D0,D1,D2,D3) BEGIN CASE S IS WHEN "00" => Y <= D0; WHEN "01" => Y <= D1; WHEN "10" => Y <= D2; WHEN "11" => Y <= D3; WHEN OTHERS => Y <= (OTHERS => 'U'); -- 8-bit vector of U END CASE; END PROCESS; END Behavioral;

(a)

19

UNIVERSITATEA TEFAN CEL MARE SUCEAVA FACULTATEA DE INGINERIE ELECTRIC I TIINA CALCULATOARELOR
-- Dataflow level code ARCHITECTURE Dataflow OF Multiplexer IS BEGIN WITH S SELECT Y <= D0 WHEN "00", D1 WHEN "01", D2 WHEN "10", D3 WHEN "11", (OTHERS => 'U') WHEN OTHERS; -- 8-bit vector of U END Dataflow;

Figura 3.11. Codul VHDL pentru un multiplexor cu 4 intrri i 1 ieire avnd lrgimea de 8 bii: (a) nivelul comportamental; (b) nivelul fluxului de date.

3.3 Buffer cu trei stri

Figura 3.12. Buffer cu trei stri: (a) tabela de adevr; (b) simbolul logic; (c) circuit; (d) tabela de adevr pentru poriunea de control al circuitului buffer cu 3 stri.
LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY TriState_Buffer IS PORT ( E: IN STD_LOGIC; d: IN STD_LOGIC_VECTOR(7 DOWNTO 0); y: OUT STD_LOGIC_VECTOR(7 DOWNTO 0)); END TriState_Buffer; ARCHITECTURE Behavioral OF TriState_Buffer IS BEGIN PROCESS (E, d) BEGIN IF (E = '1') THEN y <= d; ELSE y <= (OTHERS => 'Z'); -- to get 8 Z values END IF; END PROCESS; END Behavioral;

Figura 3.12. Codul VHDL pentru un buffer cu trei stri avnd lrgimea de 8 bii. 20

UNIVERSITATEA TEFAN CEL MARE SUCEAVA FACULTATEA DE INGINERIE ELECTRIC I TIINA CALCULATOARELOR

3.4 Registru de deplasare (Shifter)


Un shifter este utilizat pentru deplasarea biilor unui cuvnt binar cu o poziie la stnga sau la dreapta.

Figura 3.13. Shifter i operaiile de rotaie.

Figura 3.14. Un shifter pe 4 bii: (a) tabela de operare; (b) circuit; (c) simbolul logic.

21

UNIVERSITATEA TEFAN CEL MARE SUCEAVA FACULTATEA DE INGINERIE ELECTRIC I TIINA CALCULATOARELOR
LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY shifter IS PORT ( S: IN STD_LOGIC_VECTOR(1 DOWNTO 0); input: IN STD_LOGIC_VECTOR(7 DOWNTO 0); output: OUT STD_LOGIC_VECTOR(7 DOWNTO 0)); END shifter; ARCHITECTURE Behavior OF shifter IS BEGIN PROCESS(S, input) BEGIN CASE S IS WHEN "00" => -- pass through output <= input; WHEN "01" => -- shift left with 0 output <= input(6 downto 0) & '0'; WHEN "10" => -- shift right with 0 output <= '0' & input(7 downto 1); WHEN OTHERS => -- rotate right output <= input(0) & input(7 DOWNTO 1); END CASE; END PROCESS; END Behavior;

Figura 3.15. Codul VHDL comportamental pentru un shifter pe 8 bii avnd operaiile definite ca n figura 3.14 (a).

3.5 Registru cu deplasri multiple ( Barrel Shifter)


Un registru cu deplasri multiple (barrel shifter) este un registru de deplasare (shifter) care poate deplasa sau roti datele cu orice numr de bii printr-o singur operaie.

22

UNIVERSITATEA TEFAN CEL MARE SUCEAVA FACULTATEA DE INGINERIE ELECTRIC I TIINA CALCULATOARELOR

Figura 3.16. Un registru cu deplasri multiple pe 4 bii cu operaia de rotire la stnga: (a) tabela de operare; (b) circuitul.

4. Desfurarea lucrrii
1. Se studiaz tipurile de date VHDL i atributele. 2. Se vor studia ALU, Multiplexorul, circuitul cu trei stri i registrul de deplasare. 3. Se scriu i se testeaz programele VHDL corespunztoare

5. Tema
S se implementeze i s se testeze circuitul barrel shifter prezentat la sfritul paragrafului 3.

23