Sunteți pe pagina 1din 78

1.

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ã

Fig. 1.1 Procesul de calcul manual (a) şi cel al maşinii (b)


Hârtia este folosită pentru stocarea informaţiei care poate fi algoritm, respectiv dată.
Elementele caracteristice ale calculatoarelor sunt similare cu cele din modelul uman. Unitatea de
memorie stochează instrucţiuni şi date. Unitatea centrală de prelucrare conţine o unitate de
control, care interpretează şi realizează secvenţierea instrucţiunilor, şi o unitate aritmetică şi
logică, care execută secvenţe de instrucţiuni.
Diferenţa majoră dintre cele două sisteme constă în reprezentarea informaţiei. Omul foloseşte
un limbaj cu un număr foarte mare de simboluri, şi reprezintă numerele (în mod uzual) în baza
10. Calculatoarele moderne, pornind de la natura fizică a elementelor electronice, reprezintă
informaţia în baza 2, şi reduce numărul simbolurilor în mod esenţial. Comunicarea dintre maşină
şi om, conversia informaţiei din limbajul maşină în limbajul uman este realizat de echipamentul
de intrare-ieşire.

1.2 Obiectivul proiectului


Obiectivul acestui proiect este de a construi o maşină de gaurit automata controlata de un
controler bazat pe FPGA, si un microcontroler PIC18F4455, care vor primi comenzi de la un
computer si de a compara modul in care lucreaza fiecare placuta. Poziţionarea de capului de
gaurit fata de piesa de gaurit va fi stabilita de către două motoare pas care vor muta suportul pe
care se gaseste prinsa piesa de gaurit pe cele două direcţii perpendiculare , x şi y. Acest suport ce
sustine piesa de gaurit se va misca de asemenea in sus si in jos pentru a fi efectuata gaura,
miscare ce va fi realizata folosind un motor DC.
Un alt motor DC va fi folosit pentru rotirea capului de gaurit.
Controlerul pe baza de FPGA este descris în limbajul VHDL, si consta din mai multe module,
care vor controla motoare pas cu pas, de poziţionare. Initial am dorit sa putem comanda si
motoarele DC tot cu ajutorul placii FPGA , insa din anumite motive ( pe care le voi specifica mai
jos)nu am reusit.
Acest proiect permite executarea de găuri precis poziţionate si poate avea aplicatii in
diferite domenii, cum ar fi: executarea de PCB-uri, artistice, gravura, etc.
Cerinţele proiectului nostru
- Partea mecanica nu trebuie să împiedice ( prin fortele de frecare , forta de greutate etc )
circulaţia suportului piesei de gaurit pe axele X si Y ; partea mecanică este compusă din mai
multe motoare pas cu pas, şi echipamentul care permite transmiterea miscarii de rotatie de la

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ă.

1.3 Dimensiunea şi performanţa microprocesorului


Următoarele resurse de informaţii ale dispozitivului sunt luate de la ISE raportate pentru
microprocesor într-un dispozitiv de XC3S500E. Rapoartele au evidenţiat caracteristicile care sunt
utilizate şi eficienţa microprocesorului.
Dimensiunea microprocesorului raportată de Map Process este de 100 de părţi din totalul de
4656, în acest caz, se poate reduce la minimum 89 părţi de asamblare mai mari atunci când este
folosit pentru a se potrivi cu un model complet într-un dispozitiv.
Resursele de informaţii sunt următoarele:
- Memoria totală de utilizare 71556 kilobytes
- Prezentare sincronizare:
- Gradul de viteză: -4
- Perioada minimă: 7.147ns (Frecvenţa maximă: 139.919MHz) 69.95 MIPS
- Intrarea minimă apărută după un timp de ceas: 5.762ns
- Ieşirea maximă aflată după un timp de ceas: 7.605ns.

În tabelul 1 sunt arătate dispozitivele logice utilizate


Tabel 1
Dispozitive logice Utilizate Disponibile Utilizare(%)
Celule logice 100 4656 2%
Registre Flip Flops 76 9312 0%
LUT-uri cu 4 intrări 181 9312 1%
IOB-uri 30 232 12%
BlockRAM-uri 1 20 5%
GCLK-uri 1 24 4%

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

Un FPGA (Field Programmable Gate Array), adică o structură de porţi logice


programabile, este un dispozitiv electronic pe bază de semiconductori (disponibil sub formă de
circuit integrat VLSI ), care conţine module elementare (numite adeseori "celule") de funcţiuni
logice de bază (AND, OR, XOR etc..) precum şi celule elementare de memorie. După cum o
indică numele său, ceea ce diferenţiază un FPGA de un circuit integrat "normal" este faptul că
poate fi configurat de către utilizator, acesta putând modifica de exemplu "cablajul logic" intern
al circuitului său FPGA în mod dinamic, pentru a-l adapta necesităţilor sale de moment, sau chiar
pentru a corecta anumite erori de programare. Este de notat că unele circuite FPGA disponibile în
momentul de faţă au capacităţi considerabile, putând integra de exemplu chiar şi arhitecturi de
procesor destul de complexe precum ARM, POWER PC , etc. În general conceptorii acestor
arhitecturi ezită să publice detaliile lor, din motive evidente. Pe de altă parte proiecte "open
source" au început să devină populare în acest domeniu. Dezavantajul faţă de o soluţie ASIC este
că pentru o funcţie logică dată, realizarea acestei funcţii în FPGA oferă performanţe mai modeste
(din punctul de vedere al vitezei) decât versiunea ASIC a aceleiaşi funcţii. Pe de altă parte, având
în vedere costul de producere şi mai ales de concepere al unui ASIC , adeseori prohibitiv, se
impune utilizarea unui FPGA pentru multe aplicaţii. Costul FPGA-urlior a scăzut mult în ultima
perioadă, în acest moment un modul FPGA poate fi achiziţionat pentru mai puţin de 100$.Există
mai multe limbaje de programare utilizabile pentru configurarea FPGA-urilor (nu neapărat
concepute specific pentru FPGA) precum : VHDL sau Verilog. Principalii fabricanţi sunt Altera
şi Xilinx.

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ă.

