Circuitele Logice Programabile

Circuitele logice programabile

CUPRINS

CAP. 1. INTRODUCERE

CAP. 2. FUNDAMENTAREA teoretică și documentarea bibliografică

pentru tema propusă

2.1. noțiuni teoretice privind circuitele logice programabile

2.1.1. Dispozitivele logice programabile

2.1.1.1. Matricea logică programabilă PLA

2.1.1.2. Matricea logică programabilă cu nivel SAU fix – PAL

2.1.1.3. Circuitele logice programabile complexe

2.1.1.4. Matrici de porți programabile în câmp

2.1.2. Memorii ROM

2.1.3. Resursele hardware și software ale circuitelor FPGA

2.1.3.1. Resurse hardware

2.1.3.1.1. Blocuri funcționale integrate

2.1.3.1.2. Condiționarea semnalelor de intrare/ieșire

2.1.3.1.3. Dispozitive speciale

2.1.3.2. Resurse software

2.1.4. Caracteristici arhitecturale ale unităților centrale ale microcontrollerelor

2.1.4.1. Memoria microcontrollerului

2.1.4.2. Dispozitive de intrare/ieșire ale microcontrollerului

2.1.4.3. Sistemul de întreruperi

2.1.5. Aplicații FPGA

2.2. Proiectarea cu circuite logice programabile

2.2.1. Proiectarea automatizată asistată de calculator a circuitelor integrate

2.2.2. Limbaje de programare a circuitelor logice programabile

2.2.2.1. Limbajul descriptor de echipamente VHDL

2.2.2.2. Limbajul descriptor de echipamente Verilog

2.2.2.2.1. Nivelul transferurilor între registre

2.2.2.2.2. Modelul unui calculator

2.2.2.2.3. Realizarea codului Verilog în circuitele logice numerice

2.2.2.2.4. Proiectarea unității de comandă

2.2.2.2.5. Creșterea vitezei de operare

2.2.3. Fluxul de proiectare

2.2.4. Principalele etape de proiectare

2.2.4.1. Descrierea sistemului

2.2.4.2. Sinteza sistemului

2.2.4.3. Simularea funcțională

2.2.4.4. Maparea tehnologică

2.2.4.5. Plasarea și rutarea

2.2.4.6. Analiza de timp

2.2.4.7. Configurarea sau programarea circuitului

2.2.4.8. Depanarea sistemului

cap. 3. proiectarea aplicației

3.1. Formularea problemei

3.2. Componenta hardware

3.3. Componenta software

3.3.1. Mediul de programare

3.3.2. Schema bloc

3.3.3. Descrierea funcțiilor

cap. 4. implementarea aplicației

4.1. Implementarea spațiului de soluții

4.2. Implementarea unor metode de filtrare a imaginilor utilizând limbajul Verilog

4.2.1. Filtrul de binarizare

4.2.2. Filtrul de inversare

4.2.3. Filtrul de colorare falsă

cap. 5. testarea aplicației și rezultate experimentale

5.1. Testarea descrierilor

5.2. Rezultatele implementării

cap. 6. concluzii ȘI IMPLEMENTĂRI VIITOARE

bibliografie

anexe

CAPITOLUL 1

INTRODUCERE

CAPITOLUL 2

FUNDAMENTAREA TEORETICĂ ȘI DOCUMENTAREA BIBLIOGRAFICĂ PENTRU TEMA PROPUSĂ

2.1. Noțiuni teoretice privind circuitele logice programabile

Dispozitivele logice programabile, PLD (Programming Logic Device) au apărut ca o necesitate pentru eliminarea inconveniențelor pe care le prezentau circuitele logice universale MUX, ROM, în implementarea funcțiilor logice sub formă de produse, și anume: generarea tuturor termenilor canonici produs deși, în general, nu sunt necesari toți; formele minime/reduse ale funcțiilor nu pot fi implementate. Pentru implementarea acestora trebuie parcurs drumul invers, adică expandarea formelor reduse la formă canonică; inexistența facilitații de implementare a funcției și prin negata acesteia, când funcția negată este mai simplă (unnele circuite MUX au atât ieșirea negată cât și nenegată).

2.1.1. Dispozitive logice programabile

Există o gamă largă de circuite integrate ale căror funcții logice pot fi programate în teriorul lor după îincheierea procesului de fabricare. Majoritatea acestor dispozitive folosesc tehnologii ce permit reprogramarea funcțiilor, ceea ce înseamnă că, dacă descoperiți o eroare de proiectare, o puteți corecta fără a înlocui dispozitivul sau a modifica fizic conexiunile. În această lucrare se va vace referința frecvent la posibilitațile și metodele de proiectare cu asemenea dispozitive.

Cronologic, matricele logice programabile (PLA – programmable logic array) au fost primele dispozitive logice programabile. Structura PLA constă în două niveluri de porți AND și OR, ale căror interconexiuni se programează de către utilizator. Folosind această structură, proiectantul poate realiza orice funcție logică până la un anumit nivel de complexitate aplicând teoria sintezei și minimizării circuitelor logice.

Structura PLA a fost îmbunătățită și costurile ei au fost reduse în urma apriției dispozitivelor logice matriceale programabile (PAL – programmable array logic device). la ora actuala ele sunt denumite generic dispozitive logice programabile (PLD – programmable logic device) și constituie varianta „MSI” a producției de circuite logice programabile.

Capacitatea in continuă creștere a circuitelor integrate a oferit producătorilor ocazia de a realiza PLD tot mai mari,pentru aplicații digitale de mai mare amploare. Însă, din motive de ordin tehnic, structura de bază cu doua niveluri AND-OR a PLD nu a putut fi realizată la dimensiuni mai mari. Pentru a ajunge totuși la dimensiunile dorite, producătorii de CI au conceput arhitecturi cu PLD complexe (CPLD). Un CPLD uzual este un ansamblu format din mai multe PLD și o structură de interconectare, toate realizate pe același cip. În plus față de PLD de sine stătătoare, structura de interconectare realizată pe cip este și ea programabilă, oferind o gamă largă de variante de circuite. CPLD pot ajunge la dimensiunile dorite prin mărirea numărului de PLD de sine stătătoare și prin dezvoltarea structurii de interconectare de pe cipul CPLD.

Figura 1. Porți ȘI, respectiv SAU: (a) reprezentare obișnuită; (b) reprezentare simplificată pentru circuitele PLD.

Cam în aceeași perioadă în care au fost inventate CPLD, alți producatori de CI au abordat în mod diferit problema extinderii dimensiunilor cipurilor logice programabile. Comparativ cu CPLD, matricele de porți logice in câmp (FPGA – field programmable gate array) conțin un număr mult mai mare de mici blocuri logice de sine stătătoare și dispun de o structura extinsă, ramificată, de interconectare, predominantă la nivelul întregului cip. Partizanii uneia sau alteia dintre căile de realizare ajunseseră să susțină cu argumente religioase superioritatea acestora, dar cel mai mare producator de dispozitive logice programabile de mari dimensiuni, compania Xilinx, Inc., a demonstrat ă ambele tipuri sunt utile, drept care le fabrică pe amândouă. Mai important decât arhitectura cipului este faptul ca ambele tipuri oferă posibilitatea de a scurta mult etapele de trecere din faza de proiect în cea de prototip și apoi în producție.

Un alt aspect aspect important pentru parcurgerea rapidă a drumului de la concepție la comercializare, în cazul roicărui produs realizat cu PLD, este proiectarea cu HDL (HDL= Hardware Description Language – Limbaj descriptor de echipamente). Limaje precum ABEL si VHDL, împreuna cu instrumentele virtuale ce le însoțesc, permit compilarea, sintetizarea și realizarea cu PLD, CPLD sau FPGA a unei noi scheme efectiv în câteva minute. Eficiența limbajelor ierarhizate, cu nivel înalt de structurare, cum este VHDL, este extrem de utilă proiectanților care lucrează cu sutele de mii sau milioanele de porți conținute în cele mai mari CPLD sau FPGA.

2.1.1.1. Matricea logică programabilă PLA

O rețea logică programabilă cum mai este numită PLA (Programmable Logic Array), este similară ca și concept cu o memorie ROM, numai că aceasta nu realizează decodificarea completă a variabilelor și nu generează toți mintermii. Decodificatorul este înlocuit cu o rețea de porți ȘI care poate fi programată pentru a genera termenii produs ai variabilelor de intrare. Termenii produs sunt apoi conectați în mod selectiv cu porți SAU pentru a genera suma termenilor produs pentru funcțiile booleene necesare. Structura de bază a unui circuit PLA este prezentată în Figura 2.

Un circuit PLA poate implementa în mod direct un set de funcții logice exprimate printr-un tabel de adevăr. Fiecare intrare pentru care valoarea funcției este adevărată necesită un termen produs, și acestuia îi corespunde o linie de porți ȘI din primul etaj al circuitului PLA. Fiecare ieșire corespunde la o linie de porți SAU din al doilea etaj al circuitului. Numărul de porți SAU corespunde cu numărul de intrări din tabela de adevăr pentru care ieșirea este adevărată. Dimensiunea totală a circuitului PLA este egală cu suma dintre dimensiunea rețelei de porți ȘI și dimensiunea rețelei de porți SAU. Din Figura 1 se observă că dimensiunea rețelei de porți ȘI este egală cu numărul de intrări multiplicat cu numărul diferiților termeni produs, iar dimensiunea rețelei de porți SAU este egală cu numărul de ieșiri multiplicat cu numărul termenilor produs.

Figura 2. Structura generală a unui circuit PLA

Un circuit PLA are două caracteristici care determină o implementare eficientă a unui set de funcții logice. Prima este că singurele intrări din tabelul de adevăr care necesită porți logice sunt cele cărora le corespunde o valoare adevărată pentru cel puțin o ieșire. A doua este că un anumit termen produs va avea o singură intrare în circuitul PLA, chiar dacă termenul produs este utilizat în mai multe ieșiri.

Structura internă a circuitului PLA care implementează aceste funcții este prezentată în Figura 3. Fiecare intrare trece printr-un buffer și un inversor. Există conexiuni programabile de la fiecare intrare și complementul acesteia la intrările fiecărei porți ȘI, indicate prin intersecțiile dintre liniile verticale și orizontale. Ieșirile porților ȘI au conexiuni programabile la intrările fiecărei porți SAU. Ieșirea fiecărei porți SAU constituie intrare într-o poartă SAU EXCLUSIV, iar cealaltă intrare poate fi programată fie la 1 logic, fie la 0 logic. Ieșirea este inversată dacă această intrare este 1 logic (deoarece X ⊕1 = X), și rămâne neschimbată dacă această intrare este 0 logic (deoarece X ⊕ 0 = X).

Modul de programare a circuitului PLA se poate specifica sub formă tabelară. De exemplu, pentru circuitul din Figura 3, programarea este specificată în Tabelul 1. Tabelul constă din trei secțiuni. Prima secțiune listează numerele termenilor produs. A doua secțiune specifică conexiunile necesare dintre intrări și porțile ȘI. A treia secțiune specifică conexiunile dintre porțile ȘI și porțile SAU. Fiecare variabilă de ieșire poate fi adevărată (A) sau complementată (C), ceea ce se controlează prin poarta SAU EXCLUSIV. Pentru fiecare termen produs, intrările sunt marcate cu 1, 0 sau -. Dacă o variabilă dintr-un termen produs apare sub formă necomplementată, variabila este marcată cu 1. Dacă o variabilă dintr-un termen produs apare sub formă complementată, ea este marcată cu 0. Dacă variabila lipsește din termenul produs, ea este marcată cu -. Variabilele de ieșire sunt marcate cu 1 pentru termenii produs care sunt incluși în cadrul funcției. O ieșire marcată cu A indică faptul că cealaltă intrare a porții SAU EXCLUSIV corespunzătoare trebuie conectată la 0, iar o ieșire marcată cu C indică o conectare la 1.

Tabelul 1. Tabelul de programare pentru circuitul PLA din Figura 3

Figura 3. Structura internă a unui circuit PLA cu trei intrări, patru termeni produs și două ieșiri.

Pentru proiectarea unui sistem digital cu un circuit PLA, nu este necesar să se indice conexiunile interne ale circuitului, ci trebuie să se specifice doar tabela de programare. Circuitele PLA pot fi programate prin măști (în timpul fabricației) sau pot fi programate de către utilizator. Circuitele PLA programate de către utilizator se numesc FPLA (Field Programmable Logic Array).

2.1.1.2. Matricea logică programabilă cu nivel SAU fix – PAL

Circuitul PAL (Programmable Array Logic) este o variantă a circuitului PLA. Modificarile față de acesta constă în: existența numai a matricei ȘI programabile, matricea SAU fixă (neprogramabilă), invers față de circuitul ROM, și o facilitate ca unele dintre terminalele circuitului să poată poată la fiecare intrare și complementul acesteia la intrările fiecărei porți ȘI, indicate prin intersecțiile dintre liniile verticale și orizontale. Ieșirile porților ȘI au conexiuni programabile la intrările fiecărei porți SAU. Ieșirea fiecărei porți SAU constituie intrare într-o poartă SAU EXCLUSIV, iar cealaltă intrare poate fi programată fie la 1 logic, fie la 0 logic. Ieșirea este inversată dacă această intrare este 1 logic (deoarece X ⊕1 = X), și rămâne neschimbată dacă această intrare este 0 logic (deoarece X ⊕ 0 = X).

Modul de programare a circuitului PLA se poate specifica sub formă tabelară. De exemplu, pentru circuitul din Figura 3, programarea este specificată în Tabelul 1. Tabelul constă din trei secțiuni. Prima secțiune listează numerele termenilor produs. A doua secțiune specifică conexiunile necesare dintre intrări și porțile ȘI. A treia secțiune specifică conexiunile dintre porțile ȘI și porțile SAU. Fiecare variabilă de ieșire poate fi adevărată (A) sau complementată (C), ceea ce se controlează prin poarta SAU EXCLUSIV. Pentru fiecare termen produs, intrările sunt marcate cu 1, 0 sau -. Dacă o variabilă dintr-un termen produs apare sub formă necomplementată, variabila este marcată cu 1. Dacă o variabilă dintr-un termen produs apare sub formă complementată, ea este marcată cu 0. Dacă variabila lipsește din termenul produs, ea este marcată cu -. Variabilele de ieșire sunt marcate cu 1 pentru termenii produs care sunt incluși în cadrul funcției. O ieșire marcată cu A indică faptul că cealaltă intrare a porții SAU EXCLUSIV corespunzătoare trebuie conectată la 0, iar o ieșire marcată cu C indică o conectare la 1.

Tabelul 1. Tabelul de programare pentru circuitul PLA din Figura 3

Figura 3. Structura internă a unui circuit PLA cu trei intrări, patru termeni produs și două ieșiri.

Pentru proiectarea unui sistem digital cu un circuit PLA, nu este necesar să se indice conexiunile interne ale circuitului, ci trebuie să se specifice doar tabela de programare. Circuitele PLA pot fi programate prin măști (în timpul fabricației) sau pot fi programate de către utilizator. Circuitele PLA programate de către utilizator se numesc FPLA (Field Programmable Logic Array).

2.1.1.2. Matricea logică programabilă cu nivel SAU fix – PAL

Circuitul PAL (Programmable Array Logic) este o variantă a circuitului PLA. Modificarile față de acesta constă în: existența numai a matricei ȘI programabile, matricea SAU fixă (neprogramabilă), invers față de circuitul ROM, și o facilitate ca unele dintre terminalele circuitului să poată poată fi utilizată atât ca intrări cât și ca ieșiri.

Fiecare linie de ieșire este conectată la un set fix de linii ale rețelei de porți ȘI. O asemenea ieșire a circuitului PAL poate implementa o expresie pe două nivele conținând cel mult opt termeni. Aceste modificări reduc flexibilitatea generării funcțiilor logice dar simplifică programarea și eficientizează utilizarea terminalelor circuitului.

Figura 4. Structura generală a unui circuit PAL.

O structură tipică de circuit PAL (PAL16L10) este prezentata in Figura 4, care, de fapt, este reprezentarea puțin simplificată a PAL16L8. În compunerea codului de denumire a circuitului primul număr specific numărule de terminale de intrare, în cazul acesta 16, iar al doilea este numărul terminalelor de ieșire, aici 8. Circuitul PAL16L8 are 20 de pini (sunt incluși și cel de masă și de alimentare), ceea ce înseamnă că numărul total de terminale de intrare și de ieșire necesar (16+8+2=26) este mai mare decât numărul de pini existenți (20). Această diferență rezultă din posibilitatea de utilizare a unor pini atât ca terminale de ieșire cât și ca terminale de intrare.

