Sunteți pe pagina 1din 20

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

LABORATOR nr. 5
VHDL. Modelul comportamental. Instruciuni secveniale Proiectarea unui microprocesor. Sumatorul i circuitul de scdere.

Scopul laboratorului
n cadrul acestei lucrri se urmresc dou obiective: 1. Prezentarea modelului comportamental VHDL i descrierea instruciunilor secveniale. 2. Proiectarea sumatoarelor i circuitelor de scdere ca pri componente ale Unitii Aritmetice i Logice UAL.

2. Consideraii teoretice
2.1 Modelul comportamental: Instruciunile secveniale
Aa cum s-a mai spus, VHDL furnizeaz mijloace pentru a reprezenta circuitele digitale la nivele diferite de reprezentare abstract, precum modelul comportamental ct i cel structural. n seciunea aceasta vom prezenta diferitele construcii pentru descrierea comportamentului componentelor i circuitelor n termenii instruciunilor secveniale. Baza pentru modelarea secvenial este constructorul process. Aa cum se va vedea, constructorul process ne permite s modelm sisteme digitale complexe, n general circuite secveniale.

2.1.1 Process
Declaraia procesului este un constructor principal n modelarea comportamental care ne permite s folosim strile secveniale pentru a descrie comportamentul unui sistem n timp. Sintaxa pentru starea procesului este : [eticheta_process :] process [ (lista_senzitiv) ] [is] [declaraiile_procesului] begin lista strilor secveniale precum: asignarea semnalelor asignarea variabilelor instruciunea case instruciunea exit instruciunea if instruciunea loop instruciunea next instruciunea null 1