Fig.2.1 Componentele plăcii Nexys 2

Componentele plăcii Nexys 2:

- 500k – poartă Xilinx Spartan 3E FPGA;


- USB2 – configuraţie bazată pe FPGA şi transferuri de date de mare viteză (utilizând
gratuit soft-ul Adept Suite);
- USB – alimentare ( baterie sau de la o sursă de tensiune externă);
- 16Mb memorie Micron PSDRAM şi 16 Mb memorie Flash Intel StrataFlash ROM;
- platforma Flash a xilinx-ului pentru configuraţii care nu poate fi modificată;

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.

2.3.1 FPGA şi configurarea platformei Flash


FPGA-urile de pe placa Nexys 2 trebuie să fie configurate (sau programate) de către utilizator
înainte de a putea îndeplini orice funcţie. În timpul configurării, un fişier cu extensia .bit este
transferat în celulele de memorie din interiorul FPGA-ului pentru a defini funcţiile logice şi
interconexiunile circuitului.
Soft-ul gratuit ISE/WebPack CAD de la Xilinx poate fi folosit pentru a crea fişiere cu extensia
.bit din VHDL, Verilog, sau fişiere sursă bazate pe scheme.

2.4 Arhitectura microprocesorului


În această subsecţiune vom discuta despre cerinţele de bază ale sistemului, vom prezenta
componentele şi interconectarea lor şi principalele caracteristici ale acestora.
Cel mai important aspect al microprocesorului, este construit pe baza metodologiei FSMD
(maşină cu stări finite cu cale de date) în care vom discuta mai pe larg în capitolul Proiectare şi
implementare. În figura 1.2 sunt prezentate interconexiunile dintre regiştrii, componentele
microprocesorului şi o legendă care prezintă detalii despre funcţionarea componentelor în număr
de biţi.
Componentele construite pe baza FSMD-ului sunt: program counter, unitatea aritmetică şi
logică (ALU), componenta control şi program ROM/RAM.

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.

a. De la FSDM cu scop special la microprocesor cu scop general

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.

3.1 Maşina cu stări finite (FSM)


O maşină cu stări finite(FSM) este utilizată să modeleze un sistem care tranzitează între un
număr finit de stări interne. Tranziţia depinde de starea curentă şi de intrarea externă. Spre
deosebire de un circuit secvenţial obişnuit, tranziţia stării unui FSM nu expune un tipar simplu,
repetitiv. Starea sa următoare este de obicei construită de la zero si este uneori cunoscută ca
logică “la întâmplare”.

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).

3.1.1 Ieşirile Mealy şi Moore


Diagrama bloc a unui FSM este aceeaşi cu a unui circuit secvenţial obişnuit şi este arătat in
fig. 3.2 Constă dintr-un registru de stare, următoarea stare-logică şi ieşire logică. Un FSM este
cunoscut ca o maşină Moore dacă, ieşirea este numai o funcţie a stării şi a intrării externe.
Ambele tipuri de ieşiri pot exista într-un FSM complex, şi ne referim pur şi simplu la ea ca şi
conţinând o ieşire Moore şi o ieşire Mealy. Ieşirile Moore şi Mealy sunt similare dar nu identice.
Înţelegerea diferenţelor subtile dintre acestea este cheia pentru controlul arhitecturii.

Fig.3.2 Reprezentarea FSM

3.1.2 Reprezentarea FSM-ului


O maşină cu stări finite este de obicei specificată de o diagramă de stare abstractă sau o
diagramă ASM (diagramă de stare algoritmică a unei maşini), ambele cuprinzând intrările,
ieşirile, stările şi tranziţiile unui FSM într-o reprezentare grafică. Cele două reprezentări oferă
aceleaşi informaţii.

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

expresie logică / me <= valoare Expresie logică / me <= valoare

altă stare altă stare

Node

mo : iesire Moore intrare


me : iesire Mealy stare

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

(b) ASM bloc


Fig.3.3
mS

24
(a) Diagrama de stare (b) Diagrama ASM

Fig. 3.4 Exemplul FSM

3.1.3 Dezvoltarea codului FSM


Procedura de dezvoltare pentru un cod FSM este similară cu cea a unui circuit secvenţial
obişnuit. Separăm prima dată registrul de stări şi apoi derivăm codul pentru următoarea stare
logică combinaţională şi a ieşirii logice.
Principala diferenţă este logica stării următoare. Pentru un FSM codul pentru logica următoare
urmează curgerea diagramei de stare sau diagramei ASM.
Pentru claritate şi flexibilitate, folosim tipul enumerării de date VHDL pentru a reprezenta
stările FSM. Tipul datei enumerate poate fi explicat cel mai bine printr-un exemplu. Considerăm
exemplul din figura 3.4 care are trei stări:S0,S1 şi S2. Putem introduce un tip de date enumerate
definite de utilizare după cum urmează:
type eg - state-type is(so,sl,s 2);

25
Tipul de date simplu listează toate valorile simbolice. Odată ce tipul de date este definit, poate
fi folosit pentru semnale după cum urmează:

signal state - reg, state - next : eg - state - type ;

Î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.

Listing 1.1 Exemplul FSM

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;

architecture Behavioral of fsm is