Există și circuite PLA sau PAL care conțin bistabile atașate prin conexiuni programabile la ieșirile rețelei de porți SAU, ceea ce permite implementarea unor circuite secvențiale de dimensiuni medii. Aceste circuite sunt cunoscute și cu denumirea de circuite logice programabile simple (SPLD – Simple Programmable Logic Device).

Avantajele circuitelor PAL sunt simplitatea utilizării în anumite aplicații și viteza mai ridicată. Aceste circuite sunt însă mai puțin flexibile decât circuitele PLA.

2.1.1.3. Circuitele logice programabile complexe

Figura 5. Structura generală a unui circuit CPLD

Circuitele logice programabile complexe (CPLD – Complex Programmable Logic Device) sunt circuite PLD cu o densitate mai ridicată. Ele conțin un număr de blocuri funcționale, asemănătoare unor circuite PLD, fiecare bloc fiind compus din mai multe macrocelule (Figura 5). Există de asemenea o matrice de rutare pentru interconectarea blocurilor. Funcțiile logice simple pot fi implementate în cadrul uni singur bloc. Funcțiile mai complexe pot necesita mai multe blocuri, care vor fi interconectate prin matricea de rutare.

2.1.1.4. Matrici de porți programabile în câmp

Figura 6. Structura unui circuit FPGA tipic

Circuitele FPGA (Field Programmable Gate Array) au fost introduse în anul 1985 de compania Xilinx. De atunci au fost elaborate diferite tipuri de circuite FPGA de un număr de alte companii ca Actel, Altera, Atmel, Texas Instruments etc. Un circuit FPGA constă dintr-o rețea bidimensională de celule sau blocuri logice fiecare mai mic decât un PLD, fiind un fel de CPLD întors pe dos. De obicei, fiecare bloc logic poate fi programat pentru a implementa orice funcție logică a intrărilor sale. De aceea, aceste blocuri sunt numite de obicei blocuri logice configurabile (Configurable Logic Block – CLB). Cele mai multe blocuri logice conțin de asemenea unul sau două bistabile. Canalele și blocurile de comutare dintre aceste blocuri conțin resurse de interconectare, după cum se ilustrează în Figura 5. Aceste resurse conțin de obicei segmente de interconectare de diferite lungimi. Interconexiunile conțin comutatoare programabile cu rolul de a conecta blocurile logice la segmentele de interconectare, sau un segment de interconectare la altul. În plus, există celule de I/E la periferia rețelei, care pot fi programate ca intrări sau ieșiri.

Din punctul de vedere al tipului conexiunilor programabile, există două categorii principale de circuite FPGA: circuite cu memorii SRAM și circuite cu antifuzibile.

Circuite cu memorii SRAM. Programarea acestor circuite se realizează prin celule de memorie statică. Logica este implementată cu ajutorul unor tabele (lookup table) realizate din celulele de memorie, intrările funcțiilor controlând liniile de adresă. Fiecare tabelă de 2n celule de memorie implementează orice funcție cu n intrări. Una sau mai multe tabele, combinate cu bistabile, formează un bloc logic configurabil. Aceste blocuri sunt aranjate într-un tablou bidimensional, segmentele de interconectare formând canale, similar cu rețelele de porți. Segmentele se conectează la pinii blocurile logice din canale și la alte segmente din blocurile de comutare prin intermediul tranzistoarelor de trecere controlate de celule ale memoriei de configurare. O secvență de configurare pentru circuitele cu memorii SRAM constă dintr-un singur cuvânt lung de programare. Logica din circuit încarcă cuvântul de programare, pe care îl citește serial dintr-o memorie externă de fiecare dată când circuitul este alimentat. Biții acestui cuvânt setează valorile tuturor celulelor memoriei de configurare din circuit, setând astfel valorile tabelelor și selectând segmentele care se vor conecta între ele. Circuitele cu memorii SRAM sunt reprogramabile. Ele pot fi actualizate în sistem, punând la dispoziția proiectanților noi opțiuni și posibilități de proiectare. Din această categorie de circuite FPGA fac parte cele ale firmelor Xilinx, Altera, AT&T.

Circuite cu antifuzibile. Un antifuzibil este un dispozitiv cu două terminale care în mod normal se află în starea de înaltă impedanță, iar atunci când este expus la o tensiune ridicată, trece în starea cu rezistență redusă (300-500 Ω). Antifuzibilele au dimensiuni reduse, astfel încât o arhitectură bazată pe antifuzibile poate conține sute de mii sau milioane de antifuzibile. Pentru simplificarea arhitecturii și a programării, circuitele FPGA bazate pe antifuzibile constau de obicei din rânduri de elemente logice configurabile cu canale de interconectare între ele, ca și rețelele de porți tradiționale. Un bloc logic poate fi programat prin conectarea pinilor săi de intrare la valori fixe sau la rețele de interconectare. Există antifuzibile la fiecare punct de intersecție între interconexiuni și pini din canal și la toate punctele de intersecție între interconexiuni în locurile în care canalele se intersectează. Din categoria circuitelor FPGA cu antifuzibile fac parte circuitele firmelor Actel, Quicklogic, Cypress.

2.1.2. Memorii ROM

Memoriile ROM (Read Only Memory) reprezintă o categorie de circuite programabile care se pot utiliza pentru implementarea unui set de funcții logice. Aceste memorii conțin un set de locații utilizate pentru stocarea informației binare. Conținutul acestor locații este fixat în momentul fabricației, aceste memorii fiind programate prin măști. Pe lângă acestea, există și memorii ROM programabile care utilizează fuzibile, numite PROM (Programmable ROM). Acestea pot fi înscrise de către utilizator, cu ajutorul unui echipament de programare corespunzător. De asemenea, există memorii PROM care pot fi șterse cu ajutorul razelor ultraviolete, și apoi pot fi reprogramate. Acestea se numesc EPROM (Erasable Programmable ROM). În fine, memoriile ROM care utilizează o tehnologie de ștergere prin impulsuri electrice se numesc EEPROM sau E2PROM (Electrically Erasable Programmable ROM). Diferitele variante de memorii ROM sunt nevolatile, deci își păstrează conținutul și după întreruperea tensiunii de alimentare.

O memorie ROM are k intrări și n ieșiri. Intrările furnizează adresa pentru memorie, iar ieșirile furnizează conținutul cuvântului selectat de adresa de la intrare. Numărul cuvintelor dintr-o memorie ROM este determinat de faptul că prin k linii de adresă se pot selecta 2k cuvinte. Memoria ROM nu are date de intrare, deoarece nu este posibilă operația de scriere. Memoriile ROM integrate dispun de una sau mai multe intrări de validare și ieșiri cu trei stări pentru a permite realizarea unor memorii de dimensiuni mai mari.

Figura 7. Logica internă a unei memorii ROM cu capacitatea de 32 × 8

Considerăm, de exemplu, o memorie ROM cu capacitatea de 32×8, care conține 32 de cuvinte de 8 biți fiecare. Există 5 linii de intrare, care permit specificarea adreselor cuprinse între 0 și 31. Structura internă a acestei memorii este indicată în Figura 7. Intrările sunt decodificate în 32 ieșiri distincte cu ajutorul unui decodificator 5:32. Fiecare ieșire a decodificatorului reprezintă o adresă de memorie. Cele 32 de ieșiri sunt conectate prin intermediul unor conexiuni programabile la fiecare din cele opt porți SAU. Fiecare poartă SAU trebuie considerată ca având 32 de intrări. Pentru aceste porți s-a utilizat reprezentarea simplificată. Fiecare ieșire a decodificatorului este conectată prin intermediul unui fuzibil la una din intrările fiecărei porți SAU. Deoarece fiecare poartă SAU are 32 de conexiuni interne programabile, și deoarece există opt porți SAU, această memorie ROM conține 32×8 = 256 de conexiuni programabile. În general, o memorie ROM cu capacitatea de 2k × n are un decodificator intern k:2k și n porți SAU. Fiecare poartă SAU are 2k intrări, care sunt conectate prin conexiuni programabile la fiecare din ieșirile decodificatorului.

Conținutul locațiilor unei memorii ROM poate fi specificat printr-o tabelă de adevăr. De exemplu, conținutul unei memorii ROM cu dimensiunea de 32×8 poate fi specificat printr-o tabelă de adevăr similară cu cea din Tabelul 3.13. Fiecare combinație a intrărilor din tabel specifică adresa unui cuvânt de 8 biți, a cărei valoare este indicate în coloanele ieșirilor. Tabelul prezintă numai primele patru și ultimele patru cuvinte ale memoriei ROM; tabelul complet trebuie să conțină lista tuturor celor 32 de cuvinte.

Tabelul 2. Tabelul de adevăr al unei memorii ROM (parțial)

Programarea memoriei ROM conform tabelului de adevăr de mai sus conduce la configurația din Figura 3.38. Fiecare valoare 0 din tabelul de adevăr specifică un circuit deschis, și fiecare valoare 1 specifică un circuit închis. De exemplu, tabelul specifică un cuvânt cu valoarea 11000101 la adresa 00010. Cei patru biți de 0 din cadrul cuvântului sunt programați prin deschiderea conexiunilor dintre ieșirea 2 a decodificatorului și intrările porților SAU asociate cu ieșirile A5, A4, A3 și A1. Cei patru biți de 1 din cadrul cuvântului sunt marcați cu un × în schemă, pentru a indica un circuit închis. Atunci când intrarea memoriei ROM este 00010, ieșirea 2 a decodificatorului va fi la 1 logic, celelalte ieșiri fiind la 0 logic. Semnalul cu nivelul 1 logic de la ieșirea 2 a decodificatorului se propagă prin circuitele închise și porțile SAU la ieșirile A7, A6, A2 și A0, iar celelalte ieșiri rămân la 0 logic. Rezultatul este că la ieșirile de date se aplică cuvântul cu valoarea 11000101.

După cum s-a arătat anterior, un decodificator generează toți mintermii variabilelor de intrare. Prin inserarea unor porți SAU pentru însumarea mintermilor funcțiilor booleene, se poate implementa orice circuit combinațional. O memorie ROM conține atât un decodificator, cât și porți SAU în cadrul aceluiași circuit. Prin închiderea conexiunilor pentru mintermii incluși în cadrul funcției, ieșirile memoriei ROM pot fi programate pentru a reprezenta funcțiile booleene ale variabilelor de intrare dintr-un circuit combinațional.

Din punctul de vedere al unui circuit care implementează o funcție booleană, fiecare terminal de ieșire al unei memorii ROM este considerat separat ca ieșire a funcției booleene exprimate ca o sumă de mintermi. De exemplu, memoria ROM din Figura 8 poate fi considerată ca un circuit combinațional cu opt ieșiri, fiecare fiind o funcție a celor cinci variabile de intrare. Ieșirea A7 poate fi exprimată ca o sumă a mintermilor, în felul următor (punctele reprezintă mintermii de la 4 la 27, care nu apar în figură): A7 (I4, I3, I2, I1, I0) = Σ (0, 2, 3, …, 29).

Deoarece o memorie ROM păstrează de fapt întregul tabel de adevăr al funcțiilor pe care le generează, o asemenea memorie poate fi utilizată pentru implementarea circuitelor combinaționale complexe direct din tabelul de adevăr. Procesul de citire a informațiilor memorate într-o memorie ROM este similar cu o căutare într-o tabelă (table lookup). Memoriile ROM sunt utile pentru implementarea unor circuite ale căror funcții sunt dificil de specificat prin ecuații logice, ca de exemplu convertoare de cod sau circuite pentru operații aritmetice complexe (înmulțire, împărțire), și pentru aplicații care necesită un număr moderat de intrări și un număr mare de ieșiri. Utilitatea memoriilor ROM este limitată de faptul că dimensiunea lor trebuie dublată cu fiecare nouă variabilă de intrare.

Figura 8. Programarea memoriei ROM conform Tabelului 2

În practică, la implementarea unui circuit combinațional printr-o memorie ROM, nu este necesar să se deseneze schema logică sau să se indice conexiunile interne din cadrul memoriei. Trebuie să se specifice doar o anumită memorie ROM prin numărul circuitului și tabelul de adevăr al memoriei. Tabelul de adevăr conține toate informațiile necesare programării memoriei.

De exemplu, se consideră proiectarea unui circuit combinațional care acceptă la intrare un număr de 3 biți și generează la ieșire un număr binar egal cu pătratul numărului de la intrare. Prima etapă pentru proiectarea circuitului este întocmirea tabelului de adevăr. În cele mai multe cazuri, aceasta este singura operație necesară. În alte cazuri, se poate utiliza un tabel de adevăr parțial pentru memoria ROM ținând cont de anumite proprietăți ale variabilelor de ieșire. Tabelul 3 reprezintă tabelul de adevăr pentru circuitul proiectat.

Tabelul 3. Tabelul de adevăr pentru circuitul care generează pătratele valorilor de la intrare

Pentru circuitul proiectat, sunt necesare trei intrări și șase ieșiri. Se observă că ieșirea B0 este egală întotdeauna cu intrarea A0, astfel încât nu este necesară generarea acestei ieșiri cu ajutorul memoriei ROM. De asemenea, ieșirea B1 este întotdeauna 0. Astfel, trebuie să se genereze doar patru ieșiri cu memoria ROM. Memoria trebuie să aibă minimum trei intrări și patru ieșiri. Cele trei intrări specifică opt cuvinte, deci dimensiunea minimă a memoriei necesare este de 8×4. Schema circuitului este prezentată în Figura 9.

Figura 9. Implementarea cu o memorie ROM a circuitului care generează pătratele valorilor de la intrare

2.1.3. Resursele hardware și software ale circuitelor FPGA

Familiile moderne FPGA extind capacitate de conectare prin realizarea cablată a unor funcții de înalt nivel, crescând astfel performanțele și scăzând efortul de proiectare. Astfel de blocuri pot fi: blocuri generice DSP, multiplicatoare, blocuri PLL sau DLL, circuite I/O de mare viteză, memorii, registre de deplasare și numărătoare. Resursele hardware investite în FPGA sunt extrem de diverse, în funcție de producători și de arhitectura aleasă iar pe de altă parte, resursele software, de care depind în mare măsură și performan ele hardware-ului, sunt extrem de specifice, într-o continuă dezvoltare și evoluție.

2.1.3.1. Resurse hardware

Resurse hardware conțin trei mari categorii: blocuri funcționale integrate; condiționarea semnalelor de intrare/ieșire; dispozitive speciale.

2.1.3.1.1. Blocuri funcționale integrate

Memorii. Aceste memorii interne permit creșterea vitezei de operare și utilizarea mai eficientă a pinilor drartnei e și ieșirș ei pe lângă acesta structura sistemului este mult simplificată. Capacitățile de memorie utilizate sunt destul de mari și se pot întâlni diferite configurații.

PLL/DLL. Aceste circuite PLL(Phase-Locked Loop) și DLL()Delay-Locked Loop) se pot utiliza pentru compensarea întârzierii de propagare a semnalului de sincronizare. Alte aplicații interesante sunt sintetizarea de frecvențe prin multiplicare sau divizare și condiționarea semnalului de sincronizare care se referă la factorul de umplere și defazaj. Circuitele DLL au un preș mai scăzut consumând puțină energie și sunt imune la zgomote, în timp ce PLL-urile sunt mai versatile și permit operații mai complexe cum ar fi implementarea filtrelor pe un domeniu de frecvențe mai larg.

Circuite aritmetice. Unele circuite FPGA dispun de un număr mare de blocuri aritmetice simple. De exemplu din familia Virtex-5 LX Xilinx include multiplicatoare, prin care se pot realiza operații de până la 25 × 18 biți.

Transceivere. Acestea sunt dispozitive de emisie-recepție de diferite standarde iar ca și protocoale de comunicație definite de utilizator pot fi ușor implementate prin blocuri de codare sau decodare și serializare sau deserializare a datelor.

Procesoare integrate. Cele mai complexe arhitecturi FPGA ajung să includă și procesoare însoțite de perifericele aferente, în vederea materializării conceptului System-on-Chip (așa numi- tele SoC solutions) prin care tot sistemul de calcul este implementat pe un singur cip de Siliciu. Un exeplu de acest fel ar putea fi circuitul Virtex-4 FX (Xilinx) care include procesoare RISC (reduced instruction set computer) de tipul IBM PowerPC 405 de 32 de biți, capabile să funcționeze la 450 MHz, cu cotrolere de acces la memorii RAM, o unitate aritmetică hardware pentru multiplicare sau divizare, trei timere diferite, interfață directă pentru rețea Ethernet, registre de configurare, o unitate de procesare auxiliară pentru interfațarea resurselor logice FPGA în vederea conectării la acceleratoare hardware și a introducerii de instrucțiuni definite de utilizator.

2.1.3.1.2. Condiționarea semnalelor de intrare/ieșire

