+ All Categories
Home > Documents > LABORATOR nr - eed.usv.rocristinag/LAB_ASC/laborator6.doc · Web view2.1 Tipuri de date. Fiecare...

LABORATOR nr - eed.usv.rocristinag/LAB_ASC/laborator6.doc · Web view2.1 Tipuri de date. Fiecare...

Date post: 30-Jan-2020
Category:
Upload: others
View: 8 times
Download: 0 times
Share this document with a friend
30
UNIVERSITATEA “ŞTEFAN CEL MARE” SUCEAVA FACULTATEA DE INGINERIE ELECTRICĂ ŞI ŞTIINŢA CALCULATOARELOR LABORATOR nr. 6 VHDL. Tipuri de date. Atribute Proiectarea unui microprocesor. ALU 1. Scopul laboratorului În cadrul acestei lucrări se urmăresc două obiective: 1. Prezentarea tipurilor de date şi a atributelor din VHDL. 2. Proiectarea Unităţii Aritmetice şi Logice, Multiplexoarelor, Circutelor cu trei stări şi a Registrelor de deplasare (Shifter şi Barrel Shifter). 2. Consideraţii teoretice 2.1 Tipuri de date Fiecare obiect de date are asociat un tip. Tipul defineşte setul de valori pe care obiectul le poate lua şi setul de operaţii care îi sunt permise. Noţiunea 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 corespunzătoare 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 fişiere. Tipurile scalare reprezintă o singură valoare şi sunt ordonate astfel încât şă se poate realiza pe ele operaţiile relaţionale. Tipul scalar include întreg, real şi tipurile enumerate Booleane şi Caracter. Vor fi date în continuare câteva exemple dintre acestea. 2.1.1 Tipuri de date definite în Pachetul Standard VHDL are câteva tipuri predefinite în pachetul standard aşa cum este prezentat în tabelul următor. Pentru a utiliza unul dintre aceste pachete trebuie să includă clauza următoare: 1
Transcript

UNIVERSITATEA “ŞTEFAN CEL MARE” SUCEAVAFACULTATEA DE INGINERIE ELECTRICĂ ŞI ŞTIINŢA CALCULATOARELOR

LABORATOR nr. 6 VHDL. Tipuri de date. Atribute

Proiectarea unui microprocesor. ALU

1. Scopul laboratorului

În cadrul acestei lucrări se urmăresc două obiective: 1. Prezentarea tipurilor de date şi a atributelor din VHDL. 2. Proiectarea Unităţii Aritmetice şi Logice, Multiplexoarelor, Circutelor cu trei stări şi a

Registrelor de deplasare (Shifter şi Barrel Shifter).

2. Consideraţii teoretice

2.1 Tipuri de dateFiecare obiect de date are asociat un tip. Tipul defineşte setul de valori pe care

obiectul le poate lua şi setul de operaţii care îi sunt permise. Noţiunea 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 corespunzătoare 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 fişiere. Tipurile scalare reprezintă o singură valoare şi sunt ordonate astfel încât şă se poate realiza pe ele operaţiile relaţionale. Tipul scalar include întreg, real şi tipurile enumerate Booleane şi Caracter. Vor fi date în continuare câteva exemple dintre acestea.

2.1.1 Tipuri de date definite în Pachetul StandardVHDL are câteva tipuri predefinite în pachetul standard aşa cum este prezentat în

tabelul următor. Pentru a utiliza unul dintre aceste pachete trebuie să includă clauza următoare:

library std, work ;use std.standard.all ;

Tipuri definite în Pachetul Standard din Librăria stdTipuri Nivelul de valori Exemplu

bit ‘0’, ‘1’ signal A: bit:=1;bit_vector O arie cu fiecare element de tip

bitsignal INBUS: bit_vector(7 downto 0);

boolean FALS, ADEVĂRAT variable TEST:Boolean:= ’FALSE’