UNIVERSITATEA TEFAN CEL MARE SUCEAVA FACULTATEA DE INGINERIE ELECTRIC I TIINA CALCULATOARELOR instruciunea procedure instruciunea wait end process [eticheta_process] n continuare se prezint un bistabil de tip D activ pe front cu o intrare asincron de tergere: library ieee ; use ieee.std_logic_1164.all; entity DFF_CLEAR is Port (CLK, CLEAR, D : in std_logic; Q : out std_logic); end DFF_CLEAR; architecture BEHAV_DFF of DFF_CLEAR is begin DFF_PROCESS: process (CLK, CLEAR) begin if (CLEAR = 1) then Q <= 0; elsif (CLKevent and CLK = 1) then Q <= D; end if; end process; end BEHAV_DFF; Un proces este declarat n interiorul arhitecturii i este o declaraie concurent. Cu toate acestea, instruciunile din interiorul procesului sunt executate secvenial. Ca i alte instruciuni concurente, un proces citete i scrie semnalele i valorile porturilor (intrare i ieire) interfeei pentru a comunica cu restul arhitecturii. Expresia CLK event and CLK = `1 verific frontul cresctor al ceasului (eveniment de tip ceas i ceasul n starea HIGH). Lista senzitiv este un set de semnale la care procesul este sensibil. Orice schimbare a valorii unui semnal din lista senzitiv va cauza execuia imediat a procesului. Dac nu este specificat lista senzitiv, trebuie inclus o instruciune WAIT pentru a fi siguri c procesul se oprete. Variabilele i constantele care sunt folosite nuntrul procesului vor fi definite n partea unde sunt declaraiile procesului, nainte de cuvntul cheie begin. Cuvntul cheie begin semnalizeaz startul prii de calcul a procesului. Instruciunile sunt executate secvenial similar ca la un program software. Trebuie menionat c asignarea variabilelor n cadrul unui proces se execut imediat i este simbolizat cu operatorul := (spre deosebire de asignarea semnalelor simbolizat cu operatorul <= i a cror modificare apare cu o ntrziere). Exemplul anterior, al unui bistabil D, ilustreaz modul cum se descrie un circuit secvenial cu instruciunea proces. Dei proces se utilizeaz n principal pentru descrierea circuitelor secveniale, acesta poate descrie i circuitele combinaionale. Urmtorul exemplu ilustreaz un sumator complet compus din dou sumatoare incomplete. Acest

UNIVERSITATEA TEFAN CEL MARE SUCEAVA FACULTATEA DE INGINERIE ELECTRIC I TIINA CALCULATOARELOR exemplu ilustreaz de asemenea modul n care un proces poate genera semnalele care vor declana alte procese atunci cnd apar evenimente n lista lor de senzitivitate. Se poarte scrie expresia boolean a sumatoarelor incomplet i complet dup cum urmeaz:

S_ha = (AB) and C_ha = AB


pentru sumatorul incomplet i

Sum = (AB)Cin = S_ha Cin Cout = (AB)Cin + AB = S_ha.Cin + C_ha


Pentru sumatorul complet.

Figura 2-1. Un sumator complet compus din dou sumatoare incomplete modelat cu dou procese P1 i P2. library ieee; use ieee.std_logic_1164.all; entity FULL_ADDER is port (A, B, Cin : in std_logic; Sum, Cout : out std_logic); end FULL_ADDER; architecture BEHAV_FA of FULL_ADDER is signal int1, int2, int3: std_logic; begin -- Process P1 that defines the first half adder P1: process (A, B) begin int1<= A xor B; int2<= A and B; end process; -- Process P2 that defines the second half adder and the OR --

UNIVERSITATEA TEFAN CEL MARE SUCEAVA FACULTATEA DE INGINERIE ELECTRIC I TIINA CALCULATOARELOR P2: process (int1, int2, Cin) begin Sum <= int1 xor Cin; int3 <= int1 and Cin; Cout <= int2 or int3; end process; end BEHAV_FA; Desigur se poate simplifica semnificativ modelul comportamental utiliznd un singur proces.

2.1.2 Instruciunea if
Instruciunea if execut o secven de instruciuni, secven care depinde de una sau mai multe condiii. Sintaxa este urmtoarea : if condiie then Instruciuni secveniale [ elsif condiie then Instruciuni secveniale ] [ else Instruciuni secveniale ] end if ; Fiecare condiie este o expresie boolean. Starea if este executat prin verificarea fiecrei condiii n ordinea n care sunt prezentate pn cnd este gsit una adevrat (true). Instruciunea if s-a regsit n exemplul anterior. Pot fi modelate i circuitele combinaionale cu instruciunea if ca n exemplul urmtor. Este prezentat un exemplu de multiplexor cu 4 intrri i 1 ieire, cu intrrile A, B, C i D i semnalele de selecie S0 i S1. Aceast instruciune trebuie s fie n interiorul constructorului de proces. entity MUX_4_1a is port (S1, S0, A, B, C, D : in std_logic; Z : out std_logic); end MUX_4_1a; architecture behav_MUX41a of MUX_4_1a is begin P1 : process (S1, S0, A, B, C, D) begin if ( ( not S1 and not S0 ) = 1 ) then Z <= A ; elsif ( ( not S1 and S0 ) = 1 ) then Z <= B ; elsif ( ( S1 and not S0 ) = 1 ) then Z <= C ; 4

UNIVERSITATEA TEFAN CEL MARE SUCEAVA FACULTATEA DE INGINERIE ELECTRIC I TIINA CALCULATOARELOR else Z <= D; end if; end process P1; end behav_MUX41a; O cale diferit de a modela acelai multiplexor este prezentat n continuare . if S1=0 and S0=0 then Z <= A; elsif S1=0 and S0=1 then Z <= B; elsif S1=1 and S0=0 then Z <= C; elsif S1=1 and S0=1 then Z <= D; end if; Instruciunea if este adesea utilizat pentru a implementa diagrame de stare.

2.1.3 Instruciunea case


Instruciunea execut una dintre secvenele strilor, bazat pe valoarea unei singure expresii. Sintaxa este urmtoarea: case expresie is when selecie => instruciuni secveniale when selecie => instruciuni secveniale -- sunt permise i salturi [ when others => instruciuni secveniale ] end case; Expresia trebuie s fie evaluat ca un ntreg, sau ca o arie unidimensional de tip enumerare. Instruciunea case evalueaz expresia i compar valoarea cu fiecare selecie. Trebuie respectate urmtoarele reguli: Nu se poate s se suprapun (overlap) dou selecii (fiecare selecie trebuie acoperit doar o dat); Dac nu este prezent opiunea when others, toate valorile posibile ale expresiei trebuie s fie acoperite de ctre un setul de selecii invocat. n continuare este dat un exemplu de instruciune case utiliznd tipul enumerat. Se obine o ieire D=1 atunci cnd semnalul GRADES are o valoare cuprins ntre 51 i 60, C=1 Grades cuprins ntre 61 i 70, i pentru celelalte valori F=1.

UNIVERSITATEA TEFAN CEL MARE SUCEAVA FACULTATEA DE INGINERIE ELECTRIC I TIINA CALCULATOARELOR Library ieee ; use ieee.std_logic_1164.all; entity GRD_201 is port (VALUE : in integer range 0 to 100; A, B, C, D : out bit) ; end GRD_201; architecture behav_grd of GRD_201 is begin process (VALUE) begin A <= 0 ; B <= 0 ; C <= 0 ; D <= 0 ; F <= 0 ; case VALUE is when 51 to 60 => D <= 1 ; when 61 to 70 | 71 to 75 => C <= 1 ; when 76 to 85 => B <= 1 ; when 86 to 100 => A <= 1 ; when others => F <= 1 ; end case; end process; end behav_grd; Exemplul urmtor utilizeaz case pentru a construi un multiplexor MUX 4 la 1

UNIVERSITATEA TEFAN CEL MARE SUCEAVA FACULTATEA DE INGINERIE ELECTRIC I TIINA CALCULATOARELOR entity MUX_4_1 is port ( SEL: in std_logic_vector(2 downto 1); A, B, C, D: in std_logic; Z: out std_logic); end MUX_4_1; architecture behav_MUX41 of MUX_4_1 is begin PR_MUX: process (SEL, A, B, C, D) begin case SEL is when 00 => Z <= A; when 01 => Z <= B; when 10 => Z <= C; when 11 => Z <= D; when others => Z <= X; end case; end process PR_MUX; end behav_MUX41; Instruciunea when others acoper cazurile pentru care SEL=0X, 0Z, XZ, UX, etc. Trebuie notat c aceste circuite combinaionale pot fi exprimate i n alte moduri utiliznd instruciuni concurente cum ar fi construciile de tipul With Select. Instruciunile case pot include alte instruciuni case.

2.1.4 Instruciunile loop


O instruciune de buclare (loop) este utilizat ca s repete execuia unei secvene de instruciuni secveniale. Sintaxa unei bucle este urmtoarea: [ eticheta_buclei :] schema_iteraiei loop Stri secveniale [ next [etichet] [ when condiie] ; [ exitb [etichet] [ when condiie] ; end loop [eticheta_buclei]; Etichetele sunt opionale dar sunt folositoare atunci cnd se scriu bucle incluse una n alta. Instruciunea next termin iteraia curent a buclei i execuia va ncepe noua iteraie a buclei. Instruciunea exit sare restul instruciunilor, termin ntrega bucl i continu cu instruciunea de dup bucla prsit. Instruciunea next i exit sunt instruciuni secveniale care pot fi utilizate doar n interiorul unei bucle. Exist trei tipuri de scheme: a. Basic loop.

UNIVERSITATEA TEFAN CEL MARE SUCEAVA FACULTATEA DE INGINERIE ELECTRIC I TIINA CALCULATOARELOR b. While loop, i c. for loop. 1. basic loop . Aceast bucl nu are o schem de iteraie. Se va executa continuu pn cnd va ntlni o instruciune exit sau next. [eticheta_buclei :] loop Instruciuni secveniale [ next [etichet] [ when condiie] ; [ exit [etichet] [ when condiie] ; end loop [eticheta_buclei]; Bucla de baz (ca i bucla while-loop) trebuie s aib cel puin o instruciune wait. Ca exemplu, s considerm un numrtor de 5 bii care numr de la 0 la 31. Atunci cnd ajunge la 31, numrtorul va reporni de la 0. S-a inclus o stare de wait astfel nct bucla se execut ori de cte ori ceasul se schimb de la 0 to 1. Library ieee ; use ieee.std_logic_1164.all; entity COUNT_31 is port (CLK: in std_logic; COUNT: out integerf) ; end COUNT_31; architecture behav_COUNT of COUNT31 is begin P_COUNT : process Variabile intern_value : integer :=0; begin COUNT <= intern_value; loop wait until CLK = 1; intern_value := (intern_value + 1) mod 32; COUNT <= intern_value; end loop; end process P_COUNT; end behav_COUNT; S-a definit variabila intern_value n interiorul procesului deoarece ieirile porturilor nu pot fi citite din afara procesului. 2. while loop . Evalueaz o condiie de iteraie boolean. Atunci cnd condiia este TRUE, bucla se repet, altfel bucla este prsit i execuia ei se va opri. [eticheta_buclei :] while condiie loop Instruciuni secveniale [ next [etichet] [ when condiie] ; [ exit [etichet] [ when condiie] ;

UNIVERSITATEA TEFAN CEL MARE SUCEAVA FACULTATEA DE INGINERIE ELECTRIC I TIINA CALCULATOARELOR end loop [eticheta_buclei]; Condiia de buclare este testat la fiecare iteraie. Dac este fals bucla se termin. 3. Bucla for loop utilizeaz un numr ntreg pentru a determina numrul de iteraii. [eticheta_buclei :] for identificator in gama(range) loop Instruciuni secveniale [ next [etichet] [ when condiie] ; [ exit [etichet] [ when condiie] ; end loop [eticheta_buclei]; Identificatorul (identifier (index)) este declarat automat de ctre bucla nsi, ca urmare nu trebuie declarat separat. Valoarea identificatorului poate fi citit doar n interiorul buclei i nu este vzut n afara acesteia. Nu se poate schimba sau asigna valoarea indexului. Aceasta este n contrast cu bucla while-loop a crei condiie poate implica variabile care sunt n interiorul buclei. Gama trebuie s fie cuprins ntre valori ntregi calculabile n care integer_expression trebuie evaluat ca un ntreg: integer_expression to integer_expression integer_expression downto integer_expression

2.1.5 Instruciunea next i exit


Instruciunea next realizeaz un salt la urmtoarea iteraie i lanseaz n execuie urmtoare iteraie. next [etichet] [when condiie]; Cuvntul cheie when este opional i va executa instruciunea next dac expresia evaluat are valoarea boolean TRUE. Instruciunea exit realizeaz un salt n afara buclei, terminndu-o. Se continu cu urmtoarea instruciune de dup terminarea buclei. Sintaxa este: exit [etichet] [when condiie]; Cuvntul cheie when este opional i va executa instruciunea exit dac expresia evaluat are valoarea boolean TRUE.

2.1.6 Instruciunea wait


Instruciunea wait va opri un proces pn cnd apare un eveniment. Sunt cteva forme ale instruciunii wait :

UNIVERSITATEA TEFAN CEL MARE SUCEAVA FACULTATEA DE INGINERIE ELECTRIC I TIINA CALCULATOARELOR wait until condiie ; wait for expresia timpului ; wait on semnal ; wait; Xilinx Foundation Express a implementat doar prima form a instruciunii wait. Sintaxa este urmtoarea: wait until signal = value; wait until signalevent and signal = value; wait until not signalstable and signal = value; Este dat urmtorul exemplu: wait until CLK = 1 ; wait until CLK = 0 ; wait until CLK eveniment and CLK = 1 ; wait until not CLK stabil and CLK = 1 ; Pentru primul exemplu procesul va atepta pn la apariia unui front cresctor, n timp ce pentru al doilea exemplu procesul va atepta pn cnd apare un front negativ. Ultimile dou exemple sunt echivalente cu primul (front pozitiv sau tranziie din 0 n 1). Trebuie notat c un proces care utilizeaz instruciuni wait nu poate avea o list senzitiv.

2.1.7 Instruciunea null


Instruciunea null indic faptul c nu se va genera nici o aciune.. Sintaxa este urmtoarea : null ; Poate fi folositoare ntr-o instruciune case unde toate alegerile trebuie s fie acoperite, chiar dac unele dintre ele pot fi ignorate. Ca exemplu, se consider un semnal de control CNTL de la nivelul 0 pn la 31. Atunci cnd valoarea lui CNTL este 3 sau 15, semnalele A i B vor fi XOR-ate, altfel nimic nu se va ntmpla. entity EX_WAIT is port ( CNTL : in ntreg range 0 to 31 ; A, B : in std_logic_vector (7 downto 0); Z : out std_logic_vector (7 downto 0) ) ; end EX_WAIT; architecture arch_wait of EX_WAIT is begin P_WAIT : process (CNTL) begin Z <= A ; case CNTL is when 3 | 15 =>

10

UNIVERSITATEA TEFAN CEL MARE SUCEAVA FACULTATEA DE INGINERIE ELECTRIC I TIINA CALCULATOARELOR Z <= A xor B; when others => null ; end case; end process P_WAIT; end arch_wait;

3. Sumatorul
3.1 Sumatorul complet
Pentru a construi un sumator pentru adunarea a dou numere binare pe n bii, X = xn-1... x0 i Y = yn-1 y0, vom ncepe cu adunarea a doi bii. Rezultatul acestei adunri este suma biilor, si, i un bit de transport, ci+1, pentru urmtoarea poziie de bit din numr. Cu alte cuvinte, si = xi + yi + ci i ci+1 = 1 dac exist un transport pentru urmtoarea pereche de bii de la stnga. De notat c operatorul + din aceast ecuaie este pentru adunare i nu pentru OR-ul logic. De exemplu, se consider urmtoarea adunare a dou numere binare pe 4 bii, X = 1001 i Y = 0011.

1 0 0 1 + 0 0 1 111 ------------------------1 1 0 0 Rezultatul adunrii este 1100. Adunarea este efectuat la fel i pentru numerele zecimale, cu excepia c apare un transport dac suma este 2 sau 3 n zecimal deoarece 2 este 10 iar 3 este 11. Cel mai semnificativ bit este bitul de transport. Uitndu-ne la bitul marcat cu linie ntrerupt n figur unde x1 = 0, y1 = 1 i c1 = 1, adunarea pentru acest bit este x1 + y1 + c1 = 0 +1 + 1 =10. Prin urmare, suma bitului este s1 = 0 iar bitul de transport este c2 = 1. Circuitul pentru adunarea a unui singur bit cu tot cu transport este cunoscut ca sumator complet (full adder - FA) iar tabela de adevr este prezentat n figura 3.1(a). Ecuaiile corespunztoare pentru si i ci+1 sunt prezentate n figura 3.1(b). De la aceste 2 ecuaii se obine circuitul pentru sumatorul complet care este prezentat n figura 3.1(c). Figura 3.1(d) prezint simbolul logic pentru sumatorul complet. Codul VHDL al fluxului de date pentru sumatorul complet este prezentat n figura 3.2.

11

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

xi 0 0 0 0 1 1 1 1

yi 0 0 1 1 0 0 1 1

ci 0 1 0 1 0 1 0 1 (a)

ci+1 0 0 0 1 0 1 1 1

si 0 1 1 0 1 0 0 1

si = xiyici + xiyici + xiyici + = (xiyi + xiyi)ci + (xiyi + xiyi)ci = (xi yi)ci + (xi yi)ci = xi yi ci ci+1 = xiyici + xiyici + xiyici + xiyici = xiyi (ci + ci) + (xiyi + xiyi)ci = (xi yi)ci + (xi yi)ci = xiyi + ci (xi yi) (b)

xi

yi

ci+1 ci

ci ci+1

yi

FA
si

ci

si (c) (d)

Figura 3.1 Sumator complet: (a) tabel de adevr; (b) ecuaiile pentru si i ci +1; 12

UNIVERSITATEA TEFAN CEL MARE SUCEAVA FACULTATEA DE INGINERIE ELECTRIC I TIINA CALCULATOARELOR (d) simbol logic
LIBRARY IEEE ; USE IEEE.STD_LOGIC_1164.ALL ; ENTITY fa IS PORT ( Ci, Xi, Yi: IN STD_LOGIC ; Ci1, Si: OUT STD_LOGIC) ; END fa; ARCHITECTURE Dataflow OF fa IS BEGIN Ci1 <= (Xi AND Yi) OR (Ci AND (Xi XOR Yi)); Si <= Xi XOR Yi XOR Ci; End Dataflow ;

Figura 3.2 Codul VHDL pentru fluxul de date din sumatorul complet pe un bit

3.1.1 Sumatorul Ripple-carry


Sumatorul complet este pentru adunarea a doi operanzi care au doar un bit. Pentru a aduna doi operanzi care au s zicem 4 bii, vom conecta, n serie, mpreun patru sumatoare complete. Circuitul rezultat (prezentat n figura 3.3) este denumit sumatorul ripple-carry (sumator n cascad) pentru adunarea a doi operanzi pe 4 bii. Din moment ce sumatorul complet adun trei bii, xi, yi i ci, mpreun, avem nevoie s setm primul bit de transport, c0, la 0 astel nct adunarea s se fac corect. Mai departe, semnalul de ieire, cout, este 1 att timp ct exist o depire n adunare. Codul VHDL structural pentru sumatorul ripple-carry pe 4 bii este prezentat n figura 3.4. Din moment ce trebuie s multiplicm componenta sumatorului complet, putem folosi fie instruciunea PORT MAP de patru ori sau putem utiliza instruciunea FORGENERATE aa cum este prezentat n codul care genereaz automat cele patru componente. Instruciunea FOR k IN 3 DOWNTO 0 GENERATE determin de cte ori se repet starea PORT MAP care se afl n corpul instruciunii GENERATE i care este valoarea utilizat pentru k. Semnalul de tip vector Carryv este folosit pentru a propaga bitul carry dintr-un FA ctre urmtorul. x3 y3 yi cout x2 y2 yi c3 x1 y1 yi c2 x0 y0 yi c1

FA3
si s3

ci

FA2
si s2

ci

FA1
si s1

ci

FA0
si s0

ci

c0 = 0

13

UNIVERSITATEA TEFAN CEL MARE SUCEAVA FACULTATEA DE INGINERIE ELECTRIC I TIINA CALCULATOARELOR Figura 3.3 Sumatorul ripple-carry
LIBRARY IEEE ; USE IEEE.STD_LOGIC_1164.ALL ; ENTITY Adder4 IS PORT ( A, B : IN STD_LOGIC_VECTOR (3 DOWNTO 0); Cout : OUT STD_LOGIC; SUM : OUT STD_LOGIC_VECTOR (3 DOWNTO 0)); END Adder4; ARCHITECTURE Structural OF Adder4 IS COMPONENT FA PORT ( ci, xi, yi : IN STD_LOGIC; co, si : OUT STD_LOGIC); END COMPONENT; SIGNAL Carryv : STD_LOGIC_VECTOR (4 DOWNTO 0) ; BEGIN Carryv (0) <= 0; Adder : FOR k IN 3 DOWNTO 0 GENERATE FullAdder : FA PORT MAP (Carryv (k), A (k), B (k), Carryv (k+1), Sum (k)); END GENERATE Adder; Cout <= Carryv (4); END Structural;

Figura 3.4 Codul VHDL pentru sumatorul ripple-carry pe 4 bii utiliznd starea FOR-GENERATE

3.1.2 Sumatorul cu transport anticipat (carry-lookahead)


Sumatorul n cascad (ripple-carry) este ncet deoarece transportul de intrare pentru fiecare sumator complet este dependent de semnalul carry-out din FA-ul anterior. Prin urmare nainte ca FAi s genereze o dat de ieire valid, acesta trebuie s atepte ca FAi-1 s aib o dat valid. n sumatorul cu transport anticipat (carry-lookahead), fiecare adunare pe bit elimin aceast dependen de semnalul carry-out anterior i impune n schimb utilizarea valorilor celor doi operanzi de intrare. Pentru fiecare FA i, semnalul carry-out, ci+1, este setat la 1 dac una din urmtoarele condiii sunt adevrate : xi = 1 i yi = 1 sau (xi = 1 sau yi = 1) iar ci = 1 Cu alte cuvinte,

14

UNIVERSITATEA TEFAN CEL MARE SUCEAVA FACULTATEA DE INGINERIE ELECTRIC I TIINA CALCULATOARELOR ci+1 = xiyi + ci(xi + yi) (1)

La prima vedere, aceast ecuaie carry-out arat complet diferit fa de ecuaia carry-out dedus din figura 3.1(b). Totui, sunt echivalente: xiyi + ci(xi + yi) = xiyici + xiyici + xiyici + xiyici Dac lsm: gi = xiyi i p i = xi + yi atunci ecuaia (1) poate fi rescris astfel: ci+1 = gi + pici (2)

Utiliznd ecuaia (2) pentru c1+1, vom putea extinde n mod recursiv expresia pentru a determina ci doar ca o sum a celor doi operanzi de intrare, X i Y, i de bitul iniial de transport (carry-in), c0. Utiliznd aceast tehnic, vom obine urmtoarele ecuaii carry-out pentru un grup de 4 bii: c1 = g0 + p0co (3) c2 = g1 + p1c1 = g1 + p1(g0 + p0c0) = g1 + p1g0 + p1p0c0 c3 = g2 + p2c2 = g2 + p2(g1 +p1g0 + p1p0c0) = g2 + p2g1 + p2p1g0 + p2p1p0c0 c4 = g3 + p3c3 = g3 + p3(g2 + p2g1 + p2p1g0 + p2p1p0c0) = g3 + p3g2 + p3p2g1 + p3p2p1g0 + p3p2p1p0c0

(4)

(5)

(6)

Utiliznd ecuaiile (3) pn la (6), obinem circuitul pentru generarea semnalelor de transport anticipat (carry-lookahead) de la c1 pn la c4, aa cum s-a prezentat n figura3.5(a). De notat c fiecare ecuaie este implementat sub forma unei scheme logice combinaionale pe trei niveluri un nivel pentru generarea lui gi i pi, i dou nivele (pentru formatul de tip sum de produse) - pentru generarea expresiei ci. Acest circuit carry-lookahead poate fi redus dac se consider c0 ca fiind ntotdeauna 0. Sumatorul complet pentru sumatorul carry-lookahead poate fi fcut foarte simplu att timp ct nu este necesar s se genereze semnalul carry-out pentru urmtorul bit. De aceea, acest sumator complet are nevoie doar s genereze semnalul sumi. Figura 3.5(b) prezint o generalizare pentru felii de i bii al sumatorului cu transport anticipat.

15

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

Figura 3.5 (a) Circuit pentru generarea semnalelor carry-lookahead, de la c 1 pn la c4 ; (b) circuitul cu transport anticipat generalizat pentru felii de i bii cu un singur bit de transport.

3.2 Reprezentarea numerelor negative n complement fa de 2


nainte de a introduce circuitul de scdere, trebuie ca s revedem cum sunt codate numerele negative n reprezentarea n complement fa de 2. Cel mai semnificant bit al unui numr cu semn ne spune cnd numrul este pozitiv sau negativ. Dac cel mai semnificant bit este 1, atunci numrul este negativ, altfel, numrul este pozitiv. Valoarea unui numr pozitiv cu semn este obinut exact ca i la numerele fr semn. De exemplu, valoarea pentru numrul pozitiv cu semn 011010012 este 1x26 +1x25 +1x23 +1x20 = 105 n zecimal. Totui, pentru a determina valoarea unui numr negativ cu semn, trebuie ca s urmm un proces cu doi pai; 1. s nlocuim toi biii de 1 cu 0 i toi biii de 0 cu 1; 2. s adunm un 1 la rezultatul obinut la pasul 1. Numrul obinut prin aplicarea celor doi pai ai procesului este evaluat ca fiind un numr fr semn pentru valoarea sa. Negativul acestei valori rezultate este valoarea numrului original cu semn negativ. Exemplu 1: De exemplu, se d un numr cu semn pe 8 bii 111010012 , care se tie c este un numr negativ deoarece ncepe cu 1. Pentru a gsi valoarea acestui numr negativ, vom urma cei doi pai ai procesului astfel: 11101001 00010110 00010111 numrul iniial inversarea biilor adunarea cu 1 la numrul anterior 16

UNIVERSITATEA TEFAN CEL MARE SUCEAVA FACULTATEA DE INGINERIE ELECTRIC I TIINA CALCULATOARELOR Valoarea numrului rezultat este 00010111 care este transformat n zecimal astfel 1x24+1x22+1x21+1x20 = 23. De aceea, valoarea numrului iniial este 23 negativ (-23). Exemplul 2: Un alt exemplu este un numr cu semn pe 4 bii 1000, aplicndu-i cei doi pai ai procesului vom obine: 1000 numrul iniial 0111 inversarea biilor 1000 adunarea cu 1 Numrul rezultat 1000 este exact ca i numrul iniial! Acest lucru nu trebuie s ne genereze o confuzie dac urmm exact instruciunile procesului de conversie. Trebuie s interpretm numrul rezultat ca un numr fr semn pentru a determina valoarea. Interpretarea numrului rezultat 1000 ca un numr fr semn ne d valoarea 8. De aceea, numrul iniial, care este 1000 va fi -8. Nr. Binar pe 4 bii 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111 Figura 3.6 Complement fa de 2 0 1 2 3 4 5 6 7 -8 -7 -6 -5 -4 -3 -2 -1

3.3 Circuitul de scdere


Putem construi un circuit de scdere pe 1 bit similar ca i metoda folosit pentru realizarea unui sumator complet. n loc de bitul sum si avem bitul diferen di iar n loc de bitul de transport (ci) avem bitul de mprumut (bi) de intrare i (bi+1) de ieire. Ca urmare di

17

UNIVERSITATEA TEFAN CEL MARE SUCEAVA FACULTATEA DE INGINERIE ELECTRIC I TIINA CALCULATOARELOR = xi - yi bi = 1 i bi+1 = 1 dac este nevoie de mprumut pentru scdere, atfel b i+1 = 0. Tabela de adevr pentru scderea pe 1 bit este prezentat n figura 3.7(a), din care sunt rezultate ecuaiile (7) pentru di i (8) pentru bi+1. di = xiyibi + xiyibi + xiyibi + xiyibi = (xiyi + xiyi)bi + (xiyi + xiyi)bi = (xi yi)bi + (xi yi)bi = xi yi bi bi+1 = xiyibi + xiyibi + xiyibi + xiyibi = xibi (yi+ yi ) + xiyi(bi + bi) + yibi (xi + xi) = xibi + xiyi + yibi

(7)

(8)

De la aceste 2 ecuaii, obinem circuitul de scdere prezentat n figura 3.7(b). Figura 3.7.(c) prezint simbolul logic pentru circuitul de scdere.

Figura 3.7. Circuitul de scdere pe 1 bit: (a) tabela de adevr; (b) circuitul; (c) simbolul logic

3.4 Combinaia dintre sumator i circuitul de scdere


n loc de a construi separat unitile sumatorului i circuitului de scdere, putem modifica puin sumatorul (sau sumatorul cu transport anticipat) pentru a realiza ambele operaii. Circuitul modificat realizeaz scderea prin aducerea unei valori negative la al doilea operand. Reamintim c pentru a converti un numr n reprezentarea sa n complement fa de 2, pur i simplu inversm toi biii din 0 n 1 i vice versa iar apoi se adun cu 1. Pentru adunarea a doi operanzi de intrare A i B, este folosit un semnal de selecie S pentru a selecta care operaie se realizeaz n conformitate cu tabela de adevr din figura 3.8(a). Atunci cnd este selectat operaia de scdere, de ex. S = 1, operandul B trebuie s fie inversat. Reamintim c x 1 = x'. n final, adunarea cu 1 este realizat prin setarea unui semnal primar carry-in c0 pe 1. Pe de alt parte, atunci cnd este selectat

18

UNIVERSITATEA TEFAN CEL MARE SUCEAVA FACULTATEA DE INGINERIE ELECTRIC I TIINA CALCULATOARELOR operaia de adunare, de ex. S = 0, operandul B nu va fi inversat de ctre operaia XOR. n acest caz, vom avea c0 = S = 0. Este prezentat n figura 3.8(b) o combinaie ntre un sumator i un circuit de scdere pe 8 bii i simbolul logic n 3.8.(c). Codul VHDL comportamental al combinaiei dintre un sumator i circuitul de scdere este prezentat n figura 3.9 S 0 1 Funcia Adunare Scdere (a) Operaia F=A+B F = A + B + 1

Figura 3.8. Combinaia dintre un sumator i un circuit de scdere: (a) tabela de adevr; (b) circuitul; (c) simbolul logic LIBRARY ieee; USE ieee.std_logic_1164.ALL; USE ieee.std_logic_arith.ALL; USE ieee.std_logic_unsigned.ALL; ENTITY AddSub IS GENERIC(n: NATURAL :=8); -- default number of bits = 8 19

UNIVERSITATEA TEFAN CEL MARE SUCEAVA FACULTATEA DE INGINERIE ELECTRIC I TIINA CALCULATOARELOR PORT ( A: IN std_logic_vector(n-1 downto 0); B: IN std_logic_vector(n-1 downto 0); subtract: IN std_logic; carry: OUT std_logic; sum: OUT std_logic_vector(n-1 downto 0)); END AddSub; ARCHITECTURE Behavioral OF AddSub IS -- temporary result with one extra bit for carry SIGNAL result: std_logic_vector(n downto 0); BEGIN PROCESS(subtract, A, B) BEGIN IF (subtract = '0') THEN -- addition --add the two operands with one extra bit for carry result <= ('0' & A)+('0' & B); sum <= result(n-1 downto 0); -- extract the n-bit result carry <= result(n); -- extract the carry bit from result ELSE -- subtraction result <= ('0' & A)-('0' & B); sum <= result(n-1 downto 0); -- extract the n-bit result carry <= result(n); -- extract the borrow bit from result END IF; END Behavioral; Figura 3.9.

4. Desfurarea lucrrii
1. Se studiaz instruciunile secveniale i se va testa funcionarea programelor pentru circuitele logice combinaionale. 2. Se va studia sumatorul i circuitul de scdere i se vor testa programele din paragraful 3.

20