type eg_state_type is (s0,s1,s2);
signal state_reg, state_next: eg_state_type;
begin
--state register
process(clk,reset)
begin
if (reset='1') then
state_reg <= s0;
elsif (clk ' event and clk='1' )then
state_reg <= state_next;
end if;
end process;
--next-state-logic
process(state_reg,a,b)
begin
case state_reg is
when s0 =>
if a='1' then
if b='1' then
state_next <= s2;

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)

Detectare front(0 crescător şi 1 descrescător)


Perioada unui tact
Forme de undă ale intrărilor

Ieşiri (LED-uri) Forme de undă ale ieşirilor(care sunt in funcţie de intrare)

Fig.3.5 Simularea componentei FSM

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;

architecture Behavioral of FSM_imbinat_cu_un_circuit_logic_combinational is


type eg_state_type is (s0,s1,s2);
signal state_reg, state_next : eg_state_type;
begin
--state register
process (clk,reset)
begin
if (reset='1') then
state_reg <= s0;
elsif (clk' event and clk='1') then
state_reg <= state_next;
end if;
end process;
-- next-state/output logic
process(state_reg,a,b)
begin
state_next <= state_reg; --default back to same state
y0 <= '0';
y1 <= '0';
case state_reg is
when s0 =>
if a='1' then
if b='1' then
state_next <= s2;
y0 <= '1';
else
state_next <= s1;
end if;
--no else branch
end if;
when s1 =>
y1 <= '1';
if (a='1') then
state_next <= s0;
--no else branch
end if;
when s2 =>
state_next <= s0;
end case;
end process;
end Behavioral;

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.

3.1.4 Modele cu exemple


3.1.4.1 Detectorul de front crescător

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.

Modelul de bază Moore


Diagrama de bază şi diagrama ASM a unui detector de front bazat pe un sistem Moore sunt
arătate in figura 3.6. Stările zero şi unu indică că semnalul de intrare a fost ‘0’ şi ’1’ pentru o
vreme. Urcarea detectorului de front apare când intrarea se schimbă de la ‘1’ într-o stare zero.
FSM se mută la starea de limită şi ieşirea, tick, este menţionată în această stare. O diagramă de
timp este arătată în figura 3.7. Codul este arătat în listingul 1.3.

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;

architecture moore_arch of dedector_front is


type state_type is (zero,detector,one);

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

Fig. 3.7 Diagrama de sincronizare pentru două detectoare de front

32
(a) Diagrama cu stări (b) Diagrama ASM
Figura 3.8 Detector de front bazat pe maşina Mealy.

Modelul de bază Mealy


Diagrama de stare şi diagrama ASM a unui detector de front bazat pe un sistem Mealy sunt
arătate in figura 3.8. Starea zero şi unu au înţelesuri similare.
Când FSM-ul este în starea zero şi intrarea este pusă pe unu, ieşirea este atribuită imediat. FSM
se mută la starea unu şi frontul crescător următorului ceas şi ieşirea este neatribuită. O diagramă
de timp este arătată la baza figurii 3.7.
De notat că datorită întârzierii de propagare semnalul de ieşire este în continuare atribuită la
frontul crescător a ceasului următor . Codul este arătat în listingul 1.4.

Listing 1.4 Detector de front bazat pe maşina Mealy.


entity detector_front is
Port ( clk : in STD_LOGIC;
reset : in STD_LOGIC;

33
level : in STD_LOGIC;
tick : out STD_LOGIC);
end detector_front;

architecture mealy_arch of detector_front is


type state_type is (zero,one);
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 <= one;
tick <= '1';
end if;

when one =>


if level='0' then
state_next <= zero;
end if;
end case;
end process;
end mealy_arch;

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

Listing 1.5 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;

architecture gate_level_arch of detector_front is


signal delay_reg : std_logic;
begin
--registru de intarzaiere
process(clk,reset)
begin
if (reset='1') then
delay_reg <='0';
elsif (clk' event and clk='1') then
delay_reg <= level;
end if;
end process;
--decodare logica
tick <= (not delay_reg) and level;
end gate_level_arch;

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.

3.1.5 Circuitul de stabilizare


Întrerupătoarele şi butoanele care se pot apăsa pe placa de dezvoltare sunt dispozitive
mecanice. Când este apăsat comutatorul, apar oscilaţii înainte de a se stabiliza. Oscilaţiile se
opresc de obicei în 20 ms.
Scopul circuitului de stabilizare este să filtreze paraziţii asociaţi cu tranziţiile de întrerupere.
Scopul circuitului de stabilizare a oscilaţiilor este să filtreze paraziţii asociaţi cu tranziţiile de
comutare. Semnalul de ieşire este stabilizat de două scheme bazate pe un model FSM sunt arătate
în cele două părţi ale figurii 3.10. Un model pe baza FSM foloseşte un timer acţionat în timp de
10 ms. Timer-ul generează un tic de un ciclu de ceas la fiecare 10 ms şi FSM-ul foloseşte această
informaţie pentru a pute determina dacă această valoare de intrare s-a stabilizat.
În prima schemă FSM-ul ignoră scurtele sărituri şi schimbă valoarea ieşirii filtrate numai după
ce intrarea este stabilizată pentru 20 ms. Diagrama de sincronizate a ieşirii este arătată în mijlocul
figurii 3.10. Diagrama de a acestui FSM este arătată în figura 3.11. Stările zero şi unu indică că
semnalul de intrare de întrerupere a fost stabilizat cu valoarea ‘0’ şi ‘1’. Să considerăm că FSM
se află iniţial în starea zero, se mută la starea de aşteptare1_1 când întrerupătorul se schimbă la
’1’. La starea aşteptare1_1, FSM aşteptă pentru afirmarea m_tick. Dacă întrerupătorul devine ‘0’
în această stare implică mărimea valorii ’1’ nu a durat destul şi FSM se întoarce în starea zero.

36
Fig. 3.10 Formele de undă stabilizate

Fig. 3.11 Diagrama de stare a circuitului de stabilizare

37
Fig. 3.12 Schema bloc de testare a circuitului de stabilizare

3.1.6 Circuitul de testare


Folosim un circuit de numărare a salturilor pentru a verifica operaţia de detectare a
frontului şi un circuit de stabilizare. Diagrama bloc este arătată in figura 3.12. Intrarea circuitului
de verificare este dintr-un întrerupător şi buton .
In partea de jos semnalul este mai întâi alimentat circuitului de stabilizare şi apoi detectorul de
front.
De aceea un tact per ciclu este generat de fiecare data când butonul este apăsat şi eliberat.
Tactul controlează posibilitatea pornirii unui counter de 8 biţi al cărui conţinut este legat
circuitului LED-time-multiplexing şi arătat în cele două cifre din stânga a celui de-al 7-lea
segment al plăcii prototip Nexys cu afişaj de tip LED. În partea de sus, semnalul de intrare este
alimentat direct către detectorul de front şi circuitul de stabilizare şi numărul este arătat în cele
două cifre din dreapta al celui de-al 7-lea segment al plăcii prototip cu afişaj de tip LED. Partea
de jos a numărătorului acestei cifre numără tranziţiile de la zero la unu la fel ca şi salturile. Codul
este arătat în listing-ul 5.7. Foloseşte de fapt instanţierea componentei pentru a realiza diagrama
bloc.

Listing 1.7 Verificarea circuitului de stabilizare şi detectarea frontului crescător

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.

3.2.1 Unica operaţiune RT


O operaţie RT specifică manipularea datelor şi transferul pentru un singur registru de
destinaţie. Este reprezentat de notaţia:
rdest ←f ( rsrc 1 ,rsrc 2 ,..., rsrcn )

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:

− r1 ← 0 . A este constant, 0 este stocat în registrul r1.


− r1 ← 0 . Conţinutul registrului r1 este rescris în el însuşi.
− r 2 ← r 2 . Registrul r2 este schimbat spre dreapta trei poziţii şi apoi rescris în el însăşi.
− r 2 ← r1 . Conţinutul registrului r1 este transferat în registrul r2.
− i ← i + 1. conţinutul registrului i este incrementat cu valoarea 1 şi rezultatul este rescris
în el însuşi.
− d ← s1 + s 2 + s3 . Suma registrelor s1,s2 şi s3 este rescrisă în registrul d.

40
(a) diagrama bloc

(b) diagrama de timp

Fig.3.13 Diagrama bloc şi de timp a unei operaţii RT

y ← a ∗ a . a pătrat este scris în registrul y.

O singură operaţiune RT poate fi implementată prin construirea unui circuit combinaţional


pentru funcţia f (⋅) şi conectarea intrărilor şi ieşirilor registrului.
De exemplu să considerăm operaţia a ← a − b + 1 . Funcţia f (⋅) implică un scăzător şi un
incrementator. Diagrama bloc este arătată în figura 3.13(a). Pentru claritate folosim sufixele reg

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).

3.2.3 Diagrama ASMD


Un circuit bazat pe metodologia RT specifică care operaţie RT ar trebui executată în fiecare
pas. Din moment ce operaţiunea RT este gata pe baza unui ceas , timpul este similar unei stări de
tranziţie a unui FSM. Totuşi un FSM este alegerea naturală pentru a specifica secvenţa un unui
algoritm RT. Extindem diagrama ASM pentru a încorpora operaţiile RT şi o numim
ASMD(ASM cu cale de date).Operaţiile RT sunt tratate ca un alt tip de activitate şi pot fi plasate
acolo unde sunt folosite semnale de ieşire. Un segment al unei diagrame ASMD este arătat in
figura 3.13(a).

(a) Segmentul ASMD (b) Diagrama bloc


Fig. 3.13 Realizarea segmentului ASMD

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).