character Orice caracter legal VHDL (a se variable VAL: character:=’$’;

1

UNIVERSITATEA “ŞTEFAN CEL MARE” SUCEAVAFACULTATEA DE INGINERIE ELECTRICĂ ŞI ŞTIINŢA CALCULATOARELOR

vedea pachetul standard); caracterele printabile trebuie să fie plasate între ghilimele simple (de ex. ‘#’)

file_open_kind* modul_citire, modul_scriere, modul_căutare

file_open_status* deschis_ok, stare_eroare, nume_eroare, mod_eroare

integer Nivelul este dependent de implementare dar include totuşi – (231 - 1) până la +(231 – 1)

constant CONST1 : integer :=129 ;

natural Întregul începe cu 0 până la maximul specificat în implementare

variable VAR1: natural := 2;

positive Întregul începe de la 1 până la maximul specificat în implementare

variable VAR2: positive :=2;

real* Număr în virgulă flotantă de la -1.0 x 1038 până la +1.0 x 1038 (se poate implementa independent). Nu este suportat de către progarmul de sinteza Foundation.

variable VAR3: real :=+64.2E12;

severity_level Notă, avertizare, eroare, greşealăstring O arie ăn care fiecare element

este de tipul caractervariable VAR4: string(1to12) := “@$ABC*()_%Z”;

time* Un număr întreg pentru care gama valorilor este definită de implementare; unităţile pot fi exprimate în secunde, ms, us, ns, ps, fs, minute şi ore. Nu este suportat de către programul de sintetizare Foundation.

variable DELAY: time :=5ns;

* Nu este suportat de către programul de sinteza FOUNDATION.

2.1.2 Tipuri definite de utilizator Sintaxa este următoarea:

type identificator is definiţia_tipului;

Sunt date câteva exemple de definiţii ale tipului după cum urmează :

a. Tipurile întregtype small_int is range 0 to 1024;type my_word_length is range 31 downto 0;

2

UNIVERSITATEA “ŞTEFAN CEL MARE” SUCEAVAFACULTATEA DE INGINERIE ELECTRICĂ ŞI ŞTIINŢA CALCULATOARELOR

subtype data_word is my_word_length range 7 downto 0;

Un subtip este un subset al tipului definit anterior. Ultimul exemplu prezentat anterior prezintă utilizarea subtipurilor. El defineşte un tip numit data_word care este un subtip al my_word_length al cărui nivel este restricţionat 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 către programul de sinteză Xilinx Foundation.

c. Tipurile fiziceDefiniţia tipului fizic include un identificator al unităţilor după cum urmează:

type conductance is range 0 to 2E-9units

mho;mmho = 1E-3 mho;

umho = 1E-6 mho;nmho = 1E-9 mho;pmho = 1E-12 mho;

end units conductance;Sunt date, în continuare, câteva exemple de declaraţii 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 lăsat un spaţiu înainte de numele unităţii.Tipurile de date fizice nu sunt suportate de către programul de sinteză al

Foundation Express.Atunci când vom folosi tipurile noastre, vom avea nevoie să includem definiţia

tipului în interiorul corpului arhitecturii sau să declarăm tipul într-un pachet. Poate fi folosit, mai departe, pentru un pachet numit “my_types”.

package my_types istype 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;

3

UNIVERSITATEA “ŞTEFAN CEL MARE” SUCEAVAFACULTATEA DE INGINERIE ELECTRICĂ ŞI ŞTIINŢA CALCULATOARELOR

type cmos_level is range 0.0 to 3.3;type conductance is range 0 to 2E-9;

unitsmho;

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 enumerateUn tip enumerat este alcătuit dintr-o listă de caractere literale sau identificatori.

Tipul enumerat poate fi foarte manevrabil atunci când se scriu modelele unui nivel abstract. Sintaxa pentru un tip enumerat este următoarea:

type numele_tipului is (listă de identificatori sau caracter literal);

Sunt date câteva 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 iniţializează semnalul, iniţializarea se face cu valoare cea mai din stânga din listă.

Tipurile enumerate trebuie să fie definite în corpul arhitecturii sau în interiorul unui pachet aşa cum a fost prezentat în secţiunea 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’, -- neiniţializat’X’, -- forţează o valoare necunoscută’0’, -- forţează 0’1’, -- forţează 1’Z’, -- impedanţă înaltă’W’, -- stare slabă necunoscută

4

UNIVERSITATEA “ŞTEFAN CEL MARE” SUCEAVAFACULTATEA DE INGINERIE ELECTRICĂ ŞI ŞTIINŢA CALCULATOARELOR

’L’, -- o slab’H’. -- 1 slab’-’); -- nu contează.