Resurse specifice trebuiesc alocate pinilor de intrare și iețire pentru ca FPGA-urile să poată fi conectate cu ușurință cu alte dispozitive și la tensiuni diferite fără a fi nevoie de interfețe suplimentare. Pinii de intrare și ieșire sunt de obicei grupați în funcție de diferitele standarde: conectare între cipuri; conectare de tip backplane în care mai mulți pini se conectează în paralel sau interfețe pentru memorii. În figura 10 este prezentată un exemplu, corespunzător familiei Virtex.

Figura 10. Conectare backplane la FPGA din familia Virtex

2.1.3.1.3. Dispozitive speciale

Dispozitive programabile o singură dată OTP (One-time-programmable). Acestea sunt dispozitivele nevolatile care utilizează celule SRAM (Static Random Access Memory). Celulele SRAM sunt cel mai des utilizate pentru că oferă o mare flexibilitate în vederea reconfigurării cu toate acestea dispozitivele OTP nevolatile sunt aplicate în anumite situații în care se evidențiază avantajele lor: nu au nevoie de resurse externe pentru configurarea la alimentare și din acest motiv pornesc foarte repede; consum foarte redus de putere, rezistențe și capacități de contact foarte mici; imunitate foarte bună la zgomote.

Dispozitive de putere mică. La aceste dispozitive scăderea puterii consumate de către circuite este un imperativ puternic, atât pentru a îmbunătăți performanțele funcționale ale produselor prin creșterea eficienței utilizării energiei cât și prin scăderea temperaturilor de funcționare. Circuitele FPGA sunt de obicei mai puțin eficiente la acest capitol din cauza resurselor alocate programării, iar din acest punct de vedere soluțiile bazate pe OTP sunt cele mai avantajoase. Ele reușesc să treacă din modul de așteptare în care se consumă foarte puțină energie în modul de lucru foarte rapid de ordinul nanosecundelor și oferă și rezistențe mici de comutare.

Dispozitive tolerante la radiație: aceste dispozitive se folosesc în aplicațiile aerospațiale în care FPGA au fost incluse, Stația Spațială Internațională, Telescopul Spațial Hubble, Mars Pathfinder și altele, ridică probleme speciale de lucru în mediul radioactiv. Au fost dezvoltate familii de FPGA de tip antifuse, pentru a putea raspunde acestor solicitări cu rezistență sporită la radiației. Ca exeplu sar putea preciza RTSX/RTAX sau Aeroflex Eclipse și există și versiuni protejate împotriva perturbațiilor radio ca și familiile Atmel AT40KEL040 sau Xilinx QPRO-R Virtex-II.

Circuite securizate. Aplicațiile în care FPGA sunt conectate în rețele ridică problema securizării IP-urilor. Pe de o parte în aplicațiile mai simple pot fi utilizați biți de securizare care previne citirea de către utilizator a configurațiilor dar în cazul aplicațiilor foarte complexe se adaugă un FPGA nonvolatil care să gestioneze accesul la componentele interne.

2.1.3.2. Resurse software

Complexele structuri hardware ale FPGA-urilor nu ar putea fi utilizate fără un întreg arsenal de instrumente software specifice, iar acest domeniu este în plină dezvoltare dar există deja o ofertă bogată de resurse software.

Resurse software împart în trei mari categorii: nuclee IP; procesoare soft; instrumente software.

Nuclee IP. Pentru a putea simplifica proiectarea sistemelor FPGA complexe s-au realizat biblioteci de funcții predefinite complexe, în majoritatea cazurilor parametrizabile, precum și circuite, care au fost deja testate și optimizate. Aceste elemente sunt de regulă protejate ca nuclee de proprietate intelectuală, fiind vândute fie direct de producătorul circuitului fie de firme terțe specializate cum ar fi Modelware sau QuickFlex. Astfel de biblioteci acoperă largi domenii de aplicații: comunicațiile, multimedia, procesoare de semnal, transporturi și multe altele.

Procesoarele soft au fost aplicate în acest domeniu de Xilinx (PicoBlaze și MicroBlaze) și de Altera (Nios șiNios II). PicoBlaze este un microcontroler de 8 biți de capacitate mică dar implementat cu un număr redus de blocuri logice. MicroBlaze corespunde unei arhitecturi RISC de 32 biți cu un set standard de periferice și procesorul Nios are o funcționare mai complexă, cuprinzând chiar și posibilitatea adăugării de instrucțiuni noi de către client.

Instrumente software. Intreprinderile de FPGA au dezvoltat în timp multe instrumente soft originale adresate tuturor activităților cerute de aplicarea FPGA-urilor. În general aceste produse includ nuclee IP periferice, instrumente pentru configurarea procesoarelor soft, instrumente pentru dezvoltarea de software care constă în editoare, compilatoare, asambloare, editoare de legături și depanatoare, depanatoare și testare hardware și software și instrumente software și hardware pentru plăcile de dezvoltare.

2.1.4. Caracteristici arhitecturale ale unităților centrale ale microcontrollerelor

La modul general, un controller este o structură electronică destinată controlului unui proces sau a unei interacțiuni caracteristice cu mediul exterior, fără intervenția operatorului uman. Primele controllere au fost echipamente de mari dimensiuni, însă apariția microprocesoarelor a condus la procesul de miniaturizare și integrare a tuturor componentelor pe același cip. S-a dezvoltat astfel microcontrollerul, dedicat implementării operațiilor de control.

Un microcontroller cuprinde în același circuit integrat multiple componente ale unui sistem cu microprocesor. Prin urmare, un microcontroller este un microcircuit care încorporează o unitate centrală de prelucrare (CPU) și o memorie, împreună cu resurse pentru interacțiunea cu mediul exterior. Printre resursele tipice se definesc următoarele: unitatea centrală; generatorul de tact; memoria volatilă RAM (Random Access Memory); memoria nevolatilă ROM (Read Only Memory), PROM (Programmable Read Only Memory), EPROM (Erasable Programmable Read Only Memory) sau EEPROM (Electrically Erasable Programmable Read Only Memory); dispozitive de intrare/ieșire seriale și paralele; controller de întreruperi, numărătoare/timere; periferice.

Contra-cost se pot adăuga caracteristici specifice sarcinii de control care trebuie îndeplinite, precum sisteme de conversie analog numerică, sisteme de conversie numeric analogic și/sau ieșiri cu modulare în durată (PWM), comparatoare analogice, facilități suplimentare pentru sistemul de numărare, facilități de prelucrare a informației la nivel de bit și de acces direct și usor la intrări/ieșiri sau mecanisme de prelucrare a informației la nivel de bit.

Microcontrollerele sunt în general clasificate după lungimea cuvântului de date. În funcție de puterea de calcul dorită, se pot alege variante de microcontrollere cu dimensiunea cuvântului de date de 4/8/16/32 sau chiar 64 de biți. Există și variante constructive dedicate unei anumite aplicații, având un cod preprogramat și resurse hardware specializate, fiind utilizate în domeniul comunicațiilor, pentru controlul tastaturilor, controlul aparaturii video/audio sau prelucrări numerice de semnal.

Microcontrollere sunt realizate în tehnologie CMOS (semiconductor complementar metal-oxid) oferind structuri cu o mare densitate de integrare, cu consum redus și cu posibilitatea de alimentare de la baterie. Datorită unei logici interne statice este posibilă micșorarea frecvenței de ceas sau chiar oprirea ceasului pentru optimizarea consumului. Tehnologia CMOS este caracterizată prin imunitatea sa mult mai mare la perturbații și posibilitatea utilizării pe un domeniu extins al temperaturii de funcționare.

Figura 11. Schema bloc generală a unui microcontroller

Un microcontroller este un sistem de calcul complet ce include o unitate centrală de prelucrare, memorie proprie, generator de tact și dispozitive de intrare și ieșire. Performanțele elementelor sale constructive (precum performanțele unității centrale și capacitatea memoriei) depind de aplicația în care este folosit. Un element esențial în funcționarea microcontrollerului este programul care se stochează în memoria proprie.

Intrările sunt semnale digitale sau analogice, provenite de la comutatoare sau traductoare (de temperatură, de presiune sau specializate). Intrările digitale presupun semnale discrete la care informația înregistrată este informația eșantionată la momentul citirii liniei. Intrările analogice presupun exprimarea informației sub forma unei funcții continue de timp, ceea ce face ca citirea informației să fie susținută cu ajutorul unor circuite de prelucrare a informației precum comparatoare analogice sau convertoare analog-numerice, a căror ieșiri să fie citite de către microcontroller. Ieșirile microcontrollerului sunt analogice (ieșirile ale convertoarele numeric-analogice) sau digitale (caz în care informația este memorată până la o nouă scriere).

Unitatea centrală de calcul (UCP sau CPU – Centrall Processing Unit) prezintă următoarele tipuri principale de arhitecturi.

Arhitectura de tip von Neumann este alcătuită din patru componente principale: unitatea aritmetică și logică (UAL), unitatea de control (UC), memoria centrală și dispozitivele de intrare/ieșire. Componentele sunt interconectate prin magistrale (bus) pe care circulă datele de calcul și instrucțiunile (datele de program), fiind conduse de semnalul de tact.

Fiecare celulă din memoria unui calculator înmagazinează o cantitate prestabilită de informație ce poate fi interpretată ca instrucțiune sau ca dată propriu-zisă. Datele sunt acele informații ce trebuie prelucrate conform instrucțiunilor primite.

Unitatea aritmetică și logică (UAL) este denumită de cele mai multe ori ca fiind „inima” calculatorului, fiind capabilă să efectueze mai multe tipuri de operații precum operații aritmetice (adunare, scădere, înmulțire), operații de comparație, manevrarea datelor (mutare, trunchiere, rotație) și operații ce pot influența circulația instrucțiunilor.

Unitatea de control (UC) este un modul de comandă cu următoarele caracteristici: interpretarea datelor si instrucțiunilor din memorie sau de la dispozitivele de intrare-ieșire; decodarea instrucțiunilor; transmiterea datelor de intrare corecte către unitatea aritmetico-logică (UAL); comandarea unității aritmetico-logice (UAL) cu operația ce trebuie efectuată asupra datelor de intrare; scrierea in memorie a rezultatelor operațiilor sau transmiterea informațiilor către dispozitivele de ieșire.

Figura 12. Arhitectură de tip von Neumann

Unitatea de control prezintă un numărător de instrucțiuni, capabil să conțină la orice moment adresa instrucțiunii curente din secvența de program. Acest contor se află în permanentă schimbare datorită faptului că numără instrucțiunile. Unitatea de control și unitatea aritmetică și logică se plasează în același circuit integrat ce poartă denumirea de unitate centrală de procesare (UCP) sau microprocesor. Sistemele de intrare-ieșire sunt dispozitive de comunicație a calculatorului cu exteriorul. Pe lângă dispozitivele tipice de intrare (tastatură, mouse) și ieșire (monitor, imprimantă), există și dispozitive de intrare-ieșire combinate (utilizate atât pentru intrare cât și pentru ieșire) precum modemul și placa de rețea.

Arhitectura de tip von Neumann este o arhitectură standard ce prezintă dezavantajul încetinirii operațiilor datorită existenței unei singure magistrale interne (bus) ce realizează preluarea și efectuarea secvențială a datelor și informațiilor.

Arhitectura de tip Harvard prezintă două zone distincte pentru memoria de date și memoria de instrucțiuni, fiecare zonă definită cu magistrale separate. Aceste magistrale lucrează în mod independent ceea ce prezintă un mare avantaj deoarece, astfel, instrucțiunile și datele pot fi aduse în același timp optimizând viteza sistemului comparativ cu arhitecturile ce prezintă o singură magistrală.

Procesorul prezent în arhitecturile de tip Harvard finalizează execuția unei instrucțiuni într-un singur ciclu de clock utilizând tehnica pipeline. Pipeline reprezintă o tehnică ce vizează creșterea vitezei totale de execuție a procesoarelor prin subdivizarea fiecărei instrucțiuni în etape sau segmente, fiecare etapă sau segment fiind executat de o unitate funcționala separată a procesorului. Segmentele pipeline sunt conectate între ele iar execuția de instrucțiuni se realizează simultan însă decalat, fără componente hardware suplimentare.

Segmentele de execuție uzuale ale unei instrucțiuni pe un procesor sunt: FI (Fetch Instruction) – procesorul citește din memorie instrucțiunea următoare ce trebuie executată; DI (Decode Instruction) – instrucțiunea este recunoscută și procesorul începe executarea ei; CO (Calculate Operand Address) – se calculează adresa de memorie de unde se aduce primul operand; FO (Fetch Operand) – se citește operandul aflat la adresa calculată anterior; EI (Execute Instruction) – execuția propriu-zisă a instrucțiunii și calculul rezultatului ei; WO (Write Operand) – scrierea rezultatului în memorie.

Segmentele de instrucțiune se află în execuție în etape diferite, fiind tratată câte o instrucțiune în fiecare etapă a pipeline-ului. Instrucțiunea următoare poate începe să fie executată imediat ce instrucțiunea anterioară a trecut de prima etapă, fără a fi necesară terminarea completă a etapelor pentru o singură instrucțiune. Astfel sistemele care folosesc tehnica pipeline prezintă o creștere în performanță fără a crește complexitatea.

În cazul arhitecturii Harvard, în primul segment pipeline instrucțiunea care urmează a fi executată este extrasă din memorie iar în al doilea segment pipeline se preia din memorie utilizând adresa decodata, execuția fiind finalizată în cadrul celui de-al treilea segment pipeline.

Tabelul 4. Exemplul de tehnică pipeline

Cu toate că permite o execuție rapidă a instrucțiunilor, tehnica pipeline prezintă o serie de dezavantaje numite hazarde, care pot fi clasificate în trei categorii:

Hazarde structurale. Apar când memoria sau unitatea funcțională este suprasolicitată de către mai multe instrucțiuni în același timp (conflicte de resurse comune). Pentru a evita un astfel de hazard se folosesc unități funcționale de tip pipeline care pot suporta mai multe instrucțiuni simultane sau memorii de tip cache separate pentru instrucțiuni și pentru date.

Hazarde de date. Dacă este nevoie de rezultatul produs de către o instrucțiune, însă acest rezultat nu a fost încă generat are loc un hazard de date ceea ce conduce la blocarea instrucțiunii curente până la scrierea rezultatului instrucțiunii anterioare.

Hazarde de control. Sunt produse de către instrucțiunile de salt. La execuția unui salt, pipeline-ul este golit și încărcat cu instrucțiunea următoare de la adresa de memorie la care se face saltul, însă există situații la care stagiul pipeline de decodificare nu știe dacă saltul a fost executat sau nu, de cele mai multe ori instrucțiunea adusă fiind abandonată și saltul neefectuat.

Microprocesoarele care utilizează arhitectura de tip CISC au instrucțiuni încorporate în ele (instrucțiuni complexe), ceea ce salvează timpul necesar procesării deoarece instrucțiunile sunt preluate direct din microprocesor și nu din programul stocat pe memoria externă.

O instrucțiune simplă este executată direct de procesor, în timp ce execuția unei instrucțiuni complexe necesită un număr mare de unități specializate pentru fiecare tip de instrucțiune. Fiecare instrucțiune complexă este descompusă într-o secvență de microinstrucțiuni, prin urmare execuția unei instrucțiuni complexe presupune de fapt execuția secvenței de microinstrucțiuni din care este alcătuită. Microinstrucțiunile sunt înregistrate în timpul procesului de fabricație într-o memorie de tip ROM pe pastila de siliciu a procesorului sub formă de microcod.

Modelele CISC prezintă un set foarte mare de instrucțiuni cod mașină, cu lungimi variabile și moduri de adresare sofisticate. Procesorul execută operații logice suplimentare datorită lungimilor diferite ale instrucțiunilor (în octeți) și a timpului de execuție diferit (perioade de clock diferite per instrucțiune). Viteza de execuție este corelata cu timpul de execuție al celei mai complexe instrucțiuni. Arhitectura CISC are rolul principal de a grăbi execuția programelor, însă datorită instrucțiunilor încorporate în microprocesor acest tip de arhitectură prezintă performanțe scăzute deoarece compilatoarele nu au capacitatea de a utiliza corespunzător registrele iar microinstrucțiunile se execută mai rapid decât instrucțiunile.

Arhitectura RISC execută instrucțiunile mai rapid deoarece nu parcurge nivelul de conversie a microcodului, generând mai multe instrucțiuni față de compilatorul CISC.

RISC CISC

Figura 14. Arhitectura RISC și CISC

RISC utilizează instrucțiuni simple care pot fi executate în cadrul unui singur ciclu de clock. Implementarea unei instrucțiuni a unui limbaj de nivel înalt se realizează folosind mai multe linii de cod, prin urmare este necesară o zonă mai mare de RAM pentru a stoca instrucțiunile, comparativ cu CISC care necesită o arie relativ mică de memorie RAM.

