Documente Academic
Documente Profesional
Documente Cultură
Introducere
1.1 Scurt istoric
Încă din cele mai vechi timpuri, omul a fost nevoit să efectueze calcule. Odată cu creşterea
complexităţii calculelor, s-au pus în evidenţă două deficienţe majore ale calculului manual:
- viteza de efectuare a calculelor, care este limitată, astfel anumite probleme nu pot fi
rezolvate într-un timp rezonabil;
- greşeala, care intervine iminent la calculele umane.
Putem compara pentru început procesul de calcul manual (a) şi cel al maşinii (b):
Creierul
Instrucþiuni
Control Hîrtia
Execuþie Date
a)
Calculator
de buzunar
Unitatea
centralã b)
de prelucrare
Unitatea Instrucþiuni
de control
Unitatea Echipamente
de memorie de intrare/ieºire
Unitatea
aritmeticã Date
ºi logicã
5
motoare la suportul piesei de gaurit
- Sistemul va genera comenzi folosind o placa Nexys 2. Semnalele de iesire vor fi amplificate cu
ajutorul unui circuit electronic, pe baza de tranzistori; placa Nexys trebuie să fie protejata de
supratensiuni, lucru la care va folosi de asemenea placa electronica pe baza de tranzistori
- În procesul de gaurit se va folosi un program care trebuie să fie într-o formă simplă şi
cuprinzătoare
Caracteristici
- Efectuarea de găuri într-o zona specificata
- Mişcări separate si concomitente pe direcţiile X şi Y
- Posibilitatea de a schimba dupa dorinta pozitiile in care masina sa dea gauri , obtinand aceasta
prin intermediul modificarii datelor din programul in Verilog.
Necesităţi Hardware
- Placa Nexys-2 FPGA
- 2 motoare pas
- 2 motoare de curent continuu
- switch-uri de limitare a miscarii suportului piesei de gaurit
- suport pentru piesa de gaurit în mişcare insotit cu sistem mecanic de poziţionare
Cerinte Software
- Digilent Software Xilinx ISE WebPack 10.1
Starea proiectului
Design-ul este complet şi îndeplineşte obiectivele sale. Desigur , acest proiect putea sa fie mult
mai extins, adica se putea realiza in cadrul lui mult mai multe functii cum ar fi :
- afisarea pozitiilor in care se dau gaurile prin intermediul afisorului LCD incorporat in placa
FPGA
- realizarea comenzii motoarelor DC tot cu ajutorul placii FPGA ; aceasta sarcina nu am reusit
inca sa o realizam din cauza ca noi am fost obligati sa folosim niste motoare destul de puternice
la sarcinile la care au fost folosite. Aceasta ar fi dus la folosirea unor punti Darlington pentru
amplificarea semnalui de la 3,5 volti si 300 de mA cat scoate placa FPGA si pana la o putere de
cel putin 60 de watti cat ar fi necesitat ; aceste punti ar fi fost necesar sa fie folosite in cascada
pentru a amplifica semnalul treptat , folosind tranzistori diferiti pentru fiecare treapta de
amplificare : mai intai BD-uri sau ULN2033 , apoi BC-uri , si apoi 2N3055 sau alt tip de
tranzistor puternic care sa permita amplificarea semnalului pana la cativa amperi si cateva zeci de
volti. Apoi ar mai fi trebuit sa folosim si punti H pentru a se putea inversa semnalul care trece
6
prin motoarele DC , cu scopul de a obtine inversarea sensului turatiei acestor motoare.
- Folosirea unor butoane plasate deasupra si dedesuptul suportului piesei de gaurit; aceste butoane
ar fi avut rol de a indica momentul in care suportul a fost ridicat suficient pentru a se fi efectuata
gaura , sau ca acest suport a fost coborat suficient pentru a se fi scos burghiul din gaura. Aceaste
butoane ar fi transmis un semnal placii FPGA ; in momentul in care placa ar fi primit un semnal
de la butonul de deasupra suportului piesei ( ceea ce inseamna ca suportul a atins pozitia
superioara si ca deci gaura a fost efectuata cu succes ) placa ar fi decis invesarea sensului de
invartire al motoului DC folosit la ridicarea/coborarea suportului , si deci ar fi provocat coborarea
suportului; in momentul in care suportul ar fi ajuns in pozitia cea mai de jos , atunci ar fi fost
emis un semnal de la butonul de jos , si astfel placa ar fi stiut exact momentul cand sa comande
pozitionarea suportului piesei la urmatoarele coordonate ( la coordodatele urmatoarei gauri de
efectuat )
- O alta optimizare a proiectului ar fi fost folosirea unui fisier separat de memorie , unde sa fie
scrise toate informatiile despre coordonatele gaurilor , despre directiile pe care trebuie sa le aiba
motoarele pas cu pas , dar si cele de curent continuu in fiecare moment al oparatiei de gaurire ; de
asemenea se putea scrie in acest fisier si o intructiune de sfarsit de program , astfel incat operatia
de gaurire sa inceteze intr-un moment dorit de utilizator , chiar daca in mod normal ar mai fi fost
inregistrate in memorie si efectuarea de alte gauri La fel , se putea scrie in memorie si o
intructiune care sa indice si adresa de start a citirii de informatii , astfel ca , la dorinta
utilizatorului sa nu fie necesar ca efectuarea gaurilor sa inceapa cu prima gaura inregistrata in
memorie , si sa se poata incepe operatie de gaurire de la o anumita gaura specificata Scopul
principal al proiectului a fost realizarea unui microprocesor pe 8 biţi. Microprocesorul pe 8 biţi
este foarte simplu, în primul rând utilizat pentru dispozitive Spartan-3E, dar şi pentru dispozitive
adecvate ca Virtex-II şi Virtex-IIPRO. Deşi ar putea fi utilizat pentru prelucrarea datelor, este, cel
mai probabil, folosit în aplicaţii care necesită un proces complex. Prin urmare, acesta are numele
de “maşină programabilă cu stări finite cu cod constant".
Această versiune de procesor a fost dezvoltată în continuare, cu un factor dominant -
Dimensiunea!
Rezultatul este un procesor care ocupă doar 100 Spartan-3E părţi, care este de doar 5% din
dispozitivul XC3S200 şi mai puţin de 0,3% din dispozitivul XC3S500. Împreună cu această
cantitate mică de logică, un singur bloc de memorie RAM este utilizată pentru a forma un stocaj
de date ROM pentru un program de până la 1024 instrucţiuni. Chiar şi cu astfel de constrângeri
7
de dimensiuni, performanţa este respectabilă la aproximativ 43 - 66 MIPS în funcţie de tip de
dispozitiv şi de gradul de viteză.
Una dintre cele mai interesante caracteristici ale procesorului este că acesta este încorporat în
totalitate în dispozitiv şi nu necesită sprijin extern. Simplul fapt că orice logică poate fi conectată
la modul în interiorul dispozitivului Spartan-3E sau Virtex-II înseamnă că orice facilităţi
suplimentare pot fi adăugate pentru a oferi flexibilitate finală. Nu este atât de important ceea ce
este în interiorul modulului care îl face util, dar mediul în care acesta funcţionează.
8
1.4 Structura lucrării
Pentru realizarea proiectului pe care ni l-am propus avem nevoie de două componente
principale : partea soft şi partea hardware. Pe partea de soft este vorba despre compilatorul ISE
WebPack care suportă limbaje de descriere hardware, în cazul nostru VHDL. Pe partea de hard
avem nevoie de o placă de dezvoltare Nexys 2 cu ajutorul căreia va fi construit microprocesorul.
Pentru a putea încărca pe placa de dezvoltare Nexys 2 microprocesorul construit în limbaj de
descriere hardware ne vom folosi de un program boot-loader de la firma Digilent numit Adept.
Pentru a înţelege funcţionarea microprocesorului trebuie efectuat un studiu amănunţit pe
domeniul de microprocesoare.
Pentru a putea vizualiza semnalele de intrare, ieşire şi interne ale microprocesorului ne vom
folosi de un program ModelSim oferit de firma Xilinx cu ajutorul căruia vom putea vedea în timp
real timpii de sincronizare şi funcţionare a sistemului nostru ca mai târziu să putem discuta
rezultatele obţinute şi perspective de viitor.
În capitolul Structuri logice programabile vom vorbi despre componentele fizice
reconfigurabile (FPGA) şi arhitectura microprocesorului ce urmează a fi construit. În capitolul al
treilea vom discuta despre partea de Proiectare şi Implementare, astfel vom învăţa să construim o
maşină cu stări finite scheme bloc, organigrame, diagrame de stare pe baza cărora va funcţiona
microprocesorul. În ultimul capitol Rezultate experimentale vom evidenţia principalele aspecte
legate de concluzii şi perspective.
9
2. Structuri logice programabile
2.1 FPGA
10
2.2 VHDL – scurt istoric
VHDL nu este un limbaj de programare, ci un limbaj de descriere a sistemelor hardware
pornind de la structura lor modulară pornind de la structura lor modulară şi de la interconexiunile
dintre acestea. El a fost definit şi integrat în rândul instrumentelor de CAD (Computer-Aided
Design) din domeniul electronicii, pentru a introduce o metodologie riguroasă de proiectare în
ciclul de dezvoltare al sistemelor hardware.
VHDL a devenit un limbaj standardizat, utilizat pentru descriere hardware de la nivelul
abstract până la nivelul concret. VHDL a fost rapid asimilat cu un mediu universal de
comunicaţie în proiectare. Toţi producătorii de staţii de lucru şi de software CAE (Computer-
Aided Engineering) îşi standardizează produsele pentru a avea intrări şi ieşiri standard VHDL.
Aceste produse includ software pentru simulare, sinteză şi cablaj imprimat.
Limbajul provine din programul VHSIC (Very Hight Speed Integrated Circuit) iniţiat de
Departamentul Apărării din S.U.A în 1980. În faţa importantei creşteri a complexităţii sistemelor
electronice şi mai ales a costurilor de întreţinere rezultante, s-a făcut simţită nevoia apariţiei unui
limbaj modern şi standardizat.
Ce este un limbaj de descriere hardware? Permite descrierea funcţionării componentelor unui
sistem hardware, precum şi a relaţiilor dintre aceste componente şi a legăturilor lor cu exteriorul.
VHDL conţine toate elementele de descriere algoritmică proprii limbajelor de programare. De
aceea este considerat drept un limbaj informatic sau drept un limbaj de informaticieni.
2.3 Nexys 2
Placa de dezvoltare Nexys 2 este o platformă completă de circuite dezvoltate, bazată pe pe un
procesor Xilinx Spartan 3E FPGA. Acest dispozitiv Spartan-3E este de fapt un procesor construit
de firma Xilinx, care se poate configura (programa) în funcţie de aplicaţia care se vrea a fi
construită. Porturile USB2 de mare viteză de pe placă, 16 Mb de RAM şi ROM, şi câteva
dispozitive de I/O, şi porturi care o fac ideală pentru sisteme digitale de tot felul, inclusiv pentru
sistemele cu procesor încorporat bazate pe Microblaze(Xilinx). Porturile USB2 conferă
alimentare şi o interfaţă programabilă, astfel încât placa Nexys 2 poate fi utilizată împreună cu un
computer pentru a crea o adevărată staţie portabilă de modele.
Nexys 2 aduce tehnologii de ultimă oră într-o platformă ce poate fi folosită de către oricine
pentru a căpăta experienţă în modele digitale. Poate susţine nenumărate sisteme digitale FPGA,
iar componentele se pot extinde cu uşurinţă dincolo de placă utilizând oricare sau toţi cei cinci
11
conectori de expansiune. Module periferice(Pmod) 4 conectori de 12-pin pot adopta până la opt
module periferice cu cost redus pentru a adăuga proprietăţi precum controlul datelor dintre
interfeţe, conversia A/D şi D/A, circuitele audio, şi interfeţe active. Toate semnalele accesibile de
pe placa Nexys 2 sunt ESD şi protejate împotriva scurt-circuitului, asigurând o viaţă lungă de
operare în orice mediu.
Placa Nexys 2 este în întregime compatibilă cu toate versiunile accesoriilor Xilinx ISE,
incluzând pachetul gratuit WebPack. Astfel oricine poate construi sisteme digitale reale cu preţ
redus. În figura 2.1 de mai jos este dată schema bloc cu componentele plăcii de dezvoltare Nexys
2 şi conectorii de mare viteză.
12
- rezerve eficiente de alimentare cu mod de comutare (bune pentru aplicaţii alimentate
pe baterii);
- oscilator de 50MHz plus legătura pentru cel de-al doilea oscilator.
- Intrări şi ieşiri în număr de 60, sunt conduse către conectori de expansiune (un
conector de mare viteză Hirose FX2 şi 4 capuri de 6-pin );
- 8 LED-uri, afişaj de 7 segmente şi 4 digiţi, 4 butoane, 8 întrerupătoare.
13
Fig. 1.2 Arhitectura microprocesorului(sursa Pong P.Chu FPGA Protoyiping By VHDL
Examples. „Cleveland Stat University”2008.)
Dimensiunea Programului
Microprocesorul susţine un program de până la o lungime de 1024 de instrucţiuni utilizând un
singur bloc de memorie. Cerinţele pentru program de spaţiu mai mare sunt, de obicei abordate
folosind mai multe microprocesoare fiecare asociat cu un bloc de memorie pentru a distribui
diferite sarcini de sistem. Programe care necesită în mod semnificativ mai multa memorie sunt în
mod normal domeniul unui procesor de date.
Regiştrii de uz general.
Există 16 regiştri de uz general de 8-biţi specificaţia ca ‘s0’ până la ‘sF’ care pot fi redenumiţi
în codul de asamblare. Toate operaţiile sunt complet flexibile cu privire la utilizarea de regiştrii
fără registre speciale rezervate pentru orice sarcini sau având prioritate faţă de orice alt registru.
Nu există nici un acumulator ca orice registru sa poată fi adoptat pentru această sarcină.
14
Unitatea Aritmetică şi logică
Unitatea Aritmetică şi Logică (ALU) oferă multe operaţii simple de aşteptat într-o unitate de
opt biţi de prelucrare. Toate operaţiile sunt efectuate utilizând un operand oferit de oricare
registru (SX). Rezultatul este întors în acelaşi registru. Pentru operaţiile care necesită un al doilea
operand, un al doilea registru poate fi specificat (Sy) sau poate fi furnizată o constantă cu o
valoare de opt biţi (kk).
Capacitatea de a specifica orice valoare constantă, cu nici o sancţiune suplimentară pentru
dimensiune sau performanţă a programului îmbunătăţeşte setul simplu de instrucţiuni şi anume
capacitatea “ADD 1”este la fel ca o dedicată operaţie INCREMENT. Adăugare (ADD) şi scădere
(SUB) au opţiunea de a include pavilionul de intrare (ADDCY şi SUBCY) pentru a sprijini
operaţiile de aritmetică ce necesită mai mult de 8-biţi.
LOAD, AND, OR şi XOR oferă operatorilor posibilitatea de a manipula şi a testa valori.
Comprehensiv grupul SHIFT şi ROTATE. Instrucţiunile COMPARE şi TEST permite
conţinutului registrului de a fi testat fără a modifica conţinutul lor şi de a determina
PARITATEA.
Program Control
Rezultatele operaţiilor ALU determină starea flag-urilor de ZERO şi CARRY. ZERO
flag este setat ori de câte ori rezultatul ALU a resetat toţi biţii ( 00 16 ). CARRY este setat atunci
când există o supraaglomerare de la o operaţie aritmetică. Este, de asemenea, folosit pentru a
captura biţi mutaţi dintr-un registru în timpul instrucţiuni de SHIFT si ROTATE. În timpul unei
instrucţiuni TEST, CARRY flag este folosit pentru a indica dacă bitul 8 rezultat temporar are
ODD PARITY.
Această stare de indicatori poate fi utilizată pentru a stabili succesiunea de execuţie a
programului, folosind programul de control al fluxului de control condiţionat şi fără condiţie.
Instrucţiunile JUMP sunt utilizate pentru a specifica adresele absolute (aaa) în cadrul spaţiului
programului. Instrucţiunile CALL şi RETURN furnizează subrutina de facilităţi pentru
frecventele utilizate secţiuni de cod. A CALL este făcut la o adresă absolută (aaa) şi un program
intern counter stack păstrează adresele asociate cerute de instrucţiunile RETURN . Stiva acceptă
până la 31 nivele imbricate de subrutine.
15
Reset-ul
Funcţia RESET repune procesorul în starea iniţială. Programul se va executa de la
adresa‘000’ si întreruperile şi vor fi dezactivate. Starea flagurilor şi CALL / RETURN vor fi, de
asemenea, resetate. Conţinutul registrului nu sunt afectate.
Memoria internă
Aceasta este o memorie internă de 64 byte de uz general. Conţinutul oricăror dintre cele 16
registre pot fi scrise pe unul din 64 locaţii, folosind instrucţiunea STORE. Instrucţiunea
complementară FETCH permite să fie scrise conţinuturile de la orice locaţii de memorie 64
pentru oricare din cele 16 registre. Acest lucru permite un mult mai mare număr de variabile, care
va avea loc în cadrul limitei de procesor şi tinde să rezerve toate spaţiile reale de I / O pentru
intrări şi ieşiri de semnale.
Întreruperea
Procesorul prevede un singur semnal de intrare INTERRUPT. Logica simplă poate fi folosită
pentru a combina mai multe semnale, dacă este necesar. Întreruperile sunt dezactivate, în mod
implicit, şi apoi sunt activate în conformitate cu programul de control. Un activ întrerupător
forţează microprocesorul pentru a iniţia CALL 3FF (un apel de subrutina la ultima locaţie de
memorie de program), de unde utilizatorul poate defini un vector potrivit la o întrerupere de
servicii de rutină (ISR). În acest moment, un puls este generat o ieşire de pe INTERRUPT_ACK,
de la ZERO şi CARRY flags sunt menţinute în mod automat, precum şi orice alte întreruperi
sunt dezactivate. Instrucţiunea RETURNI asigură faptul că la sfârşitul unui ISR se restabileşte
statutul de flags şi specifică dacă întreruperi viitoare vor fi activate sau dezactivate.
16
3. Proiectare şi implementare
Introducere
Microprocesorul este un miez de microcontroler compact pentru dispozitivele Xilinx FPGA.
Este prevăzut ca o descriere la nivel de celulă HDL (cunoscut şi ca miez soft) şi poate fi sintetizat
împreună cu altă logică. Microprocesorul este optimizat pentru eficienţă şi ocupă aproximativ
100 de celule logice, care însumează mai puţin de 5% din resursele unui dispozitiv XC3S500.
Deşi nu e menit ca un procesor de performanţă, este compact şi flexibil şi poate fi folosit pentru
procesare de date şi control simple, în particular pentru mentenanţă şi operaţii de I/O.
Microprocesorul poate fi uşor integrat într-un sistem mai mare şi adaugă o altă dimensiune de
flexibilitate într-un model pe bază de FPGA.
Modelul la nivel RT (transfer registru) şi FSDM-ul (maşină cu stări finite cu cale de date)
discutat în acest capitol, furnizează o metodologie generală pentru a converti un algoritm
secvenţial pentru hardware particularizat. Diagrama bloc arătată în figura 3.1(a). Într-un FSDM,
toate componentele, inclusiv numărul de regiştri, rutele de I/O a regiştrilor, numărul şi tipul
unităţilor funcţionale şi FSM-ul de control, sunt proiectate pentru aplicaţia ţintă. Ruta datelor
poate conţine unităţi de funcţie multiple şi cărări de rută multiple, la fel ca-n diagramă.
O alternativă e să păstrăm acelaşi hardware, dar să folosim software particularizat pentru
diferite aplicaţii. Transformarea poate fi făcută astfel: În primul rând, putem schimba ruta de date
particularizată cu o configuraţie fixă, la fel ca-n figura 3.1(b) (sus). Regiştrii de date şi reţelele de
17
rute particularizate sunt înlocuite de un fişier registru, care are un număr fix de regiştri şi conţine
doar două porturi de citire şi un port de scriere. Unităţile de funcţie particularizate sunt înlocuite
cu un ALU (unitate logică şi aritmetică), care poate executa un set de funcţii predefinite. Calea de
date poate executa în acest moment operaţii RT doar în următorul format:
rd r1 op r2
unde r1, r2 şi rd sunt adresele a doi regiştri şi un registru destinaţie şi op este una din funcţiile
ALU.
În al doilea rând, putem schimba FSM particularizat cu o maşină programabilă de stare, la fel
ca-n partea de jos a figurii 3.1(b). Rechemarea acelei operaţii ale unui FSM constă în trei părţi:
• registrul de stare ţine evidenţa stării curente
• ieşirea logică activează anumite semnale de ieşire în funcţie de starea actuală
• următoarea stare logică determină noua stare
Maşina programabilă de stare modifică aceste operaţii după cum urmează:
• Schimbă registrul de stare cu un numărător de program. Conţinutul numărătorului
reprezintă starea curentă a rutei de control
• Într-un FSM, fiecare stare activează diferite semnale de ieşire pentru a controla
operaţiunile rutei de date. Maşina programabilă de stare codează aceste şabloane de
ieşire în instrucţiuni şi le stochează într-un modul de memorie, cunoscut ca şi memorie
de program sau memorie de instrucţiuni. O adresă de memorie corespunde unei stări (de
ex. o valoare) a numărătorului de program. În timpul execuţiei, instrucţiunea punctată de
numărătorul de program este recuperată din memorie şi decodată pentru a genera
semnale de control. Memoria cu instrucţiuni şi funcţia de decodare logică ca un circuit
sofisticat de logică de ieşire.
• Într-un FSM nu există limitare unde să se meargă mai departe. De la o stare dată, FSM-ul
poate verifica condiţia de intrare şi să continue la una din multele stări posibile
următoare. În o maşină programabilă de stare, starea următoare e de obicei valoarea
stării actuale plus 1 (de ex. numărătorul de program e incrementat cu 1), care reflectă
natura execuţiei secvenţiale. Execuţia secvenţială poate fi alterată doar de câteva
instrucţiuni speciale, cu ar fi instrucţiunea jump, în care numărătorul de program e
încărcat cu o valoare diferită. Incrementatorul şi funcţia logică de multiplexare asociată
ca un circuit simplu de stare următoare.
18
După ce înlocuim ruta de date cu un fişier registru şi un ALU şi înlocuim FSM-ul dedicat cu o
maşină de stare programabilă, particularizând sistemul corespunde cu dezvoltarea unei noi
secvenţe de instrucţiuni (de ex. dezvoltarea unui program software) şi încarcă instrucţiunile în
memoria de instrucţiune. Organizarea FSMD e acum la fel pentru diferite aplicaţii şi devine o
platformă hardware cu scop general. Platforma constituie scheletul de bază al microprocesorului.
b. Aplicaţia microprocesorului
Într-un FSMD particularizat, calea de date poate fi creată pentru a acomoda necesităţile unei
aplicaţii individuale. Poate conţine unităţi funcţionale particularizate multiple şi căi de rute
paralele, şi poate efectua calcule complexe într-o singură stare (de ex. un ciclu). Pe de altă parte,
microprocesorul poate efectua doar o singură operaţie RT predefinită (de ex. o instrucţiune) o
dată. Poate avea nevoie de multe instrucţiuni pentru a efectua aceeaşi operaţie şi astfel necesita
mult mai mult timp.
Multe sarcini pot fi efectuate fie de un FSDM particularizat fie de un microcontroler. Alegerea
se face după complexitatea hardware-ului, performanţă şi dezvoltare cât mai uşoară. Nu există o
regulă exactă de alegere. Deoarece dezvoltarea software e de obicei mai uşoară decât
particularizarea hardware, opţiunea microcontrolerului e în general preferată pentru aplicaţii ce
nu necesită rapiditate în execuţie. Putem determina fezabilitatea acestei opţiuni prin examinarea
complexităţii de calcul. Microprocesorul necesită două cicluri de ceas pentru a efectua o
instrucţiune. Dacă ceasul sistemului este 50MHz, 25 de milioane de instrucţiuni pot fi efectuate
într-o secundă. Pentru o sarcină (sau o colecţie de sarcini), putem examina cât de frecvent e
lansată o cerere şi cât de repede trebuie terminată sarcina, iar apoi estimăm numărul de
instrucţiuni valabile. De exemplu să presupunem că o interfaţă de tastatură generează o intrare la
fiecare milisecundă şi datele trebuie procesate în acest interval. În intervalul unei milisecunde,
microprocesorul poate efectua 25000 de instrucţiuni. Controllerul microprocesorul va fi o opţiune
viabilă dacă procesarea necesită mai puţin de 25000 de instrucţiuni. În general, microcontrolerul
e potrivit pentru multe sarcini ce nu necesită rapiditate, interfaţa I/O sau mentenanţă.
19
Fig. 3.1
20
c. Fluxul de dezvoltare
Dezvoltând un sistem bazat pe un microcontroler convenţional, examinăm funcţionalităţile
necesare şi alegem un microprocesor capabil pentru calcule potrivite şi interfaţă I/O adecvată.
Chipuri adiţionale sunt frecvent necesare pentru a efectua funcţii speciale. Un avantaj al folosirii
unui microcontroler soft-core este acela că putem avea un circuit particularizat şi un
microcontroller dezvoltat şi implementat în acelaşi dispozitiv FPGA. O aplicaţie mare include, de
obicei, multe sarcini diferite. Într-o platformă FPGA, putem implementa sarcini ce necesită
rapiditate în procesare într-un circuit particularizat (de ex. hardware) pentru performanţă şi să
realizăm funcţiile I/O şi de mentenanţă într-un microcontroller (de ex. software).
Fluxul de dezvoltare de bază PicoBlaze e afişat în figura. Constă din următorii paşi:
1. Determină partiţia software-hardware
2. Dezvoltă programul de asamblare pentru porţiunea software
3. Compilează programul de asamblare pentru a genera un ROM de instrucţiune. ROM-ul e
un fişier HDL.
4. Efectuează simulare la nivelul setului de instrucţiuni
5. Derivă cod HDL pentru porţiunea hardware. Hardware-ul include circuite particularizate
pentru a efectua I/O speciale şi funcţii în timp-critic şi circuite particularizate să comunice
cu PicoBlaze
6. Creează cod HDL de nivel de top care combină codul pentru miezul PicoBlaze, ROM-ul
de instrucţiune şi hardware particularizat.
7. Dezvoltă un banc de teste şi efectuează simulare HDL pentru întregul sistem
8. Sintetizează şi implementează codul HDL şi programează chipul FPGA pe placa de
prototip.
21
Aceasta este diferenţa faţă de logica stării următoare a unui circuit secvenţial obişnuit, care
este alcătuit, în majoritate, de componente structurate, precum incrementări şi comutări.
În acest capitol oferim o incursiune în caracteristicile şi reprezentările de bază ale FSM-urilor
şi se discută derivaţia codurilor HDL(limbaj de descriere hardware).
În practică principala aplicaţie a unui FSM este să se comporte ca un controler a unui sistem
digital variat, care examinează comenzile, starea activează semnalele de control potrivite pentru
operarea unei căi de date care este de obicei compusă din componente secvenţiale obişnuite.
Aceasta este cunoscută ca FSMD(maşină cu stări finite cu cale de date).
22
Reprezentarea FSM-ului este mai compactă şi mai bună pentru aplicaţii simple. Reprezentarea
tip diagramă ASM este pe undeva mai curgătoare şi este mai descriptivă pentru aplicaţiile cu
condiţii şi acţiuni de tranziţie mai complexe.
Diagrama de stare
O diagramă de stare este compusă din noduri care reprezintă stările şi este desenată cu cercuri
arce de tranziţie adnotate. Un singur nod şi arcele sale de tranziţie sunt arătate in figura 3.3a. O
expresie logică exprimată în termenii unor semnale de intrare este asociată cu fiecare arc de
tranziţie şi reprezintă o condiţie specifică. Arcul este luat când expresia corespunzătoare este
evaluată ca adevărată.
Valorile ieşirilor Moore sunt plasate în interiorul arcului din moment ce depind numai de
starea curentă. Valorile ieşirilor Mealy sunt asociate cu condiţiile arcelor de tranziţie din moment
ce depind de starea curentă şi de intrarea externă . Pentru a reduce dezordinea în diagramă numai
valorile ieşirilor afirmate sunt listate.
O diagramă de stare reprezentativă este arătată în figura 3.3b. FSM are patru stări, două
semnale de intrare externe (a şi b), un semnal de ieşire Moore (y1) şi un semnal de ieşire Mealy
(y0).
Semnalul y1 este atribuit când FSM se află în starea s2 sau s3. Semnalul y0 este atribuit când
FSM este în starea s0 şi semnalul a şi b sunt pe “11”.
Diagrama ASM
Diagrama este compusă dintr-o reţea de blocuri ASM. Un bloc ASM constă dintr-o casetă de
stări şi o reţea opţională de casete de decizii şi casete de ieşiri condiţionale. Un bloc ASM
reprezentativ este arătat în figura 3.2b.
O casetă de stări reprezintă o stare într-o FSM şi valorile de ieşire Moore sunt listate în
interiorul casetei. De notat că are o singură cale de ieşire.
O casetă de decizie testează condiţiile intrării şi determină să ia o cale de ieşire. Are două căi
de ieşire etichetate T şi F care corespund valorilor de adevărat sau fals ale condiţiei.
O casetă de ieşiri condiţionale listează valorile unei ieşiri Mealy afirmate şi este de obicei
plasată după casetă de decizii. Indică, că semnalul de ieşire poate fi activat numai când condiţia
corespunzătoare în caseta de decizie este cunoscută.
O diagramă de stare poate fi cu uşurinţă transformată într-o diagramă ASM şi invers.
Diagrama ASM corespunzătoare diagramei FSM de mai înainte este arătată in figura 3.4b.
23
mo : iesire Moore
me : iesire Mealy
Stare_nume
Mo <= valoare
Node
nume caseta de
stare
stare
Mo <= value
caseta de
decizie
Condiţie
T F
Booleană
caseta
decizie
Me <= valoare condiţională
ieşire la alt
bloc ASM ieşire la alt
bloc ASM
24
(a) Diagrama de stare (b) Diagrama ASM
25
Tipul de date simplu listează toate valorile simbolice. Odată ce tipul de date este definit, poate
fi folosit pentru semnale după cum urmează:
În timpul sintezei, soft-ul desenează harta valorilor în mod automat într-un tip de date
enumerat cu reprezentare binară, un proces cunoscut ca stare de atribuire . Deşi există un
mecanism care poate să facă asta manual el este rareori necesar.
Codul complet al unui FSM este arătat mai jos, care constă din segmente pentru un registru de
stare (state register), următoarea stare logică(next-state logic), ieşire logică Moore(Moore output
logic), şi ieşire logică Mealy(output logic Mealy). Rezultatul simulării este arătat în figura 3.5.
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity fsm is
Port ( clk : in STD_LOGIC;
a, b: in STD_LOGIC;
reset : in STD_LOGIC;
y0 : out STD_LOGIC;
y1 : out STD_LOGIC);
end fsm;
26
else
state_next <=s1;
end if;
else
state_next<=s0;
end if;
when s1 =>
if (a='1') then
state_next <=s0;
else
state_next <=s1;
end if;
when s2 =>
state_next<=s0;
end case;
end process;
--Moore output logic
process(state_reg)
begin
case state_reg is
when s0|s2=>
y1 <= '0';
when s1=>
y1 <= '1';
end case;
end process;
--Mealy output logic
process(state_reg,a,b)
begin
case state_reg is
when s0 =>
if (a='1') and (b='1') then
y0 <= '1';
else
y0 <= '0';
end if;
when s1 | s2 =>
y0 <= '0';
end case;
end process;
end Behavioral;
27
Intrări(întrerupătoare)
Ceasul sistemului(20ns)
Partea cheie este logica stării următoare. Foloseşte o declaraţie de caz cu un semnal state-reg
ca expresie de selectare. Starea următoare este determinată de starea curentă şi de intrarea
externă. Codul pentru fiecare stare de bază urmează activităţile din interiorul fiecărui bloc ASM
din fig.3.4b.
Un cod alternativ este să se unească următoarea stare logică şi ieşirea logică într-un singur
bloc combinaţional după cum se arată în listingul 1.2.
28
Listing 1.2
entity FSM_imbinat_cu_un_circuit_logic_combinational is
Port ( clk : in STD_LOGIC;
reset : in STD_LOGIC;
a : in STD_LOGIC;
b : in STD_LOGIC;
y0 : out STD_LOGIC;
y1 : out STD_LOGIC);
end FSM_imbinat_cu_un_circuit_logic_combinational;
29
De notat că principalele valori de ieşire sunt listate la începutul codului.
Codul pentru logica stării următoare şi logica ieşirii urmează îndeaproape diagrama ASM.
Odată ce o diagramă de stare detaliată sau o diagramă ASM este derivată, convertirea FSM în cod
HDL este aproape o procedură mecanică.
Listingurile 1.1 şi 1.2 pot servi exemplu pentru acest scop.
Xilinx ISE include un program de utilitate intitulat StateCAD care permite unui utilizator să
deseneze o diagramă de stare în format grafic. Programul converteşte diagrama de stare în cod
HDL. Este o idee bună să se încerce în primă instanţă cu câteva exemple simple să se vadă dacă
codul şi stilul său sunt satisfăcătoare, mai ales pentru semnalele de ieşire.
Este un circuit care generează un impuls scurt, un tact per ciclu când semnalul de intrare se
schimbă de la ‘0’ la ’1’. Este utilizat de obicei să indice setarea unui semnal de intrare care
variază încet în timp. Creăm circuitul utilizând ambele sisteme Moore şi Mealy şi comparând
diferenţele dintre ele.
Listingul 1.3
entity dedector_front is
Port ( clk : in STD_LOGIC;
reset : in STD_LOGIC;
level : in STD_LOGIC;
tick : out STD_LOGIC);
end dedector_front;
30
signal state_reg, state_next : state_type;
begin
--state register
process (clk,reset)
begin
if (reset='1') then
state_reg <= zero;
elsif (clk' event and clk='1') then
state_reg <= state_next;
end if;
end process;
--next-state/ output logic
process(state_reg,level)
begin
state_next <= state_reg;
tick <= '0';
case state_reg is
when zero =>
if level='1' then
state_next <= detector;
end if;
when detector =>
tick <='1';
if level='1' then
state_next <=one;
else
state_next <=zero;
end if;
when one =>
if level='0' then
state_next <= zero;
end if;
end case;
end process;
end moore_arch;
31
Fig. 3.6 Detector front bazat pe maşina Moore
32
(a) Diagrama cu stări (b) Diagrama ASM
Figura 3.8 Detector de front bazat pe maşina Mealy.
33
level : in STD_LOGIC;
tick : out STD_LOGIC);
end detector_front;
Implementarea directă
Din moment ce tranziţiile circuitului detectorului de front sunt foarte simple, poate fi
implementat fără a folosi un FSM. Poate fi interpretat că ieşirea este atribuită numai când intrarea
curentă este unu şi intrarea precedentă, care este stocată în registru, este zero. Codul
corespunzător este arătat in listingul 1.5. Rezultatul simulării este arătat în figura 3.9
34
Fig. 3.9 Simularea componentei Porţi-nivel implementate cu un detector de front
entity detector_front is
Port ( clk : in STD_LOGIC;
reset : in STD_LOGIC;
level : in STD_LOGIC;
tick : out STD_LOGIC);
end detector_front;
Deşi descrierile din listing-urile 5.4 şi 5.5 par să fie foarte diferite, ele descriu acelaşi circuit.
Diagrama circuitului poate fi derivată din FSM dacă atribuim ‘0’ şi ’1’ stărilor zero şi unu.
35
Comparaţia
Întrucât ambele modele bazate pe sisteme Moore şi Mealy pot genera un tact de front
crescător a semnalului de intrare, există câteva diferenţe subtile. Modelul bazat pe un sistem
Mealy are mai puţine stări şi răspunde mai repede, dar lărgimea ieşirilor sale poate varia şi
căderea pe intrare poate fi trecută la ieşire.
Alegerea dintre cele două modele depinde de subsistemul care foloseşte semnalele de ieşire. În
majoritatea timpului subsistemul este un sistem sincron care împarte acelaşi semnal de ceas. Din
moment ce ieşirea FSM-ului este demonstrată numai la frontul crescător a ceasului, lărgimea şi
zgomotul de impuls nu contează atâta timp cât semnalul de ieşire este stabil în jurul frontului.
De notat că semnalul de ieşire Mealy este disponibil pentru prelevare de probe la t1 care este
mai rapid cu un ciclu de ceas decât ieşirea Mealy, care este disponibilă la t2. De aceea, circuitul
pe baza sistemului Mealy este preferat pentru acest tip de aplicaţii.
36
Fig. 3.10 Formele de undă stabilizate
37
Fig. 3.12 Schema bloc de testare a circuitului de stabilizare
entity stabilizator_test is
Port ( clk : in STD_LOGIC;
btn : in STD_LOGIC_VECTOR(3 downto 0);
an : out STD_LOGIC_VECTOR(3 downto 0);
sseg : out STD_LOGIC_VECTOR(7 downto 0));
end stabilizator_test;
38
architecture arch of stabilizator_test is
signal q1_reg, q1_next : unsigned(7 downto 0);
signal q0_reg, q0_next : unsigned(7 downto 0);
signal b_count, d_count : std_logic_vector(7 downto 0);
signal btn_reg, db_reg : std_logic;
signal db_level, db_tick, btn_tick, clr : std_logic;
begin
--instantierea componentelor
--instantiere hex display time-multiplexing circuit
disp_unit : entity work.disp_hex_multiplexor
port map(
clk=>clk, reset=>'0',
hex3=>b_count(7 downto 4), hex2=>b_count(3 downto 0),
hex1=>d_count(7 downto 4), hex0=>d_count(3 downto 0),
dp_in=>"1011", an=>an, sseg=>sseg);
-- instantiere circuit de stabilizare
db_unit : entity work.stabilizator_fsm(arch)
port map(
clk=>clk, reset=>'0',
sw=>btn(1), stab=>db_level);
--circuit de detectare front
process(clk)
begin
if (clk' event and clk='1') then
btn_reg <= btn(1);
db_reg <= db_level;
end if;
end process;
btn_tick <= (not btn_reg) and btn(1);
db_tick <= (not db_reg) and db_level;
-- cele doua counter-e
clr <= btn(0);
process(clk)
begin
if (clk' event and clk='1') then
q1_reg <= q1_next;
q0_reg <= q0_next;
end if;
end process;
-- urmatoarea stare logica ce apartine counter-ului
q1_next <= (others=>'0') when clr='1' else
q1_reg + 1 when btn_tick='1' else
q1_reg;
q0_next <= (others=>'0') when clr='1' else
q0_reg + 1 when db_tick='1' else
q0_reg;
-- iesirea
b_count <= std_logic_vector(q1_reg);
d_count <= std_logic_vector(q0_reg);
end arch;
Cel de-al 7-lea segment al afişajului arată numerele acumulate de la zero la unu, intrările
întrerupătoarelor de salturi şi reglare a salturilor. După apăsarea şi lăsarea butonului de câteva ori
putem determina numărul mediu de salturi pentru fiecare tranziţie.
39
3.2 Maşina cu stări finite cu cale de date (FSMD)
Un FSMD(maşină cu stări finite cu cale de date) combină FSM şi circuite secvenţiale
obişnuite. FSM, care este cunoscut uneori ca şi calea de control, examinează comenzile externe
şi starea şi generează semnale de control pentru a specifica operaţia circuitelor secvenţiale
obişnuite, care sunt cunoscute în colectiv drept cale de date.
FSMD-ul este folosit pentru a implementa sisteme descrise de metodologia RT(registru de
transfer), în care operaţiunile sunt specificate ca manipulări de date şi transferate alături de
colecţia de registre.
unde rdest este registrul de destinaţie, rsrc 1 , rsrc 2 şi rsrcn sunt registre sursă şi f(.) specifică
operaţia care va fi executată. Notaţia indică faptul că, conţinutul registrului sursă care este
alimentat funcţiei f(.) care este realizată printr-un circuit combinaţional, iar rezultatul este trecut
intrării registrului de destinaţie şi stocat în registrul de destinaţie la următorul front crescător a
ceasului. În continuare evidenţiem câteva operaţii RT reprezentative:
40
(a) diagrama bloc
41
şi next pentru a reprezenta intrarea şi ieşirea registrului. De notat că o operaţiune RT este
sincronizată de un ceas încorporat.
Rezultatul din funcţia f (⋅) nu este stocat în registrul de destinaţie până la următorul front
crescător a ceasului. Diagrama de timp a operaţiei RT precedente este arătată în figura 3.13(b).
Conţine un registru de destinaţie r1, care este iniţializat cu 8 la care se adaugă conţinutul
registrului r2 şi apoi schimbat cu două poziţii spre stânga. De notat că registrul r1 trebuie
specificat în fiecare stare. Când r1 nu este schimbat operaţia r1 ← r1 ar trebui folosită pentru a-şi
42
menţine starea curentă, ca în starea s3. În discuţia viitoare, presupunem că r ← r este
operaţiunea RT iniţială pentru registrul r şi nu include diagrama ASMD. Implementarea
operaţiilor RT ale unei diagrame ASMD implică un circuit multiplexor care să mute următoarea
valoare dorită în registrul de destinaţie. De exemplu, următorul segment poate fi implementat cu
un multiplexor 4:1, cum este arătat în figura 3.13(b) . Starea curentă(i,e, ieşirea registrului de
stare ) a FSM-ului controlează selectarea semnalelor multiplexorului şi de aceea se alege
rezultatul operaţiei RT dorite.
O operaţie RT poate fi specificată într-o casetă de ieşiri condiţionale, cum este arătat registrul
r2 în figura 3.14(a). Depinzând de condiţia a>b, FSMD prelucrează fie r 2 ← r 2 + a fie
r 2 ← r 2 + b . De notat că toate operaţiile sunt făcute în paralel în interiorul blocului ASMD.
Trebuie să realizăm a>b, r2+a şi r2+b ca operaţii şi să folosim un multiplexor pentru a conduce la
valoarea dorită în r2. Diagrama bloc este arătată în figura 3.14(b).
43
(b) Diagrama bloc
• r _ n e x t< =r _ r e g− 1 ;
• r _ r e g< =r _ n e x t− 1 la frontul crescător a ceasului(i.e,când FSMD iese din blocul
curent).
Această stocare întârziată poate introduce erori subtile când un registru este folosit în caseta
de decizie. Considerăm segmentul FSMD din figura 3.4(a). Registrul r este decrementat din
caseta de stări şi folosit în casetă de decizii. Din moment ce registrul r nu este „updatat” până
când FSMD-ul nu iese din bloc, fostul conţinut este folosit pentru comparaţie în caseta de decizii.
Dacă noua valoare a lui r este dorită ar trebui să utilizăm ieşirea logică combinaţională(i.e,r_next)
în caseta de decizii(i.e, înlocuieşte expresia r=0 cu expresia r_next=0), cum este arătat în figura
44
6.4(b). De notat că noi folosim notaţia := ca în r_next=r-1 pentru a indica asignarea imediată al
r_next.
(a) Utilizarea tuturor valorilor a lui r (b) utilizarea noii valori a lui r
Calea de date urmează semnalele de control pentru a efectua operaţia RT dorită şi generează
semnalul de stare intern.
Calea de control este un FSM. De regulă un FSM obişnuit conţine un registru de stare,
următoarea stare logică şi ieşire logică. Este utilizat semnalul extern de comandă şi semnalul de
stare al căii de date ca intrare şi generează semnale de control pentru a conduce operaţia căii de
45
date. FSM-ul generează de asemenea semnalul de stare extern pentru a indica starea operaţiei
FSMD.
De notat că deşi FSMD-ul constă din două tipuri de circuite secvenţiale, ambele circuite sunt
controlate de acelaşi ceas, şi de aceea FSMD-ul este în continuare un sistem sincronizat.
46
3.2.6 Circuitul de stabilizare bazat pe metodologia RT
Cu metodologia RT putem folosi FSM-ul pentru a controla iniţierea timer-ului pentru a obţine
un interval exact. Diagrama ASMD este arătată în figura 3.17. Circuitul este extins pentru a
extinde doua semnale de ieşire : db_level, care este ieşirea de stabilizare şi db_tick care
reprezintă un ceas per ciclu activat de pulsul atribuit de la tranziţia ’0’ la ’1’. Stările zero şi unu
înseamnă că intrarea sw a fost stabilizată pentru ‘0’ respectiv ’1’. Stările wait_1 şi wait_0 sunt
folosite pentru a filtra zgomotele scurte de impuls. Calea de date conţine un registru, q, care are
21 de biţi semnificativi. Să considerăm că FSMD-ul este la început în starea
47
zero. Când semnalul de intrare sw devine ’1’, FSMD-ul se mută în starea wait_1 şi iniţializează
registrul q la “1...1”. În starea wait_1, q decrementează în fiecare perioadă a ceasului. Dacă sw
rămâne în ‘1’ , FSMD-ul se reîntoarce în starea sa în mod repetat până când q atinge “0…0” şi
apoi se mută în starea unu.
Reamintim că ceasul de sistem de 50-MHz(i.e, perioadă de 20 ns) este utilizată pe placa
prototip. Din moment ce FSMD-ul stă în starea wait_1 pentru 2 21 cicluri ale ceasului, este în jur
de 40 ms ( 2 21 ∗ 20 ns ). Putem modifica valoarea iniţială a registrului q pentru a obţine intervalul
de aşteptare dorit. Există două feluri de a deriva un cod HDL, unu cu o descriere explicită a
componentelor căii de date şi alta cu o descriere implicită a componentelor căii de date.
Putem crea un numărător binar cu un semnal q_load pentru a încărca valoarea iniţială şi
semnalul q_dec pentru porni numărătorul. Numărătorul generează de asemenea un semnal de
stare q_zero, care este atribuit când numărătorul atinge zero. Calea de date completă este
compusă din registrul q şi următoarea stare logică a numărătorului decrementat obişnuit. Un
circuit de comparaţie este inclus pentru a genera semnalul q_zero. Calea de control constă dintr-
un FSM care ia intrarea şi starea q_zero şi atribuie semnalele de control, q_load şi q_dec,
potriveşte acţiunile dorite în diagrama ASMD. Codul HDL urmează specificările căii de date şi
ale diagramei ASMD cum este arătat în listing-ul 2.1.
48
Listing 2.1 Circuit stabilizator cu componenta căii de date explicite
entity stabilizator is
Port ( clk : in STD_LOGIC;
reset : in STD_LOGIC;
sw : in STD_LOGIC;
db_level : out STD_LOGIC;
db_tick : out STD_LOGIC);
end stabilizator;
49
state_next <= zero;
end if;
when one =>
db_level <= '1';
if (sw='0') then
state_next <= wait_0;
q_load <='1';
end if;
when wait_0 =>
db_level <= '1';
if (sw='0') then
q_dec <= '1';
if (q_zero='1' ) then
state_next <= zero;
end if;
else -- sw='1'
state_next <= one;
end if;
end case;
end process;
end Behavioral;
50
3.2.9 Exemple de modele
3.2.9.1 Perioada de numărare
O perioadă de numărare măsoară perioada unei intrări în formă de undă perioadă. Un mod de
a construi circuitul este să numărăm numărul de cicluri de ceas dintre două fronturi crescătoare
ale semnalului de intrare. Din moment ce frecvenţa ceasului sistemului este cunoscută, perioada
semnalului de intrare poate fi derivată în acord. De exemplu, dacă frecvenţa ceasului sistemului
este f şi numărul de cicluri de ceas dintre două fronturi crescătoare este N, perioada semnalului
1
de intrare este N ∗ f .
Modelul din subsecţiune măsoară perioada în milisecunde. Diagrama sa ASMD este arătată în
figura 3.19. Perioada de numărare ia o măsură când semnalul start este atribuit. Utilizăm un
circuit de detectare a frontului crescător pentru a genera un tick de un ciclu al ceasului, front,
pentru a indica frontul crescător al intrării în formă de undă. După ce start este atribuit FSMD se
mută in starea waite pentru a aştepta primul front crescător al intrării. Se mută apoi în starea
count când următorul front crescător al intrării este detectat. În starea count utilizăm două registre
pentru a putea măsura timpul. Registrul t numără 50.000 cicluri de ceas, de la 0 la 49,999. Din
moment ce perioada ceasului sistemului este este de 20 ns, registrul t ia o milisecundă ca să
circule prin 50.000 de cicluri. Registrul p numără în milisecunde. Este incrementat o dată când
registrul t atinge 49,999. Când FSMD iese din starea count, perioada intrării în formă de undă
este stocată în registrul p şi unităţile lui sunt milisecundele. FSMD-ul atribuie semnalul done-tick
în starea done ca în exemplul precedent.
Codul urmează diagrama ASMD şi este arătat în listing-ul 2.7. Utilizăm o constantă
CLK_MS_COUNT, pentru a limita numărătorul în milisecunde. Poate fi înlocuită dacă o altă
unitate de măsură este cerută.
51
Fig.3.19 Diagrama ASMD a perioadei de numărare
entity perioada_numarare is
Port ( clk : in STD_LOGIC;
reset : in STD_LOGIC;
start : in STD_LOGIC;
si : in STD_LOGIC;
52
ready : out STD_LOGIC;
done_tick : out STD_LOGIC;
prd : out STD_LOGIC_VECTOR (10 downto 0));
end perioada_numarare;
begin
-- stare cu registru de date
process(clk,reset)
begin
if reset='1' then
state_reg <= idle;
t_reg <= (others=>'0');
p_reg <= (others=>'0');
delay_reg <= '0';
elsif (clk'event and clk='1') then
state_reg <= state_next;
t_reg <= t_next;
p_reg <= p_next;
delay_reg <= si;
end if;
end process;
--circuit de detectare front
front <= (not delay_reg) and si;
-- fsmd urmatoarea stare logica/operatii cu cale cale de date
process(start,front,state_reg,t_reg,p_reg,t_next)
begin
ready <='0';
done_tick <= '0';
state_next <= state_reg;
p_next <= p_reg;
t_next <= t_reg;
case state_reg is
when idle =>
ready <= '1';
if (start='1') then
state_next <= waite;
end if;
when waite => --asteapta primul front
if(front='1') then
state_next <= count;
t_next <= (others=>'0');
p_next <= (others=>'0');
end if;
when count =>
if (front='1') then -- al doi-lea front invaluit
state_next <= done;
else -- alta maniera a numaratorului
if t_reg = clk_ms_count - 1 then --1 ms tick
t_next <= (others=>'0');
p_next <= p_reg + 1 ;
53
else
t_next <= t_reg + 1;
end if;
end if;
when done =>
done_tick <= '1';
state_next <= idle;
end case;
end process;
prd <= std_logic_vector(p_reg);
end Behavioral;
1
că frecvenţa reciproca a perioadei (i.e, frequency = perioada ) . O altă abordare este de a
măsura perioada semnalului şi apoi ia reciproca pentru a găsi frecvenţa. Utilizăm această
abordare pentru a implementa un counter de joasă frecvenţă în această subsecţiune.
Acest exemplu de model demonstrează cum folosim părţile create mai devreme pentru a
construi un sistem mai mare. Pentru simplitate, presupunem că frecvenţa intrării este între 1 şi 10
Hz (i.e, perioada este între 100 şi 1000 ms). Operaţia acestui circuit include trei procese:
1. Măsoară perioada.
2. Să găsească frecvenţa prin efectuarea unei operaţii de divizare.
3. Să convertească numere binare în format BCD.
54
(a) Rang-nivel diagrama bloc
55
Listing 2.8 Counter de joasă frecvenţă
entity counter_joasa_frecventa is
Port ( clk : in STD_LOGIC;
reset : in STD_LOGIC;
start : in STD_LOGIC;
si : in STD_LOGIC;
bcd3 : out STD_LOGIC_VECTOR (3 downto 0);
bcd2 : out STD_LOGIC_VECTOR (3 downto 0);
bcd1 : out STD_LOGIC_VECTOR (3 downto 0);
bcd0 : out STD_LOGIC_VECTOR (3 downto 0));
end counter_joasa_frecventa;
divizor=>divizor,divident=>divident,coeficient=>coeficient,rest=>open,
ready=>open,done_tick=>divizor_done_tick);
-- instatiere convertor binar in BCD
bin2bcd_unit : entity work.bin2bcd
port map(clk=>clk, reset=>reset, start=> b2b_start,
bin=>coeficient(12 downto 0),ready=>open,
done_tick=>b2b_done_tick,
bcd3=>bcd3,bcd2=>bcd2,bcd1=>bcd1,bcd0=>bcd0);
--latimea semnalului de extensie
divident <= std_logic_vector(to_unsigned(1000000, 20));
divizor <= "0000000000" & prd;
--FSM-ul principal
process(clk,reset)
begin
if reset='1' then
state_reg <= idle;
elsif (clk'event and clk='1') then
state_reg <= state_next;
end if;
end process;
process(state_reg,
start,prd_done_tick,divizor_done_tick,b2b_done_tick)
begin
state_next <= state_reg;
56
prd_start <= '0';
divizor_start <= '0';
b2b_start <= '0';
case state_reg is
when idle =>
if start='1' then
state_next <= count;
prd_start <= '1';
end if;
when count =>
if (prd_done_tick='1') then
divizor_start <='1';
state_next <= frecventa;
end if;
when frecventa =>
if(divizor_done_tick='1') then
b2b_start <= '1';
state_next <= b2b;
end if;
when b2b =>
if (b2b_done_tick='1') then
state_next <= idle;
end if;
end case;
end process;
end Behavioral;
57
este destul de uşoară, atingerea performanţei optime implică multe probleme de sincronizare şi
este destul de dificil.
Placa S3 are două dispozitive asincrone SRAM de 256K-16, care totalizează un Mbyte. În
acest capitol demonstrăm construirea unui controler de memorie pentru aceste dispozitive. Din
moment ce caracteristicile de sincronizare pentru fiecare dispozitiv RAM sunt diferite,
controlerul este aplicabil numai acestui dispozitiv. Dar, acelaşi principiu de model poate fi folosit
pentru dispozitive SRAM similare. Dispozitivul Xilinx Spartan-3 conţine de asemenea mici
blocări de memorie încorporate.
Toate aceste semnale sunt active jos, iar sufixul n pentru a pune accentul pe această
proprietate. Tabelul funcţional este arătat în tabelul 3.1. Semnalul ce_n poate fi folosit pentru a
găzdui extinderea de memorie, iar semnalele we_n şi oe_n sunt folosite pentru operaţiile de
scriere şi citire. Semnalul lb_n şi ub_n sunt folositi pentru a uşura configuraţia orientată pe byte.
În restul capitolului, ilustrăm modelul şi problemele de corelare a unui controler de memorie.
Pentru claritate folosim un dispozitiv SRAM şi accesăm SRAM-ul în format word pe 16 biţi.
58
Asta înseamnă că semnalele ce_n, lb_n şi ub_n trebuie să fie mereu activate(i.e, legat de 0).
Tabelul funcţional simplificat este arătat în tabelul 3.2.
- t RC : timpul ciclic de citire, timpul minim scurs între două operaţii de citire. Este
părăseşte starea de înaltă impedanţă după ce oe_n este dezavtivat. De notat că şi atunci
când ieşirea numai este în starea de înaltă impedanţă, datele sunt în continuare invalide.
Valorile acestor parametrii pentru dispozitivul IS61LV25616AL sunt arătate în figura
3.3.
Diagrama de sincronizare simplificată pentru o operaţie de scriere we_n controler este
arătată în tabelul 3.22.
59
Fig.3.20 Diagrama bloc al dispozitivului SRAM
Tabelul 3.1
Operaţia ce_n we_n ce_n lb_n ub_n dio (inf) Dio(sup)
invalidată 1 - - - - Z Z
0 1 1 - - Z Z
0 - - 1 1 Z Z
citeşte 0 1 0 0 1 ieşire date Z
0 1 0 1 0 Z ieşire date
0 1 0 0 0 iesire date ieşire date
scrie 0 0 - 0 1 intrare date Z
0 0 - 1 0 Z intrare date
0 0 - 0 0 intrare date intrare date
Tabelul 3.2
Operaţia We_n Ce_n Dio (16bits)
Ieşire invalidată 1 1 Z
Citeşte cuvânt pe 16 1 0 Ieşire date
biţi
Scrie cuvânt pe 16 0 - Intrare date
biţi
60
(a) Diagrama de sincronizare a adresei controlate de citirea ciclului
61
Tabelul 3.3
parametru min max
tRC durata ciclului de citire 10 -
tAA durată acces adresă - 10
tOHA durata menţinerii ieşirii 2 -
tDOE durata accesului la ieşirea validată - 4
tHZOE durata validării ieşirii de înaltă impedanţă - 4
tLZOE durata validării ieşirii de impedanţă normală 0 -
Tabelul 3.4
parametru min max
tWC durata ciclului de citire 10 -
tSA adresa alocată 0 -
tHA durata de alocare a adresei 0 -
tPWE1 we_n lăţime impuls 8 -
62
tSD durata de alocare a datelor 6 -
tHD timp de menţinere a datelor 0 -
- t HD : timpul de stare a datelor, timpul minim în care datele trebuie să fie stabile după
frontul latching.
Valorile acestor parametrii pentru dispozitivul IS61LV25616AL sunt arătate în figura 3.3(b).
Informaţiile de sincronizare complete pot fi găsite în tabelul de date a dispozitivului.
63
3.3.3 Baza controlerului de memorie
3.3.1.1 Diagrama bloc
Rolul controlerului de memorie şi a semnalelor sale I/O sunt arătate în figura 3.23. Semnalele
sistemului principal (main system) sunt:
64
Fig.3.24 Diagrama bloc a controlerului de memorie
1. Plasează adresa pe bus ,ad, şi activează semnalul oe_n. Aceste două semnale trebuie
să fie stabile pentru întreaga operaţie.
2. Aşteaptă pentru cel mai puţin t AA . Datele din SRAM devin accesibile după acest
interval.
3. Recuperează datele din dio şi dezactivează semnalul oe_n.
Utilizăm ciclul de scris controlat we_n în modelul nostru după cum este arătat în figura 3.22.
Secvenţa operaţională de bază este :
65
1. Plasează o adresă în ad bus şi datele în dio bus şi activează
semnalul we_n. Aceste semnale trebuie să fie stabile pe durata întregii operaţiuni.
2. Aşteptă pentru cel puţin t PWE 1 .
3. Dezactivează semnalul we_n. Datele sunt transmise către SRAM la tranziţia ’0’ la ’1’
a frontului.
4. Mută datele din dio bus.
66
3.4.2 Diagrama ASMD
Schema pentru acest controler este arătată în figura 3.25. FSM-ul are cinci stări şi se află
iniţial în starea idle. Începe operaţia de activare când este activat semnalul mem. Semnalul rw
determină dacă este o operaţiune de citire sau de scriere.
Pentru o operaţie de citire FSM se mută în starea rd1. Adresa de memorie, addr este
selectată şi stocată în registrul addr_reg la trecere. Semnalul oe_n este activat în stările rd1 şi
rd2. La sfârşitul ciclului de citire, FSM-ul se întoarce în starea de idle. Datele recuperate sunt
stocate în registrul data_s2f_reg la trecere, şi semnalul oe_n este dezactivat după aceea. De notat
că diagrama bloc din figura 3.5 are două porturi de citire. Semnalul data_s2f_r este un registru
de ieşire şi devine disponibil după ce FSM-ul iese din starea r2. Datele rămân neschimbate până
la finalul următorului ciclu de citire. Semnalul data_s2f_r este conectat direct la dio bus al
SRAM. Datele sale trebuie să devină valide la sfârşitul stării rd2 dar vor fi îndepărtate după ce
FSM-ul intră in starea idle. În unele aplicaţii, sistemul principal selectează şi stochează supra
citirile de memorie în proprii registre şi ieşirea neînregistrată permite ca această acţiune să fie
terminată cu un ciclu de ceas mai rapide.
Pentru o operaţiune de scriere FSM se mută în starea wr1 state. Adresa de memorie, addr şi
datele data_f2s sunt selectate şi stocate în regiştrii addr_reg şi data_ f2s_reg la tranziţie.
Semnalele we_n şi tri_n sunt ambele activate în starea wr1. Ultima permite buffer-ului cu trei
stări să pună datele peste dio bus al SRAM. Când FSM se mută în starea wr2, we_n este
dezactivat dar tri_n rămâne atribuit. Aceasta asigură că datele sunt lached cum trebuie când we_n
se schimbă de la ’0’ la ’1’. La sfârşitul ciclului de scriere FSM se reîntoarce în starea idle şi
semnalul tri_n este dezactivat pentru a îndepărta datele din dio bus.
67
Fig. 3.25 Diagrama ASMD a controlerului SRAM.
68
În timpul ciclului de scriere, we_n este atribuit în starea wr1 şi intervalul de 20ns depăşeşte
cererea de 8 ns a t PWEI . Semnalul tri_n rămâne atribuit în starea wr2 şi astfel se asigură că
datele sunt stabile încă în timpul tranziţiei frontului ’0’ la ’1’ a semnalului we_n.
În termeni de performanţă, ambele operaţiuni, de citire şi scriere durează două cicluri de ceas
ca să fie completate. În timpul operaţiei de citire, date neînregistrate (i.e, data_s2f_ur) sunt
disponibile la sfârşitul ciclului celui de-al doilea ciclu a ceasului, iar datele înregistrate (i.e,
data_s2f_r) sunt disponibile chiar după creşterea frontului celui de-al doilea ciclu a ceasului. Deşi
o operaţiune de memorie poate fi executată în două ceasuri, sistemul principal nu poate accesa
memoria aşa repede. Ambele operaţii de citire şi scriere trebuie să se întoarcă în starea idle după
completare. Sistemul principal trebuie să aştepte încă un ciclu de ceas pentru a accesa noua
operaţie memorie, de aceea ceasul back-to-back al memoriei ia trei cicluri de ceas.
entity sram_ctrl is
Port ( clk : in STD_LOGIC;
reset : in STD_LOGIC;
mem : in STD_LOGIC;
rw : in STD_LOGIC;
addr : in STD_LOGIC_VECTOR (17 downto 0);
data_f2s : in STD_LOGIC_VECTOR (15 downto 0);
69
ready : out STD_LOGIC;
data_s2f_r, data_s2f_ur : out STD_LOGIC_VECTOR (15 downto 0);
ad : out STD_LOGIC_VECTOR (17 downto 0);
we_n, oe_n : out STD_LOGIC;
dio_a : inout STD_LOGIC_VECTOR (15 downto 0);
ce_a_n , ub_a_n, lb_a_n : out STD_LOGIC);
end sram_ctrl;
70
end if;
end if;
ready <= '1';
when wr1 =>
state_next <= wr2;
when wr2 =>
state_next <= idle;
when rd1 =>
state_next <= rd2;
when rd2 =>
data_s2f_next <= dio_a;
state_next <= idle;
end case;
end process;
--iesire logica
process(state_next)
begin
tri_buf <= '1';
we_buf <= '1';
oe_buf <= '1';
case state_next is
when idle =>
when wr1 =>
tri_buf <= '0';
we_buf <= '0';
when wr2 =>
tri_buf <= '0';
when rd1 =>
oe_buf <= '0';
when rd2 =>
oe_buf <= '0';
end case;
end process;
-- la sistemul principal
data_s2f_r <= data_s2f_reg;
data_s2f_ur <= dio_a;
-- la SRAM
we_n <= we_reg;
oe_n <= oe_reg;
ad <= addr_reg;
-- i/o pentru SRAM chip a
ce_a_n <= '0';
ub_a_n <= '0';
lb_a_n <= '0';
dio_a <= data_f2s_reg when tri_reg='0' else (others=>'0');
end Behavioral;
71
4. Rezultate experimentale
Introducere
După ce am terminat de construit microprocesorul urmează să trecem la partea de simulare cu
ajutorul programului de simulare ModelSim oferit de Xilinx, cu acesta putem vedea parametrii de
funcţionare a microprocesorului şi cum se comportă în timp real.
În urma simulării am obţinut formele de undă care ne arată timpii de sincronizare dintre intrări
şi ieşiri, instrucţiuni şi adrese. Toate instrucţiunile sunt sincronizate după un ceas intern (CLK)
care oscilează la o frecvenţă de 50MHz, respectiv 20ns.
72
4.2 RESET-ul
Microprocesorul conţine un circuit de control intern de resetare pentru a asigura pornirea
corecta a microprocesorului urmând configurarea aparatului sau resetarea globală (GSR).
Aceasta poate fi, de asemenea, activată în cadrul modelului acestui sistem.
Resetarea microprocesorului este eşantionată şi sincronizată după ceasul intern şi utilizată
pentru a forma un control intern pentru a reseta semnalul care este distribuit pe plan local, după
caz. Un mic circuit se asigură că punerea în circulaţie a resetarii interne este curata şi controlata.
73
Realizarea resetării după configurare
Resetarea de intrare poate fi legată de logica ‘0’ dacă nu este necesară, precum şi circuitul va
fi utilizat pentru a asigura o secvenţă corectă putere în creştere.
74
4.4 Simularea circuitului de divizare
75
5.Analiza rezultatelor obţinute
5.1 Concluzii
În urma implementării şi testării microprocesorului putem observa comportarea şi
funcţionarea lui. După încărcarea microprocesorului construit în limbaj de descriere hardware în
interiorul celulelor FPGA (structuri de porţi logice reconfigurabile) de pe placa de dezvoltare
Nexys 2 putem observa pe afişajul plăcii ieşirile out_port ale microprocesorului.
Deoarece dezvoltarea software e de obicei mai uşoară decât particularizarea hardware,
opţiunea microprocesorului este în general preferată pentru aplicaţii ce nu necesită rapiditate în
execuţie. Putem determina fezabilitatea acestei opţiuni prin examinarea complexităţii de calcul.
Microprocesorul necesită două cicluri de ceas pentru a efectua o instrucţiune. Dacă ceasul
sistemului este 50MHz, 25 de milioane de instrucţiuni pot fi efectuate într-o secundă. Pentru o
sarcină (sau o colecţie de sarcini), putem examina cât de frecvent e lansată o cerere şi cât de
repede trebuie terminată sarcina, iar apoi estimăm numărul de instrucţiuni valabile. De exemplu
să presupunem că o interfaţă de tastatură generează o intrare la fiecare milisecundă şi datele
trebuie procesate în acest interval. În intervalul unei milisecunde, microprocesorul poate efectua
25000 de instrucţiuni. Controllerul microprocesorul va fi o opţiune viabilă dacă procesarea
necesită mai puţin de 25000 de instrucţiuni.
76
- microprocesorul se poate extinde către alte module cu ajutorul conectorilor de
expansiune cum ar fi: tastatură, mouse, VGA(ecran LCD), şi alte module dintr-un
sistem complex;
- frecvenţa de lucru a oscilatorului intern pentru care a fost proiectat microprocesorul
este de 50 MHz adică 20ns care se poate extinde cu alte microcontrolere;
- microprocesorul este reconfigurabil datorită faptului că utilizatorul poate să intervină
în codul de asamblare pentru eventuale modificări;
- USB-ul de pe placa Nexys 2 oferă pe lângă transmisii de date şi alimentare;
- microprocesorul se poate conecta într-un sistem de microprocesoare care folosesc
aceeaşi memorie cu condiţia ca memoria să fie dualport;
- se poate vedea în timp real comportarea microprocesorului cu ajutorul unui program
de simulare;
- microprocesorul nu conţine acumulator astfel rezultatul este întors în acelaşi registru;
- microprocesorul a fost construit într-un limbaj de descriere hardware (VHDL) ceea ce
ne conferă flexibilitate pentru descrierea componentelor sistemului.
5.3 Perspective
Microprocesorul poate fi uşor integrat într-un sistem mai mare şi adaugă o altă dimensiune de
flexibilitate într-un model pe bază de FPGA. Extinderea microprocesorului, adică acest
microprocesor poate să conţină mai multe miezuri (core) care să lucreze în paralel de exemplu
pentru prelucrarea datelor. De evidenţiat că două micro se pot conecta la aceeaşi memorie, dar
trebuie să fie cu două porturi de intrare.
77
Bibliografie
78
Cuprins
.............................................................................................................................................4
1. Introducere.............................................................................................4
1.1 Scurt istoric............................................................................................................................4
1.2 Obiectivul proiectului.............................................................................................................5
1.3 Dimensiunea şi performanţa microprocesorului....................................................................8
1.4 Structura lucrării ....................................................................................................................9
3. Proiectare şi implementare..................................................................17
Introducere..............................................................................................................................17
a. De la FSDM cu scop special la microprocesor cu scop general.....................................17
b. Aplicaţia microprocesorului...........................................................................................19
c. Fluxul de dezvoltare.......................................................................................................21
3.1 Maşina cu stări finite (FSM).................................................................................................21
3.1.1 Ieşirile Mealy şi Moore..................................................................................................22
3.1.2 Reprezentarea FSM-ului...............................................................................................22
Diagrama de stare...............................................................................................................23
Diagrama ASM..................................................................................................................23
79
3.1.3 Dezvoltarea codului FSM..............................................................................................25
3.1.4 Modele cu exemple........................................................................................................30
3.1.4.1 Detectorul de front crescător..................................................................................30
Modelul de bază Moore......................................................................................................30
Modelul de bază Mealy .....................................................................................................33
Implementarea directă........................................................................................................34
Comparaţia .........................................................................................................................36
3.1.5 Circuitul de stabilizare...................................................................................................36
3.1.6 Circuitul de testare.........................................................................................................38
3.2 Maşina cu stări finite cu cale de date (FSMD)....................................................................40
3.2.1 Unica operaţiune RT......................................................................................................40
3.2.3 Diagrama ASMD...........................................................................................................42
3.2.4 Casetă de decizie cu un registru.....................................................................................44
Diagrama bloc a unui FSMD..............................................................................................45
3.2.5 Dezvoltarea codului unui FSMD...................................................................................46
3.2.6 Circuitul de stabilizare bazat pe metodologia RT..........................................................47
3.2.7 Codul cu componentele căii de date explicite...............................................................48
3.2.8 Circuitul de testare.........................................................................................................50
3.2.9 Exemple de modele.......................................................................................................51
3.2.9.1 Perioada de numărare.............................................................................................51
3.2.9.2 Counter de joasă frecvenţă de mare acurateţe........................................................54
3.3 Memoria SRAM externă.....................................................................................................57
Introducere..........................................................................................................................57
3.3.1 Specificaţiile dispozitivului IS61LV25616AL SRAM..................................................58
3.3.1.1 Diagrama bloc şi semnalele I/O..............................................................................58
3.3.2 Parametri de sincronizare .............................................................................................59
3.3.3 Baza controlerului de memorie......................................................................................64
3.3.1.1 Diagrama bloc.........................................................................................................64
3.3.4 Cerinţele de sincronizare...............................................................................................65
3.3.5 Fişierul cu registre versus SRAM..................................................................................66
3.4.1 Un model sigur..............................................................................................................66
3.4.2 Diagrama ASMD .........................................................................................................67
3.4.3 Analiza sincronizării......................................................................................................68
80
3.5.1 Implementarea HDL......................................................................................................69
Bibliografie .............................................................................................78
81