Pentru a putea folosi tipul acesta trebuie inclus în clauza de dinaintea fiecărei declaraţii a entităţii.

library ieee; use ieee.std_logic_1164.all;

Este posibil ca mai multe drivere să comande acelaşi semnal. În acest caz, ar apărea un conflict iar semnalele de ieşire ar fi nedeterminate. De exemplu, ieşirile unei porţi AND şi a unei porţi NOT vor fi conectate împreună la ieşirea OUT1. Pentru a rezolva valoarea ieşirii, se poate apela funcţia rezoluţie. Aceasta este de obicei o funcţie scrisă de utilizator care va rezolva semnalul. Dacă semnalul nu este un tip std_ulogic şi are drivere multiple, atunci trebuie folosită funcţia de rezoluţie. Pachetul std_logic_1164 are o astfel de funcţie de rezoluţie, numită RESOLVED predefinită. Se poate astfel folosii declaraţia pentru semnalul OUT1:

signal OUT1: resolved: std_ulogic;

Dacă există vreun conflict, funcţia 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 arrayUn tip array este declarat astfel:

type numele_array is array (indexarea schemei) of tipul_elementului;

type MY_WORD is array (15 downto 0) of std_logic;type YOUR_WORD is array (0 to 15) of std_logic;type VAR is array (0 to 7) of integer;type 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 coborând până la 0 şi respectiv, de la 0 urcând până la 15. Ultimul exemplu defineşte o arie unidimensională a elementelor tipului std_logic care utilizează un tip std_ulogic pentru a defini constrângeri privind tipul De aceea, această arie arată în felul următor :

5

UNIVERSITATEA “ŞTEFAN CEL MARE” SUCEAVAFACULTATEA DE INGINERIE ELECTRICĂ ŞI ŞTIINŢA CALCULATOARELOR

Index : ‘U’ ‘X’ ‘0’ ‘1’ ‘Z’ ‘W’ ‘L’ ‘H’ ‘-’Element :

Acum putem să declarăm obiectele ale acestor tipuri de date. Sunt date câteva exemple:

signal MEM_ADDR: MY_WORD;signal DATA_WORD: YOUR_WORD := B”1101100101010110”;constant SETTING: VAR := (2,4,6,8,10,12,14,16);

În primul exemplu, semnalul MEM_ADDR este o arie pe 16 biţi, iniţializaţi toti pe 0. Trebuie specificat indexul pentru a accesa individual elementele unei arii. De exemplu, MEM_ACCR(15) accesează bitul cel mai din stânga al ariei, în timp ce DATA_WORD(15) accesează bit cel mai din dreapta al ariei care este iniţializat 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 utilizând ş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 iniţializată cu:0 21 34 65 7

Pentru a accesa un element se specifică indexul, de ex. DATA_ARR (3,1) returnează valoarea 4. Ultimul exemplu defineşte o arie 9x9 sau un tabel cu un index de elemente al tipului std_ulogic.

Câteodata este mult mai convenabil să nu se specifice dimensiunea ariei atunci când este declarat tipul array.  Acest tip este denumit arie fără constrângeri. Sintaxa pentru declararea acestui tip de arie este:

type numele_ariei is array (type range <>) of tipul_elementelor;

Se dau câteva 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 când se declară obiectul array:

6

UNIVERSITATEA “ŞTEFAN CEL MARE” SUCEAVAFACULTATEA DE INGINERIE ELECTRICĂ ŞI ŞTIINŢA 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 alcătuit din elemente multiple

care pot fi de tipuri diferite. Sintaxa pentru tipul record este următoarea:

type nume isrecord

identificator :indicaţia_subtipului :

identificator :indicaţia_subtipuluiend record ;

Ca un exemplu,type MY_MODULE is

recordRISE_TIME :time ;FALL_TIME :time ;SIZE :integer range 0 to 200;DATA :bit_vector (15 downto 0);

end record ;

signal A, B: MY_MODULE;

Pentru a accesa sau asigna valorile pentru înregistrare, se poate folosi una dintre următoarele metode :

A.RISE_TIME <= 5ns;A.SIZE <= 120 ;

B <= A ;

2.1.5 Conversiile tipulDin moment ce VHDL este un limbaj foarte puternic orientat pe tip, nu se poate

asigna o valoare corespunzătoare unui tip de date pentru un semnal care are alt tip de date. În general, este de preferat aceleaşi tipuri de date pentru aceleaşi semnale dintr-o schemă, precum std_logic (în locul uni amestec dintre std_logic şi tipul bit). Câteodată 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ă funcţii disponibile în câteva pachete din librăria ieee, precum pachetele std_logic_1164 şi std_logic_arith. Ca un exemplu, pachetul std_logic_1164 permite următoarele conversii :

7

UNIVERSITATEA “ŞTEFAN CEL MARE” SUCEAVAFACULTATEA DE INGINERIE ELECTRICĂ ŞI ŞTIINŢA CALCULATOARELOR

Conversiile suportate de către pachetul std_logic_1164Conversia Funcţia

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ă următorul exemplu :

2.1.6 Atribute

Expresia “A and B”, care are tipul bit_vector, trebuie să fie convertită la tipul std_logic_vector ca să fie ca acelaşi tip ca şi semnalul de ieşire out4.

Sintaxa conversiei tipului este următoarea :

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 câteva condiţii 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 aceeaşi lungime şi dacă au tipuri ale elementelor identice sau dacă tipurile elementelor sunt convertibile ;

Tipurile enumerate nu pot fi convertite.

8