Avantajele utilizării arhitecturii RISC sunt următoarele: datorită setului redus de date prezent în acest tip de arhitectura, fluxul de instrucțiuni de asamblare este organizat în mod eficient; timpul de proiectare și erorile de construcție sunt mai reduse decât la CISC; utilizează tehnici de procesare pipeline; utilizează o memorie tampon sau cache pentru accelerarea operațiilor; utilizează un format fix al instrucțiunilor, codificate pe un singur cuvânt de 32/64 biți; are un număr de registre generale substanțial mai mare decât arhitectura CISC.

În concluzie, conceptul arhitecturii RISC nu se reduce la setul redus de instrucțiuni ci implică o arhitectură simplificată cu o viteză de calcul sporită. Procesoarele bazate pe acest tip de arhitectură prezintă o suprafață de siliciu redusă datorită unui număr mult mai mic de tranzistoare folosite în structură și prin urmare costul acestora este mult mai redus.

2.1.4.1. Memoria microcontroller-ului

Instrucțiunile care controleaza microcontrollerul trebuie stocate în memorii nevolatile, unde informațiile se păstrează și după oprirea și repornirea alimentării. Rezultatele intermediare pot fi înscrise într-o memorie volatilă fiind importantă citirea și scrierea lor rapidă în timpul funcționării.

Microcontrollerele includ următoarele tipuri de memorie:

Memoria RAM (Random Access Memory) – memorie volatilă care poate fi citită/scrisă de către unitatea centrală de prelucrare. Memoria de tip RAM ocupă mult spațiu pe chip și implică costuri mari de implementare, de aceea este puțin folosită în cadrul microcontroller-elor. Memoria RAM statică (SRAM – Static RAM) este folosită pentru stocarea nevolatilă a datelor, are o viteză de acces mare și un număr nelimitat de ștergeri/reînscrieri.

Memoria ROM (Read Only Memory) – memorie simplă, ieftină, utilizată pentru stocarea programelor în timpul fabricației. Informațiile din cadrul memoriei de tip ROM pot fi citite de către unitatea centrală însă nu pot fi modificate.

Memoria PROM (Programmable Read Only Memory) – similară memoriei ROM însă prezintă avantajul posibilității programării de către utilizator. Această memorie se clasifică în funcție de posibilitățile de ștergere în:

Memorie EPROM (Erasable PROM), care prezintă un mic geam de cuarț ce permite ștergerea memoriei chip-ului prin expunerea la raze ultraviolete. Expunerea presupune ștergerea întregii informații, nu doar a unor fragmente de informație. Memoria EPROM poate fi ștearsă și rescrisă de un număr limitat de ori, iar programarea sa necesită o procedură specială. Unele microcontrollere au circuite speciale de programare cu ajutorul cărora se poate programa memoria EPROM. În cadrul programării, memoria EPROM nu este conectată la magistrala de date și adrese.

OTP (One Time Programmable PROM) este de fapt o memorie EPROM cu chip-ul capsulat într-o capsulă fără fereastră, mult mai ieftină. Memoria OTP nu se poate șterge sau reprograma iar aplicațiile sunt lipsite de flexibilitate.

Memoria EEPROM (Electrically Erasable PROM) poate fi ștearsă electric în timpul funcționării. Este o memorie ieftină și lentă, cu un număr limitat de ștergeri și scrieri (usual 10000). Reînscrierea într-o memorie EEPROM presupune parcurgerea unui anumit număr de pași, iar ștergerea poate fi selectivă.

Memoria FLASH poate fi ștearsă și (re)programată electric precum memoria EEPROM și prezintă capacitatea unui EPROM, însă nu necesită fereastră pentru ștergere. Memoria FLASH nu permite ștergerea selectivă de locații. [10]

Microcontrollerele cu memorie ROM sunt folosite în cadrul aplicațiilor ce necesită un volum mare de producție, memoriile OTP fiind folosite pentru volum mic iar EPROM pentru prototipuri. Tipul de memorie utilizată în cadrul microcontroller-elor, capacitatea memoriei si ușurința cu care se poate alimenta sunt caracteristici specifice fiecărui circuit.

2.1.4.2. Dispozitive de intrare/ieșire ale microcontrollerului

Microcontrollerele interacționează cu mediul în procesul de control prin intermediul dispozitivelor de intrare/ieșire (I/O – Input/Output). Dispozitivele I/O au rolul de a implementa funcții speciale care degrevează unitatea centrală de activitățile specifice în cadrul funcției respective.

Printre funcțiile cele mai importante ale dispozitivelor I/O se enumeră realizarea de operații de comunicație (transfer serial/paralel de date), operații de conversie analog numerică, efectuarea de funcții de comandă și funcții de timp (generare de impulsuri). Resursele necesare acoperă funcțiile de control propriu-zis și funcțiile sistemelor de întreruperi și a timer-elor, care sunt aplicații în timp real. Dispozitivele I/O se regăsesc în configurația tuturor microcontroller-elor însă există dispozitive care se regăsesc doar în cadrul microcontroller-elor construite specific pentru optimizarea unor aplicații particulare.

Unitatea centrală interpretează dispozitivele I/O ca porturi și prezintă două metode de mapare (alocare) a adreselor pentru apelarea porturilor. Maparea se realizează fie în spațiul de memorie, fie în spațiul propriu. Pentru fiecare tip de mapare există o serie de avantaje și dezavantaje:

Maparea în spații separate:

Avantaje: Se evită comiterea de erori software deoarece se folosesc instrucțiuni diferite pentru accesul la memorie și la dispozitivele I/O. Dispozitivele I/O nu ocupă spațiu de memorie iar decodificatorul de adrese este simplu datorită spațiului mic de adresare al dispozitivelor I/O;

Dezavantaje: Instrucțiunile I/O sunt puțin flexibile și nu permit folosirea modurilor de adresare folosite în lucrul cu memoria.

Maparea în spațiul comun:

Avantaje: Programarea operațiilor I/O este foarte flexibilă deoarece instrucțiunile de lucru cu memoria și modurile de adresare sunt utilizabile în tratarea dispozitivelor I/O. Prin urmare, se poate opera cu porturile la fel ca și cu o locație de memorie. Operațiile aritmetice și logice folosesc operanzi direct de la port iar datele pot fi mutate în porturi prin instrucțiuni. Conținutul porturilor poate fi citit, modificat și scris din nou în port cu ajutorul instrucțiunilor.

Dezavantaje: Maparea în același spațiu prezintă erori software și spațiul de adresare pentru memorie este mult mai mic.

Porturile paralele I/O. Rolul porturilor paralele I/O este de a facilita transferul simultan a datelor între microcontroller și mediu. Numărul de biți transferați depinde de organizarea porturilor în cadrul microcontroller-elor: organizare pe 8 biți sau pe un număr mai mare de biți. Sensul transferului, intrarea I (input) la ieșirea O (output), este programabil și se stabilește în cadrul unui registru de sens. Pentru optimizarea transferului de informații cu mediul sunt implementate mecanisme de apelare specifice la nivel de bit pentru registrele porturilor paralele I/O. Mecanismele de apelare presupun o structură hardware corespunzătoare și instrucțiuni de manipulare a informației la nivel de bit (execuții pe bit, transfer de bit, mascare de bit, operații logice la nivel de bit). Datorita acestor posibilități de manipulare la nivel de bit, la descrierea sistemelor paralele I/O se specifică întotdeauna numărul total de linii I/O. Interfața portului paralel I/O prezintă un circuit denumit circuit de interfață, responsabil pentru corectitudinea transferului către și de la dispozitiv. Printre metodele de sincronizare folosite de către circuitul de interfață se află:

Transferul direct – Interfața are rolul de a transfera semnalele de la unitatea centrală spre dispozitivul I/O (în cazul operației de ieșire) sau de la dispozitivul I/O la untiatea centrală (în cazul operației de intrare).

Transferul cu protocol (Handshake Method) – În situația în care interfața și dispozitivul I/O lucrează la viteze de lucru diferite se folosește un transfer denumit handshake. Fiecare linie a dispozitivelor I/O poate fi folosită independent ca intrare sau ca ieșire. Pentru a interacționa cu mediul, unui microcontroller îi sunt necesare multe conexiuni la nivel de pin ceea ce înseamnă un circuit cu un număr mare de pini. Din considerente economice, se urmărește reducerea numărului de pini ai circuitului integrat, astfel se atribuite funcții multiple pinilor porturilor paralele. La pinii porturilor paralele au acces conexiunile modulelor de comunicații seriale, conexiunile modulelor timer, canalele de intrare ale convertoarelor analogice sau digitale și liniile pentru generarea întreruperilor externe.

Module de comunicații seriale. Comunicația serială oferă compatibilitate cu o gamă largă de dispozitive și necesită un număr minim de fire și conexiuni. Într-o astfel de comunicație este necesară cunoașterea începutului și sfârșitului informației transferate, altfel spus emițătorul și receptorul trebuie să fie sincronizați.

Sincronizarea emițătorului și a receptorului se poate realiza prin două metode în cadrul microcontroller-elor: modulul serial asincron și modulul serial sincron. Fiecare metodă presupune că durata unui bit este aceeași la emițător și la receptor, fiind folosit același semnal de ceas pentru serializarea informației. Numărul de biți transmiși într-o secundă reprezintă baud rate (rata de transfer), măsurată în biți pe secundă (bits per second – bps). Durata unui bit este dată de raportul 1/(baud rate).

Modul serial asincron este referit ca UART – Universal Asynchronous Receiver Transmiter. În cadrul unui transfer serial asincron începutul fiecărei secvențe de opt biți (byte) este marcat de o tranziție a liniei, menținută pe durata unui bit (denumit bit de start), iar sfârșitul este marcat de un bit de stop. Bitul de stop menține linia pe durata unui bit într-o stare predefinită. Informația este transferată între bitul de start și bitul de stop, iar secvența completă de informație este formată dintr-un bit de start, opt biți de date (uneori chiar nouă) și un bit de stop – prin urmare un total de zece (sau unsprezece) unități de cod.

Interfața seriala asincronă poate fi implementată cu ajutorul unui program care generează secvența de transfer și măsoară durata fiecărui bit, însă această metodă este costisitoare din punct de vedere a resurselor hardware necesare și a timpului consumat. O soluție mai bună de implementare și des folosită în microcontrollere este realizarea interfeței cu un modul hardware specializat. Unitatea centrală va înscrie informația de transferat într-un registru al interfeței iar hardware-ul realizează serializarea și generarea secvenței. În cazul în care registrul de recepție este plin sau registrul de transmisie este gol, interfața poate suspenda temporar execuția programului cu ajutorul întreruperilor.

Ceasul pentru generarea ratei de transfer (CLK) poate fi intern sau extern. Dacă se folosește un ceas intern, acesta este format din ceasul unității centrale cu o prescalare. Interfața UART are registre de stare și control cu ajutorul cărora se pot programa modul de lucru, parametri de comunicație și selecția de ceas.

Schema bloc simplificată a interfeței seriale asincrone este reprezentată în figură.

Modulul serial sincron. Transferul serial poate fi realizat în două moduri: transfer serial sincron sau transfer serial autosincronizat. Transferul autosincronizat presupune utilizarea unui sistem special care permite extragerea semnalului de ceas din datele recepționate, însă acest tip de transfer nu este folosit în cadrul microcontroller-elor.

Transferul serial sincron în cadrul microcontroller-elor este folosit pentru comunicația cu dispozitivele periferice. Acest transfer necesită un emițător, un receptor și un semnal de clock transferat pe o linie dedicată. Între emițător și receptor sincronizarea se realizează o singură data la inițierea transferului de date, spre deosebire de modul asincron la care sincronizarea se făcea prin bitul de start al fiecărui octet. Ratele de transfer ale modului serial sincron sunt mult mai mari decât modul asincron, fiind estimate la 1Mbps.

Figura 15. Schema bloc simplificată a interfeței seriale asincrone a dispozitivelor I/O prezente la microcontrollere

Specific transferului serial sincron este relația master-slave între dispozitive. Transferul de date poate fi inițiat doar de către master, care scrie un octet în registrul de transmisie de date al interfetei sincrone. Datele înscrise sunt apoi transferate în registrul de deplasare, sunt serializate și transmise pe linia MOSI (Master Output Slave Input), care este o linie de emisie în cadrul transferului serial sincron. Clock-ul pentru sincronizarea procesului este transmis pe linia SCK (Serial Clock). Datele ajung la dispozitivul slave tot pe linia MOSI, fiind deplasate cu ajutorul ceasului recepționat pe linia SCK. Atunci când registrul de deplasare este “umplut”, datele sunt transferate în registrul de recepție de date.

Pinii asociați unei conexiuni seriale sincrone sunt: MISO – Master In Slave Out – pinul este configurat ca intrare într-un dispozitiv master și ieșire dintr-un dispozitiv slave. Datele se transmit într-un singur sens, de la slave către master; MOSI – Master Out Slave In – pinul este configurat ca ieșire dintr-un dispozitiv master și intrare într-un dispozitiv slave. Datele se transmit într-un singur sens, de la master la slave; SCK – Serial Clock – pinul este configurat ca ieșire la un dispozitiv master și intrare la un dispozitiv slave. Prin aceasta conexiune se transmite semnalul de sincronizare a datelor; nSS – non Slave Select – la acest pin se aplică semnalul de selecție a unui dispozitiv slave. Pentru un dispozitiv slave, semnalul este activ pe toată durata unui transfer de date în care este implicat (activ – low), iar pentru un dispozitiv master nSS se conecteaza permanent la 1 logic.

Modurile de interconectare între un master și slave depinde de numărul de dispozitive slave existente în transferul serial sincron. În cazul în care în sistem există un singur dispozitiv slave, conexiunea se realizează în modul următor, reprezentat în figură:

Figura 16. Master-slave, conexiune serial sincronă

În cazul în care există mai multe dispozitive interconectate dintre care doar unul este master, se realizează conexiuni de tipul “multi-slave”. Există două moduri de conexiune master – multi-slave; în primul mod master-ul folosește ieșiri de porturi pentru a selecta dispozitivul slave, iar în cel de-al doilea mod toate dispozitivele slave sunt legate în inel și selectate. Aceste două moduri diferite de conexiune multi-slave sunt prezentate în figurile următoare:

Figura 17. Conexiune serială sincronă – Master cu porturi pentru selecția dispozitivului slave

Figura 18. Conexiune serială sincronă – Master cu dispozitive slave legate în inel

Module Timer. Funcțiile de timp ale microcontroller-ului sunt puse la dispoziția utilizatorului prin module numite timer. Un sistem timer are un set de funcții implementate pe baza unui numărător și a unor blocuri funcționale specifice. Modulul timer este folosit pentru a măsura timpul necesar proceselor și pentru a genera semnale la perioade și frecvențe dorite.

Funcțiile unui timer pot realiza întreruperi independente cu control propriu și vector de întrerupere specific. Într-un astfel de sistem există o serie de mecanisme puse la dispoziția utilizatorului printre care amintim: mecanismul de comparare – care permite controlul semnalelor de ieșire, mecanismul de captură – care permite monitorizarea semnalelor de intrare și numărătoarele interne – care oferă referințe de timp interne. De asemenea, modulele timer pot fi folosite și pentru generarea formelor de undă sau pentru conversii de tip digitale sau analogice simple.

Principalele funcții oferite de un modul timer sunt următoarele:

Captură la intrare (IC – Input Capture). În unele aplicații care implică utilizarea modulelor timer este necesară cunoașterea momentului de timp în care are loc un eveniment. Într-un sistem, timpul fizic este reprezentat prin conținutul unui numărător iar apariția unui eveniment printr-o tranziție de semnal. Momentul de apariție al evenimentului poate fi înregistrat cu ajutorul numărătorului prin memorarea stării numărătorului la acel timp. Principalele aplicații specifice funcției de captură la intrare sunt: înregistrarea momentului de apariție a unui eveniment; măsurarea perioadei unui semnal necunoscut, prin determinarea timpului scurs între două tranziții consecutive de același fel (două fronturi pozitive consecutive sau două fronturi negative consecutive); numărarea unor evenimente, prin utilizarea unui contor de evenimente. La apariția unui eveniment se generează o întrerupere; se incrementează un contor de evenimente care înregistrează numărul de apariții. Sfârșitul contorizării se stabilește cu ajutorul funcției de comparare la ieșire.

Comparare la ieșire (OC – Output Compare). La fiecare impuls de ceas, valoarea numărătorului principal este comparată cu cea a unui registru iar dacă se constată a fi egale, pot avea loc următoarele evenimente: declanșarea unei acțiuni la pinii de ieșire, setarea unui flag într-un registru sau generarea unei întreruperi pentru unitatea centrală. Utilizatorul controlează acțiunea dorită la pinul ieșirii de comparare într-un registru de control. Comparatorul măsoară diferențele între valoarea numărătorului liber și valoarea din registrul de comparare la fiecare clock, iar dacă constată o egalitate între valori, activează acțiunea specifică la pinul de comparare. De asemenea, comparatorul generează o întrerupere care a fost validată anterior prin bitul OCxI, întreruperea fiind vectorizată și având o locație specifică în tabela vectorilor de întrerupere.