(a) bloc ASM

43
(b) Diagrama bloc

Fig.3.14 Realizarea unei operaţii RT intr-o casetă de decizie condiţională

3.2.4 Casetă de decizie cu un registru


Înfăţişarea unei diagrame ASMD este asemănătoare cu cea a unei diagrame normale.
Principala diferenţă este operaţia RT în diagrama ASMD este controlată de un ceas încorporat şi
registrul de destinaţie este „adus la zi” când FSMD iese din blocul curent ASMD dar nu în
interiorul blocului. Operaţia r ← r − 1 înseamnă de fapt :

• 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

Fig.3.15 Blocul ASM nenatural pentru o întârziere

Diagrama bloc a unui FSMD


Diagrama bloc conceptuală a unui FSMD este împărţită într-o cale de date şi o cale de control
cum este arătat în figura 3.16. Calea de date efectuează operaţia RT curentă. Constă din :

- registre de date : depozitează rezultatele calculelor intermediare,


- unităţi funcţionale : efectuează funcţiile specificate de operaţia RT,
- reţeaua de ghidaj : rutează datele dintre registrele de stocare şi unităţile funcţionale.

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.

Fig.3.16 Diagrama bloc a unui FSMD

3.2.5 Dezvoltarea codului unui FSMD


Folosim un circuit de stabilizare îmbunătăţit pentru a demonstra derivarea codului FSMD.
Deşi circuitul de stabilizare din secţiunea 3.1.5 utilizează un FSM şi un timer (care este un circuit
secvenţial obişnuit) nu este bazat pe metodologia RT deoarece cele două unităţi funcţionează
independent şi FSM nu controlează timer-ul. Deoarece cele 10 ms ale tactului pot fi atribuite
oricând, FSM-ul nu ştie cât timp s-a scurs când primul tact este detectat în starea wait1_1 sau
wait0_1. Astfel, perioada de aşteptare în acest model este între 20 şi 30 milisecunde dar nu este
un interval exact. Această deficienţă poate fi depăşită prin aplicarea metodologiei RT. În această
secţiune, folosim acest circuit de stabilizare îmbunătăţit pentru a ilustra dezvoltarea codului
FSMD.

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