entity QUAD_NAND2 isport (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 isbegin

out4 <= to_stdlogicvector (A and B);end behavioral_2;

UNIVERSITATEA “ŞTEFAN CEL MARE” SUCEAVAFACULTATEA DE INGINERIE ELECTRICĂ ŞI ŞTIINŢA CALCULATOARELOR

2.1.5 AtributeleVHDL 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 informaţiei despre un semnal, variabilă sau tip. Atributele sunt precedate de un apostrof urmat de către numele atributului.

a. Atributele semnalului

Următorul tabel ne oferă câteva atribute ale semnalului :

Atribut Funcţiesignal_name’event Returnează o valoare Booleană True dacă

apare un eveniment pe semnal semnalului, altfel returnează False.

signal_name’active Returnează o valoare Booleană True dacă a avut loc o tranzacţie ( sau o asignare) pe semnal, altfel returnează False.

signal_name’transaction Returnează un semnal de tip “bit” care comută (0 în 1 sau 1 în 0) de fiecare dată când există o tranzacţie pe semnal.

signal_name’last_event Returnează intervalul de timp de la ultimul eveniment de pe semnal.

signal_name’last_active Returnează intervalul de timp de la ultima tranzacţie de pe semnal.

signal_name’last_value Ne dă valoarea semnalului dinaintea ultimului eveniment apărut pe semnal.

signal_name’delayed(T) Ne dă un semnal care este versiunea întârziată (de către timpul T) al celui original. [T este opţional, implicit T=0].

signal_name’stable(T) Returnează o valoare Booleană, True, dacă nu a apărut nici un eveniment pe semnal în intervalul T, altfel returnează False. [T este opţional, implicit T=0].

signal_name’quiet(T) Returnează o valoare Booleană, True, dacă nu apare nici o tranzacţie pe semnal în intervalul T, altfel returnează False. [T este opţional, implicit T=0].

Este dat un exemplu de atribut :

if (CLOCK’event and CLOCK=’1’) then…

Această expresie verifică apariţia unui front pozitiv al ceasului. Pentru a afla cât timp a trecut de la ultimul front al ceasului, se poate folosi următorul atribut:

CLOCK’last_event

9

UNIVERSITATEA “ŞTEFAN CEL MARE” SUCEAVAFACULTATEA DE INGINERIE ELECTRICĂ ŞI ŞTIINŢA CALCULATOARELOR

b. Atribute scalareSunt suportate câteva atribute ale tipului scalar, scalar_type. Următorul tabel ne

arată câteva dintre aceste atribute:

Atribut Valoarescalar_type’left Returnează prima sau valoarea cea mai din

stânga a tipului de scalar în gama definită.scalar_type’right Returnează ultima sau valoarea cea mai din

dreapta a tipului scalar în ordinea definită.scalar_type’low Returnează valoarea cea mai mică a tipului

scalar în ordinea definită.scalar_type’high Returnează valoarea cea mai mare a tipului

scalar în ordinea definită.scalar_type’ascending True dacă T este în ordinea crescătoare,

altfel False.scalar_type’value(s) Returnează valoarea din T care este

reprezentată prin s (s aşteaptă valoarea string).

Sunt date câteva exemple:

type conductance is range 1E-6 to 1E3units mho;end units conductance;

type my_index is range 3 to 15;type my_levels is (low, high, dontcare, highZ);

conductance’right returns: 1E3conductance’high 1E3conductance’low 1E-6my_index’left 3my_index’value(5) “5”my_levels’left lowmy_levels’low lowmy_levels’high highZmy_levels’value(dontcare) “dontcare”

c. Atributele ariilor

Prin utilizarea atributelor ariilor se returnează o valoare index corespunzătoare gamei ariei.

10

UNIVERSITATEA “ŞTEFAN CEL MARE” SUCEAVAFACULTATEA DE INGINERIE ELECTRICĂ ŞI ŞTIINŢA CALCULATOARELOR

Sunt suportate următoarele atribute:Atribut Returnează

MATRIX’left(N)MATRIX’right(N)MATRIX’high(N)MATRIX’low(N)MATRIX’length(N)MATRIX’range(N)MATRIX’reverse_range(N)MATRIX’ascending(N)

Indexul elementului cel mai din stânga Indexul elementului cel mai din dreapta Valoarea cea mai mareValoarea cea mai micăNumărul de elementeIntervalul (gama)Intervalul (gama )inversat (ă)O valoare Booleană TRUE dacă indexul este o ordinea crescătoare, altfel FALSE

Numărul N dintre paranteze se referă la dimensiune. Pentru un vector

unidimensional, se poate omite numărul N aşa cum este prezentat în exemplul următor :

type MYARR8x4 is array (8 downto 1, 0 to 3) of boolean;type MYARR1 is array (-2 to 4) of integer;

MYARR1’left returns: -2MYARR1’right 4MYARR1’high 4MYARR1’reverse_range 4 downto to -2MYARR8x4’left(1) 8MYARR8x4’left(2) 0MYARR8x4’right(2) 3MYARR8x4’high(1) 8MYARR8x4’low(1) 1MYARR8x4’ascending(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 operaţiilor logice şi aritmetice, precum adunarea, scăderea, AND logic şi OR logic. Totuşi, ALU nu este folosit pentru a rezolva înmulţirile şi împărţirile. Pe de altă parte, atunci când se realizează circuitul pentru ALU, putem folosi aceeaşi idee ca şi la circuitul combinaţional pentru sumator-scăzător. Din nou, vom folosi sumatorul în cascadă ca bloc de bază iar apoi vom introduce câteva circuite logice combinaţionale în faţa celor doi operanzi de intrare pentru fiecare sumator complet. În acest mod, intrările primare vor fi modificate corespunzător. În general, circuitul total pentru un ALU pe 4 biţi este prezentat în figura 3.1 (a) iar simbolul logic în 3.1 (b).

După cum putem vedea din figură, cele două circuite combinaţionale din faţa sumatorului complet (FA) sunt etichetate LE şi AE. Extinderea logică (LE) este pentru a manipula toate operaţiile logice; în timp ce, extinderea aritmetică (AE) este pentru a

11

UNIVERSITATEA “ŞTEFAN CEL MARE” SUCEAVAFACULTATEA DE INGINERIE ELECTRICĂ ŞI ŞTIINŢA CALCULATOARELOR

manipula operaţiile aritmetice. LE execută operaţiile logice actuale ale celor doi operanzi primari, ai şi bi înainte de a trece rezultatul primului operand, x i, din FA. Pe de altă parte, AE modifică doar al doilea operand, b i, şi îl transmite la al doilea operand, y i, din FA unde este realizată operaţia aritmetică actuală.

Figura 3.1 ALU pe 4 biţi: (a) circuit; (b) simbolul logic.

Am văzut din circuitul sumator-scăzător că, pentru a realiza adunările şi scăderile, avem nevoie să modificăm doar yi (al doilea operand din FA) astfel încât toate operaţiile să fie făcute prin adunări. De aceea, AE ia doar al doilea operand de la intrarea primară, bi, ca şi intrare şi modifică valoarea în funcţie de ce operaţie va fi realizată. Ieşirea y i este conectată la al doilea operand de intrare din FA. Ca şi în circuitul sumator-scăzător, adunarea este realizată în FA. Atunci când sunt realizate operaţiile aritmetice, LE trebuie să treacă primul operand nemodificat de la intrarea primară a i până la ieşirea xi din FA.

Din nefericire pentru AE (care modifică doar operandul), LE realizează şi operaţiile logice actuale. Astfel, de exemplu, dacă dorim să realizăm operaţia A or B, LE va lua pentru fiecare bit în parte biţii corespunzători, a i şi bi, şi va aplica operaţia SAU. Apoi ieşirea lui LE este trecută la primul operand, x i, din FA. Din moment ce această valoare este deja rezultată din operaţia logică, nu vom dori ca FA să modifice rezultatul operaţiei logice care va trebui să se regăsească nemodificat. Acest lucru se realizează prin setarea ambilor operanzi secunzi, yi din FA şi c0 pe 0.

Circuitul combinaţional denumit CE (pentru extinderea transportului) este pentru a modifica transportul iniţial c0, astfel încât să se realizeze operaţiile aritmetice cât mai

12

UNIVERSITATEA “ŞTEFAN CEL MARE” SUCEAVAFACULTATEA DE INGINERIE ELECTRICĂ ŞI ŞTIINŢA CALCULATOARELOR

corect. Operaţiile logice nu folosesc semnalul de transport, astfel încât c0 este setat pe 0 pentru toate operaţiile logice.

s2 s1 s0 Numele operaţiei

Operaţia xi(LE) yi(AE) c0(CE)

0 0 0 Trecere Trecerea lui A către ieşire

ai 0 0

0 0 1 AND A AND B ai AND bi 0 00 1 0 OR A OR B ai OR bi 0 00 1 1 NOT A’ ai‘ 0 01 0 0 Adunare A + B ai bi 01 0 1 Scădere A - B ai bi’ 11 1 0 Incrementare A + 1 ai 0 11 1 1 Decrementare A - 1 ai 1 0

(a)

Figura 3.2. Operaţiile ALU: (a) tabela de funcţii; (b) tabela de adevăr LE; (c) tabela de adevăr AE; tabela de adevăr CE.

În circuitul prezentat în figura 3.2, cele trei linii selectate, s2, s1 şi s0, sunt utilizate pentru a selecta operaţiile din ALU. Cu aceste trei linii selectate, circuitul ALU poate implementa până la 8 operaţii diferite. Presupunem că operaţiile pe care dorim să le implementăm în ALU nostru sunt definite în Figura 3.2. (a). Coloana x i prezintă valorile pe care LE trebuie să le genereze pentru operaţii diferite. Coloana y i 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 operaţia de trecere mai departe, valoarea a i este trecută mai departe fără nici o altă modificare la x i. Pentru operaţia AND, xi ia rezultatele lui ai AND bi. Aşa cum s-a spus şi anterior, ambele yi şi c0 sunt setate pe 0 pentru toate operaţiile logice, deoarece nu dorim ca FA să modifice rezultatul. FA este utilizat doar pentru a trece rezultatul de la LE direct către ieşirea F. Pentru operaţia de scădere, în loc să scădem B, dorim să adunăm -B. Schimbarea lui B la –B în formatul complementului faţă de doi necesită inversarea biţilor lui B iar apoi adunarea cu 1. Prin urmare, y i ia inversul lui bi şi este adunat cu 1 prin setarea pe 1 a lui c0. 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 toţi

13

UNIVERSITATEA “ŞTEFAN CEL MARE” SUCEAVAFACULTATEA DE INGINERIE ELECTRICĂ ŞI ŞTIINŢA CALCULATOARELOR

biţii pe 1. Ca urmare setăm toţi yi pe 1. Pentru toate operaţiile aritmetice operandul A trebuie să treacă prin LE fără modificări. Astfel xi ia valorile lui ai pentru toate operaţiile aritmetice. Figurile 3.2 b,c şi d prezintă tabelele de adevăr pentru LE AE şi CE. Circuitul CE derivă din coloana xi din figura 3.2 b. Circuitul AE derivă din coloana y i a tabelului de adevăr din figura 3.2. c. Circuitul CE derivă din coloana c0 a tabelului de adevăr 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. Hărţile K, ecuaţiile şi schemele aferente sunt prezentate în figura 3.3 a, b şi c.

14

UNIVERSITATEA “ŞTEFAN CEL MARE” SUCEAVAFACULTATEA DE INGINERIE ELECTRICĂ ŞI ŞTIINŢA CALCULATOARELOR

Figura 3.3. Diagrame K (Karnaugh), ecuaţii şi scheme pentru (a) LE; (b) AE şi (c) CE.

15

UNIVERSITATEA “ŞTEFAN CEL MARE” SUCEAVAFACULTATEA DE INGINERIE ELECTRICĂ ŞI ŞTIINŢA CALCULATOARELOR

Figura 3.4. Codul VHDL comportamental pentru un ALU.

Figura 3.5. Trasarea simulării simple cu doi operanzi de intrare 5 şi 3 pentru toate cele 8 operaţii.

16

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 ISBEGIN

PROCESS(S, A, B)BEGIN

CASE S ISWHEN "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;

UNIVERSITATEA “ŞTEFAN CEL MARE” SUCEAVAFACULTATEA DE INGINERIE ELECTRICĂ ŞI ŞTIINŢA CALCULATOARELOR

3.1 Decodorul

Figura 3.6. Decodor cu 3 intrări şi 8 ieşiri: (a) tabela de adevăr; (b) circuit; (c) simbolul logic

Figura 3.7. Decodorul cu 3 intrări şi 8 ieşiri implementat cu şapte decodoare cu 1 intrare şi 2 ieşiri

17

UNIVERSITATEA “ŞTEFAN CEL MARE” SUCEAVAFACULTATEA DE INGINERIE ELECTRICĂ ŞI ŞTIINŢA CALCULATOARELOR

Figura 3.8 Codul VHDL comportamental pentru un decodor cu 3 intrări şi 8 ieşiri.

3.2 Multiplexor

Figura 3.9. Multiplexor cu 8 intrări şi 1 ieşire: (a) tabela de adevăr; (b) circuit; (c) simbolul logic.

18

LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;

ENTITY Decoder IS PORT(E: IN STD_LOGIC; -- enableA: IN STD_LOGIC_VECTOR(2 DOWNTO 0); -- 3 bit addressY: OUT STD_LOGIC_VECTOR(7 DOWNTO 0)); -- data bus output

END Decoder;

ARCHITECTURE Behavioral OF Decoder ISBEGIN

PROCESS (E, A)BEGIN IF (E = '0') THEN -- disabled

Y <= (OTHERS => '0'); -- 8-bit vector of 0 ELSE

CASE A IS -- enabledWHEN "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;

UNIVERSITATEA “ŞTEFAN CEL MARE” SUCEAVAFACULTATEA DE INGINERIE ELECTRICĂ ŞI ŞTIINŢA CALCULATOARELOR

Figura 3.10. Implementarea unui multiplexor cu 8 intrări şi 1 ieşire utilizând: (a) un decodor cu 3 intrări şi 8 ieşiri; (b) şapte multiplexoare cu 2 intrări şi 1 ieşire.

(a)

19

-- A 4-to-1 8-bit wide multiplexer

LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;

ENTITY Multiplexer ISPORT(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 codeARCHITECTURE Behavioral OF Multiplexer ISBEGIN

PROCESS (S,D0,D1,D2,D3)BEGIN

CASE S ISWHEN "00" => Y <= D0;WHEN "01" => Y <= D1;WHEN "10" => Y <= D2;WHEN "11" => Y <= D3;WHEN OTHERS => Y <= (OTHERS => 'U'); -- 8-bit vector of UEND CASE;

END PROCESS;END Behavioral;

UNIVERSITATEA “ŞTEFAN CEL MARE” SUCEAVAFACULTATEA DE INGINERIE ELECTRICĂ ŞI ŞTIINŢA CALCULATOARELOR

Figura 3.11. Codul VHDL pentru un multiplexor cu 4 intrări şi 1 ieşire având lărgimea de 8 biţi: (a) nivelul comportamental; (b) nivelul fluxului de date.

3.3 Buffer cu trei stări

Figura 3.12. Buffer cu trei stări: (a) tabela de adevăr; (b) simbolul logic; (c) circuit; (d) tabela de adevăr pentru porţiunea de control al circuitului buffer cu 3 stări.

Figura 3.12. Codul VHDL pentru un buffer cu trei stări având lărgimea de 8 biţi.

20

-- Dataflow level codeARCHITECTURE Dataflow OF Multiplexer ISBEGIN

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;

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 ISBEGIN

PROCESS (E, d)BEGIN

IF (E = '1') THENy <= d;

ELSEy <= (OTHERS => 'Z'); -- to get 8 Z values

END IF;END PROCESS;

END Behavioral;

UNIVERSITATEA “ŞTEFAN CEL MARE” SUCEAVAFACULTATEA DE INGINERIE ELECTRICĂ ŞI ŞTIINŢA CALCULATOARELOR

3.4 Registru de deplasare (Shifter)Un shifter este utilizat pentru deplasarea biţilor unui cuvânt binar cu o poziţie la

stânga sau la dreapta.

Figura 3.13. Shifter şi operaţiile de rotaţie.

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

21

UNIVERSITATEA “ŞTEFAN CEL MARE” SUCEAVAFACULTATEA DE INGINERIE ELECTRICĂ ŞI ŞTIINŢA CALCULATOARELOR

Figura 3.15. Codul VHDL comportamental pentru un shifter pe 8 biţi având operaţiile definite ca în figura 3.14 (a).

3.5 Registru cu deplasări multiple ( Barrel Shifter) Un registru cu deplasări multiple (barrel shifter) este un registru de deplasare

(shifter) care poate deplasa sau roti datele cu orice număr de biţi printr-o singură operaţie.

22

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 ISBEGIN

PROCESS(S, input)BEGIN

CASE S ISWHEN "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;

UNIVERSITATEA “ŞTEFAN CEL MARE” SUCEAVAFACULTATEA DE INGINERIE ELECTRICĂ ŞI ŞTIINŢA CALCULATOARELOR

Figura 3.16. Un registru cu deplasări multiple pe 4 biţi cu operaţia de rotire la stânga: (a) tabela de operare; (b) circuitul.

4. Desfăşurarea lucrării 1. Se studiază tipurile de date VHDL şi atributele.2. Se vor studia ALU, Multiplexorul, circuitul cu trei stări şi registrul de deplasare.3. Se scriu şi se testează programele VHDL corespunzătoare

5. TemaSă se implementeze şi să se testeze circuitul barrel shifter prezentat la sfârşitul paragrafului 3.

23


Recommended