Întreruperile în timp real (RTI – Real Time Interrupt). Funcția de întrerupere în timp real RTI este folosită pentru a genera întreruperile, folosite în situații de comutare în sisteme multitasking sau pentru declanșarea execuției unor secvențe. Perioada RTI este programabilă iar rezoluția funcției nu este la fel de performantă comparativ cu funcția de comparare.

COP (Computer Operating Properly) Watchdog. COP Watchdog este un ceas de gardă folosit pentru detecția erorilor de program. Funcția ceasului de gardă este o funcție opțională a cărei registru trebuie resetat periodic de către utilizator; în cazul în care registrul nu a fost resetat, unitatea centrală va reseta întreg sistemul pentru a preveni o situație problematică necontrolabilă. Timerul este compus dintr-un numărător al cărui ceas este programabil printr-un registru denumit registru de prescalare. La activarea circuitului, numărătorul numără incontinuu iar atunci când atinge cea mai mare valoare (exemplu, FFFFh în cazul unui numărător de 16 biți) se generează către unitatea centrală un semnal de RESET.

Acumulatorul de impulsuri (Pulse Accumulator). În registrul acumulator de impulsuri pot fi numărate pulsuri interne sau evenimente exprimate prin pulsuri. Funcțiile principale ale acumulatorului (numărătorului) de impulsuri sunt: numărarea de evenimente – numărătorul este incrementat la fiecare front activ care a fost detectat la un pin; numărarea gradată, folosită în aplicații de măsurare a duratei unui singur impuls prin înscrierea cu 0 a numărătorului la începutul pulsului și citirea valorii sale la sfârșitul pulsului.

Pe lângă modulele timer anterioare, există aplicații care utilizează module timer PWM (Pulse Width Modulation) care generează semnale modulate. Semnalele PWM sunt utilizate în comanda motoarelor de curent continuu sau a surselor de alimentare. Aceste semnale sunt generate periodic și permit utilizatorului modificarea factorului de umplere în mod controlat.

În schema bloc a modului PWM, blocul registrului de prescalare are rolul de a genera semnalul de ceas (clock) pentru numărător. Conținutul numărătorului este comparat cu conținutul registrului PWM, și atâta timp cât rezultatul comparației este mai mic sau egal se va genera 1 logic la ieșirea PWM. În caz contrar, se generează 0 logic.

2.1.4.3. Sistemul de întreruperi

Întreruperile sunt schimburi în fluxul de control a căror cauze se află, de obicei, în legătură cu operațiile I/O. Un concept esențial al întreruperilor este transparența, proprietate care permite sistemului de calcul să se întoarcă în starea pe care a avut-o înainte de apariția unei întreruperi și servirea rutinii specifice.

Un sistem de întrerupere permite detecția în cadrul sistemului de calcul a unor evenimente de natură externă sau internă precum recepția unui caracter pe un canal, golirea unui registru, generarea unui impuls de către contorul de timp, tentativa de execuție a unui cod de instrucțiune protejat, eroare în timpul unei execuții și multe altele.

Sistemul de întrerupere are rolul de a declanșa acțiunile necesare pentru tratarea evenimentelor apărute. El permite sistemului de calcul să reacționeze în timp util la aceste evenimente, să se sincronizeze cu ele și să le trateze rapid. Un sistem de întrerupere este mult mai avantajos și preferat în cadrul programelor comparativ cu folosirea testării periodice prin program a indicatorilor de stare și a semnalelor de intrare (alternativă care s-a dovedit a fi ineficientă în situația în care numărul de elemente pentru testare este foarte mare).

De cele mai multe ori, un sistem de calcul are mai multe dispozitive I/O care lucrează în paralel și există posibilitatea de apariție simultană a două cereri de întrerupere în sistem sau apariția unei cereri în timpul execuției altei cereri. Pentru a evita astfel de situații, sistemul de calcul permite departajarea între toate întreruperile, astfel fiecare va avea câte un nivel de prioritate. De asemenea, rutinele de tratare ale întreruperilor sunt executate tot cu prioritate. În timpul execuției unei proceduri de tratare a întreruperii cu prioritatea n, orice tentativă a unui dispozitiv de a cauza o întrerupere cu o prioritate mai mică decât n va fi ignorată până la terminarea rutinii cu prioritate mai mare.

O modalitate recentă de soluționare a cererilor de întrerupere plasate simultan este de a asigna niveluri de prioritate pentru dispozitive și de a utiliza un sistem de arbitrare pentru gestionarea cererilor.

Așa cum s-a menționat anterior, întreruperile sunt cauzate de evenimente externe sau interne ale sistemului de calcul. Sursele interne de întrerupere în cadrul sistemelor microcontroller sunt: tentativa de divizare cu zero, execuția unei instrucțiuni de întrerupere software și tentativa de execuție a unei instrucțiuni protejate. Întreruperile externe se clasifică în două tipuri: nemascabile, generate prin activarea semnalului NMI (Non-Maskable Interrupt); mascabile, generate prin activarea semnalului INT (Interrupt)

Întreruperile mascabile pot fi validate prin resetarea indicatorului IF (Interrupt Flag) din registrul de stare al programului (IF = 0). Validarea se realizează la revenirea din rutina de întrerupere atunci când registrul de stare se reface sau prin instrucțiunea STI (Set Interrupt). Resetarea se realizează la lansarea unei rutine de întrerupere sau prin utilizarea instrucțiunii CLI (Clear Interrupt).

Întreruperile nemascabile nu sunt afectate de starea indicatorului IF. Ele sunt de obicei utilizate pentru a indica situații critice în funcționarea sistemului (precum erori de paritate sau fluctuații ale tensiunii de alimentare).

Deservirea unei întreruperi de tip hardware se realizează conform următorilor pași: se activează un semnal de întrerupere, indicând un eveniment; controlorul de întreruperi verifică dacă întreruperea este nemascată și dacă nu este în curs de desfășurare o alta rutină cu prioritate superioară; se activează linia de întrerupere către procesor (dacă întreruperea este mascată, se ignoră; dacă întreruperea este nemascată, dar este în curs de desfășurare o rutină prioritară, se așteaptă terminarea acesteia; se memorează cererea de întrerupere într-un registru al controlorului); se testează intrarea de întrerupere la incheierea execuției instrucțiunii aflate în curs; dacă întreruperea este validata (IF setat), se salvează pe stivă adresa instrucțiunii imediat următoare și conținutul registrului de stare.Contrar, întreruperea este ignorată; se lansează procedura de identificare a sursei de întrerupere prin INTA (Interrupt Acknowledge); controlorul plasează vectorul întreruperii curente pe magistrala de date (procesorul folosește vectorul de întrerupere ca index în tabele de întreruperi pentru determinarea adresei rutinei de tratare a întreruperii, apoi execută un salt la adresa extrasă din tabelă); se executa rutina de întrerupere; înainte de sfârșitul rutinei, se anunță controlorul de întreruperi asupra încheierii întreruperii curente prin comanda EOI (End Of Interrupt); instrucțiunea IRET (Interrupt Return) încheie rutina de întrerupere; registrul de stare se va reface cu informația salvată pe stivă și se va executa un salt la secvența întreruptă; adresa de revenire se află tot pe stivă; se continuă execuția secvenței întrerupte.

Adresele rutinelor de întrerupere se află în tabela de întreruperi care este plasată la începutul spațiului de adresare. Tabela conține un număr de n intrări corespunzătoare celor n nivele de întrerupere recunoscute de procesor. Fiecare intrare conține un anumit număr de octeți, adresa de offset și adresa de segment a rutinei de întrerupere.

Întreruperilor pot fi simulate prin program cu ajutorul instrucțiunii INT n (unde n specifică nivelul de întrerupere). Funcția INT n este utilă în cadrul apelării rutinelor și funcțiilor din sistemul de operare și un avantaj datorită posibilității de relocalizare și redirecționare a rutinelor prin mecanismul tabelei de întreruperi. Prin urmare, este suficient ca utilizatorul unei funcții de sistem să cunoască numai intrarea în tabela de întreruperi alocată funcției respective.

2.1.5. Aplicații FPGA

Aplicațiile FPGA includ unele domenii esențiale pentru electronica modernă:

DSP (digital signal processing) care uprinde o categorie vasta de aplicații de procesare digitală a semnalelor, dintre care cele mai cunoscute sunt: procesarea semnalelor audio si radio; recunoașterea vorbirii, a vocilor și a sunetelor; radar și sonar; procesarea ariilor de senzori; analiza spectrală; analiza statistică a semnalelor; telecomunicații; procesarea semnalelor biomedicale; seismice;

Aplicații în aviatică, aparatura militară, criptografie și radioastronomie;

Realizarea rapidă a prototipurilor ASIC;

Imagistică.

FPGA se utilizeaza cu bune rezultate și în cazul aplicațiilor de calcul de înalta performanță, cum ar fi în cazul calculului convoluțional și procesărilor paralele, având performanțe superioare microprocesoarelor convenționale.

De obicei circuitele FPGA sunt recomandabile aplicațiilor de tip „vertical”, care nu sunt obiectul producției de masa.dar în cazul produselor de masa este preferabila apelarea la ASIC, deoarece FPGA utile doar în faza de realizare și testare a prototipurilor.

FPGA pot înlocui cu succes orice aplicație de tip microprocesor care nu necesită prelucrari în virgula mobila. Avantajele lor strategice ale circuitelor FPGA sunt calculul hardware paralel, reconfigurarea și capacitatea de a îngloba cu usurința produse hardware si software eterogene. Datorită usurinței circuitelor FPGA de adaptare la orice tip de periferice i se conferă statutul de principala platforma de dezvoltare a aplicațiilor SoC (system on chip).

2.2. Proiectarea cu circuite logice programabile

Programele pentru automatizarea proiectării circuitelor integrate sunt factorul cheie în dezvoltarea unui circuit integrat. Din dorința creșterii productivității, adică a scăderii timpului necesar pentru proiectarea unui circuit integrat, uneltele pentru automatizarea electronică a proiectării (EDA – Electronic Design Automation) cunosc o dezvoltare accentuată odată cu creșterea puterii de calcul a calculatoarelor. Cu cât factorul uman are o contribuție mai mică la proiectarea unui circuit integrat, cu atât timpul de proiectare este mai redus.

2.2.1. Proiectarea automatizată asistată de calculator a circuitelor integrate

În prezent, automatizarea electronică a proiectării circuitelor integrate este mai evidentă la circuitele integrate (blocurile) digitale. Circuitele integrate (blocurile) analogice au nevoie de o contribuție mai semnificativă din partea factorului uman.

În general, uneltele de proiectare sunt optimizate pentru proiectarea circuitelor integrate bazate pe librării de celule: circuite integrate de aplicație specifică – ASIC (Application Specific Integrated Circuit) și circuite integrate de aplicație specifică bazate pe celule standard – ASSP (Application Specific Standard Parts). Din acest motiv, circuitele integrate la comandă (Full Custom) au oarecum de suferit.

Mai mult, principala țintă a producătorilor de software sunt tehnologiile CMOS (Complementary Metal Oxid Semiconductor), deoarece sunt mult mai răspândite decât alte procese de fabricație iar descrierea componentelor acestor tehnologii este mai simplă și necesită un efort mai mic.

O dată cu creșterea complexității circuitelor integrate a fost nevoie de dezvoltarea unor tehnici și standarde care să simplifice proiectarea.

Descrierea unui circuit integrat poate fi făcută în trei moduri: domeniul comportamental, domeniul structural și domeniul fizic. În fiecare din aceste domenii există un număr de opțiuni de proiectare ce pot fi selectate pentru a rezolva o problemă particulară. De exemplu, la nivel comportamental, libertatea de alegere înseamnă că este disponibil un algoritm secvențial sau paralel. În domeniul structural, se poate alege o familie logică particulară sau o anumită strategie de tact. La nivel fizic, se pot folosi celule dintr-o librărie standard sau se pot face celule individuale.

Aceste domenii pot fi ierarhic divizate în niveluri de abstractizare ale proiectului. În mod clasic, acestea includ următoarele: nivelul arhitectural sau funcțional, nivelul de transfer prin registre (RTL), nivelul logic și nivelul de circuit.

Un sistem bun de proiectare a circuitelor integrate de complexitate mare – VLSI (Very Large Scale Integration) trebuie să aducă descrieri consistente în toate cele trei domeniile de descriere (comportamental, structural și fizic) și în toate nivelurile relevante de abstractizare (arhitectură, RTL, logic și circuit). Mijloacele prin care acest lucru este realizat poate fi măsurat în variați termeni ce diferă ca importanță în funcție de aplicație. Parametri proiectului pot fi rezumați în termeni de: performanță (viteză, putere, funcție, flexibilitate); arie de plachetă siliciu (deci costul plachetei); timpul de proiectare (deci costul ingineriei și planului); ușurința generării testului și testabilității (deci costul ingineriei și planului).

Proiectul este un compromis continuu pentru a se asigura rezultatele corespunzătoare pentru toți parametrii de mai sus. Astfel, uneltele și metodologiile utilizate pentru un chip particular vor fi funcție de acești parametri. Anumite rezultate finale trebuie impuse (adică, chipul trebuie să fie în conformitate cu specificațiile de performanță), dar alte constrângeri pot fi funcție de economic (adică dimensiunea plachetei de siliciu, care afectează randamentul) sau chiar de subiectivitate (adică, ceea ce un proiectant găsește ușor, un altul poate să găsească neinteligibil).

Întrucât procesul de proiectare al unui sistem în siliciu este complicat, rolul unei unelte de proiectare VLSI bune este de a reduce această complexitate, de a mări productivitatea și de a asigura proiectantul că proiectul lucrează corect.

Pentru ca uneltele de proiectare să aibe un randament cât mai bun este necesară reducerea complexității prin anumite tehnici. Reducerea complexității se poate realiza prin:

Ierarhia. Prin ierarhie se divide un modul în submodule și apoi se repetă această operație pentru submodule până când complexitatea submodulelor este la un nivel de detaliu comprehensibil. Acest lucru se aseamănă cu cazul software-ului unde programele mari sunt divizate în secțiuni tot mai mici până la simple subrutine ce se pot scrie cu funcții și interfețe bine definite. Cum am văzut, un proiect poate fi exprimat în termenii celor trei domenii. Putem folosi o ierarhie paralelă în fiecare domeniu. De exemplu, un sumator poate avea: o subrutină ce modelează comportarea, o diagramă de conexiuni de porți ce specifică structura circuitului și o bucată de layout ce specifică natura fizică a sumatorului. La nivel de sistem, utilizarea ierarhiei permite să se separe proiecte de câte o persoană, la un nivel unde lista este proporțională cu numărul persoanelor disponibile.

Regularitatea. Ierarhia implică divizarea unui sistem într-un set de submodule. Totuși, ierarhia singură nu rezolva în mod necesar problema complexității. De exemplu, putem să dividem în mod repetat ierarhia unui proiect în diferite submodule, dar încă se termină cu un număr mare de submodule diferite. Cu regularitatea ca ghid, proiectantul încearcă să dividă ierarhia într-un set de blocuri de construcție similare. Folosirea iterației pentru a forma matrici de celule identice este o ilustrare de folosire a regularității în proiectarea circuitelor integrate. Totuși se poate face o utilizare extinsă de structuri regulate pentru a se simplifica procesul de proiectare. Regularitatea poate exista la toate nivelurile ierarhiei proiectului. La nivel de circuite, tranzistoare uniform dimensionate pot fi mai degrabă folosite decât să se optimizeze manual fiecare dispozitiv. La nivelul de module logice se pot folosi structuri de porți identice. La niveluri mai mari se pot construi arhitecturi ce folosesc un număr de structuri de procesor identice. Folosind regularitatea în modurile menționate, un proiect poate fi considerat corect prin construcție. Se pot adăuga, de asemenea, prin regularitate, metode pentru dovedirea în mod formal a corectitudinii proiectului. Regularitatea permite o îmbunătățire în productivitate prin reușita unor proiecte specifice într-un număr de locuri, reducând astfel numărul de proiecte ce au trebuit completate.