Fig.3.17 Diagrama ASMD a circuitului de stabilizare

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.

3.2.7 Codul cu componentele căii de date explicite


Prima abordare pentru dezvoltarea codului FSMD este să separăm controlul FSM şi
componentele cheie ale căii de date. Dintr-o diagramă ASMD identificăm în primă instanţă
componentele cheie din calea de date şi semnalul de control asociat şi apoi descriem aceste
componente în segmente de cod individuale.
Componenta cheie a căii de date a circuitului de stabilizare a diagramei ASMD este un
numărător decrementat personalizat de 21 de biţi care pot fi:

- iniţializaţi cu o valoare specifică,


- numără înapoi sau pune de pauză,
- atribuie un semnal de stare când numărătorul atinge 0.

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;

architecture Behavioral of stabilizator is


constant N: integer:=21; --filtru 2^N * 20ns=40ms
type state_type is (zero, wait_0, one, wait_1);
signal state_reg, state_next : state_type;
signal q_reg, q_next : unsigned(N-1 downto 0);
signal q_load, q_dec, q_zero : std_logic;
begin
--FSMD starea cu registre de date
process(clk,reset)
begin
if reset='1' then
state_reg <= zero;
q_reg <= (others=>'0');
elsif (clk'event and clk='1') then
state_reg <= state_next;
q_reg <= q_next;
end if;
end process;
--FSMD cu cale de date(counter) next-state-logic
q_next <= (others=>'1') when q_load='1' else
q_reg -1 when q_dec='1' else
q_reg;
q_zero <= '1' when q_next=0 else '0';
--FSMD calea de control next-state logic
process
begin
q_load <= '0';
q_dec <= '0';
db_tick <='0';
state_next <= state_reg;
case state_reg is
when zero =>
db_level <= '0';
if (sw='1') then
state_next <= wait_1;
q_load <='1';
end if;
when wait_1=>
db_level <= '0';
if (sw='1') then
q_dec <= '1';
if (q_zero='1') then
state_next <= one;
db_tick <='1';
end if;
else --sw='0'

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;

3.2.8 Circuitul de testare


Testarea circuitului de stabilizare discutată în secţiunea …… poate fi utilizată pentru a
verifica operaţia noului model. Din moment ce ieşirile revăzute ale circuitului de stabilizare
includ un semnal tick de o perioadă a ceasului, nici un detector de front nu este necesar după
circuitul de stabilizare. Diagrama bloc revizuită este arătată în figura 3.18 şi codul corespunzător
în listing-ul 2.3

Fig. 3.18 Schema bloc a circuitului de stabilizare

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

Listing 2.7 Perioada 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;

architecture Behavioral of perioada_numarare is


constant clk_ms_count : integer := 50000;--1ms tick
type state_type is(idle, waite,count,done);
signal state_reg, state_next : state_type;
signal t_reg, t_next : unsigned(15 downto 0);
signal p_reg, p_next : unsigned (10 downto 0);
signal delay_reg : std_logic;
signal front : std_logic;

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;

3.2.9.2 Counter de joasă frecvenţă de mare acurateţe


Un counter de frecvenţă măsoară frecvenţa unei intrări în formă de undă periodică. Modul
comun de a construi un counter de frecvenţă este de a calcula numărul de pulsuri de intrare într-o
durată de timp fixă, să zicem o secundă. Deşi această abordare este bună pentru intrările de înaltă
frecvenţă, nu poate măsura cu acurateţe un semnal de joasă frecvenţă. De exemplu, dacă intrarea
este în jur de 2 Hz , măsurătoarea nu poate spune dacă este de 2,123 Hz sau 2,576 Hz. Reamintim

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.

Putem utiliza numărătorul de perioade, circuitul de împărţire şi convertorul binar în BCD


pentru a efectua cele trei sarcini şi a crea un alt FSM care este controlul principal pentru a
secvenţa, coordona operaţia celor trei circuite. Schema bloc este arătată în figura 3.20(a) şi
diagrama ASM a controlului principal este arătată în figura 3.20(b). FSM-ul foloseşte semnalul
start şi done_tick ale acestor circuite pentru a iniţializa fiecare proces şi a detecta finalizarea
procesului. Codul este arătat în listing-ul 2.8.

54
(a) Rang-nivel diagrama bloc

(b) Diagrama ASM a controlului principal

Fig. 3.20 Counter de joasă frecvenţă de mare acurateţe

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;

architecture Behavioral of counter_joasa_frecventa is


type state_type is (idle,count,frecventa,b2b);
signal state_reg, state_next : state_type;
signal prd : std_logic_vector(9 downto 0);
signal divizor,divident,coeficient : std_logic_vector(19 downto 0);
signal prd_start,divizor_start,b2b_start : std_logic;
signal prd_done_tick,divizor_done_tick,b2b_done_tick: std_logic;
begin
--============================================
-- instatiem componenta
--============================================
--instantiem perioada de numarare
prd_count_unit : entity work.perioada_numarare
port map(clk=>clk, reset=>reset, start=>prd_start,si=>si,ready=>open,
done_tick=>prd_done_tick,prd=>prd);
-- instantirea circuitului de impartire
div_unit : entity work.impartire
generic map(w=>20,CBIT=>5)
port map(clk=>clk, reset=>reset, start=>divizor_start,

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;

3.3 Memoria SRAM externă


Introducere
Memoria cu acces aleator (RAM) este folosită pentru stocare masivă intr-un sistem digital din
moment ce o celulă RAM este mult mai simplu decât o celulă FF. Un tip de RAM este utilizat
destul de des este RAM static asincronă(SRAM). Spre deosebire de un registru, în care datele
sunt demonstrate şi stocate la un front al semnalului de ceas, accesarea datelor dintr-un SRAM
asincron este mai complicată. O operaţie de citire sau scriere cere ca datele, adresele şi semnalele
de control să fie atribuite într-o ordine specifică într-o ordine specifică şi aceste semnale trebuie
să fie stabile pentru o anumită perioadă de timp pe durata operaţiei.
Este dificil pentru un sistem sincron să acceseze un SRAM direct. Utilizăm, de obicei un
controler de memorie ca interfaţă, care ia comanda de la sistemul principal sincron apoi
generează semnalele potrivite la momentul potrivit pentru a accesa SRAM. Controlerul apără
sistemul principal de timing detaliat şi face ca accesarea memoriei să fie să apară ca o operaţie
sincronă. Performanţa unui controlor de memorie este măsurată prin numărul de accesări de
memorie care pot fi completate într-o perioadă dată. În timp ce crearea unui controler de memorie

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.

3.3.1 Specificaţiile dispozitivului IS61LV25616AL SRAM


3.3.1.1 Diagrama bloc şi semnalele I/O
Placa S3 are două dispozitive IS61LV25616AL care sunt SRAM de 256K pe 16 biti produse
de Integrated Silicon Solution, Inc.(ISSI). O diagramă bloc simplificată este arătată în figura
3.20. Acest dispozitiv are o adresă de bus pe 18 biţi,ad, un bus de date bidirecţional de 16 biţi şi 5
semnale de control. Bus-ul de date este divizor bytes de sus şi de jos care pot fi accesaţi
individual.
Cele cinci semnale de control sunt:

- Ce_n (chip pornit): opreşte sau porneşte chip-ul


- We_n (scriere pornită): opreşte sau porneşte operaţia de scriere
- Oe_n (pornirea ieşirii) : opreşte sau porneşte ieşirea
- Lb_n (pornirea byte-ului de jos) opreşte sau porneşte byte-ul de jos
al bus-ului de date.
- ub_n (pornirea byte de sus ): opreşte sau porneşte byte-ul de sus al bus-ul de date.

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.

3.3.2 Parametri de sincronizare


Caracteristicile de corelare ale unui SRAM asincron sunt destul de complexe şi implică mai
mult de două duzini de parametri. Ne concentrăm numai pe câţiva parametri cheie care sunt
relevanţi pentru conceptul nostru.
Diagramele de sincronizare simplificate pentru două tipuri de operaţii de citire sunt arătate în
figura 3.21(a) şi (b). Parametri de corelare relevanţi sunt:

- t RC : timpul ciclic de citire, timpul minim scurs între două operaţii de citire. Este

acelaşi ca t AA pentru SRAM.


- t AA : timpul de accesare a adresei, timpul cerut pentru a obţine o ieşire de date stabilă

după schimbarea adresei.


- t OHA : timpul de stare al ieşirii, timpul la care ieşirea de date rămâne validă după ce
adresa se schimbă. Aceasta nu trebuie confundată cu timpul de stare al unui FF declanşat
de front care este o constrângere pentru intrarea d.
- t DOE : timpul de accesare al pornirii ieşirii, timpul necesar pentru a obţine date valide
după oe_n este dezactivat.
- t HZOE : timpul de pornire al ieşirii la hight-z, timpul în care buffer-ul cu tri-state să
intre în starea de înaltă impedanţă după ce oe_n este dezactivat.
- t LZOE : timpul de pornire al ieşirii la low-z, timpul în care buffer-ul cu tri-state

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

(b) Diagrama de sincronizare şi citire a ciclului oe_n-controler

Fig.3.21 Diagrama de timp a două tipuri de operaţii de citire

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 -

Fig.3.22 Diagrama de sincronizare şi a ciclului de scriere

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 -

Parametri de sincronizare sunt:


- t wc : timpul ciclului de scriere, timpul minim de scriere dintre două operaţii de scriere.
- t SA : timpul de stabilire a adresei, timpul minim în care adresa trebuie să fie stabilă
înainte ca we_n să fie activată.
- t HA : timpul de menţinere a adresei, timpul minim în care adresa trebuie să fie stabilă
după ce we_n este dezactivat.
- t PWE 1 : lărgimea pulsului we_n, timpul minim în care we_n trebuie atribuit.
- t SD : timpul de stabilire a datelor, timpul minim în care datele trebuie să fie stabile
înainte de frontul latching (frontul în care we_n se mută de la 0 la 1).

- 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.

Fig.3.23 Rolul controlerului memoriei SRAM

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:

- mem : este atribuit la valoarea ‘1’ pentru a iniţializa o operaţie de memorare


- rw : specifică dacă este o operaţie de citire (’1’) sau de scriere (’0’)
- addr : este adresa de 18 biţi
- data_f2s : sunt datele de 16 biţi care trebuie scrise în SRAM (sufixul f2s este pentru
FPGA la SRAM)
- data_s2f_r : sunt datele de 16 biţi recuperate din SRAM (sufixul s2f este pentru
SRAM la FPGA)
- data_s2f_ur : sunt datele de 16 biţi ne înregistrate recuperate din SRAM
- ready : este semnalul de stare indicând dacă controlerul este gata să accepte o nouă
comandă. Acest semnal este necesar din moment ce o operaţie de memorie poate lua
mai mult de un ciclu de ceas.
Când sistemul principal vrea să acceseze memoria, plasează adresa şi datele (pentru o operaţie
de scriere) pe bus şi activează comanda (semnalele mem şi rw). La detectarea frontului ceasului,
toate semnalele sunt selectate de controlerul de memorie şi operaţia dorită este efectuată. Pentru o
operaţie de citire, datele devin disponibile după unul sau două cicluri ale ceasului.
Diagrama bloc a unui controler de memorie este arătată în figura 3.24. Calea sa de date conţine
un registru de adresă, care stochează adresa şi două registre de date, care stochează datele din
fiecare direcţie. Din moment ce data bus, dio, este un semnal bidirecţional, un buffer cu trei stări
este necesar. Calea de control este un FSM care urmează diagramele de sincronizare şi
specificaţiile din tabelul 3.2 şi 3.3 pentru a genera secvenţa de control potrivită.

64
Fig.3.24 Diagrama bloc a controlerului de memorie

3.3.4 Cerinţele de sincronizare


Deşi diagramele de sincronizare par a fi complicate la o primă privire, secvenţele de control
sunt destul de simple. Să considerăm un ciclu de citire. we_n ar trebui dezactivat în timpul
întregii operaţii. Secvenţa sa operaţională de bază este :

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.

De notat că t HD (timpul de menţinere a datelor după ce scriere se termină) este de 0 ns pentru


acest SRAM ceea ce implică că este teoretic posibil să fie îndepărtate datele şi să fie dezactivat
we_n simultan. Dar din cauza variaţiilor de propagare, această condiţie nu poate fi garantată într-
un circuit real. Pentru a atinge latching-ul potrivit, trebuie să ne asigurăm că semnalul we_n este
întotdeauna dezactivat primul.

3.3.5 Fişierul cu registre versus SRAM


Elementele sale de stocare din bază sunt DFFs şi astfel ele sunt complet sincronizate. Deşi un
controler de memorie înconjoară SRAM într-o interfaţă sincronă există câteva diferenţe :

- Un fişier registru are de obicei un port de scriere şi porturi de citire multiple.


- Porturile de citire şi scriere ale unui fişier registru pot fi accesate în acelaşi timp (i.e,
operaţiile de scriere şi citire pot fi executate în acelaşi timp).
- Scrierea într-un registru ia numai un ciclu de ceas.
- Datele din portul de citire al unui registru sunt întotdeauna disponibile şi operaţiile de
citire nu cer ceasuri sau semnale de control adiţionale.
În concluzie, un fişier registru este mai rapid şi mai flexibil. Deşi mărimea circuitului potrivită
a unui FF, fişierul registru este potrivit numai pentru depozitarea unor cantităţi mici.

3.4.1 Un model sigur


Cu schema bloc din figura 3.24 singura sarcină rămasă este să derivăm controlerul. Prima
noastră schemă foloseşte un model „sigur” ceea ce înseamnă că modelul oferă limite de
sincronizare foarte mari şi că nu impune nici un fel de constrângeri de sincronizare stringente.
Semnalele de control sunt generate din FSM. Controlerul utilizează două cicluri de ceas(i.e, 40ns)
pentru acces la memoria completă şi cere trei cicluri de ceas pentru operaţiile back-to-back.

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.

3.4.3 Analiza sincronizării


Pentru a asigura funcţionarea corectă a unui controler de memorie, trebuie să verificăm dacă
modelul întâlneşte diferite cerinţe de sincronizare. Să ne amintim că FSM este controlat de un
ceas de 50 Mhz şi de aceea stă în fiecare stare timp de 20 ns.
În timpul ciclului de citire we_n este atribuit timp de două stări, totalizând 40 ns, care precum
o margine de 30 ns peste t AA de 10 ns. Deşi pare că oe_n poate fi neatribuit în starea rd2 aceasta
impune o constrângere de sincronizare stringentă. Datele sunt stocate în registrul data_s2f când
FSM se mută din starea rd2 în starea idle.
Deşi oe_n este neatribuit la tranziţie, datele rămân valide pentru un scurt interval din cauza
întârzierii FPGA şi t HZOE a cipului SRAM. Poate fi sincronizată corect la un front de ceas.

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.

3.5.1 Implementarea HDL


Codul HDL poate fi derivat urmând diagrama bloc din figura 3.24 şi diagrama ASMD din
figura 3.25. Controlerul de memorie trebuie să genereze rapid semnale de control fără zgomote
de impuls(glitches). O metodă este aceea de a modifica ieşirea logică pentru a include loock-
ahead output buffers pentru semnale de ieşire Moore. Această schemă adaugă un buffer (i.e,
DFF) pentru fiecare semnal de ieşire pentru a reduce zgomotele de impuls şi a reduce zgomotele
de impuls şi a reduce întârzierea ieşirii la ceas. Pentru a compensa întârzierea de un ciclu
introdusă de buffer, look-ahead la valoarea viitoare a stării (semnalul state next) şi o utilizăm
pentru a înlocui valoarea curentă a stării (semnalul state_reg) în ieşirea logică a FSM-ului.
Codul HDL complet este arătat în listingul 3.1. Pentru a facilita expansiuni viitoare etichetăm
două cipuri SRAM de pe placa S3, ca a şi b şi adăugăm un sufix a la semnalul I/O ale SRAM în
declaraţia portului. De notat că buffer-ele cu trei stări sunt necesare pentru un semnal de date
bidirecţional dio_a.

Listing 3.1 Controler SRAM

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;

architecture Behavioral of sram_ctrl is


type state_type is (idle, rd1, rd2,wr1,wr2);
signal state_reg, state_next : state_type;
signal data_f2s_reg, data_f2s_next : std_logic_vector(15 downto 0);
signal data_s2f_reg, data_s2f_next : std_logic_vector(15 downto 0);
signal addr_reg, addr_next : std_logic_vector(17 downto 0);
signal we_buf, oe_buf, tri_buf : std_logic;
signal we_reg, oe_reg, tri_reg : std_logic;
begin
--starea si registru de date
process(clk,reset)
begin
if (reset='1') then
state_reg <= idle;
addr_reg <= (others=>'0');
data_f2s_reg <= (others=>'0');
data_s2f_reg <=(others=>'0');
tri_reg <= '1';
we_reg <= '1';
oe_reg <= '1';
elsif (clk'event and clk='1') then
state_reg <= state_next;
addr_next <= addr_next;
data_f2s_reg <= data_f2s_next;
data_s2f_reg <= data_s2f_next;
tri_reg <= tri_buf;
we_reg <= we_buf;

oe_reg <= oe_buf;


end if;
end process;
-- urmatoarea stare logica
process(state_reg, mem, rw,dio_a,addr,data_f2s,
data_f2s_reg,data_s2f_reg,addr_reg)
begin
addr_next <= addr_reg;
data_f2s_next <= data_f2s_reg;
data_s2f_next <= data_s2f_reg;
ready <= '0';
case state_reg is
when idle =>
if mem='0' then
state_next <= idle;
else
addr_next <= addr;
if rw='0' then --scrie
state_next <= wr1;
data_f2s_next <= data_f2s;
else --citeste
state_next <= rd1;

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.

4.1 Simularea microprocesorului


În simularea microprocesorului din figura de mai jos putem observa formele de undă ale
porturilor de intrare(in_port0...7), ale ceasului intern(clk), semnalele de întrerupere, adresele
instrucţiunilor şi datelor din memorie.

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

Aplicaţia utilizatorului pentru resetarea intrării

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.

4.3 READ şi WRITE STROBES


Aceste impulsuri sunt folosite de circuite externe, pentru a confirma operaţiunile de intrare şi
ieşire. În waveforms ( formele de undă) de mai jos, se presupune că acest conţinut al registrului
SE este de 47, precum şi conţinutul de registru SA este 42. PORT_ID [7:0] este valabil timp de 2
cicluri de ceas furnizând timp suplimentar pentru decodificare logică externă şi activarea
conectării sincrone RAM. WRITE_STROBE este furnizat pe cel de-al doilea ciclu de ceas pentru
a confirma activarea scrierii de către microprocesor. În cele mai multe cazuri, READ_STROBE
nu vor fi utilizat de un circuit decodificator extern, dar din nou, apare în cel de-al doilea ciclu şi
indică frontul real a ceasului de pe care se citesc datele specificate în registru.

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.

5.2 Avantajele microprocesorului


- FPGA permite o gamă largă de aplicaţii care oferă un proces complex;
- fiabilitatea, datorită faptului că microprocesorul ocupă un spaţiu redus din celulele
reconfigurabile din interiorul FPGA-ului, respectiv doar 100 de celule din cele 4656,
aceasta duce la creşterea vitezei de lucru a microprocesorului;

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

1. Haller, P. Sisteme cu microprocesoare.Curs. Tirgu-Mures universitatea “Petru Maior”


2. Pong P. Chu FPGA Protoyiping By VHDL Examples. „Cleveland Stat University”2008.
3. Creţ, O., Văcariu, L. Limbajul VHDL. Cluj-Napoca, Editura U.T.PRES, 2007
4. Nicula, D., Toacşe, Gh. Electronică digitală. Bucureşti, Editura Tehnică, 2005.
5. Morar, A. Analiza şi sinteza dispozitivelor numerice. Curs. Tirgu-Mures, Universitatea „Petru Maior”
2005.
6. Gheorghe Ş., Virgil Bistriceanu. Circuite integrate digitale. Bucureşti, Editura Didactică şi
Pedagogică R.A. 1992.
7. Sztojanov I., Paşca S., Tomescu N. Electronică analogică şi digitală. Cluj-Napoca, Editura
ALBASTRĂ .2002.
8. Huţanu C. Circuit logice şi comenzi secvenţiale. Iaşi, Editura Junimea 1983.
9. www.didgilentic.com
10. www.xilinx.com
11. http://ea.ubm.ro/

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

2. Structuri logice programabile..............................................................10


2.1 FPGA....................................................................................................................................10
2.2 VHDL – scurt istoric............................................................................................................11
2.3 Nexys 2.................................................................................................................................11
2.3.1 FPGA şi configurarea platformei Flash.........................................................................13
2.4 Arhitectura microprocesorului..............................................................................................13
Dimensiunea Programului......................................................................................................14
Regiştrii de uz general. .........................................................................................................14
Unitatea Aritmetică şi logică..................................................................................................15
Program Control.....................................................................................................................15
Reset-ul...................................................................................................................................16
Memoria internă.....................................................................................................................16
Întreruperea.............................................................................................................................16

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

4. Rezultate experimentale ...................................................................72


4.1 Simularea microprocesorului................................................................................................72
4.2 RESET-ul..............................................................................................................................73
4.3 READ şi WRITE STROBES...............................................................................................74
4.4 Simularea circuitului de divizare .........................................................................................75

5.Analiza rezultatelor obţinute................................................................76


5.1 Concluzii...............................................................................................................................76
5.2 Avantajele microprocesorului...............................................................................................76
5.3 Perspective ...........................................................................................................................77

Bibliografie .............................................................................................78

81

S-ar putea să vă placă și