Modularitatea. Principiul modularității se adaugă la ierarhie și regularitate, cu condiția ca submodulele să aibă funcțiuni și interfețe bine definite. Dacă modulele sunt bine formate interacțiunea cu alte module poate fi bine caracterizată. În cazul circuitelor integrate, aceasta corespunde la o interfață comportamentală, structurală și fizică bine definită, ce indică poziția, numele, tipul stratului, dimensiunea și tipul semnalului interconexiunilor externe, alături de funcția logică și caracteristicile electrice. De exemplu, punctele de conexiune pot indica alimentarea și masa, intrările și ieșirile la un modul. Funcțiunea trebuie de asemenea să fie bine definită într-o manieră fără ambiguități. Modularitatea ajută proiectantul să clarifice și să documenteze o abordare a unei probleme și permite, de asemenea, ca un sistem de proiectare să verifice mult mai ușor atributele unui modul o dată ce acesta este construit. Abilitatea de a diviza o sarcină într-un set de module bine definite ajută de asemenea într-o echipă de proiectare unde fiecare dintre proiectanți are de proiectat o porțiune dintr-un cip complet.

Localitatea. Definind interfețe bine caracterizate pentru un modul, noi am stabilit efectiv că alte lucruri interne ale modulului sunt neimportante la orice interfață externă. Pe această cale noi efectuăm o formă de ascundere de informație ce reduce complexitatea aparentă a acelui modul. În domeniul software aceasta este similară cu reducerea la minimum a numărului de variabile globale. Modulele pot, de asemenea să fie localizate pentru a se minimiza legăturile globale ce pot fi necesare pentru a conecta un număr de module din sistem. Un imperativ comun în sistemele proiectate în momentul de față ce aplică atât matrici de porți cât și proiectare la comandă este utilizarea tehnicii: întâi legăturile apoi modulele, mai degrabă decât aceea obișnuită: plasarea modulelor apoi rutarea lor împreună.

Specificația este prima verigă în proiectarea unui circuit integrat. În specificație sunt menționațe funcția, parametrii și performanța, ce trebuie îndepliniți de circuitul integrat.

Funcția descrie relația între intrări și ieșiri.

Tehnologia de fabricație se alege în funcție de cerințele de performanță și cost.

Descrierea reprezintă implementarea funcției într-un anumit limbaj. Descrierea se poate face la nivel comportamental sau la nivel de transfer între registre – RTL (Register Transfer Logic) într-un limbaj de descriere hardware – HDL (Hardware Description Language) sau la nivel de circuit într-o schemă grafică.

Nu există o definiție unanim acceptate a descrierii comportamentale sau a celei RTL. Oricum, un lucru este acceptat: descrierea comportamentală este o descriere abstractă care nu depinde de un tact. Descrierea RTL este o descriere care este guvernată de cel puțin un tact. Procesul de proiectare cu descriere comportamentală ridică nivelul de abstractizare, crește productivitatea și reduce riscul introducerii unor erori.

Funcția și descrierea pot fi simulate cu unelte software specifice.

Layout-ul definește implementarea fizică (măștile de fabricație a circuitului integrat) și se realizează pe baza descrierii logice.

Verificarea fizică a layout-ului constă în verificarea regulilor de proiectare fizică – DRC (Design Rule Check), a regulilor electrice – ERC (Electrical Rule Check), a corespondenței între descrierea logică și layout – LVS (Layout versus Schematic) și a altor constrângeri electrice sau fizice.

Extracția este un procedeu prin care se realizează extragerea din descrierea fizică a elementelor implementate (tranzistoare, diode, rezistoare, capacitoare, etc.), precum și a unor elemente parazite caracteristice (capacități, rezistențe, inductanțe) într-un format compatibil cu un simulator.

În funcție de tipul circuitului integrat și strategia de proiectare aleasă pot apărea diferențe în fluxul de proiectare.

Proiectarea circuitelor integrate digitale beneficiază de o posibilitate mai mare de automatizare. Acest lucru este posibil, deoarece majoritatea circuitelor digititale pot fi descrise cu aceleași celule elementare (porți, bistabile, etc.) care sunt realizate specific unei tehnologii de fabricație.

Pentru fiecare din etapele de proiectare există programe software specifice. Acestea pot fi individuale sau parte dintr-un pachet ce acoperă toate etapele de proiectare sau numai câteva.

2.2.2. Limbaje de programare a circuitelor logice programabile

La ora actuală, pentru programarea circuitelor logice se folosesc in mod curent, limbaje de descriere a hardware-ului (Hardware Description Language – HDL), dintre care cele mai răspandite sunt VHDL si Verilog. VHDL (VHSIC HDL – VHSIC însemnând Cerz High Speed Integrated Circuits) a devenit standard IEE în anul 1986 și se înrudește, din punct de vedere al sintaxei , cu limbajul de programare Ada, din care este inspirat de altfel și limbajul Pascal. Verilog a fost standardizat IEE în 1995, fiind asemanănător la nivel general cu limbajul C, ceea ce poate fi considerat drept un argument privind ușurința învățării sale. Similaritatea este însă la nivel formal, portarea directă din C fiind rareori posibilă.

Cum o cerință importantă la ora actuală în industria hardware este scurtarea timpului între elaborarea unui algoritm și implementarea sa, devine evidentă necesitatea utilizării unui limbaj care să fie cât mai apropiat de un limbaj de programare frecvent întrebuințat, un candidat perfect fiind limbajul C. În acest fel devine posibilă realizarea sistemelor hardware de către persoane care nu au urmat lungi cursuri speciale de limbaje de descriere a hardware-ului. Un alt avantaj este facilitarea transformării unui algoritm scris în C într-o implementare hardware.

Un limbaj care răspunde acestor cerințe este Handel-C, furnizat de compania Celoxica. Acest limbaj este bazat pe limbajul Handel elaborat de Ian Page, profesor la Imperial College din Londra și cofondator al Celoxica. La rândul său limbajul Handel este similar cu un subset al lui occam [Hoa-88], un limbaj folosit pentru descrierea sistemelor de aplicații concurente. Utilizând limbajul Handel-C este așadar posibilă programarea FPGAurilor într-un mod firesc, natural, cu rezultate satisfăcătoare din punctul de vedere al eficienței implementării.

Aplicațiile care pot beneficia de aportul sistemelor hardware reconfigurabile sunt numeroase, de la cele de tipul recunoașterea formelor, comunicația video, criptarea/decriptarea, până la sisteme de testare a rețelelor de calculatoare ș.a.m.d. În general vorbind, pentru orice domeniu în care sunt necesare operaii în timp real, iar prelucrările software nu sunt suficient de rapide, o soluție practică extrem de eficientă este folosirea unor sisteme pe bază de FPGA-uri, programate cu un limbaj de nivel înalt, cum ar fi Handel-C.

2.2.2.1. Limbajul descriptor de echipamente VHDL

Pe la mijlocul deceniului ’80, Departamentul Apărării al S.U.A. și IEE au sponsorizat realizarea unui limbaj de mare capacitate de descriere a echipamentelor, numit VHDL. Limbajul a avut inițial și pastrează urmatoarele caracteristici:

Proiectele pot fi descompuse ierarhic.

Fiecare element al unui proiect prezintă atât o interfață bine definită (pentru conectarea cu alte elemente), cât și o definire foarte exactă a modului de funcționare (pentru a putea fi simulat).

Funcționarea unui element poate fi descrisă fie printr-un algoritm, fie untilizându-se structura unui echipament existent. De exemplu un anumit element poate fi definit inițial printr-un algoritm, pentru a se putea efectua verificările elementelor de proiect de nivel superior, care îl includ; ulterior, definirea prin algoritm poate fi înlocuită cu o structură de echipament.

Simultaneitatea, temporizarea și sincronizarea pot fi modelate. În VHDL se poate lucra cu structuri de circuite secvențiale atât sincrone cât si asincrone.

Comportarea logică și temporală a unui priect se poate simula.

Deci VHDL a debutat ca limbaj de documentare și modelare care permite descrierea precisă și simularea comportării sistemelor digitale.

Limbajul și mediul de simulare VHDL constituie intrinsec inovații importante, însă utilizarea și popularitatea VHDL au făcut un salt important o dată cu realizarea instrumentelor de sinteză VHDL, de largă aplicabilitate. Aceste programe pot crea structuri de circuite logice pornind direct de la descrierile VHDL ale modului de funcționare. Cu VHDL, se poate proiecta, simula și sintetiza orice circuit, de la un simplu circuit combinațional până la un sistem complet cu microprocesor, realizat pe un singur cip.

– import std_logic from the IEEE library

library IEEE;

use IEEE.std_logic_1164.all;

– this is the entity

entity ANDGATE is

port (

I1 : in std_logic;

I2 : in std_logic;

O : out std_logic);

end entity ANDGATE;

– this is the architecture

architecture RTL of ANDGATE is

begin

O <= I1 and I2;

end architecture RTL;

Figura 19. O poartă ȘI în limbaj VHDL

2.2.2.2. Limbajul descriptor de echipamente Verilog

Verilog este un limbaj de descriere a hardware-ului (Hardware Description Language – HDL), destinat descrierii comportamentului și/sau arhitecturii unui sistem numeric, cu alte cuvinte al unei funcții logice combinatorii sau secvențiale. Un sistem numeric poate fi descris, la niveluri diferite, in funcție de aspectele care interesează. Astfel, un HDL poate descrie, la nivel de comutator, amplasarea traseelor de legatură (firele), a rezistoarelor si tranzistoarelor pe un circuit integrat. Limbajul HD poate descrie sistemul numeric având in vedere porțile logice și bistabilele componente, adică la nivel de porți. La un nivel mai ridicat, sistemul numeric poate fi descris în termenii transferurilor vectorilor de informație între registre. Acesta reprezintă Nivelul Transferurilor între Registre (Register Transfer Level – RTL)/Nivelul Fluxului de Date. Limbajul Verilog suporta toate aceste niveluri.

module toplevel(clock,reset);

input clock;

input reset;

reg flop1;

reg flop2;

always @ (posedge reset or posedge clock)

if (reset)

begin

flop1 <= 0;

flop2 <= 1;

end

else

begin

flop1 <= flop2;

flop2 <= flop1;

end

endmodule

Figura 20. Exemplu de circuit latch în Verilog

2.2.2.2.1. Nivelul transferurilor între registre

Se consideră un calculator foarte simplu, cu o memorie (Mem) de 8192 cuvinte de câte 32 de biți fiecare, un registru de adrese al memoriei (AM) de 13 biți, un registru de date al memoriei (DM), un acumulator (AC), un registru al instrucțiunii (RI) și un contor de program (CP) de 13 biți.

Memoria și registrele vor fi declarate în Verilog după cum urmează:

reg [31:0] AC, DM, RI;

reg [12:0] AM, CP;

reg [31:0] Mem [0:8191];

Ca nivel de abstractizare pentru sistemul numeric s-a considerat transferul între registre. Astfel, sistemul numeric prelucrează datele în procesul transferului acestora între registre, prin intermediul unor rețele logice combinaționale.

Faza de citire (fetch) a unei instrucțiuni se poate descrie cu ajutorul următoarelor instrucțiuni Verilog.

// citirea instrucțiunii

#1 AM <= CP;

#1 DM <= Mem[AM]; // citește din memorie

#1 RI <= DM;

#1 CP <= CP + 1;

Semnificația primei instrucțiuni este aceea de a transfera conținutul de 13 biți al lui CP în AM cu o întârziere de o unitate de timp de simulare (#1). Întrucât s-a folosit operatorul de atribuire blocantă (<=) și nu cel de atribuire nonblocanta (=), rezultatul atribuirii va fi vizibil la sfârșitul instrucțiunii respective. Motivul utilizării atribuirii blocante va fi discutat ulterior.

2.2.2.2.2. Modelul unui calculator

Un calcul poate fi considerat că o clasă specială de transferuri între registre.

Un calcul elementar consta în plasarea într-un registru destinație a rezultatului evaluării unei funcții Booleene, care are ca argumente conținuturile unor registre surse. Calculul elementar are loc, de regulă, într-un interval determinat de timp, interval asimilat cu perioada ceasului utilizat pentru sincronizarea sistemului numeric. În cadrul aceleiași perioade de ceas pot avea loc în paralel mai multe calcule elementare, în condițiile existenței unor suficiente resurse hardware, de exemplu: rețele constituite din porți logice pentru implementarea funcțiilor Booleene necesare, registre destinație etc.

Un calcul consta într-o secvență de calcule elementare, care se derulează în mai multe perioade de ceas.

Codul Verilog pentru derularea instrucțiunii ÎNCARCA în AC conține 8 calcule elementare, care se înlănțuie pe durata a 8 perioade de ceas.

Proiectarea unui calculator numeric comporta în mare definirea registrelor, a instrucțiunilor, specificarea ordinii și a sincronizării transferurilor între registre. Calculul mai poate fi examinat ca o schimbare de stare. Starea unui sistem este dată de totalitatea elementelor de memorare utilizate de sistem: bistabile individuale, registre, memorii etc. Concret, registrul AC își schimba starea prin atribuirea blocantă:

#1 AC <= DM;

Fazele de decodificare (decode)și execuție (execute) ale instrucțiunii ÎNCARCĂ în AC, care are codul de operație în binar 0001 plasat în primii 4 biți din RI, se prezintă după cum urmează:

// codul Verilog pentru fazele decodifică și execută // ale instrucțiunii ÎNCARCĂ în AC

#1 if (RI[31:28] == 4’b0001) begin

#1 AM <= RI[12:0]; // ultimii 13 biți sunt biți de

//adresa

#1 DM <= Mem[AM]; // citește din memorie

#1 AC <= DM;

end

Derularea fazelor de citire, decodificare și execuție ale instrucțiunii ÎNCARCĂ în AC, în condițiile întârzierii comenzii, conduce la o performanță redusă (timp mare de derulare a instrucțiunii). Astfel, instrucțiunea în cauză se va derula pe durata a 8 perioade de ceas, dacă întârzierea de o unitate de timp (#1) de simulare va fi asimilata cu o perioadă de ceas. Se pot face modificări în codul Verilog de mai sus, pentru a obține o performanță superioară.

2.2.2.2.3. Realizarea codului Verilog în circuitele logice numerice

Scopul urmărit este acela de a arăta ca subsetul de cod Verilog ales poate fi utilizat pentru realizarea circuitelor logice numerice. Această operație, în prezent, se efectuează automat în sistemele de proiectare asistată de calculator; de exemplu, pentru proiectarea microprocesoarelor moderne.

Un registru reprezintă o serie de bistabile. În cazul de față se vor considera patru bistabile de tip D, controlate pe frontul posterior/căzător al semnalului de ceas.

module DedgeFF (Q, Ck, D); output D;

reg D; input Ck, D; initial

Q = 0;

always

@(negedge Ck) Q = D; endmodule

Se specifică următoarea organizare de bistabile D:

Figura 21. Registrul A format din patru bistabile D

Un calcul elementar consta într-un transfer între registre. Mai jos se descriu două calcule elementare și declarația asociată lor:

reg [0:3] A, B;

#1 A <= 4’b1010; // Fortează 1010 în registrul A

#1 B <= A;

Cel de-al doilea transfer are următoarea realizare fizică:

Figura 22. Realizarea fizică a transferului: B<= A

Transferul are loc atunci când semnalul de comandă SCN este 1 și semnalul de ceas Ck trece din 1 în 0. Descrierea Verilog simulează această situație printr-o atribuire blocantă (<=), care întârzie schimbarea valorii lui B până la sfârșitul unității curente de timp de simulare.

Semnalul de comandă este furnizat de către unitatea de comandă, care asigură înlănțuirea într-o secvență a transferurilor implicate într-un calcul dat. Oricare sistem numeric poseda două unități: unitatea de execuție și unitatea de comandă.

Figura 23. Un sistem numeric este constituit din Unitatea de Execuție și Unitatea de Comandă

Unitatea de comandă va fi proiectată mai târziu. În mod curent transferurile se efectuează de la mai multe registre surse la un registru destinație. Se consideră următoarele transferuri între registre, dintr-o secvență oarecare de transferuri:

reg [0:3] A, B, X;

A <= B // transfer activat de către semnalul de tip nivel

//SCN1

A <= X // transfer activat de către semnalul de tip nivel

//SCN2

Unitatea de execuție pentru cele două transferuri este dată mai jos:

Figura 24. Unitatea de execuție pentru A <= B și A <= X

Pentru a forța în mod corect datele în registrul A sunt necesare blocuri de circuite AND, la ieșirile registrelor-argumente și un bloc de circuite OR la intrarea registrului destinație. În cazul mai multor destinații, datele pot fi transferate pe cai directe de la surse către destinații. Transferurile se pot face simultan între surse și destinații, dacă calculul dat impune asemenea operații. Costul unei asemenea soluții crește, datorită necesității prezenței a câte unui bloc de porți AND la intrarea fiecărui registru destinație. În comparație cu o soluție de tip magistrala, soluția bazată pe transferuri directe, deși mai rapidă, este mai costisitoare

În continuare se consideră un alt exemplu:

reg [0:3] A, B, X;

A <= X | ~B // | este OR la nivel de bit

// ~ este NOT (complement) la nivel de bit

Figura 25. Unitatea de execuție pentru A <= X | ~B

Se poate observa utilizarea ieșirilor NOT Q ale bistabilelor B. De asemenea, se evidențiază marcarea semnalului de comandă cu un șir de caractere care descriu transferal: A <= X | ~B.

În continuare se prezintă implementarea transferului circular: A <= {A[3], A[0:2]};

Parantezele { } și virgulă specifică concatenarea șirurilor de biți în Verilog.

Figura 26. Unitatea de execuție pentru deplasarea circulară dreaptă a conținutului registrului A

Pentru a putea implementa operațiile de prelucrare a datelor trebuie ca acestea să fie reduse la operatiilogice AND, OR, NOT. De exemplu: operatorul “+” trebuie implementat cu SUMATORUL (SUM), operația + 1 va fi realizată cu INCREMENTATORUL (INC), iar operația -1 va fi asigurată de către DECREMENTATORUL (DEC).

Operația elementară: #1 CP <= CP + 1; va fi rescrisa astfel: #1 CP <= INC(CP);

Este necesar să se proiecteze circuite combinaționale pentru operatorul de comparație “= =”. De exemplu, #1 if (RI[0:3] == 4’b1010) begin va fi înlocuită cu: #1 if (EQUAL(RI[0:3], 4’b1010)) begin

Proiectarea funcțiilor logice combinaționale INC, DEC, EQUAL and GREATER va fi lăsată ca exercițiu pentru cititor.

Unul dintre avantajele limbajului Verilog este acela că proiectantul nu trebuie să reducă fiecare operator la funcții logice combinaționale (nivelul structural). În partea inițială a proiectului se pot folosi operatorii specifici nivelului comportamental, ex. +, = = , > etc. Verilog oferă o strategie incrementală, deosebit de importantă pentru aprofundarea limbajului.

Este important de menționat modul în care este simulată memoria. Citirea instrucțiunii din memorie, presupune o memorie sincronă, care poate fi citită într-o perioadă de ceas, ceea ce nu se întâmplă în realitate.

2.2.2.2.4. Proiectarea unității de comandă

Unitatea de comandă furnizează semnalele de control pentru secventierea corectă a operațiilor elementare, care formează un calcul. Un sistem numeric poate avea mai multe unități de comandă.

Unitățile de comandă ale sistemelor numerice se plasează în două categorii: cablate și microprogramate. În cele ce urmează vor fi studiate unitățile de comandă cablate. Fie următoarea secvență Verilog:

initial begin

#1 A <= B; // 1

#1 C <= D; // 2

#1 A <= ~B;// 3

end

Pentru implementarea acestei secvențe, în condițiile în care un transfer necesita o perioadă de ceas, este necesar ca unitatea de comandă să plaseze pe liniile de comandă 1, 2, 3, care activează transferurile din secvența, semnale de comandă de tip nivel (SCNi), cu durata unei perioade de ceas: SCN1, SCN2, SCN3.

Unitatea de comandă folosește semnaiul de ieșire de la un generator de impuls singular, cu durata unei perioade de ceas.

Figura 27. Diagrama de timp (Cronograma) pentru semnalele de pe liniile de comandă

Semnalele de comandă de tip nivel SCNi (i = 1, 2, 3) sunt întârziate cu câte o perioadă de ceas. Circuitul care asigură întârzierea cu o perioadă de ceas este bistabilul de tip D cu comanda pe frontul căzător al semnalului de ceas.

Figura 28. Unitatea de comandă cablată

În continuare se prezintă o secvență de comandă cu o construcție always în loc de inițial. Construcția always este, din punct de vedere semantic, identică cu inițial, cu excepția că ea repeta la infinit secvența de control.

always begin

#1 A <= B; // 1

#1 C <= D; // 2

#1 A <= ~B;// 3

end

Unitatea de comandă este prezentată mai jos. S-a aplicat regula 3 și s-a introdus o poartă SAU pe intrarea de date a primului bistabil. Operarea acestei unități de comandă consta în parcurgerea ei, la infinit, de către un impuls.

Figura 29. Unitatea de comandă cablată pentru o construcție always

Verilog este un limbaj de programare structurat, ca și limbajele Pascal și C. Controlul este asigurat prin construcțiile while, if-then-else și nu prin instrucțiunea goto.

De exemplu, mai jos se prezintă un ciclu while:

while (s) begin

#1 A <= B; // 1

#1 C <= D; // 2

#1 A <= ~B;// 3

end

unde s este o expresie logică, cu rezultat 1 sau 0. Se presupune că ciclul while aparține unei secvențe de comandă mai mări dintr-o construcție initial sau always, ceea ce impune specificarea lui în și ouț pentru impulsul de comandă.

Trebuie menționat faptul că înaintea lui while ar putea fi necesar #1 dacă valoarea s este condiționată de rezultate recent obținute (dependente de date).

Dacă există o construcție condițională, de exemplu while sau if, se transmite un impuls de comandă pe una din direcții depinzând de porțile AND, care ca intrări s și ~s.

Figura 30. O secțiune a unității de control cablate pentru o construcție while

Figura 31. O secțiune a unității de comandă cablate pentru o construcție if

Pentru a veni în sprijinul proiectantului Verilog mai are construcțiile case, for și repeat. Implementarea lor în hardware este simplă deoarece case poate fi transformată în if, iar for și repeat pot fi transformate în while.

O altă construcție importantă de comandă din Verilog este fork-join. Construcția fork- join introduce concurența în secvența de comandă, adică fire multiple de comandă. Se reamintește că, construcțiile inițial și always sunt realizate concurent. Construcția fork-join reprezintă concurenta în cadrul unei singure construcții inițial sau always.

fork

#1 A <= B;

#1 Q <= P;

#1 C <= D;

join

Construcția fork transmite semnale de comandă pe n căi, câte una pentru fiecare instrucțiune internă sau construcții begin-end.

Figura 33. O secțiune a unității de comandă cablate pentru o construcție fork, cu 3 ieșiri

Construcția join sincronizează semnalul de comandă după sosirea tuturor semnalelor de comandă de pe cele n căi. În acest scop se utilizează un circuit special.

Figura 34. O secțiune a unității de comandă cablate pentru o construcție join cu 3 intrări

2.2.2.2.5. Creșterea vitezei de operare

Mărirea performanței unui sistem numeric se poate realiza prin efectuarea mai multor transferuri între registre simultan, în cazul în care nu există: interferențe între registre, dependente de date și algoritmul implementat permite acest lucru.

Fie următoarele transferuri în secvență:

#1 A <= B; // 1

#1 C <= D; // 2

Se poate elimina cea de-a doua întârziere #1, efectuând ambele transferuri în aceeași perioadă de ceas:

#1 A <= B; C <= D;

În unitatea de comandă se va elimina, de asemenea, cel de-al doilea bistabil D, activând ambele transferuri cu același semnal de tip nivel SCN1, produs ce către primul bistabil. Secvența de mai jos nu permite efectuarea celor două transferuri din secvența simultan, deoarece atribuirea blocantă din primul transfer va modifica conținutul lui AM la sfârșitul unității de timp de simulare, iar cel de-al doilea transfer va utiliza valoarea anterioară a lui AM.

#1 AM <= CP;

#1 DM <= Mem[AM];

Transferurile simultane de mai jos sunt însă posibile, deoarece ambele folosesc vechea valoare a lui CP:

#1 AM <= CP; CP <= CP + 1;

O atenție deosebită trebuie acordată expresiilor logice din construcțiile while și if întrucât ar putea apărea dependente de date, ca în exemplul de mai jos:

#1 RI <= DM;

if (RI[0:2] == 3’b100) begin

Instrucțiunea if compara vechea valoare din RI și nu valoarea atribuită în linia anterioară. În consecință trebuie introdusă o întârziere #1 pentru construcția if.

De regulă, se scrie codul Verilog introducând întârzieri #1. După efectuarea testărilor se va încerca eliminarea întârzierilor, verificând corectitudinea operării sistemului proiectat.

2.2.3. Fluxul de proiectare

Pentru proiectarea sistemelor digitale utilizând circuite programabile, cum sunt circuitele FPGA și CPLD, se utilizează pachete de programe de proiectare asistată de calculator (CAD – Coputer Aided Design). Aceste pachete de programe asistă proiectantul în toate etapele procesului de proiectare. Astfel, majoritatea pachetelor CAD pentru circuitele programabile asigură următoarele funcții principale: specificarea (descrierea) sistemului digital; sinteza descrierii, deci transformarea acesteia într-o listă de conexiuni conținând porți elementare și interconexiunile dintre ele; simularea funcționării sistemului pe baza listei de conexiuni obținute, înainte de implementarea într-un anumit circuit; implementarea sistemului într-un circuit prin adaptarea listei de conexiuni pentru a se utiliza în mod eficient resursele disponibile ale circuitului; configurarea (programarea) circuitului pentru ca acesta să realizeze funcția dorită.

Figura 35. Fluxul de proiectare a sistemelor digitale utilizând circuite programabile

Figura 35 ilustrează etapele din cadrul procesului de proiectare a sistemelor digitale utilizând circuite programabile.

2.2.4. Principalele etape de proiectare

Există mai multe metode pentru descrierea sistemelor digitale. În figura 35 sunt indicate principalele metode: prin scheme logice, prin limbaje de descriere hardware (HDL – Hardware Description Language) și prin diagrame de stare.

2.2.4.1. Descrierea sistemului

În mod tradițional, sistemele digitale sunt descrise prin scheme logice. Pentru aceasta se utilizează un editor schematic, care permite specificarea componentelor care trebuie utilizate și a modului în care acestea trebuie interconectate. Această metodă este cea care va fi utilizată în primul rând în lucrările următoare și este ilustrată în Figura 35. Circuitul din această figură detectează secvența binară 1010 aplicată la intrarea X. La detectarea acestei secvențe, ieșirea Z va fi setată la 1 logic.

Există următoarele etape principale la utilizarea schemelor logice pentru proiectarea unui sistem digital:

În cadrul unui editor schematic se selectează componentele necesare dintr-o bibliotecă de componente. Asemenea componente pot fi, de exemplu, porți elementare, multiplexoare, decodificatoare, numărătoare, circuite aritmetice etc. În funcție de circuitul care va utilizat, proiectantul trebuie să selecteze o anumită bibliotecă de componente, deoarece există biblioteci care sunt specifice diferiților producători de circuite programabile și diferitelor familii de circuite. Circuitele dintr-o anumită familie diferă prin capacitatea lor, viteza și capsula utilizată. În această etapă, nu este însă necesară specificarea exactă a circuitului care va utilizat dintr-o anumită familie.

Componentele selectate și plasate în cadrul schemei sunt interconectate prin fire de legătură. Proiectantul realizează interconectarea componentelor pentru a obține configurația necesară pentru o anumită aplicație.

Se adaugă și se etichetează porturile de I/E. Aceste porturi definesc intrările și ieșirile sistemului, permițând aplicarea semnalelor la pinii de intrare ai sistemului digital și preluarea semnalelor de ieșire generate de sistem la pinii de ieșire. Semnalele de intrare sunt aplicate la intrările sistemului digital prin intermediul unor buffere de intrare, iar semnalele de ieșire sunt preluate de la sistemul digital prin intermediul unor buffere de ieșire. Aceste buffere izolează sistemul digital față de exterior. În unele cazuri, bufferele de I/E sunt adăugate în mod automat de sistemul CAD.

Figura 36. Etapele descrierii unui sistem digital utilizând scheme: (1) Selectarea și amplasarea componentelor; (2) Conectarea componentelor; (3) Adăugarea porturilor de I/E.

2.2.4.2. Sinteza sistemului

După descrierea sistemului digital, etapa următoare din cadrul procesului de proiectare este cea de sinteză a sistemului. Sinteza constă în translatarea schemei logice, a descrierii HDL sau a diagramei de stare într-o listă de conexiuni. Această translatare se realizează cu ajutorul unui program de sinteză din cadrul sistemului CAD. Lista de conexiuni (netlist) este o descriere compactă a sistemului digital sub formă textuală, în care sunt specificate componentele sistemului, interconexiunile dintre acestea și pinii de intrare/ieșire. Această listă este prelucrată de celelalte componente ale sistemului CAD pentru realizarea etapelor următoare din cadrul procesului de proiectare. Există diferite formate pentru listele de conexiuni, cel mai utilizat fiind formatul EDIF (Electronic Digital Interchange Format), acesta reprezentând un standard industrial. Pe lângă acest format standard, se pot utiliza diferite formate care sunt specifice anumitor producători de circuite.

Figura 37. Relația dintre schema logică și lista de conexiuni

Un exemplu este formatul XNF (Xilinx Netlist Format), care este formatul propriu al firmei Xilinx, cel mai important producător de circuite programabile de tip FPGA și CPLD. O altă posibilitate este utilizarea unui limbaj de descriere hardware ca format pentru lista de conexiuni. De exemplu, sistemul CAD poate utiliza o reprezentare structurală a sistemului proiectat într-un limbaj de descriere hardware specificat de proiectant.

În prima parte a listei de conexiuni sunt declarate componentele din cadrul schemei, iar în a doua parte sunt specificate conexiunile dintre componente. Denumirile componentelor sunt G1..G7, iar denumirile conexiunilor sunt N1..N10. Aceste denumiri sunt fie cele specificate de proiectant, fie cele asignate în mod automat de sistemul CAD.

În circuitul ilustrat există două inversoare (G1 și G2), două porți ȘI cu două intrări (G3 și G4), o poartă ȘI cu patru intrări (G7) și două bistabile JK (G5 și G6). Inversoarele au un pin de intrare IN, un pin de ieșire OUT, un pin de alimentare Vcc și un pin de masă GND. Similar, porțile ȘI cu două intrări au doi pini de intrare IN1 și IN2, un pin de ieșire OUT, un pin de alimentare și un pin de masă. Bistabilele au doi pini pentru intrările de date J și K, un pin pentru intrarea de ceas C și un pin pentru ieșirea Q, pe lângă pinii de alimentare și masă. Pentru simplitate, pinii și semnalele de alimentare și masă au fost omiși în această figură. O conexiune este indicată prin listarea tuturor pinilor care sunt conectați împreună. Semnalele de intrare X și CLK sunt conectate la pinii de intrare cu aceleași nume ai circuitului, iar semnalul de ieșire Z este conectat la pinul de ieșire al circuitului.

Proiectantul poate specifica diferite criterii de optimizare de care să se țină cont în procesul de sinteză. Exemple de asemenea opțiuni sunt: minimizarea numărul de porți elementare necesare, obținerea vitezei maxime de funcționare a circuitului, minimizarea puterii consumate. Proiectantul poate experimenta cu diferite criterii de optimizare pentru a obține soluția cea mai convenabilă pentru aplicația respectivă.

2.2.4.3. Simularea funcțională

În această etapă se utilizează un program simulator pentru verificarea funcționării sistemului proiectat, înainte de implementarea acestuia într-un circuit programabil. Această verificare se referă doar la aspectele funcționale ale sistemului, fără a se lua în considerare întârzierile semnalelor, care vor fi cunoscute numai după implementare. Pentru verificarea funcțională proiectantul furnizează simulatorului mai multe combinații ale valorilor semnalelor de intrare, o asemenea combinație fiind numită vector de test. De asemenea, proiectantul poate specifica valorile semnalelor de ieșire care trebuie generate de sistem pentru fiecare vector de test.

Simulatorul aplică pe rând câte un vector de test la intrările sistemului, determină semnalele de ieșire care sunt generate de sistem și le compară cu valorile acestor semnale care au fost specificate de proiectant. În cazul în care apar diferențe, simulatorul afișează mesaje care indică diferențele apărute.

Proiectantul va efectua modificările necesare ale descrierii sistemului pentru a corecta erorile apărute, va efectua sinteza descrierii modificate și va executa din nou simularea funcțională. Aceste etape vor fi repetate până când sistemul va funcționa conform cerințelor. Figura 38 ilustrează modul în care pot fi vizualizate pe ecranul calculatorului semnalele de intrare și de ieșire ale circuitului detector de secvență utilizat ca exemplu în secțiunile precedente la simularea funcțională a circuitului.

Figura 38. Semnalele de intrare și de ieșire ale circuitului vizualizate la simularea funcțională a circuitului.

2.2.4.4. Maparea tehnologică

Etapele următoare din cadrul procesului de sinteză realizează implementarea sistemului proiectat într-un circuit programabil (FPGA sau CPLD). Prima etapă din cadrul implementării este cea de mapare tehnologică. Această etapă constă dintr-o serie de operații care realizează prelucrarea listei de conexiuni și adaptarea acesteia la particularitățile și resursele disponibile ale circuitului utilizat pentru implementare. Operațiile executate în această etapă diferă în funcție de sistemul de proiectare. Cele mai obișnuite operații sunt: adaptarea la elementele fizice ale circuitului, optimizarea și verificarea regulilor de proiectare (de exemplu, testarea depășirii numărului pinilor de I/E disponibili în cadrul circuitului). În timpul acesteia etape, proiectantul selectează tipul circuitului programabil care va fi utilizat, capsula circuitului integrat, viteza și alte opțiuni specifice circuitului respectiv.

În urma execuției operațiilor din etapa de mapare tehnologică se generează un raport detaliat al rezultatelor tuturor programelor executate. Pe lângă mesaje de eroare și de avertizare, se crează de obicei o listă cu resursele utilizate din cadrul circuitului.

Figura 39 ilustrează etapa de mapare tehnologică pentru circuitul utilizat ca exemplu. După cum se observă, schema circuitului a fost modificată pentru a utiliza bistabile D în locul bistabilelor JK, iar porțile ȘI au fost înlocuite cu porți ȘI-NU. Se menționează că aceste transformări sunt efectuate asupra listei de conexiuni care s-a obținut în urma etapei de sinteză, schema din Figura 39 fiind doar ilustrativă.

Figura 39. Ilustrarea etapei de mapare tehnologică

2.2.4.5. Plasarea și rutarea

Aceste operații sunt executate în cazul utilizării unui circuit FPGA pentru implementare. Pentru proiectarea cu circuite CPLD, operația echivalentă este numită adaptare (fitting). Plasarea este procesul de selectare a unor module sau blocuri logice ale circuitului programabil care vor fi utilizate pentru implementarea diferitelor funcții ale sistemului digital. Rutarea constă în interconectarea acestor blocuri logice utilizând resursele de rutare disponibile ale circuitului.

Majoritatea sistemelor CAD realizează operațiile de plasare și rutare în mod automat, astfel încât utilizatorul nu trebuie să cunoască detaliile arhitecturii circuitului utilizat pentru implementare. Anumite sisteme permit utilizatorilor experți plasarea și rutarea manuală a unor porțiuni critice ale sistemului digital pentru a obține performanțe superioare.

Figura 40 ilustrează plasarea și rutarea circuitului rezultat în urma mapării tehnologice a circuitului utilizat ca exemplu. După selectarea blocurilor logice care vor fi utilizate pentru implementarea circuitului, acestea se configurează pentru implementarea unor porțiuni ale schemei. Pentru interconectarea semnalelor generate de diferitele blocuri logice se utilizează resursele de rutare disponibile.

Figura 40. Ilustrarea etapelor de plasare și rutare

Aceste resurse sunt indicate în figură prin linii orizontale și verticale. Intrările și ieșirile utilizate ale blocurilor logice se conectează la liniile de rutare prin puncte de conexiune programabile (indicate în figură prin cercuri), iar liniile de rutare sunt interconectate cu ajutorul unor comutatoare programabile.

Operațiile de plasare și rutare pot necesita un timp ridicat pentru execuție în cazul sistemelor digitale complexe, deoarece sunt necesare operații complexe pentru determinarea și configurarea blocurilor logice necesare din cadrul circuitului programabil, interconectarea corectă a acestora și verificarea faptului că sunt asigurate cerințele de performanță specificate în timpul proiectării.

2.2.4.6. Analiza de timp

Pachetele de programe CAD pentru proiectarea sistemelor digitale conțin de obicei un program numit analizor de timp, care poate furniza informații despre întârzierile semnalelor. Aceste informații se referă atât la întârzierile introduse de blocurile logice, cât și la întârzierile datorate interconexiunilor. Analizorul poate afișa aceste informații în diferite moduri, de exemplu, prin ordonarea conexiunilor în ordinea descrescătoare a întârzierilor semnalelor. Proiectantul poate utiliza informațiile despre întârzierile semnalelor pentru a realiza o nouă simulare a sistemului, în care să se țină cont de aceste întârzieri. Această operație prin care se furnizează simulatorului informații detaliate despre întârzierile semnalelor se numește adnotare inversă (back-annotation).

2.2.4.7. Configurarea sau programarea circuitului

Operația de configurare se referă la circuitele programabile bazate pe memorii volatile SRAM (Static Random Access Memory) și constă din încărcarea informațiilor de configurare în memoria circuitului. Operația de programare se referă la circuitele programabile bazate pe memorii nevolatile (cum sunt circuitele care conțin antifuzibile). Această operație se execută similar cu cea de configurare, dar informațiile de configurare sunt păstrate și după întreruperea tensiunii de alimentare.

La sfârșitul operațiilor de plasare și rutare, se generează un fișier care conține toate informațiile necesare pentru configurarea circuitului. Aceste informații se referă atât la configurarea blocurilor logice ale circuitului, cât și la specificarea interconexiunilor dintre blocurile logice. Fișierul în care se înscriu aceste informații conține, în principiu, un șir de biți (bitstream), fiecare bit indicând starea închisă sau deschisă a unui comutator. Circuitele programabile conțin un număr mare de asemenea comutatoare, un comutator fiind realizat sub forma unui tranzistor sau a unei celule de memorie. Un bit de 1 din șirul de biți va determina închiderea unui comutator și, deci, stabilirea unei conexiuni. Biții din acest fișier de configurare sunt aranjați într-un anumit format pentru a realiza o corespondență între un bit și comutatorul corespunzător.

Conținutul fișierului de configurare se transferă la circuitul programabil, aflat de obicei pe o placă de circuit imprimat împreună cu alte circuite. Comutatoarele circuitului se închid sau rămân deschise în funcție de valorile biților din șirul de configurare. După terminarea configurării, circuitul va funcționa conform descrierii sistemului digital care a fost implementat.

Din cauza memoriei volatile, circuitul trebuie configurat din nou după fiecare întrerupere a tensiunii de alimentare. Informațiile de configurare pot fi păstrate într-o memorie nevolatilă PROM (Programmable Read Only Memory), existând posibilitatea configurării automate a circuitului din această memorie nevolatilă la aplicarea tensiunii de alimentare.

Configurarea sau programarea se pot realiza utilizând interfața paralelă a calculatorului. Pentru aceasta, este necesar ca placa cu circuitul programabil să conțină un conector pentru interfața paralelă, pentru transfer utilizându-se un cablu paralel. Figura 41 ilustrează un cablu paralel obișnuit, care conține conectori cu 25 de contacte DB25.

Figura 41. Cablu paralel care poate fi utilizat pentru configurarea circuitelor programabile.

2.2.4.8. Depanarea sistemului

În această ultimă etapă a procesului de proiectare se verifică funcționarea sistemului digital proiectat în condiții reale. O funcționare necorespunzătoare se poate datora nerespectării specificațiilor de proiectare, a specificațiilor circuitului utilizat pentru implementare, a unor aspecte legate de întârzierea semnalelor etc. Depanarea poate fi simplificată dacă circuitul se configurează astfel încât să conțină unele module speciale care permit citirea valorii unor semnale în timpul funcționării și transferul acestor informații la calculator, utilizând un cablu JTAG și un program special pentru vizualizarea semnalelor dorite

CAPITOLUL 3

PROIECTAREA APLICAȚIEI

3.1. Formularea problemei

BIBLIOGRAFIE

Ahmed, H. M., J. M. Delosme, M. Morf, “Highly Concurrent Computing Structure for Matrix Arithmetic and Signal Processing”, IEEE Comput. Mag., vol. 15, 1982, pp. 65-82.

Andraka, R. J., “Building a High Performance Bit-Serial Processor in an FPGA”, Proc. of Design SuperCon '96, January 1996, pp. 5.1-5.21.

Borza P., C. Gerigan, P. Ogrutan, Gh. Toacse, Microcontrollere, Aplicații, Ed. Tehnică, București, 2000.

Brayton, R. K., Logic Synthesis, EE219B, EECS Dept. UC Berkeley, 1998.

Brayton, R. K., et al., “A System for Sequential Circuit Synthesis”, Electronic Research Laboratory, Memorandum No. UCB/ERL M92/41, University of California, Berkeley, CA 94720, 4 May 1992.

Constantinescu, Rodica, Curs microcontrollere, Universitatea Politehnică București, Facultatea de Electronică, Telecomunicații și Tehnologia Informației, 2012.

Demicheli, G., “Symbolic Sesign of Combinational and Sequential Logic Circuits Implemented by Two-Level Logic Macros”, IEEE Transactions on Computer Aided Design, October 1986.

Demicheli, G., Synthesis and Optimization of Digital Circuits, Stanford University, McGraw-Hill, 1994.

Florescu, A., “Switching Power Supply with Monoloithic Switching Regulator Subsystems and DC-DC Step-Up Converter – Part A: Description of Switching Regulator Subsystemes and Mathematical Theory of DC-DC Step-Up Converter Controller by Them”, Proceedings of 4th International Symposium “Advanced Topics in Electrical Engineering”, November 25-26, 2004, pp. 249-255.

Geppert, L., “Design Tools for Analog and Digital Integrated Circuits”, IEEE Spectrum, April 1999.

Geppert, L., “Electronic Design Automation”, IEEE Spectrum, Ianuary 2001.

Heath, Steve, Embedded Systems Design, 2nd Edition, Newnes, 2003.

Hoza, F., D. Gâlea, Structura calculatoarelor numerice, vol. 2, Ed. Tehnopres, 2001.

Jozwiak, L., A. Chojnacki, “Application of Information Relationship Measures to Logic Synthesis”, Proc. CSSP98 – 9th Annual Workshop on Circuits, Systems and Signal Processing, Mierlo, The Netherlands, November 1998.

Knapp, David W., “Behavioral Synthesis, Digital System Design Using the Synopsys Behavioral Compiler”, Prentice Hall PTR, 1996.

Kurup, Pran, Taher Abbasi, Logic Synthesis Using Synopsys, second edition, Kluwer, 1997.

Lin, B., Synthesis of VLSI Designs with Symbolic Techniques, PhD. Thesis, University of California, Berkeley, November 1991.

Mostapha Abouldhavid, E., VHDL Design Flow – Behavioral and Logic Synthesis, IRO, 1997.

Oros, H., Suport de curs pentru disciplina „Arhitectura Sistemelor de Calcul”, Universitatea din Oradea, Facultatea de Științe, 2009.

Pătrașcu, Constantin, Arhitectura calculatoarelor de proces, Universitatea din Craiova, Facultatea de Automatică, Calculatoare și Electronică.

Pedram, M., Y. T. Lai, S. B. K. Vrudhula, “BDD Based Decomposition of Logic Functions with Application to FPGA Synthesis”, 30th ACM/IEEE Design Automation Conference, 1993.

Pranav, A., Synthesis of Sequential Circuits for VLSI Design, PhD. Thesis, University of California, Berkeley, 1992.

Prather, D. W., “Electronic Design Automation Tools Made Coherent”, IEEE Spectrum, April 1999.

Pruteanu, C., D. Gâlea, C. G. Haba, “An Extrinsic Evolvable Hardware Approach to Logic Synthesis Optimization”, Proceedings on The 8th International Conference on Development and Application Systems (DAS 2006), 25-27 May 2006, pp. 277-280.

Rădescu, R., Arhitectura sistemelor de calcul, colecția Electronică Aplicată, Ed. Politehnica Press, 2012.

Valachi, A., F. Hoza, V. Onofrei, R. Silion, Analiza, sinteza și testarea dispozitivelor numerice, Ed. Nord-Est, 1993.

Villa, T., Encoding Problems in Logic Synthesis, PhD. Thesis, University of California, Berkeley, May 19.

Vintan, L., A. Florea, Advanced Microarchitectures, Tehnical Publishing House, București, 2000.

Volder, J., “Binary Computation Algorithms for Coordinate Rotation and Function Generation”, Convair Report IAR-1 148 Aeroelectrics Group, June 1956.

Walther, J. S., “An Unified Algorithm for Elementary Functions”, Proc. of the Spring Joint Computer Conf., 1971, pp. 379-385.

Wilmshurst, Tim, Designing Embedded Systems with PIC Microcontrollers, second edition, Newnes, 2009.

BIBLIOGRAFIE

Ahmed, H. M., J. M. Delosme, M. Morf, “Highly Concurrent Computing Structure for Matrix Arithmetic and Signal Processing”, IEEE Comput. Mag., vol. 15, 1982, pp. 65-82.

Andraka, R. J., “Building a High Performance Bit-Serial Processor in an FPGA”, Proc. of Design SuperCon '96, January 1996, pp. 5.1-5.21.

Borza P., C. Gerigan, P. Ogrutan, Gh. Toacse, Microcontrollere, Aplicații, Ed. Tehnică, București, 2000.

Brayton, R. K., Logic Synthesis, EE219B, EECS Dept. UC Berkeley, 1998.

Brayton, R. K., et al., “A System for Sequential Circuit Synthesis”, Electronic Research Laboratory, Memorandum No. UCB/ERL M92/41, University of California, Berkeley, CA 94720, 4 May 1992.

Constantinescu, Rodica, Curs microcontrollere, Universitatea Politehnică București, Facultatea de Electronică, Telecomunicații și Tehnologia Informației, 2012.

Demicheli, G., “Symbolic Sesign of Combinational and Sequential Logic Circuits Implemented by Two-Level Logic Macros”, IEEE Transactions on Computer Aided Design, October 1986.

Demicheli, G., Synthesis and Optimization of Digital Circuits, Stanford University, McGraw-Hill, 1994.

Florescu, A., “Switching Power Supply with Monoloithic Switching Regulator Subsystems and DC-DC Step-Up Converter – Part A: Description of Switching Regulator Subsystemes and Mathematical Theory of DC-DC Step-Up Converter Controller by Them”, Proceedings of 4th International Symposium “Advanced Topics in Electrical Engineering”, November 25-26, 2004, pp. 249-255.

Geppert, L., “Design Tools for Analog and Digital Integrated Circuits”, IEEE Spectrum, April 1999.

Geppert, L., “Electronic Design Automation”, IEEE Spectrum, Ianuary 2001.

Heath, Steve, Embedded Systems Design, 2nd Edition, Newnes, 2003.

Hoza, F., D. Gâlea, Structura calculatoarelor numerice, vol. 2, Ed. Tehnopres, 2001.

Jozwiak, L., A. Chojnacki, “Application of Information Relationship Measures to Logic Synthesis”, Proc. CSSP98 – 9th Annual Workshop on Circuits, Systems and Signal Processing, Mierlo, The Netherlands, November 1998.

Knapp, David W., “Behavioral Synthesis, Digital System Design Using the Synopsys Behavioral Compiler”, Prentice Hall PTR, 1996.

Kurup, Pran, Taher Abbasi, Logic Synthesis Using Synopsys, second edition, Kluwer, 1997.

Lin, B., Synthesis of VLSI Designs with Symbolic Techniques, PhD. Thesis, University of California, Berkeley, November 1991.

Mostapha Abouldhavid, E., VHDL Design Flow – Behavioral and Logic Synthesis, IRO, 1997.

Oros, H., Suport de curs pentru disciplina „Arhitectura Sistemelor de Calcul”, Universitatea din Oradea, Facultatea de Științe, 2009.

Pătrașcu, Constantin, Arhitectura calculatoarelor de proces, Universitatea din Craiova, Facultatea de Automatică, Calculatoare și Electronică.

Pedram, M., Y. T. Lai, S. B. K. Vrudhula, “BDD Based Decomposition of Logic Functions with Application to FPGA Synthesis”, 30th ACM/IEEE Design Automation Conference, 1993.

Pranav, A., Synthesis of Sequential Circuits for VLSI Design, PhD. Thesis, University of California, Berkeley, 1992.

Prather, D. W., “Electronic Design Automation Tools Made Coherent”, IEEE Spectrum, April 1999.

Pruteanu, C., D. Gâlea, C. G. Haba, “An Extrinsic Evolvable Hardware Approach to Logic Synthesis Optimization”, Proceedings on The 8th International Conference on Development and Application Systems (DAS 2006), 25-27 May 2006, pp. 277-280.

Rădescu, R., Arhitectura sistemelor de calcul, colecția Electronică Aplicată, Ed. Politehnica Press, 2012.

Valachi, A., F. Hoza, V. Onofrei, R. Silion, Analiza, sinteza și testarea dispozitivelor numerice, Ed. Nord-Est, 1993.

Villa, T., Encoding Problems in Logic Synthesis, PhD. Thesis, University of California, Berkeley, May 19.

Vintan, L., A. Florea, Advanced Microarchitectures, Tehnical Publishing House, București, 2000.

Volder, J., “Binary Computation Algorithms for Coordinate Rotation and Function Generation”, Convair Report IAR-1 148 Aeroelectrics Group, June 1956.

Walther, J. S., “An Unified Algorithm for Elementary Functions”, Proc. of the Spring Joint Computer Conf., 1971, pp. 379-385.

Wilmshurst, Tim, Designing Embedded Systems with PIC Microcontrollers, second edition, Newnes, 2009.

Similar Posts