Sunteți pe pagina 1din 89

Proiectarea cu dispozitive programabile

Introducere
Clasificarea circuitelor integrate
Dispozitivele numerice se realizeaz n baza circuitelor integrate (CI).
Dup numrul de tranzistoare pe capsul CI se clasific n: SSI, MSI, LSI,
VLSI i ULSI.

Dup gradul de specificare al circuitelor folosite ntr-o aplicaie, CI se


clasific n:
1. Circuite standard sau de uz general (de la SSI pn la ULSI),
2. Circuite semidedicate (circuite logice programabile PLD Programmable
Logic Devices
3. Circuite dedicate ASIC Application Specific Integration Circuit
Proiectarea cu circuite standard permite utilizarea eficient a ariei de siliciu,
dar are i un ir de desavantaje:
- consum mare de energie;
- disipare mare de cldur;
- numr foarte mare de interconexiuni;
- viteza de lucru relativ sczut, datorit conexiunilor externe i a
punctelor de sudur;
- fiabilitatea scade proporional cu creterea complexitii;
- testarea i depanarea dificil.
Proiectarea cu circuite dedicate ASIC se face pentru un numr foarte mic de
aplicaii, sau chiar pentru una singur.
1

Pentru o aplicaie dat, ASIC-urile obin performane foarte bune, ocup un


spaiu mult mai mic i consum puin energie. n cazul unor producii de serie
mari, preul de cost unitar devine foarte bun.
Dezavantajele:
- Durata mare a ciclului de dezvoltare a circuitului.
- Preul ridicat al proiectrii circuitului integrat (30 000$ - 2 500 000$)
- Sunt excluse optimizri post-design.
- Sunt puin flexibile.
Circuitele programabile PLD au o structur foarte general, configurabil de
utilizator. Termenul programare presupune configurarea circuitului la nivel fizic.
Avantajele proiectrii cu PLD:
- Permit implementarea circuitelor specializate direct n hardware.
- Risc sczut n faza de proiectare.
- Cost iniial redus.
- Timp de proiectare redus.
- Permit optimizri post-design.
Clasificarea PLD
Termenul de circuit logic programabil sau PLD (Programmable Logic
Devices) este un termen general care se refer la orice tip de circuit integrat care
poate fi configurat la nivel fizic (programat) de ctre utilizator pentru
implementarea unui proiect. Majoritatea acestor dispozitive folosesc tehnologii ce
permit reprogramarea funciilor, ceea ce nseamn c erorile de proiectare pot fi
corectate fr a nlocui dispozitivul sau a modifica fizic conexiunile.
Unul dintre cele mai folosite circuite logice programabile a fost memoria de
tip ROM programabil o singur dat (PROM).
Plecnd de la aceast arhitectur s-au dezvoltat ariile logice programabile
de tip PLA (Programmable Logic Array) dedicate implementrii funciilor logice.
n circuitele PLA att aria de pori I ct i cea de pori SAU sunt programabile.
Logica programat a devenit mai popular la mijlocul anilor `70 odat cu apariia
ariilor logice programabile de tip PAL-uri (Programmable Array Logic). Acest tip
de arhitectur combin o arie programabil de pori I cu o arie de pori SAU fix.
Aceste circuite constituie varianta MSI (Medium Scale Integration) a produciei
PLD.
Capacitatea n continu cretere a circuitelor integrate a oferit productorilor
ocazia de a realiza PLD tot mai mari (Variantele LSI i VLSI) . Astfel au aprut
PLD complexe (CPLD). Un CPLD este un ansamblu format din mai multe circuite
PAL i o structur de interconectare, toate realizate pe acelai chip.
Cam n aceeai perioad de timp, ali productori de CI au abordat n mod
diferit problema extinderii dimensiunilor chipurilor. Astfel au aprut circuitele
FPGA (Field Programmable Gate Array. Circuitele FPGA conin un numr mare
de blocuri logice amplasate n form de matrice bidimensional i o structur de
interconectare amplasat n jurul fiecrui bloc.
Astfel circuitele PLD pot fi clasificate n:
2

SPLD (Simple Programmable Logic Device) PROM, PLA, PAL


CPLD (Complex Programmable Logic Device)
FPGA (Field Programmable Gate Array)
Circuitele PLD permit reducerea etapelor de trecere din faza de proiect la
cea de prototip i apoi n producie.
Proiectarea circuitelor PLD se efectueaz prin intermediul mijloacelor CAD
(Computer Aided Design), care permit proiectarea fie n mod schematic, fie cu
limbaje de descriere hardware HDL (Hardware Description Language): VHDL,
Verilog, ABEL (Advanced Booleean Expression Language), AHDL.

Circuite logice programabile simple (SPLD)


Memorii ROM
Memoria ROM este un circuit combinaional care stocheaz permanent
(memorie nevolatil) informaia binar, iar aceast informaie poate fi numai citit.
Memoria PROM (Programmable ROM) poate fi programat o singur data.
Metode de programare: prin mti (la etapa de fabricare) sau fuzibile (de
ctre utilizator).
Fuzibilul este o pelicul subire de CrNi, care se vaporizeaz la trecerea
unui curent suficient prin el. Programarea const n selecia adresei i a liniei de
date i aplicarea unui impuls de tensiune (10-30 V) pe un pin special de
programare.
Tehnologia de fabricare: bipolar sau MOS.
Memoria EPROM (Erasable PROM) poate fi programat de mai multe ori,
pentru c memoria poate fi ters prin expunere ala raze ultraviolete. Matricea de
memorie conine tranzistoare MOS cu poart flotatnt FAMOS (Floating
Avalanche MOS).
Memoria EEPROM (Electrically EPROM) poate fi tears pe cale electric.
Memoria FLASH este o memorie EEPROM de capacitate mare
Intrari
(Adrese)

Arie de porti SI
fixa
(Decodificator)

Conexiuni
programabile

Arie de porti SAU


programabila

Iesiri

Memorie PROM

O memorie ROM k n conine:


k linii de intrare (adrese)
Decodificator (pori I) k 2 k
n elemente SAU cu 2 k intrri fiecare
Decodificatorul este conectat la toate cele n pori SAU prin fuzibile. Astfel
k
sunt 2 n conexiuni programabile.

DC

0
k-1

2k 1

n-1

Programarea ROM se face conform sumei canonice. Nu este necesar


minimizarea.
Exemplu. Combinaia de intrare din tabelul de adevr se aplic la intrrile
decodificatorului, Valorile funciilor constituie coninutul memoriei.
0 fuzibilul se arde
1 fuzibilul rmne intact.
a1
0
0
1
1

a0
0
1
0
1

f2
0
1
0
1

f1
1
0
1
1

f0
0
0
1
0

a1
DC

a0

f2

f1

f0

Dezavantajul implementrii funciilor logice cu memorii ROM este creterea


foarte mare a capacitii memoriei odat cu creterea numrului de intrri n circuit
datorit rigiditii posibilitilor de adresare.
Circuite PLA
Circuitele PLA conin 2 nivele de logic, o arie de pori I i o arie de pori
SAU, ambele programabile.
Intrari
programabile
Arie de porti SI
programabila

Conexiuni
programabile

Arie de porti SAU


programabila

Iesiri
programabile

Circuit PLA

Dimensiunea unui dispozitiv PLA este dat de: numrul de intrri n ,


numrul de ieiri m i numrul de termeni produs p . Numrul termenilor produs
este mult mai mic dect numrul de mintermeni de n variabile ( 2 n ).
Porile I au cte 2n intrri care pot fi conectate prin programare la oricare
din cele n variabile de intrare, sub form direct sau complementat.

Porile SAU au cte p intrri care pot fi conectate prin programare la ieirile
oricrei pori I.
Ieirile porilor SAU sunt conectate la cte o poart XOR cu o intrare
programabil, la care se aplic 0 pentru a obine funcia n form direct, i 1
pentru a obine funcia complementat.
Circuitul permite implementarea unui numr de m funcii logice, fiecare de
cte n variabile, cu condiia c numrul termenilor produs s nu-l depeasc pe p .
Astfel circuitul conine 2n p + p m + 2m conexiuni programabile.

Pentru implementarea funciilor logice n PLA este necesar minimizarea lor


i elaborarea tabelului de programare. Tabelul de programare specific termenii
produs i termenii sum pentru funciile care urmeaz a fi implementate.
Exemplu. Fie dat tabelul de adevr pentru funciile F1 i F2

Se efectueaz minimizarea funciilor.

Analiznd expresiile minimizate se aleg acelea care permit utilizarea


termenilor comuni. Acestea sunt:

Astfel vom folosi doar 4 termeni produs :


Tabelul de programare a PLA va arta astfel:

Circuitul PLA programat:

Exemplu de dispozitiv PLA este Signetics 82S100, aprut la jumtatea anilor


70. Dispozitivul are 16 intrri, 48 pori I i 8 ieiri. Astfel el are 2x16x48=1536
conexiuni fuzibile n matricea de pori I i 8x48=384 n matricea de pori SAU.

Cu toate c circuitele PLA sunt foarte flexibile, ele nu i-au gsit o aplicare
practic mare, fiindc este necesar programarea pe dou nivele I i SAU.
Circuite PAL
Circuitele PAL conin 2 nivele de logic, o arie de pori I programabil i o
arie de pori SAU fix.
Intrari
programabile

Conexiuni fixe
Arie de porti SAU
fixa

Arie de porti SI
programabila

Iesiri
programabile

Circuit PAL

Circuitele PAL sunt mai uor programabile dar nu sunt att de flexibile, ca
circuitele PLA.
termeni produs

x1

x1 x2 x 2 x3 x 3

F1 F 1

1
F1

2
3

x1

Intrari

Iesiri

F2

5
6
x2
7

F3

8
X3

Circuitul prezentat conine 3 intrri i 3 ieiri. Fiecare intrare e conectat la o


poart buffer (tampon)/inversor. Fiecare ieire este generat de o poart SAU fix.
Fiecare seciune conine 3 pori I programabile cu 6 intrri. Ieirea F1 poate fi
programat ca intrare la porile I.
7

Numrul porilor I n fiecare seciune este fix, dar dac funcia conine mai
muli termeni produs, exist posibilitatea de a utiliza mai multe seciuni.
Pentru implementarea funciilor logice n PAL este necesar minimizarea lor
i elaborarea tabelului de programare. Tabelul de programare specific doar
termenii produs pentru funciile care urmeaz a fi implementate.
Exemplu.
F1 = (1, 3, 4, 5, 7)

F2 = (1, 3, 4, 6, 7)
F3 = (1, 2, 3, 4, 5, 7)

Se efectueaz minimizarea funciilor:


F1
x1 x2
01 11
x3 00

0
1

x1 x2
00
x3
0
1

10

F3
01 11

10

x1 x2
00
x3
0
1

F2
01

F1 = x1 x2 + x3
F2 = x1 x3 + x2 x3 + x1 x2
F3 = x1 x2 + x3 + x1 x2 = F1 + x1 x2
Tabelul de programare a PLA va arta astfel:

11

10

Termeni
produs

Intrari pentru
porti SI
x1 x2 x3 F1

1
2
3

1
-

0
-

1
-

4
5
6

0
1
0
-

1
1
1
-

1
0
-

1
-

7
8
9

Iesiri

F1 = x1 x2 + x3
F2 = x1 x3 + x2 x3 + x1 x2
F3 = F1 + x1 x2

Circuitul PAL programat:


termeni produs

x1

x1

x2 x 2

x3 x 3

F1 F 1

1
F1

2
3

x1

Intrari

Iesiri

F2

5
6
x2
7

F3

8
X3

n prezent una din cele mai utilizate structuri de PLD combinaionale este
PAL16L8, compania AMD (Advanced Micro Devices). Dispozitivul are 16 intrri,
64 de pori I, divizate n 8 seciuni, 8 pori SAU pentru generarea celor 8 ieiri.
Fiecare poart I are 32 intrri pentru variabilele de intrare n form direct i
invers.
Circuitele PAL secveniale conin bistabile de tip D (ex. PAL16R8) sau
macrocelule (ex. GAL16V8 cu tergere electric Generic Array Logic, firma
9

Lattice Semiconductor). O macrocelul este format din bistabile care pot


funciona n regimurile D i T i cteva multiplexoare pentru alegerea regimului
(combinaional, secvenial, ieire direct sau invers).
Avantajele oferite de circuitele PLD sunt: consumul redus de putere,
performane mai bune datorit lungimi mult reduse a interconexiunilor i o
fiabilitate mai ridicat.
n prezent circuitele SPLD se utilizeaz ca componente de reea care cer
performane ridicate per ansamblu: hub-uri de reea bridge-uri, routere, produse din
zona telefoniei mobile, video game-urilor i a web browserelor.
Productori: AMD, Philips Semiconductors , Lattice Semiconductor.

Dispozitive logice programabile complexe (CPLD)


Un CPLD este un ansamblu de PLD separate, realizate pe acelai cip i
nsoite de o structur de interconectare programabil.
Circuitele CPLD sunt circuite VLSI ale cror pri componente sunt:
- PLD (PAL, GAL), care formeaz blocurile logice (funcionale);
- Bloc de interconectare programabil;
- Blocuri de intrare/ieire

Structura blocului logic difer la diveri fabricani, dar n general include


matricea termenilor produs (I), distribuitorul de termeni produs (SAU) i
macrocelule.

10

Matricea SAU (distribuitorul de termini produs) nu este complet fix i


permite de a utiliza aceiai termeni pentru diferite funcii.
Macrocelula reprezint un bistabil care poate fi programat sa lucreze n
regim D sau T, multiplexoare pentru alegerea modului de lucru (combinaional sau
secvenial), elemente XOR pentru a obine funcia n forma direct sau invers.
Funciile logice simple pot fi implementate n cadrul uni singur bloc.
Funciile mai complexe pot necesita mai multe blocuri, care vor fi interconectate
prin matricea de rutare.
Circuitele din seria XC9500 de la Xilinx reprezint o familie de CPLD cu
arhitectur similar. Un bloc funcional a acestor circuite conine pn la 36 intrri
i 18 ieiri, 18 macrocelule cu cte un bistabil. Funcia logic poate conine pn la
90 termeni produs.
Circuitele CPLD folosesc tehnologia EECMOS (Electrically Erasable
Complementary metaloxidesemiconductor) i UVEPROM. Programarea se face
prin ncrcarea unui cod binar (bitstream) n circuit prin cablul JTAG.
Avantajele CPLD
1. Pre de cost redus; Dimensiuni mici; Consum de energie redus; Fiabilitate
nalt a schemelor; Vitez de lucru mare; Ciclul de via a proiectelor
redus;
2. Sunt reprogramabile;
3. Nonvolatile (coninutul nu se pierde odat cu deconectarea de la surs);
4. Securitate mare a informaiei (Biii de securitate nu pot fi resetai dect
prin tergerea circuitului ceea ce duce implicit la pierderea proiectului.)
5. Timpul de reinere a schemei este previzibil, deoarece matricea de
interconexiune are o mrime fix.
Productori de circuite CPLD
Firma Xilinx: familia de circuite XC9500, CoolRunner II.
Firma Vantis (firm subsidiar a firmei AMD): familia de circuite PAL, MACH
(Macro Array CMOS High).
Firma Altera, familia de circuite MAX (Multiple Array Matrix): MAX 5000,
MAX 7000, MAX 9000. O alt familie de circuite logice programabile care
mbin caracteristicile circuitelor FPGA (numr mare de regitri) cu cele ale
11

circuitelor EPLD (vitez mare i ntrzieri previzibile) este familia FLEX (Flexible
Logic Element Matrix) cu membrii FLEX 6000, FLEX 8000 i FLEX 10k.
Cypress Semiconductor cu familiile de circuite CY7C34x, FLASH 370i;
Lattice Semiconductor cu familiile ispLSIxxxx i GAL (ex. GAL 16V8, GAL
20V10 etc.);
Structura macrocelulei
Circuite FPGA
FPGA sunt circuite VLSI cu urmtoarele componente principale:
- Blocuri logice configurabile CLB (Congigurable Logic Blocks), amplasate
in form de matrice bidimensional;
- matrice de comutatoare programabile, amplasate n jurul fiecrui CLB;
- blocuri de intrare/ieire.
Toate componentele FPGA sunt programabile (reconfigurabile) de ctre
utilizator.
Canalele i blocurile de comutare dintre blocuri conin resurse de
interconectare. Aceste resurse conin de obicei segmente de interconectare de
diferite lungimi. Interconexiunile conin comutatoare programabile cu rolul de a
conecta blocurile logice la segmentele de interconectare, sau un segment de
interconectare la altul. n plus, exist celule de I/E la periferia reelei, care pot fi
programate ca intrri sau ieiri.
n circuitele FPGA ntrzierea asociat unui semnal nu poate fi anticipat.

n prezent sunt utilizate trei tehnologii de programare a circuitelor FPGA:


- Antifuzibile. (Un antifuzibil este un dispozitiv cu dou terminale care n
mod normal se afl n starea de nalt impedan, iar atunci cnd este expus la o
12

tensiune ridicat, trece n starea cu rezisten redus (300-500 ).) Avantaje:


nevolatile, consum mic de putere. Dezavantaje: pot fi programate o singur dat.
Din categoria circuitelor FPGA cu antifuzibile fac parte circuitele firmelor Actel,
Quicklogic, Cypress.
- SRAM. Programarea acestor circuite se realizeaz prin celule de memorie
static. Din aceast categorie de circuite FPGA fac parte cele ale firmelor Xilinx,
Altera, AT&T. Avantaje: sunt reprogramabile, procesul de fabricare este standard.
Dezavantaje: Sunt volatile, consum mai mare de putere, densitatea de integrare
este mai mic, au o securitate redus a informaiei, deoarece codul de configurare
se pstreaz pe o memorie ROM extern.
Totui avantajele tehnologiei SRAM sunt mai importante dect neajunsurile
i ele, de fapt, domin piaa.
Din aceast categorie de circuite FPGA fac parte cele ale firmelor Xilinx,
Altera, AT&T.
- EPROM, EEPROM/FLASH Tehnologia EEPROM/FLASH combin
avantajele tehnologiilor precedente: Sunt nevolatile, reprogramabile, folosesc un
proces de fabricaie standard, consum redus de putere, securitatea sporit a
informaiei.
Din aceast categorie de circuite FPGA fac parte cele ale firmelor, Altera,
Actel, Lattice.
Blocuri logice configurabile
CLB furnizeaz resursele logice necesare implementrii elementelor
combinaionale i secveniale, blocurilor de calcul aritmetic, blocurilor de memorie
de capacitate redus ale unui sistem digital.
Prile componente ale unui CLB sunt generatoarele de funcii logice,
bistabile, de obicei de tip D i multiplexoare pentru selectarea funciei dorite la
ieire.
Generatoarele de funcii logice pot fi de 2 tipuri:
1. n baz de multiplexor (ex.: Actel, QuickLogic). Tehnologia antifuzibil.
2. n baz de blocuri LUT look-up table (ex.:Xilinx - famiile XC4000,
Spartan, Virtex; Altera - famiile Flex, Cyclone, Arria, Stratix; Atmel
AT6000, AT40K). Tehnologia: memorie SRAM
CLB realizate pe baz de multiplexoare

13

Mux 1
A
B

0 F1
Mux 3
1
s1
0
Mux 2
1
0 F2
C
D
1
s2

Intrrile multiplexoarelor Mux 1 i Mux 2 sunt


conectate la semnale cu valori constante A,B i C,
D. Se pot implementa diferite funcii logice ale
cror variabile sunt intrrile de selecie s1, s2, s3 i
s4.
F = ( s3 + s4 ) F1 + ( s3 + s4 ) F2
F1 = s1 A + s1 B
F2 = s2C + s2 D

s3
s4

Celule logice realizate pe baz de blocuri LUT


Exemplu de celul LUT de 2 bii
celula LUT

celule de memorie SRAM

A
0

00

01

Numrul celulelor de memorie este


2N
N numrul de variabile ale funciei (2)

A
0
0
1
1

F(A,B)
MUX

10

11

B
0
1
0
1

F(A,B)
0
0
0
1

Programarea acestor circuite se realizeaz prin celule de memorie static.


Logica este implementat cu ajutorul unor tabele (lookup table) realizate din
celulele de memorie, intrrile funciilor controlnd liniile de adres. Fiecare tabel
de 2n celule de memorie implementeaz orice funcie cu n intrri. Una sau mai
multe tabele, combinate cu bistabile, formeaz un bloc logic configurabil.
Structura simplificat a unui CLB:

14

Se poate observa c ieirea tabelei asociative poate fi transmis direct la


ieire sau stocat, n prealabil, ntr-un bistabil.
Utilizarea circuitelor FPGA:
1. n calitate de circuite integrate, pentru accelerarea algoritmilor, n medii de
calcul reconfigurabil;
2. n cadrul procesorului gazd ca unitate funcional pentru implementarea de
instruciuni specializate;
3. Pe magistrala procesor-memorie cache, n calitate de coprocessor;
4. Pe magistrala memorie-subsistem de I/E, avnd rol de procesor ataat;
5. Accesat prin interfaa de I/E sau prin reea, n calitate de unitate independent
de prelucrare.

1.

2.
3.

4.

Deosebirile dintre CPLD i FPGA


Circuitele FPGA au o granularitate fin, ceea ce nseamn c ele conin o
mulime (pn la 100 000) de blocuri mici cu bistabile. Circuitele CPLD au
o granularitate grosier, deoarece conin un numr relativ mic (~ 100) de
blocuri logice mari cu bistabile.
Majoritatea circuitelor FPGA sunt bazate pe memorii SRAM. Ele necesit o
configurare de la o memorie ROM extern la fiecare racordare la reea.
Circuitele FPGA au resurse speciale de rutare pentru a implementa eficient
funcii aritmetice (numrrtoare, sumatoare, comparatoare), pe cnd
circuitele CPLD nu le au.
n circuitele CPLD ntrzierile pot fi calculate chiar n faza de proiectare,
deoarece aceste circuite au o reea de interconexiune fix. n contrast cu
CPLD-urile, FPGA-urile au o structur de interconexiuni format din
segmente de diferite lungimi. Numrul de segmente necesare pentru a
conecta dou celule logice nu este nici fix i nici predictibil, deci ntrzierile
nu se pot cunoate dect dup ce se face asignarea i plasarea celulelor (dup
implementare).

Sisteme pe circuite integrate programabile - SOPC (System on programmable


Chip)
Industria dispozitivelor FPGA este, n prezent, cea mai profitabil dintre
ramurile industriei electronice (conform unui studiu publicat de Forbes). Este, de
asemenea, cea mai inovativ din punct de vedere tehnologic, actualmente cele mai
noi procese de producie a semiconductorilor fiind testate pe dispozitive FPGA.
Odat cu creterea nivelului de integrare a circuitelor au aprut arhitecturi
care combin avantajele CPLD i FPGA. Un exemplu este familia de circuite
FLEX (Flexible Logic Element matriX), firma ALTERA. Aceste circuite, pe lng
blocurile logice, blocurile de intrare/ieire i reeaua de interconectare
programabil, conin i blocuri SRAM ncorporate (EAB Embedded Array Block)

15

de dimensiune variabil. Aceste arhitecturi sunt utilizate i n circuitele integrate


de tipul sistem pe chip SOPC (system on programmable chip).
Prile componente ale SOPC:
- Blocuri logice configurabile;
- matrice de interconectare;
- blocuri de intrare/ieire;
- blocuri de memorie RAM ncorporate;
- blocuri dedicate procesrii digitale de semnal (DSP - Digital Signal
Processing), bazate pe multiplicatoare hardware i acumulatoare;
- nuclee IP (Intellectual Property cores), care pot fi de 2 tipuri:
procesoare hard (microprocesoare sau microcontrolere n care sunt
realizate anumite funcii i uniti programabile;
procesoare soft cu structur uniform i posibilitate de reconfigurare a
tuturor unitilor din system.
Etapele de proiectare cu circuite programabile
Pentru proiectarea sistemelor digitale utiliznd circuite programabile, cum
sunt circuitele FPGA i CPLD, se utilizeaz pachete de programe de proiectare
asistat de calculator (CAD Computer Aided Design). Aceste pachete de
programe asist proiectantul n toate etapele procesului de proiectare. Astfel,
majoritatea pachetelor CAD pentru circuitele programabile asigur urmtoarele
funcii principale:

16

1. Specificarea (descrierea) sistemului digital; Principalele metode pentru


descrierea sistemelor digitale:
- prin scheme logice,
- prin limbaje de descriere hardware (HDL Hardware Description
Language).
2. Sinteza descrierii, deci transformarea acesteia ntr-o list de conexiuni
coninnd pori elementare i interconexiunile dintre ele; Aceast translatare se
realizeaz cu ajutorul unui program de sintez din cadrul sistemului CAD.
Lista de conexiuni (netlist) este o descriere compact a sistemului digital
sub form textual, n care sunt specificate componentele sistemului,
interconexiunile dintre acestea i pinii de intrare/ieire. Aceast list este prelucrat
de celelalte componente ale sistemului CAD pentru realizarea etapelor urmtoare
din cadrul procesului de proiectare.
17

3. Simularea funcionrii sistemului pe baza listei de conexiuni obinute,


nainte de implementarea ntr-un anumit circuit;
n aceast etap se utilizeaz un program simulator pentru verificarea
funcionrii sistemului proiectat. Aceast verificare se refer doar la aspectele
funcionale ale sistemului, fr a se lua n considerare ntrzierile semnalelor, care
vor fi cunoscute numai dup implementare.
Pentru verificarea funcional proiectantul furnizeaz simulatorului mai
multe combinaii ale valorilor semnalelor de intrare, o asemenea combinaie fiind
numit vector de test. De asemenea, proiectantul poate specifica valorile
semnalelor de ieire care trebuie generate de sistem pentru fiecare vector de test.
4. Implementarea sistemului ntr-un circuit prin adaptarea listei de
conexiuni pentru a se utiliza n mod eficient resursele disponibile ale circuitului;
a) Maparea tehnologic
Aceast etap const dintr-o serie de operaii care realizeaz prelucrarea
listei de conexiuni i adaptarea acesteia la particularitile i resursele disponibile
ale circuitului utilizat pentru implementare. Cele mai obinuite operaii sunt:
- adaptarea la elementele fizice ale circuitului,
- optimizarea i verificarea regulilor de proiectare (de exemplu, testarea
depirii numrului pinilor de I/E disponibili n cadrul circuitului). n timpul
acestei etape, proiectantul selecteaz tipul circuitului programabil care va fi
utilizat, capsula circuitului integrat, viteza i alte opiuni specifice circuitului
respectiv.
n urma execuiei operaiilor din etapa de mapare tehnologic se genereaz
un raport detaliat al rezultatelor tuturor programelor executate. Pe lng mesaje de
eroare i de avertizare, se creeaz de obicei o list cu resursele utilizate din cadrul
circuitului.
b) Plasarea i rutarea
Aceste operaii sunt executate n cazul utilizrii unui circuit FPGA pentru
implementare.
Pentru proiectarea cu circuite CPLD, operaia echivalent este numit
adaptare (fitting).
Plasarea este procesul de selectare a unor module sau blocuri logice ale
circuitului programabil care vor fi utilizate pentru implementarea diferitelor funcii
ale sistemului digital.
Rutarea const n interconectarea acestor blocuri logice utiliznd resursele
de rutare disponibile ale circuitului.
Majoritatea sistemelor CAD realizeaz operaiile de plasare i rutare n mod
automat, astfel nct utilizatorul nu trebuie s cunoasc detaliile arhitecturii
circuitului utilizat pentru implementare.

18

c) Analiza de timp
Pachetele de programe CAD pentru proiectarea sistemelor digitale conin de
obicei un program numit analizor de timp, care poate furniza informaii despre
ntrzierile semnalelor. Aceste informaii se refer att la ntrzierile introduse de
blocurile logice, ct i la ntrzierile datorate interconexiunilor.
Proiectantul poate utiliza informaiile despre ntrzierile semnalelor pentru a
realiza o nou simulare a sistemului, n care s se in cont de aceste ntrzieri.
Aceast operaie prin care se furnizeaz simulatorului informaii detaliate despre
ntrzierile semnalelor se numete adnotare invers (back-annotation).
Anumite sisteme permit utilizatorilor experi plasarea i rutarea manual a
unor poriuni critice ale sistemului digital pentru a obine performane superioare.
5. Configurarea (programarea) circuitului pentru ca acesta s realizeze
funcia dorit.
Operaia de configurare se refer la circuitele programabile bazate pe
memorii volatile SRAM (Static Random Access Memory) i const din ncrcarea
informaiilor de configurare n memoria circuitului.
Operaia de programare se refer la circuitele programabile bazate pe
memorii nevolatile (cum sunt circuitele care conin antifuzibile). Aceast operaie
se execut similar cu cea de configurare, dar informaiile de configurare sunt
pstrate i dup ntreruperea tensiunii de alimentare.
La sfritul operaiilor de plasare i rutare, se genereaz un fiier care
conine toate informaiile ce se refer att la configurarea blocurilor logice ale
circuitului, ct i la specificarea interconexiunilor dintre blocurile logice. Fiierul
n care se nscriu aceste informaii conine, n principiu, un ir de bii
(bitstream), fiecare bit indicnd starea nchis sau deschis a unui comutator.
Circuitele programabile conin un numr mare de asemenea comutatoare, un
comutator fiind realizat sub forma unui tranzistor sau a unei celule de memorie. Un
bit de 1 din irul de bii va determina nchiderea unui comutator i, deci, stabilirea
unei conexiuni.
Biii din acest fiier de configurare sunt aranjai ntr-un anumit format pentru
a realiza o coresponden ntre un bit i comutatorul corespunztor.
Coninutul fiierului de configurare se transfer la circuitul programabil,
aflat de obicei pe o plac de circuit imprimat mpreun cu alte circuite.
Din cauza memoriei volatile, circuitul trebuie configurat din nou dup
fiecare ntrerupere a tensiunii de alimentare. Informaiile de configurare pot fi
pstrate ntr-o memorie nevolatil PROM, existnd posibilitatea configurrii
automate a circuitului din aceast memorie nevolatil la aplicarea tensiunii de
alimentare.
Configurarea sau programarea se pot realiza utiliznd interfaa paralel a
calculatorului. Pentru aceasta, este necesar ca placa cu circuitul programabil s
conin un conector pentru interfaa paralel, pentru transfer utilizndu-se un cablu
parallel (DB25). O alt posibilitate este utilizarea unui cablu special i a unei
metodologii de configurare propuse de organizaia JTAG (Joint Test Advisory
Group). Aceast metodologie este cunoscut i sub numele de Boundary-Scan.
19

6. Depanarea sistemului
n aceast ultim etap a procesului de proiectare se verific funcionarea
sistemului digital proiectat n condiii reale. O funcionare necorespunztoare se
poate datora nerespectrii specificaiilor de proiectare, a specificaiilor circuitului
utilizat pentru implementare, a unor aspecte legate de ntrzierea semnalelor etc.
Depanarea poate fi simplificat dac circuitul se configureaz astfel nct s
conin unele module speciale care permit citirea valorii unor semnale n timpul
funcionrii i transferul acestor informaii la calculator, utiliznd un cablu JTAG
i un program special pentru vizualizarea semnalelor dorite.

20

Limbajul VHDL
n prezent se utilizeaz mai mule limbaje de descriere hardware HDL
(Hardware Description Language): VHDL, Verilog, ABEL (Advanced Booleean
Expression Language), AHDL.
Avantajele utilizrii limbajelor de descriere hardware:
- Portabilitatea proiectelor pentru diferite tehnologii n care sunt realizate
cipurile, n care urmeaz s se fac implementarea;
- Maniera de descriere a proiectului sub form de cod i confer acestuia
claritate mai bun dect dac ar fi fost descris sub form de schem;
- Timp de proiectare redus;
- Opiuni de optimizare a proiectului, cum ar fi cele de arie sau/i vitez.
- Folosirea diferitelor construcii specifice HDL cum ar fi: pachetele
(package) i bibliotecile (library), permit reutilizarea lor n alte proiecte.
Limbajul VHDL a fost dezvoltat la mijlocul anilor 80 de ctre
departamentul de aprare al Statelor Unite n colaborare cu IEEE (Institute of
Electrical and Electronical Enginner). Limbajul a fost standardizat pentru prima
dat de IEEE n 1987 (VHDL-87) i a fost extins n 1993 (VHDL-93).
Abrevierea VHDL deriv din VHSIC Hardware Description Language
(limbajul de descriere hard VHSIC), abrevierea VHSIC nsemnnd la rndul ei
Very High Speed Integrated Circuit.
Caracteristicile de baz ale limbajului sunt:
- Descrierea funcionrii componentelor electronice de la nivelul de
poart logic pn la procesoare i sisteme de calcul.
- Descrierea ierarhic a sistemelor digitale. Modelele VHDL realizate pot
fi utilizate ca blocuri n descriere unor circuite complexe;
- Descrierea structural/comportamental a sistemelor n scopul sintezei
automate;
- Descrierea evenimentelor concurente, specifice funcionrii reale a
circuitelor digitale;
- Verificarea funcional (prin simulare) i temporal a sistemelor prin
intermediul unor programe speciale, numite test bench. Ele conin
descrierea stimulilor i a rezultatelor ce ar trebui obinute prin
aplicarea acestora, n scopul depistrii automate a unor erori funcionale.
Particularitile limbajelor de descriere hardware i , n particular al
limbajului VHDL, sunt urmtoarele:
- Exist unele deosebiri ntre un program VHDL pentru sinteza circuitului
logic i un program VHDL pentru simularea lui;
- Este posibil ca un program VHDL, perfect, din punct de vedere sintactic,
s fie neimplementabil datorit descrierii eronate a unor fenomene fizice
din circuit;
- n anumite situaii este necesar intervenia proiectantului pentru a
nltura anumite anomalii din soluia generat automat.
Principalele pri (blocuri) care alctuiesc un model VHDL complet sunt:
21

Arhitectura poate fi de trei tipuri:


1. Structural
2. Comportamental
3. Flux de data
La nivel structural sistemul este descris ca o colecie de pori i conexiuni
ntre ele. Aceast descriere se apropie de realizarea fizic a sistemului.
Modelarea structural impune o proiectare ierarhizat n care se pot defini
componente folosite de mai multe ori. Aceasta reduce semnificativ complexitatea
proiectelor mari.
La nivel comportamental (funcional) sistemul este descris prin modul cum
se comport i nu prin componentele sale. Aceast descriere folosete att
instruciuni secveniale care se execut n ordinea specificat, ct i instruciuni
concurente care se execut n paralel.
Reprezentarea de tip Data Flow descrie modul cum circul datele prin
sistem la nivel de transfer de date ntre registre (RTL). Aceast descriere folosete
instruciuni concurente, care se execut n paralel.
Structura unui cod VHDL
VHDL a fost proiectat ca i program structurat, mprumutndu-se unele idei
de la limbajele de programare soft Pascal i Ada.
O idee de baz este acea de a definii o interfa a modulului hard n timp ce
detaliile interne sunt ascunse.
Astfel o entitate (entity) VHDL este o simpl declarare a intrrilor i ieirilor
modulului n timp ce arhitectura (architecture) VHDL este o descriere structural
sau comportamental detailat a funcionrii modulului.

22

Acest concept formeaz bazele proiectrii ierarhice a sistemelor, i anume


arhitectura entitii de la nivelul cel mai superior poate conine (instantiate) alte
entiti ale cror arhitecturi sunt invizibile de la nivelele superioare. O
arhitectur de la nivel superior poate folosii entiti de la nivelul inferior de mai
multe ori, iar mai multe arhitecturi de la nivel superior pot folosii aceeai entitate
de la nivel inferior fiecare la rndul ei.

Exemplu de program VHDL:


Inhibiie
(BUT/NOT)

entity BUT_NOT is -- poarta SI cu o intrare inversata


Port (X,Y: in BIT;
Z:
out BIT) ;
End BUT_NOT;
Architecture BUT_NOT_arch of BUT_NOT is
Begin
Z <='1' when X='1' and Y='0' else '0';
End BUT_NOT_arch;
23

Aici, entity, port, end, is, in, out, architecture, begin, when, else sunt
cuvinte rezervate sau cuvinte cheie. Acestea nu pot fi folosite de utilizator ca nume
de semnale sau identificatori.
Identificatorii sunt definii de utilizator. n exemplul de mai sus aceti
identificatori sunt: BUT_NOT, X, Y, Z i BIT.
BIT este un identificator preexistent i poate fi redefinit.
Identificatorii pot conine numai simboluri alfanumerice (A-Z, a-z, 0-9) i
caracterul underscore ( _ ). caracterul underscore nu poate aprea dublat sau
n ultima poziie. Cuvintele cheie i identificatorii pot fi scrii att cu majuscule ct
i cu litere mici, nu sunt case sensitive.
Cuvintele cheie definite n VHDL:
abs
all
assert
body
component
downto
entity
function
guarded
inertial
library
map
next
of
others
postponed
pure
reject
rol
signal
sra
to
units
wait
xnor

acces
and
attribute
buffer
configuration
else
exit
generate
if
inout
linkage
mod
nor
on
out
procedure
range
rem
ror
shared
srl
transport
until
when
xor

after
architecture
begin
bus
constant
elsif
file
generic
impure
is
literal
nand
not
open
package
process
record
report
select
sla
subtype
type
use
while

alias
array
block
case
disconnect
end
for
group
in
label
loop
new
null
or
port
proctected
register
return
severity
sll
then
unaffected
variable
with

Sintaxa pentru declararea entitii:


entity nume_entitate is
port ( nume-semnale : mod tip-semnale;
nume-semnale : mod tip-semnale;
...
nume-semnale : mod tip-semnale) ;
end nume-entitate;
mod = unul din urmtoarele patru cuvinte rezervate, specificnd direcia
semnalului:
24

- in pentru semnal de intrare n entitate;


- out pentru semnal de ieire din entitate, valoarea semnalului nu poate fi citit
nuntrul entitii, ci numai de alte entiti care-l folosesc;
- buffer definete un semnal de ieire din entitate, iar valoare lui poate fi citit i
n interiorul arhitecturii din entitate;
- inout definete un semnal de intrare/ieire din entitate, acesta se folosete
frecvent pentru a descrie pini three-state.

Sintaxa pentru declararea arhitecturii:


arhitecture nume_arhitectur of nume_entitate is
Zona de declaraii (tipuri, semnale, constante,
funcii, proceduri, componente)
begin
instruciuni_concurente
end nume_arhitectur;
Numele entitii (entity-name) trebuie s fie acelai cu cel folosit la definirea
entitii. Numele arhitecturii (architecture-name) este un identificator definit de
utilizator, dac se dorete poate fi la fel cu cel al entitii sau diferit.
Reprezentri numerice
Reprezentarea numeric obinuit este reprezentarea zecimal.
VHDL permite reprezentarea de tip ntreg i real.
Tipul ntreg : 13, 25, 45E6
Tipul real : 1.2 , 3.14E-2
Pentru reprezentarea unui numr n alt baz se folosete notarea:
baza#numr#
Exemple: 2#101101# reprezentare binar
8#356#
reprezentare octal
16#1C#
reprezentare hexazecimal
Pentru a face citirea numerelor mai uoar se admit caractere underscore:
2#1010_1100_1110#

Caractere, iruri de caractere i iruri de bii


Pentru a putea folosi caractere se folosesc ghilimele simple:
a, A, .
irurile de caractere se plaseaz ntre ghilimele duble:
25

caracter
Un ir de bii reprezint o secven de valori 0 i 1. iruri de bii pot fi
reprezentate n sistemele binar, octal i hexazecimal (mai compact):
Exemple:
Binar B1001_1011
Octal O324
Hexazecimal X3D4A

Obiecte de tip date: semnale, variabile i constante


Un obiect de tip dat este creat de o declaraie a obiectului i are asociat o
valoare i un tip.
Constante
O constant poate avea o singur valoare de un tip specificat i nu se poate
modifica pe parcursul modelrii.
Sintaxa declarrii constantei:
constant nume-constant : nume-tip : = valoare;
Constantele se declar la nceputul unei arhitecturi i se pot folosi apoi
oriunde n arhitectur. Constantele declarate ntr-un proces se pot folosi doar n
procesul respectiv.
Exemple:
constant X: integer := 24;
constant BUS_SIZE: integer :=32; -- reprezint limea componentei
constant Y: integer : = BUS_SIZE-1; -- numrul de bii ai lui Y
constant Z: character := Z; -- sinonim cu valoarea de nalt impedan
constant T: time := 2 ns;
Constantele pot fi definite n pachet, entitate, arhitectur i proces.
Variabile
O variabil poate avea o singur valoare la un moment dat, dar ea poate fi i
actualizat folosind o instruciune de actualizare. Variabila se actualizeaz fr nici
o ntrziere, imediat ce instruciunea este executat. Variabilele se declar doar n
interiorul proceselor.
Sintaxa declarrii variabilelor:
variable nume-variabile : tip-variabile [:= valori iniiale]; --[] opional
26

Exemple:
variable CT : bit :=0 ;
variable VAR : boolean := FALSE;
variable SUM : integer range 0 to 256 := 16 ; -- 16 este valoarea iniial
variable X_BIT : bit_vector (7 downto 0) ; -- definete un vector de 8 bii
Pentru actualizarea variabilei se poate folosi o instruciune de asignare:
nume_variabil := expresie;
Semnale
Semnalele reprezint porturile de intrare/ieire i conexiunile interne ale
unui circuit. Semnalele se definesc n cadrul entitii.
entity nume_entitate is
port ( nume-semnale : mode tip-semnale;
nume-semnale : mode tip-semnale;
...
nume-semnale : mode tip-semnale) ;
end nume-entitate;
De asemenea se pot definii i semnale interne arhitecturii, dar ele vor aciona
doar local.
Sintaxa pentru definirea unui semnal intern:
signal nume_semnal: tip_semnal [:=valori iniiale]; -- nu este specificat modul
Exemple:
signal SUMA, CARRY : std_logic;
signal CLK : bit ;
signal DATA_BUS : bit_vector (0 to 7) ;
signal VAL : integer range 0 to 100 ;
Semnalele sunt actualizate cnd se execut o instruciune de asignare, cu o
anumit ntrziere:
SUMA <= (A xor B) after 2 ns ;
n particular se poate astfel specifica i o form de und:
signal unda : std_logic ;
unda <= 0, 1 after 5 ns, 0 after 10 ns, 1 after 20 ns ;
Tipuri de date
In VHDL exist doua feluri de tipuri: tipuri SCALARE si tipuri COMPUSE.
27

Tipurile scalare includ numere, cantitati fizice, enumerari si tipuri


predefinite.
Tipurile compuse sint matrice i nregistrri.
n VHDL snt definite i tipurile 'access' (pointeri) si 'file' (fisiere).

Toate semnalele, variabilele i constantele dintr-un program VHDL trebuie


s aib asociat un tip. n cadrul tipului se specific un set de valori pe care le poate
lua obiectul (semnal, variabil ) i de asemenea exist i un set de operatori (+,
AND etc) asociai tipului respectiv.
Tipurile de date predefinite din limbajul VHDL sunt descrise n pachetul
(eng. package) standard din biblioteca std .
Tip
Domeniul de valori
Bit
0, 1
Bit_vector un ir de elemente de tip
bit
Boolean
TRUE, FALSE
Character orice caracter permis n
VHDL
Integer
Domeniul include
numerele ntregi de la (231-1) pn la +(231-1).
Natural
De la 0 pna la valoarea
maxim admis
Positive
De la 1 pna la valoarea
maxim admis
String
Un ir de elemente de tip
caracter

Tipurile predefinite din limbajul VHDL


Exemple
signal B: bit :=1;
signal BUS: bit_vector (7 downto 0);
variable X: boolean :=true;
variable Z: character :=a ;
constant A: integer :=12;

variable C: natural :=4;


variable D: positive :=10;
variable list: string :=abcde&*%;

Tipul character (caracter) include toate caracterele din setul de caractere ISO*
(International Organization of Standardization) exprimate pe 8 bii, primele 128
fiind caractere ASCII.
28

Tipul fizic:
Tipul fizic este un tip numeric de reprezentare a unor cantiti fizice (lungime,
timp, voli). Declaraia de tip include specificarea unei uniti de msur de
baz i eventual un numr de uniti de msur secundare, care reprezint
multiplii ai unitii de baz.
Exemplu:
type length is range 0 to 1E9
units
um;
mm = 1000 um;
cm = 10 mm;
m = 1000 mm;
end units;
Exist tipul predefinit 'time', folosit in simulri VHDL pentru specificarea
ntrzierilor.
type time is range interval_maxim_din_implementare
units
fs;
ps = 1000 fs;
ns = 1000 ps;
us = 1000 ns;
ms = 1000 us;
sec = 1000 ms;
min = 60 sec;
hr = 60 min;
end units;
nregistrri: nregistrrile n VHDL snt colecii de elemente, care pot avea tipuri
diferite.
Exemplu:
type instruction is
record
op_code : processor_op;
address mode : mode;
operand1,operand2 : integer range 0 to 15;
end record;
Cele mai folosite tipuri n programele VHDL sunt aa numitele tipuri definite
de utilizator (user defined types), unul dintre acestea este tipul enumerare
(enumerated type) definit printr-o niruire de valori.
Exemple de declarare a tipului enumerare:
Type nume-tip is (list de valori);

29

Lista de valori reprezint enumerarea tuturor elementelor posibile pentru


respectivul tip, separate prin virgul. Valorile enumerate pot fi att caractere (un
caracter este cuprins ntre ghilimele simple) ct i identificatori definii de
utilizator.
Exemple.
type oct_digit is (`0`, `1`, `2`,`3`,`4`,`5`,`6`,`7`) ;
type PC_OPER is (load, store, add, sub) ;
type MY_WORD is range 31 downto 0 ;
type cmos_level is range 0.0 to 3.3 ;
Exemple de obiecte care folosesc aceste tipuri:
variable ALU_OP : PC_OPER ;
signal SIG : oct_digit ;
Dac nu se iniializeaz semnalul, iniializarea implicit este valoarea
extrem in stnga domeniului.
Limbajul VHDL permite definirea de subtip (subtype) corespunztor unui
tip. Valorile unui subtip trebuie s se afle ntr-un subdomeniu de valori ale tipului
de baz, continuu fa de valorile tipului de baz.
Exista o serie de tipuri de enumerri predefinite:
type severity-level is (note,warning,error,failure);
type boolean is (false,true);
type bit is ('0','1');
type character is ( NUL, SOH, STX, ETX, EOT, ENQ, ACK, BEL, BS, HT, LF,
VT, FF, CR, SO, SI, DLE, DC1, DC2, DC3, DC4, NAK, SYN, ETB, CAN, EM,
SUB, ESC, FSP, GSP, RSP, USP, ` `, `!`, `z`, `{`, `|`, `}` , `~`, DEL);
Subtype nume-subtip is nume-tip valoare-iniial to valoare-final; -ordine cresctoare.
Subtype nume-subtip is nume-tip valoare-iniial downto valoare-final;
-- ordine descresctoare.
Exemple:
Subtype twoval_logic is std_logic range `0` to `1` ;
Subtype negint is integer range `-2147483647` to `-1` ;
Subtype data_word is my_word range 7 downto 0 ;
VHDL include dou subtipuri integer predefinite:
Natural : subtype natural is integer range 0 to cel mai mare ntreg;
Positive: subtype positive is integer range 1 to cel mai mare ntreg;

30

Un tip foarte important este std_logic, care este un tip standard definit de
utilizator i este parte a package-ului standard IEEE 1164. Acest pachet include
tipul de date std_ulogic care are 9 valori logice utile n simularea unui semnal logic
dintr-un circuit real.
`U` - neinitializat
`X` - puternic necunoscut
`0` - puternic 0 -- poate fi sintetizat
`1` - puternic 1 -- poate fi sintetizat
`Z` - impendanta inalta -- poate fi sintetizat
`W` - slab necunoscut
`L` - slab 0
`H` - slab 1
`-` indiferent.
O alt categorie foarte important de tip definit de utilizator este tipul
matrice (array type). Acest tip definete o matrice ca fiind un set de elemente de
acelai tip n care fiecare element este selectat printr-un indice de matrice (array
index)
Versiuni de sintax folosite n declararea unei matrici:
Type nume-tip is array (valoare-initiala to valoare-finala) of tip-element;
Type nume-tip is array (valoare-initiala downto valoare-finala) of tip-element;

Exemple:
Type luni_count is array (1 to 12) of integer;
Type byte is array (7 downto 0) of std_logic;
Constant WORD_LEN: integer :=32
type word is array (WORD_LEN-1 downto 0) of word;
type matrice3x2 is array (1 to 3, 1 to 2) of natural ; -- matrice bidimensional
Se consider implicit c elementele unei matrici sunt ordonate de la stnga la
dreapta, astfel cel mai din stnga element al matricilor luni_count, byte, word este
1, 7, 31.
Uneori este util s nu se specifice domeniul.
type nume is array (tip range <>) of tip_elemente ;
Accesarea unui singur element din matrice:
W(5) , unde W este semnal aferent matricii word.

31

O matrice literal se definete (array literals) prin niruirea ntre paranteze


a valorilor elementelor. Elementele variabilei B de tipul byte pot primi toate
valoarea 1 logic scriind o expresie de forma:
B := (1, 1, 1, 1, 1, 1, 1, 1);
Limbajul VHDL permite de asemenea notaii mai scurte, de exemplu pentru
a atribui valoarea 1 logic tuturor biilor variabilei W de tip word, n afar de LSB
din fiecare se va scrie expresia:
W := (0=>0, 8=>0, 16=>0, 24=>0, others=>1);
Expresiile anterioare pot fi rescrise folosind irurile de caractere, dup cum
urmeaz:
B := 11111111;
W:= 11111110111111101111111011111110;
Este posibil de asemenea s se fac referire la un subset de valori (slice)
dintr-o matrice, specificnd nceputul i sfritul indicilor elementelor din subset,
exemple: M(6 to 9), B(3 downto 0), W(15 downto 8) etc.
Cel mai important tip de matrice des ntlnit n programele VHDL este cel
aparinnd standardului logic definit de utilizator IEEE 1164 (std_logic_vector),
definiia acestui standard este:
type STD_LOGIC_VECTOR is array (natural range < > ) of STD_LOGIC
Datorit faptului c VHDL-ul este un limbaj puternic tipizat, adesea apare
necesitatea convertiri unui semnal sau variabile dintr-un anumit tip n altul.
Packageul IEEE 1164 conine cteva astfel de funcii de conversie, de exemplu din
BIT n STD_LOGIC sau invers. O conversie foarte utilizat i care nu este definit,
din cauz c proiecte diferite pot avea nevoie de o interpretare diferit a numerelor
(ex. numere cu semn sau fr semn), este conversia din STD_LOGIC_VECTOR n
integer.

Atribute
n VHDL exist dou categorii de atribute:
1. Predefinite ca parte a standardului 1076;
32

2. Introduse de utilizator.
Atributele predefinite sunt ntotdeauna aplicate ca un prefix numelui unui
semnal, variabile sau tip.
Atributele sunt folosite pentru e returna diferite tipuri de informaie.
Exemple de atribute predefinite:
nume_semnal`event - ntoarce valoarea boolean True dac semnalul a
avut o tranziie i False dac nu;
nume_semnal`active - ntoarce valoarea boolean True dac a existat o
atribuire a valorii semnalului i False dac nu.
Operatori VHDL
Limbajul VHDL suport diferite clase de operatori care opereaz pe
semnale, constante i variabile.

Prioritatea operatorilor este maxim pentru operatorii din clasa 7. Dac nu


sunt folosite paranteze, ei se execut primii. Operatorii din aceeai clas au aceeai
prioritate i se execut de la dreapta la stnga ntr-o expresie.
Operatorii logici sunt definii pentru tipurile bit, boolean, std.logic i pentru
vectorii de aceste tipuri.
Operatorii nand i nor nu sunt asociativi. De exemplu expresia: X nand Y
nand Z va da o eroare de sintax. Corect se va scri: (X nand Y) nand Z.
Operatorii relaionali testeaz relaia dintre dou tipuri scalare i ofer ca
rezultat o ieire boolean TRUE sau FALSE. De menionat ca simbolul
operatorului mai mic sau egal este acelai cu cel al operatorului de atribuire
pentru semnale i variabile.
Operatorii de deplasare execut o deplasare sau rotire la nivel de bit ntr-un
vector de elemente de tip bit (std.logic) sau boolean.
Operatorii aditivi sunt folosii pentru operaii aritmetice pe orice tip numeric
de operanzi. Operatorul de concatenare este folosit pentru a concatena doi vectori,
de exemplu prin concatenarea 0 & 1 & 1Z se obine 011Z. Pentru a folosi
aceti operatori trebuie specificate pachetele std_logic_unsigned sau
std_logic_arith pe lng pachetul std_logic_1164.
Operatorii unari se folosesc pentru a specifica semnul unui tip numeric.
Operatorii de multiplicare se folosesc pentru a executa funcii matematice pe
tipurile numerice (ntreg sau virgul mobil).
33

mod mprire modulo;


rem - mprire modulo cu rest;
** - ridicare la putere (pentru tipurile numerice);
abs - valoare absolut (pentru tipurile numerice);
not negare (pentru tipurile bit i boolean);
Conversiile dintre std_logic_vector i tipurile numerice:

Sa presupunem ca sunt declarate urmtoarele semnale:


s i g n a l sl, s 2 , s3: std_logic_vector (3 downto 0 ) ;
s i g n a l ul, u2, u3: unsigned (3 downto 0 ) ;
Operaiile:
u l <= s l ;
s2 <= u 3 ;
nu sunt corecte, deoarece au loc atribuiri ntre diferite tipuri.
Corect se va scrie:
u l <= unsigned(s1);
s2 <= std_logic_vector(u3);
Operaii aritmetice:
u4 <= u2 + ul; -- corect
s5 <= s2 + sl; -- incorect, std_logic_vector nu susine operatori aritmetici
s5 <= std_logic_vector(unsigned(s2) + unsigned(s1)); -- ok
Exemple cu operatorul concatenare
signal a1: std_logic;
signal a4: std_logic_vector (3 downto 0);
signal b8, c8: std_logic_vector (7 downto 0);
...
b8 <= a4 & a 4 ;
c8 <= a1 & a1 & a4 & 0 0 ;
Operatorul & poate fi utilizat i pentru a deplasa datele. Cu toate c
operatorii de deplasare sunt definii n limbajul VHDL, ei uneori nu pot fi
sintetizai automat de compilator.
signal a : std_logic_vector (7 downto 0);
34

signal rot, shl, sha : std_logic_vector (7 downto 0);


...
rot <= a (2 downto 0) & a (7 downto 3); -- deplasare ciclica cu 3 biti la dreapta
shl <= 000& a(7 downto 3); -- deplasare logica cu 3 biti la dreapta
sha <= a ( 7 ) & a ( 7 ) & a ( 7 ) & a ( 7 downto 3 ) ; -- deplasare aritmetica cu 3
-- biti la dreapta
Biblioteci i package-uri
O bibliotec (library) VHDL este locul unde compilatorul depune toate
informaiile despre un anumit proiect i anume toate fiierele intermediare folosite
n analiza, simularea i sinteza proiectului.
Pentru un proiect VHDL dat compilatorul creeaz i folosete n mod
automat o bibliotec numit work.
Pentru a utiliza biblioteca standard care conine elemente (funcii, tipuri, etc)
predefinite se folosete directiva library la nceputul codului VHDL, ex.
library ieee;
Astfel se obine accesul la toate entitile i arhitecturile aflate n biblioteca
respectiv.
Pentru a accesa tipurile definite se folosesc pachetele (package-urile).
Un package este un fiier care conine obiecte definite folosite n mod
curent. Tipurile de obiecte care se afl ntr-un package sunt: semnale, definiri de
tipuri, constante, funcii, proceduri i declarri de componente.
Un proiect poate folosi un package dac n codul VHDL se include directiva
use, de exemplu pentru a apela toate componentele definite n package-ul standard
IEEE 1164 scriem urmtoarea secven de cod:
use ieee.std_logic_1164.all;,
unde ieee este numele unei librrii care a fost dat mpreun cu directiva
library. Sintaxa std_logic_1164 este numele unui fiier care conine componentele
definite, iar sufixul all i spune compilatorului s le foloseasc pe toate.
n locul respectivului sufix se poate scrie numai numele unei anumite
componente care s fie luat n considerare de compilator.
Exemple de pachete:
std_logic_1164 - definete tipurile de date standard;
std_logic_arith - conine funcii aritmetice, de conversie i comparaie
pentru tipurile de date signed, unsigned, integer, std_logic i std_logic_vector;
std_logic_unsigned;
std_logic_misc - definete tipuri suplimentare, subtipuri, constante i
funcii pentru pachetul std_logic_1164.
Definirea package-urilor nu se limiteaz doar la cele standard aflate n
biblioteci, utilizatorul poate el nsui s-i defineasc package-uri.
Sintaxa de declarare a unui pachet este urmtoarea:
package numele_pachetului is
35

declaraiile pachetului
end package numele_pachetului ;
package body numele_pachetului is
declaraiile corpului pachetului
end package body numele_pachetului;
De exemplu, n proiectarea structural, funciile de baz pentru
componentele AND2, OR2, NAND2, NOR2, XOR2 etc., sunt necesare ca s fie
definite nainte s fie utilizat una din ele. Acest lucru poate fi fcut ntr-unul
dintre pachete, de ex. base_func pentru fiecare dintre aceste componente, dup
cum urmeaz :
-- declaraia pachetului
library ieee ;
use ieee.std_logic_1164.all ;
package basic_func is
-- declaraia pentru AND2
component AND2
generic (DELAY: timp :=5ns);
port (in1, in2: in std_logic; out1: out std_logic);
end component;
--declaraia pentru OR2
component OR2
generic (DELAY: timp :=5ns);
port (in1, in2: in std_logic; out1: out std_logic);
end component;
end package basic_func ;
-- declaraiile corpului pachetului
library ieee ;
use ieee.std_logic_1164.all;
package body basic_func is
-- poart AND cu dou intrri
entity AND2 is
generic (DELAY: timp);
port (in1, in2: in std_logic; out1: out std_logic);
end AND2;
arhitecture model_conc of AND2 is
begin
out1 <= in1 and in2 after DELAY;
end model_conc;
36

-- poart OR cu dou intrri


entity OR2 is
generic (DELAY: timp);
port (in1, in2: in std_logic; out1: out std_logic);
end OR2;
arhitecture model_conc2 of AND2 is
begin
out1 <= in1 or in2 after DELAY;
end model_conc2;
end package body basic_func;
n program a fost inclus o ntrziere (delay) de 5 ns. Totui, ar trebui de
notat c specificaiile ntrzierii sunt ignorate de ctre Foundation synthesis tool. A
trebuit s utilizm tipul predefinit std_logic care este declarat n pachetul
std_logic_1164. S-au inclus n acest pachet library i clauza use. Acest pachet are
nevoie s fie compilat i plasat ntr-o librrie. O s numim aceasta library
my_func. Pentru a utiliza componentele acestui pachet, o dat ce a fost declarat, se
utilizeaz library i clauza use :
library ieee, my_func;
use ieee.std_logic_1164.all, my_func.basic_func.all;

Funcii i proceduri
La fel ca i n alte limbaje de nivel nalt i n VHDL o funcie accept un
anumit numr de argumente i returneaz un rezultat. Att argumentele ct i
rezultatul returnat de o funcie sunt de un tip predeterminat.
Sintaxa VHDL prin care se definete o funcie:
function nume-funcie (
nume-semnal : tip-semnale;
...
nume-semnal : tip-semnale;
) return tip-ntoarcere is
declaraii de tip
declaraii de constante
declaraii de variabile
definiii de funcii
definiii de proceduri
begin
instruciune secvenial
37

...
Instruciune secvenial
end nume funcie;
Dup ce se d un nume funciei (function -name) se poate definii o list de
parametri formali care vor fi folosii n structura funciei, toi aceti parametrii
trebuie s fie de acelai tip. n cadrul unei funcii se pot definii local tipuri,
constante, variabile i de asemenea funcii i proceduri imbricate (nested). ntre
cuvintele cheie begin i end este cuprins o serie de instruciuni secveniale care
sunt executate ori de cte ori este apelat funcia . n cadrul funciei cuvntul cheie
return indic momentul din care funcia returneaz o valoare care trebuie s fie de
tipul celei definite la declararea funciei.
Exemplu:
entity BUT_NOT is -- poarta SI cu o intrare inversata
Port (X1,X2: in BIT;
Z:
out BIT) ;
End BUT_NOT;
Architecture BUT_NOT_archf of BUT_NOT is
function ButNot (A, B: bit) return bit is
begin
if B = `0` then return A;
else return `0
end if;
end ButNot;
Begin
Z <= ButNot (X1,X2);
End BUT_NOT_archf;
n limbajul VHDL mai este definit noiunea de procedur (procedure) care
este similar cu funcia doar c nu returneaz o valoare. La fel cum o funcie poate
fi apelat n locul unei expresii i o procedur poate fi apelat n locul unei
declaraii. Dac argumentele unei proceduri sunt declarate de tipul out sau inout,
va exista totui o valoare returnat.
Stiluri de proiectare i descriere a circuitelor
O arhitectur este format dintr-o serie de instruciuni concurente. Fiecare
instruciune se execut simultan cu celelalte instruciuni din arhitectur.
Instruciunile concurente sunt necesare pentru a putea simula comportamentul
circuitelor modelate, n care componentele interacioneaz unele cu altele.
ntr-o arhitectur VHDL dac ultima instruciune modific starea unui
semnal care este folosit de prima instruciune din arhitectur atunci simulatorul se
va ntoarce la prima instruciune i o va reactualiza cu noua valoare, cu alte cuvinte
simulatorul va continua s propage schimbrile i s reactualizeze valorile
semnalelor pn cnd circuitul simulat se stabilizeaz.
38

Sintaxa VHDL conine cteva instruciuni concurente i de asemenea un


mecanism de grupare a instruciunilor secveniale astfel nct ele s funcioneze ca
i o sigur instruciune concurent. Utilizate n diferite modaliti, aceste
instruciuni genereaz trei stiluri diferite de proiectare i descriere a circuitelor:
- proiectare structural;
- proiectare ca flux de date;
- proiectare comportamental.
Proiectare structural
n proiectarea structural se definesc exact elementele i interconexiunile
dintre elementele circuitului. O descriere structural pur este echivalent cu o
descriere schematic sau cu un netlist (list de conexiuni ntre elementele unui
circuit).
Cea mai elementar instruciune concurent, folosit n descrierea structural
este instruciunea component:
etichet: nume-component port-map (semnal1, semnal2, ..., semnal n);
etichet: nume-component port-map (port1=> semnal1, port2=>semnal2,
portn=>semnaln);
Numele componentei este numele unei entiti definite anterior care trebuie
utilizat sau instaniat (multiplicat).
Fiecare instruciune component care invoc numele entitii creeaz o
clon (instan) respectivei entiti care se va distinge printr-un nume unic dat de
o etichet (label).
Cuvntul cheie port map introduce o list prin care porturile entitii sunt
asociate unor semnale din arhitectura curent.
Aceast list se poate scrie n dou moduri: poziional i asociativ.
n modul poziional de atribuire semnalele din list sunt asociate cu porturile
entitii n aceeai ordine n care apar n entitate.
n modul de atribuire asociativ fiecare port al entitii se asociaz unui
semnal folosind operatorul =>, iar asocierea poate fi fcut n orice ordine.
nainte de a fi instaniat ntr-o arhitectur, o component trebuie s fie
declarat n cadrul arhitecturii, sintaxa de declarare este:
component nume-component
port (nume-semnale: mod tip-semnale;
nume-semnale: mod tip-semnale;
...
nume-semnale: mod tip-semnale);
end component;
Componentele folosite n arhitectur pot s fie de dou tipuri:
a) componente descrise anterior care sunt specifice proiectului,
b) componente care sunt apelate din bibliotecile standard.
Exemplu. Codul VHDL pentru un detector de numere prime pe 4 bii.
39

Numerele prime sunt: 1, 2, 3, 5, 7, 11, 13.


Funcia minimizat: F = N 3 N 0 + N 3 N 2 N 1 + N 2 N 1 N 0 + N 2 N 1 N 0
Circuitul logic:
N3

N2

N1

T1 = N 3 N 0

N0

T2 = N 3 N 2 N 1
N3_L

N2_L

N1_L

T3 = N 2 N 1 N 0
T4 = N 2 N 1 N 0

T1

T2
F
T3

T4

Programul structural VHDL pentru detectorul de numere prime:


library IEEE;
use IEEE.std_logic_1164.all;
entity prime is
port ( N: in STD_LOGIC_VECTOR (3 downto 0);
F: out STD_LOGIC ) ;
end prime;
architecture prime1_arch of prime is
signal N3_L, N2_L, N1_L : STD_LOGIC;
signal T1, T2, T3, T4 : STD_LOGIC;
component G_INV port (x : in STD_LOGIC; Q: out STD_LOGIC) ;
end component ;
component G_AND2 port (x, y : in STD_LOGIC; Q: out STD_LOGIC) ;
end component ;
component G_AND3 port (x, y, z : in STD_LOGIC; Q: out STD_LOGIC) ;
end component ;
component G_OR4 port (x, y, z, w : in STD_LOGIC; Q: out STD_LOGIC ;
end component ;
begin
U1 : G_INV port map (N(3) , N3_L) ;
U2 : G_INV port map (N(2) , N2_L) ;
U3 : G_INV port map (N(1) , N1_L) ;
U4 : G_AND2 port map (N3_L, N(0), T1) ;
U5 : G_AND3 port map (N3_L, N2_L, N(1), T2) ;
40

U6 : G_AND3 port map (N2_L, N(1), N(0), T3) ;


U7 : G_AND3 port map (N(2), N1_L, N(0), T4) ;
U8 : G_OR4 port map (T1, T2, T3, T4, F) ;
end prime1;
Prin declararea entitii se declar intrrile i ieirile circuitului. n cadrul
arhitecurii sunt declarate toate semnalele care vor fi folosite, de asemenea i
numele componentelor (G_INV, G_AND2, G_AND3, G_OR4) care trebuie
definite n acelai proiect n fiiere VHDL de nivel ierarhic mai jos.
Exemplu de descriere a porii logice AND cu dou intrri:
library ieee;
use ieee.std_logic_1164.all;
entity G_And2 is
port ( x: IN std_logic;
y: IN std_logic;
Q: OUT std_logic);
end G_And2;
architecture G_And2_beh of G_And2 is
begin
Q <= x and y;
end G_And2_beh;
Deoarece descrierea circuitului este concurent n orice ordine am
introduce componentele se va sintetiza acelai circuit, iar funcionarea va fi
aceeai.
Exist proiecte n care este necesar crearea mai multor copii a unui element
n cadrul unei arhitecturi. De exemplu, un sumator pe n bii se poate crea din n
sumatoare pe un bit.
Limbajul VHDL include o instruciune (generate) care permite crearea unei
structuri repetitive folosind un fel de bucl, fr a fi necesar s instaniem separat
fiecare element.
Sintaxa unei bucle for- generate :
label: for identificator in domeniu generate
instruciune concurent
end generate;
Identificatorul este implicit declarat ca variabil compatibil cu domeniul
(range). Instruciunile concurente se execut cte o dat pentru fiecare valoare
posibil a identificatorului inclus n domeniu. Identificatorul trebuie folosit n
cadrul instruciunii concurente.
Exemplu. Crearea unei pori inversoare pe 8-bii.
library IEEE;
41

use IEEE.std_logic_1164.all;
entity inv8 is
port ( X: in STD_LOGIC_VECTOR (1 to 8);
Y: out STD_LOGIC_VECTOR (1 to 8) );
end inv8;
architecture inv8_arch of inv8 is
component G_INV port (I: in STD_LOGIC;
Q: out STD_LOGIC);
end component;
begin:
g1: for b in 1 to 8 generate
U1: G_INV port map (X(b) , Y(b)) ;
end generate;
end inv8_arch;
Programul pentru inversorul pe un bit trebuie inclus n proiectul curent:
library ieee;
use ieee.std_logic_1164.all;
entity G_INV is
port( I : in std_logic;
Q : out std_logic);
end G_INV;
architecture func of G_INV is
begin
Q <= not I;
end func;
Valoarea constantelor trebuie s fie cunoscut n momentul compilrii unui
program VHDL. n unele aplicaii este util s se proiecteze i s se compileze o
entitate mpreun cu arhitectura corespunztoare care s conin unii parametrii
(cum ar fi limea magistralei) care nu sunt specificai. Aceast facilitate este
introdus de constanta generic.
Genericele nu se modific n timpul simulrii. Datele coninute n genericele
transmise entitii sau componentei se pot utiliza pentru a modifica rezultatele
simulrii, dar rezultatele nu pot modifica genericele.
entity nume-entitate is
generic ( nume constante : tip-constante;

nume-constante: tip-constante);
port ( nume-semnale: mod tip-semnale;

nume-semnale: mod tip-semnale);


end nume-entitate;
42

Una sau mai multe constante generice pot fi definite ntr-o declaraie de
entitate naintea declaraiei de porturi. O valoare i va fi atribuit numai cnd
entitatea va fi instaniat n cadrul altei arhitecturi.
n cadrul definirii
componentelor (component), constantelor generic li se atribuie valori folosind
instruciunea generic map, asemntoare cu instruciunea port map.
Exemplu. Definirea unui inversor de magistral cu o lime impus de
utilizator.
library IEEE;
use IEEE.std_logic_1164.all;
entity businv is
generic ( WIDTH: positive);
port ( X: in STD_LOGIC_VECTOR (WIDTH -1 downto 0);
Y: out STD_LOGIC_VECTOR (WIDTH -1 downto 0) );
end businv;
architecture businv_arch of businv is
component G_INV port (I: in STD_LOGIC;
Q: out STD_LOGIC);
end component;
begin
g1: for b in WIDTH -1 downto 0 generate
U1: G_INV port map (X(b) , Y(b)) ;
end generate;
end businv_arch;
n urmtorul exemplu sunt instaniate mai multe exemplare ale acestui
inversor, fiecare pentru o alt lime.

library IEEE;
use IEEE.std_logic_1164.all;
entity businv1 is
port ( IN8: in STD_LOGIC_VECTOR (7 downto 0);
OUT8: out STD_LOGIC_VECTOR (7 downto 0);
IN16: in STD_LOGIC_VECTOR (15 downto 0);
OUT16: out STD_LOGIC_VECTOR (15 downto 0);
IN32: in STD_LOGIC_VECTOR (31 downto 0);
OUT32: out STD_LOGIC_VECTOR (31 downto 0) );
end businv1;
architecture businv1_arch of businv1 is
component businv
43

generic ( WIDTH: positive);


port ( X: in STD_LOGIC_VECTOR (WIDTH -1 downto 0);
Y: out STD_LOGIC_VECTOR (WIDTH -1 downto 0) );
end component;
begin:
U1: businv generic map (WIDTH=>8) port map (IN8, OUT8);
U2: businv generic map (WIDTH=>16) port map (IN16, OUT16);
U3: businv generic map (WIDTH=>32) port map (IN32, OUT32);
end businv1_arch;
Proiectare de tip flux de date
n limbajul VHDL exist un ir de instruciuni concurente care permit
descrierea circuitului din punctul de vedere al fluxului de date i al prelucrrii
acestuia n circuit.
1. Instruciunea de atribuire concurent direct de semnal
(signal-name<=expression).
Tipul expresiei trebuie s fie compatibil cu cel al semnalului.
Pentru a exemplifica atribuirea concurent de semnal arhitectura detectorului
de numere prime este rescris pentru fluxul de date.
architecture prime2_arch of prime is
signal T1, T2, T3, T4 : STD_LOGIC;
begin
T1 <= not N(3) and N(0) ;
T2 <= not N(3) and not N(2) and N(1) ;
T3 <= not N(2) and N(1) and N(0) ;
T4 <= N(2) and not N(1) and N(0) ;
F <= T1 or T2 or T3 or T4;
end prime2_arch;
Spre deosebire de descrierea anterioar (descriere structural) porile i
conexiunile dintre ele nu mai apar explicit, ci se folosesc operatori VHDL definii
implicit in biblioteca IEEE (and, or, not). Se observ c operatorul not are
prioritatea cea mai mare, astfel c nu este necesar s se utilizeze paranteze pentru
expresii de genul not N(2).
2. Instruciunea de atribuire concurent condiional de semnal when - else.
Nume-semnal <= expresie when espresie-boolean else
...
expresie when espresie-boolean else
expresie;
44

In acest caz o expresie boolean combin termeni booleeni individuali


folosind operatori implicii (and, or, not). Termenii booleeni sunt de obicei variabile
sau rezultate ale unor comparaii fcute cu ajutorul operatorilor relaionali: = , /=
(inegaliate), > , >= , < , <= (mai mic sau egal)
Instruciunea de atribuire condiional este implementat printr-un
multiplexor care selecteaz una din expresiile surs.
Circuitul rezultat pentru urmtoarea instruciune:
s <= a xor b when c = '1' else
not (a xor b);

Circuitul este cel generat iniial de utilitarul de sintez, dar operatorul de


egalitate va fi minimizat ulterior la o simpl conexiune, astfel nct semnalul c s
controleze multiplexorul n mod direct.
Exemplul anterior reprezint forma cea mai simpl a unei instruciuni de
atribuire condiional, n care exist o singur condiie testat. Un alt exemplu n
care exist dou condiii testate este urmtorul:
z <= a when s0 = '1' else
b when s1 = '1' else
c;
Condiiile sunt evaluate n ordinea n care sunt scrise, fiind selectat pentru
atribuire prima expresie a crei condiie este adevrat. Aceasta echivaleaz din
punct de vedere hardware cu o serie de multiplexoare cu dou ci, prima condiie
controlnd multiplexorul cel mai apropiat de ieire.
Circuitul rezultat pentru acest exemplu:

Pentru acest circuit, condiiile au fost deja optimizate, astfel nct semnalele
s0 i s1 controleaz multiplexoarele n mod direct. Din acest circuit se poate
45

observa c atunci cnd s0 este '1', este selectat semnalul a indiferent de valoarea
semnalului s1. Dac s0 este '0', atunci s1 selecteaz ntre intrrile b i c.
Dac exist un numr mare de ramuri ale instruciunii, la implementare
rezult un ir lung de multiplexoare. De acest aspect trebuie s se in cont la
proiectare: cu ct o expresie surs apare mai trziu n lista de selecie, cu att
semnalele din aceast expresie vor traversa mai multe multiplexoare n circuitul
rezultat la sintez.
Exemplu. Arhitectura detectorului de numere prime in care se folosete
atribuirea concurent condiional de semnal.
architecture prime3_arch of prime is
signal T1, T2, T3, T4 : STD_LOGIC;
begin
T1 <= '1' when N(3)='0' and N(0)='1' else '0' ;
T2 <= '1' when N(3)='0' and N(2)='0' and N(1)='1' else '0' ;
T3 <= '1' when N(2)='0' and N(1)='1' and N(0)='1' else '0' ;
T4 <= '1' when N(2)='1' and N(1)='0' and N(0)='1' else '0' ;
F <= T1 or T2 or T3 or T4;
end prime3_arch;
Comparaia unui bit de tip std_logic cum ar fi N(3) se face in funcie de
caracterele literale 1 sau 0, iar rezultatul returnat este de tip boolean.
Rezultatul acestor comparaii se combin intr-o expresie boolean plasat
intre cuvintele cheie when, else. Clauza else este obligatorie deoarece setul de
condiii dintr-o expresie trebuie s acopere toate combinaiile posibile.

3. Instruciunea de atribuire concurent selectiv de semnal:


with expresie select
nume-semnal <= valoare-semnal when opiuni,
valoare-semnal when opiuni,
...
valoare-semnal when opiuni;
In acest tip de instruciune, se evalueaz expresia dat, iar cand una dintre
valori se potrivete cu una dintre opiuni (choices) atunci identificatorului numesemnal i se va atribui valoarea corespunztoare valoare-semnal. Opiunea
corespunztoare fiecrei clauze when poate s fie o singur valoare sau o list de
valori separate intre ele prin bara vertical ( | ). Cuvantul cheie others poate fi
folosit impreun cu ultima clauz when pentru a acoperii toate valorile pe care le
poate lua expresia de evaluare.
Aceast instruciune este echivalent funcional cu instruciunea secvenial
case.
Exemplu. Arhitectura detectorului de numere prime in care se folosete
atribuirea concurent selectiv de semnal. Toate opiunile pentru care F ia valoarea
46

1 ar fi putut fi scrise folosind o singur clauz when, dar pentru o inelegere mai
bun s-au folosit mai multe clauze.
architecture prime4_arch of prime is
begin
with N select
F <= `1` when 0001 | 0010 | 0011,
`1` when | 0101 | 0111 ,
`1` when 1011 | 1101 ,
`0` when others ;
end prime4_arch;
Exemple.
1. Poarta SAU EXCLUSIV cu dou intrri. n arhitectur se utilizeaz o
instruciune de atribuire condiional.
library ieee;
use ieee.std_logic_1164.all;
entity xor2 is
port (a, b: in std_logic;
x: out std_logic);
end xor2;
architecture arh1_xor2 of xor2 is
begin
x <= '0' when a = b else
'1';
end arh1_xor2;
2. Definirea porii SAU EXCLUSIV cu dou intrri, n cadrul arhitecturii se
utilizeaz o instruciune de atribuire selectiv.
library ieee;
use ieee.std_logic_1164.all;
entity xor2 is
port (a, b: in std_logic;
x: out std_logic);
end xor2;
architecture arh_xor2 of xor2 is
signal tmp: std_logic_vector (1 downto 0);
begin
tmp <= a & b;
with tmp select
x <= '0' when "00",
'1' when "01",
'1' when "10",
'0' when "11";
47

end arh_xor2;
Proiectare comportamental (secvenial)
Nu ntotdeauna este posibil s descriem direct comportarea unui circuit logic
prin utilizarea unei instruciuni concurente. Pentru majoritatea descrierilor
comportamentale este necesar folosirea unor elemente suplimentare de limbaj.
Instruciunile secveniale se utilizeaz n procese, funcii i proceduri.
1. Un element de descriere comportamental cheie este procesul. Un proces
(process) este o colecie de instruciuni secveniale care se execut in paralel cu
alte instruciuni concurente i cu alte procese.
Instruciunea process are urmtoarea sintax:
process (nume-semnal, nume-semnal, , nume-semnal)
declaraii de tipuri
declaraii de variabile
declaraii de constante
definiii de funcii
definiii de proceduri
begin
instruciune-secvenial
.
instruciune-secvenial
end process;
Intr-un proces sunt vizibile numai tipurile, semnalele, constantele, funciile
i procedurile care fac parte din aceeai arhitectur cu procesul, ins toate aceste
elemente cu excepia semnalelor pot fi definite i local in proces.
In cadrul unui proces, variabilele au rolul de a pstra stri, ele nu sunt
vizibile in afara procesului. n funcie de modul de utilizare, o variabil poate
genera sau nu un semnal correspondent ntr-o implementare fizic a circuitului
modelat.
Sintaxa VHDL pentru definirea unei variabile :
variable nume-variabile : tip-variabile ;
Semnalele care se afl n paranteze alturi de cuvntul cheie process,
determin dac procesul ruleaz sau dac este suspendat, aceast list de semnale
poart numele de list de sensibilitate.
Presupunem c un proces este suspendat iniial. Dac unul dintre semnalele
aflate n lista de sensibilitate i schimb valoarea, procesul intr n execuie,
ncepnd cu prima instruciune i pn la ultima. Dac valoarea oricrui semnal din
lista de sensibilitate se modific datorit execuiei procesului, acesta se execut din
nou. Astfel procesul va rula pn n momentul n care nici unul dintre semnale nui mai schimb valoarea. Toate evenimentele din cadrul unui proces au loc, n
cadrul unei simulri ntr-un timp de simulare egal cu zero.
48

Un proces descris corect n VHDL se va suspenda dup una sau mai multe
rulri, trebuie s se evite modelarea proceselor care nu se suspend niciodat. Lista
de sensibilitate este opional, procesele care nu au list de sensibilitate ncep s
ruleze n cadrul simulrii la momentul zero, aceste procese sunt utile pentru
modelarea test bench-urilor.
Limbajul VHDL are cteva tipuri de instruciuni secveniale.
1. Atribuirea secvenial de semnal (sequential signal-assignment):
nume-semnal <= expresie ;
Instruciunea are aceeai sintax ca i varianta concurent, dar se utilizeaz
doar n interiorul procesului, i nu n arhitectur.
2. Atribuirea secvenial de variabil:
nume-variabil : = expresie ;
Exemplu. Arhitectura detectorului de numere prime rescris ca proces.
architecture prime5_arch of prime is
begin
process (N)
variable T1, T2,T3,T4 : STD_LOGIC;
begin
T1 := not N(3) and N(0) ;
T2 := not N(3) and not N(2) and N(1) ;
T3 := not N(2) and N(1) and N(0) ;
T4 := N(2) and not N(1) and N(0) ;
F <= T1 or T2 or T3 or T4;
end process ;
end prime5_arch;
n cadrul acestei arhitecturi (prime5_arch) exist doar o singur instruciune
concurent, aceasta este instruciunea process. n lista de sensibilitate a procesului
apare intrarea N, iar n cadrul procesului se definesc variabile, definirea de semnale
nu este permis. Ieirile porilor AND trebuie definite ca variabile, deoarece
definiiile de semnale nu sunt acceptate ntr-un proces.
3. Instruciunea if
Sintaxa:
a) if expresie-boolean then instruciune secvenial
end if;
Expresia boolean este testat i, dac ea este adevrat (TRUE), se va
executa o instruciune secvenial.
b)

if expresie-boolean then instruciune secvenial ;


else instruciune secvenial ;
end if;

49

n aceast form se mai adaug i clauza else urmat de o alt instruciune


secvenial care se execut n cazul n care expresia testat este fals (nu se
verific).
c)

if expresie-boolean then instruciune secvenial ;


elsif expresie-boolean then instruciune secvenial ;
...
elsif expresie-boolean then instruciune secvenial ;
end if;

d)

if expresie-boolean then instruciune secvenial ;


elsif expresie-boolean then instruciune secvenial ;
...
elsif expresie-boolean then instruciune secvenial ;
else instruciune secvenial ;
end if;

n aceste forme se introduce cuvntul cheie elsif. O instruciune secvenial


condiionat de clauza elsif se execut dac expresia boolean creia i s-a aplicat
aceasta este adevrat i toate expresiile precedente sunt false. Instruciunea
secvenial corespunztoare clauzei finale else se execut dac toate expresiile
booleene precedente au fost false.
Exemplu. Codul VHDL pentru detectorului de numere prime folosindu-se
instruciunea if.
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.numeric_std.all;
entity prime is
port ( N: in STD_LOGIC_VECTOR (3 downto 0);
F: out STD_LOGIC) ;
end prime;
architecture prime6_arch of prime is
begin
process (N)
variable NI : INTEGER;
begin
NI := to_integer(unsigned (N));
if NI=1 or NI=2 or NI=3 or NI=5 or NI=7 or NI=11 or NI=13 then F<='1' ;
else F <=
'0' ;
end if ;
end process ;
end prime6_arch;
50

n acest caz se folosete o variabil NI pentru a pstra valoarea ntreag (de


tip integer) rezultat n urma convertiri intrrii N.
4. Instruciunea case
Se folosete cnd trebuie aleas o singur alternativ din multitudinea de
alternative oferite de valorile pe care le poate lua un semnal sau o expresie.
Sintaxa instruciunii case:
case expresie is
when opiuni => instruciuni-secveniale ;
...
when opiuni => instruciuni-secveniale ;
end case ;
Aceast instruciune evalueaz o expresie dat, alege valoarea care se
potrivete din una din opiuni (choices) i execut instruciunea secvenial
corespunztoare.
Opiunile (choices) sunt reprezentate de o singur valoare sau de un set de
valori separate prin bare verticale ( | ), aceste opiuni trebuie s se exclud una pe
cealalt i trebuie s includ toate valorile posibile ale expresiei evaluate, altfel se
folosete clauza others.
Exemplu. Arhitectura pentru detectorul de numere prime, folosind instruciunea
case.
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.numeric_std.all;
entity prime is
port ( N: in STD_LOGIC_VECTOR (3 downto 0);
F: out STD_LOGIC) ;
end prime;
architecture prime7_arch of prime is
begin
process (N)
begin
case to_integer(unsigned (N)) is
when 1 => F <= '1' ;
when 2 => F <= '1' ;
when 3 | 5 | 7 | 11 | 13 => F <= '1' ;
when others => F <= '0' ;
end case ;
end process ;
end prime7_arch;

5. Instruciunile for loop, while loop i loop


51

Se utilizeaz pentru a indeplini mai multe iteraii n procese, funcii i


proceduri.
Sintaxa:
a) for identificator in domeniu loop
instruciune-secvenial;
...
instruciune-secvenial;
end loop;
Variabila identificator se declar implicit i este de acelai tip cu domeniul
(range), pe care l parcurge de la stnga la dreapta cte o valoare la fiecare iteraie.
Domeniul (range) poate fi:
5 downto 0
0 to 5
n limbajul VHDL, instruciunea loop are mai multe particulariti, care o
deosebesc de alte limbaje de programare. n unele limbaje de programare,
identificatorului din interiorul ciclului i se poate atribui o valoare oarecare. n
limbajul VHDL acest lucru nu este posibil.
O alt particularitate este faptul c identificatorul este declarat doar n
interiorul instruciunii for loop i nu este necesar declararea explicit a lui n
proces, funcie sau procedur. Din aceast cauz identificatorul nu poate fi utilizat
n calitate de valoare returnat n funcii i proceduri. Dac n interiorul
procedurii, dar n afara ciclului loop, exist o alt variabil cu acelai nume, ea
este tratat ca o variabil aparte.
process (i)
begin
...
x <= i+1; -- x este un semnal

for i in 1 to 10 loop
q(i) := a; -- q este o variabil
end loop;

end process;
Exemplu. Un generator al bitului de paritate pentru un cuvnt binar de 10
bii, utiliznd instruciunea for-loop.
library ieee;
use ieee.std_logic_1164.all;
entity parity10 is
port (D: in std_logic_vector(0 to 9);
ODD: out std_logic);
constant WIDTH: integer := 10;
end parity10;
52

architecture par of parity10 is


begin
process (D)
variable x: Boolean;
begin
x := false;
for i in 0 to D'length - 1 loop -- se utilizeaz atributul length
if D(i) = '1' then
x := not x;
end if;
end loop;
if x then
ODD <= '1';
else
ODD <= '0';
end if;
end process;
end par;
Programul va genera bitul de imparitate, dac variabila x va primi iniial
valoarea TRUE.

b) while expresie-boolean loop


instruciune-secvenial;
...
instruciune-secvenial;
end loop;
n acest tip de instruciune expresia boolean este testat naintea de fiecare
iteraie, iar bucla se execut numai dac valoarea expresiei este adevrat.
Instruciunea se folosete pentru descrierea proceselor secveniale n
programe speciale de generare a stimulilor de intrare, numite test-bench. Nu se
recomand utilizarea ei n programele de descriere a circuitelor, deoarece
compilatorul nu ntotdeauna poate sintetiza instruciunea.
Exemplu. Generator al semnalului de ceas, care poate fi utilizat ntr-un testbench. Semnalul de ceas se va genera pn cnd fanioanele error_flag sau done nu
vor fi egale cu 1.
process
begin
while error_flag /= 1 and done /= '1 loop
Clock <= not Clock;
53

wait for CLK_PERIOD/2;


end loop;
end process;
c) loop -- ciclu infinit, se utilizeaz cu instr. next sau exit
instruciune-secvenial;
...
instruciune-secvenial;
end loop;
La fel ca i instruciunea while-loop nu poate fi sintetizat.
6. Instruciunile exit i next
Sunt instruciuni secveniale care se pot executa n cadrul unei instruciuni
loop.
Instruciunea exit transfer comanda ctre instruciunea ce urmeaz imediat
dup sfritul buclei. Poate fi utilizat pentru toate tipurile de instruciuni loop.
Poate fi:
- necondiional: exit
- condiional: exit when
Sintaxa:
exit [ label ] [ when condition ] ;
Exemplu. Generator al semnalului de ceas, care poate fi utilizat ntr-un testbench n care se folosete instruciunea exit.
process
begin
loop
Clock <= not Clock;
wait for CLK_PERIOD/2;
if done = '1' or error_flag = '1' then
exit;
end if;
end loop;
end process;
Exemplu. Utilizarea instruciunii condiionale exit.
L2: loop
A:=A+1;
exit L2 when A>10;
end loop L2;
Instruciunea next face ca toate instruciunile rmase pn la sfritul buclei
s fie ocolite i s nceap o nou execuie a buclei.
54

Sintaxa:
next [ label ] [ when condition ] ;
Exemplu. Un numrtor de uniti pentru cuvinte binare de 16 bii.
library ieee;
use ieee.numeric_bit.all;
entity count_ones is
port (v: in bit_vector (15 downto 0);
count: out signed (3 downto 0));
end count_ones;
architecture functional of count_ones is
begin
process (v)
variable result: signed (3 downto 0);
begin
result := (others => '0');
for i in v'range loop
next when v(i) = '0';
result := result + 1;
end loop;
count <= result;
end process;
end functional;
7. Instruciunea wait
n locul unei liste de sensibilitate, un proces poate conine o instruciune
wait. Utilizarea unei instruciuni wait are dou scopuri:
Suspendarea execuiei unui proces;
Specificarea condiiei care va determina activarea procesului suspendat.
La ntlnirea unei instruciuni wait, procesul n care apare aceast
instruciune este suspendat. Atunci cnd se ndeplinete condiia specificat n
cadrul instruciunii wait, procesul este activat i se execut instruciunile acestuia
pn cnd se ntlnete din nou instruciunea wait.
Limbajul VHDL permite ca un proces s conin mai multe instruciuni wait.
Atunci cnd se utilizeaz pentru modelarea logicii combinaionale n vederea
sintezei, un proces poate conine ns o singur instruciune wait.
Dac un proces conine o instruciune wait, acesta nu poate conine o list de
sensibilitate. Formele instruciunii wait:
- wait on list_de_sensibilitate. Procesul se execut cnd apare o modificare
a valorii semnallor din lista de sensibilitate; Exemplu: wait on a,b;
- wait until expresie_condiional; Procesul se suspend pn cnd condiia
specificat devine adevrat datorit modificrii unuia din semnalele care apar n
expresia condiional. Dac nici un semnal din aceast expresie nu se modific,
55

procesul nu va fi activat, chiar dac expresia condiional este adevrat. Exemplu:


wait until ((x*y)<100);
- wait for expresie_de_timp. Permite suspendarea execuiei unui proces
pentru un timp specificat, de exemplu: wait for 10 ns;
Exemplele urmtoare prezint mai multe forme ale instruciunii wait until:
wait until semnal = valoare;
wait until semnalevent and semnal = valoare;
wait until not semnalstable and semnal = valoare;
unde semnal este numele unui semnal, iar valoare este valoarea care se
testeaz. Dac semnalul este de tip bit, atunci pentru valoarea '1' se ateapt frontul
cresctor al semnalului, iar pentru '0' frontul descresctor.
Instruciunea wait until se poate utiliza pentru implementarea unei
funcionri sincrone. n mod obinuit, semnalul testat este un semnal de ceas. De
exemplu, ateptarea frontului cresctor al unui semnal de ceas se poate exprima n
urmtoarele moduri:
wait until clk = '1';
wait until clk'event and clk = '1';
Pentru descrierile destinate sintezei, instruciunea wait until trebuie s fie
prima din cadrul procesului. Din aceast cauz, logica sincron descris cu o
instruciune wait until nu poate fi resetat n mod asincron.
Exemplu. Implementarea unui circuit cu resetare sincron, utiliznd
instruciunile wait i loop. Semnalul RESET trebuie verificat imediat dup fiecare
instruciune wait.
process
begin
RESET_LOOP: loop
wait until CLOCKevent and CLOCK = 1;
next RESET_LOOP when (RESET = 1);
X <= A;
wait until CLOCKevent and CLOCK = 1;
next RESET_LOOP when (RESET = 1);
Y <= B;
end loop RESET_LOOP;
end process;
Exemplu. Utilizarea procesului cu list de sensibilitate i
sensibilitate, dar cu instruciunea wait.

56

fr list de

Instruciunea wait este situat la sfritul procesului pentru a permite


instruciunilor din proces de fi executate o dat.
Sinteza circuitelor modelate cu limbajul VHDL
Limbajul VHDL a fost mai nti dezvoltat ca limbaj de descriere i simulare
a circuitelor i abia mai trziu acest limbaj a fost adaptat pentru sintez. Astfel c
limbajul are multe caracteristici i construcii care nu pot fi sintetizate.
Recomandri pentru sintez:
- Structurile de control seriale de tipul if-elsif-elsif-else pot fi sintetizate sub forma
unui lan serial de pori logice, ceea ce favorizeaz ntrzierile, astfel c n acest
caz este mai bine s se foloseasc instruciunile de selecie case sau with dac
condiiile se exclud reciproc.
- n cazul n care se folosesc instruciuni condiionale n cadrul unui proces, dac
pentru o anumit combinaie a intrrilor se omite specificarea valori pe care trebuie
s o ia aib ieirea, compilatorul va crea un latch (bistabil) la ieire care s poat
pstra vechea valoare a semnalului de ieire care altfel ar trebui s se schimbe. n
general generarea unui astfel de latch nu este dorit.
- Instruciunile de ciclare creeaz n general copii multiple ale logicii
combinaionale descrise n cadrul instruciunii. Dac se dorete folosirea unei
singure astfel copii a logici combinaionale ntr-o secven de pai atunci trebuie s
se proiecteze un circuit secvenial.
Definirea ntrzierilor

57

Fr specificarea ntrzierilor, modelarea circuitului are lor ntru-un timp de


simulare egal cu zero.
Limbajul VHDL permite modelarea ntrzierilor.
Unul dintre cuvintele cheie care permit introducerea ntrzierilor este after
care poate fi asociat cu orice tip de atribuire de semnal (secvenial, concurenial,
condiional i selectat).
Arhitectura pori logice interdicie (BUT-NOT), poate fi rescris dup cum
urmeaz:
Z <= 1 after 4ns when X = 1 and Y =0 else 0 after 3 ns;
Aceast poart este astfel modelat nct semnalul de ieire fa de cel de
intrare va avea o ntrziere de 4ns la tranziia din 0 n 1 i 3ns la tranziia din 1 n 0.
O alt instruciune care invoc dimensiunea timp este instruciunea secvenial
wait. Aceasta poate fi folosit pentru a suspenda executarea unui proces pentru o
anumit perioad de timp.
Aceste dou instruciuni care invoc dimensiunea timp nu sunt sintetizabile, ele
sunt utile ns la modelarea test-bench-urilor.
Exemplu. Programul, numit test-bench, care folosete instruciunea wait
pentru a genera formele de und simulate necesare la testarea funcionrii porii
logice interdicie.
entity BUT_NOT_TB is
end BUT_NOT_TB ;
architecture BUT_NOT_TB_arch of BUT_NO_TB is
component BUT_NOT port (X,Y : in BIT ; Z : out BIT) ;
component ;
signal XI, YI, ZI : BIT ;
begin
U1 : BUT_NOT port map (XI, YI, ZI) ;
process
begin
XI <= `0` ; YI <= `0` ;
wait for 10 ns ;
XI <= `0` ; YI <= `1` ;
wait for 10 ns ;
XI <= `1` ; YI <= `0` ;
wait for 10 ns ;
XI <= `1` ; YI <= `1` ;
wait ; -- suspend procesul pentru un timp nedetrminat
end process ;
end BUT_NOT_TB_arch ;

end

Descrierea circuitelor combinaionale n VHDL


Multiplexoare
Multiplexorul este un comutator digital care transmite la ieire datele de la
una dintre cele n surse de la intrare.
58

Mux 2 1

Program VHDL bazat pe flux de date:

S
D1

library IEEE;
use IEEE.std_logic_1164.all;
entity mux2_1 is
port (s: in std_logic;
D1,D0 : in std_logic;
Q : out std_logic);
end mux2_1;
architecture mux2_1_arch of mux2_1 is
begin
Q <= D1 when (s = '1') else D0;
end mux2_1_arch;

D0

Mux 4 1 (8biti pe linie )

D3
8

D2
8

D1
8

D0
8

Program VHDL bazat pe flux de date, utiliznd


instruciunea select

library IEEE;
use IEEE.std_logic_1164.all;
entity mux4in8b is
port(
s: in std_logic_vector (1 downto 0);
D3, D2, D1, D0: in std_logic_vector(1 to 8);
Q: out std_logic_vector(1 to 8) );
end mux4in8b;
architecture mux4in8b_arch of mux4in8b is
begin
with S select Q <=
D0 when "00",
D1 when "01",
D2 when "10",
D3 when "11",
(others => 'U' ) when others; -- creaza un
--vector de 8 biti din `U`, valoare
-- neinitializata
end mux4in8b_arch;

59

Mux 4 1 (8biti pe linie )

D3
8

D2

D1
8

D0
8

Program VHDL
comportamental

library IEEE;
use IEEE.std_logic_1164.all;
entity mux4in8b is
port( S: in std_logic_vector (1 downto 0);
D3, D2, D1, D0: in std_logic_vector(1 to 8);
Q: out std_logic_vector(1 to 8) );
end mux4in8b;
architecture mux4in8b_arch of mux4in8b is
begin
process (S, D3, D2, D1, D0)
begin
case S is
when "00" => Q <= D0;
when "01" => Q <= D1;
when "10" => Q <= D2;
when "11" => Q <= D3;
when others => Q <= (others =>'U') ;
end case;
end process;
end mux4in8b_arch;

Multiplexor specializat care


selecteaz una din cele patru
magistrale de intrare de 18
bii A, B, C i D, pentru a
comanda o magistral de
ieire de 18 bii Q.
Mux 4 1 (18biti pe linie )

D
18

18

18

B
18

A
18

S2
0
0
0
0
1
1
1
1

S1
0
0
1
1
0
0
1
1

S0
0
1
0
1
0
1
0
1

Q
A
B
A
C
A
D
A
B

library IEEE; -- comportamental


use IEEE.std_logic_1164.all;
entity mux4in18 is
port(
S: in std_logic_vector (2 downto 0);
A, B, C, D: in std_logic_vector(1 to 18);
Q: out std_logic_vector(1 to 18) );
end mux4in18;
architecture mux4in18b_arch of mux4in18 is
begin
process (S, A, B, C, D)
-- variable i : INTEGER;
begin
case S is
when "000"|"010" |"100" |"110" => Q <= A;
when "001"|"111" => Q <= B;
when "011" => Q <= C;
-- when "101" => Q <= D;
when others => Q <= (others =>'U') ;
end case;
end process;
end mux4in18b_arch;

60

Decodificatoare
Decodificatorul este un circuit care activeaz o singur ieire din 2n posibile,
corespunztor codului binar aplicat la cele n intrri.
DC 3 8
Y7
Y6
Y5
Y4
Y3
Y2
Y1
Y0

S2
S1
S0
En

Program VHDL comportamental pentru un decodificator 38 cu intrri


active pe 0.
library IEEE;
use IEEE.std_logic_1164.all;
entity dec3to8 is
port ( S: in std_logic_vector (2 downto 0); --intrari de selectare
EN: in std_logic; -- enable
Y: out std_logic_vector (7 downto 0)); -- iesirile sunt active pe zero
end dec3to8;
architecture dec3to8_arch of dec3to8 is
begin
process (S,EN)
begin
y <= "11111111";
61

if (en = '1') then


case S is
when "000" => Y(0) <= '0';
when "001" => Y(1) <= '0';
when "010" => Y(2) <= '0';
when "011" => Y(3) <= '0';
when "100" => Y(4) <= '0';
when "101" => Y(5) <= '0';
when "110" => Y(6) <= '0';
when "111" => Y(7) <= '0';
when others => null;
end case;
end if;
end process;
end dec3to8_arch ;
n cazul n care vreuneia dintre ieiri nu i se atribuie nici o valoare,
sintetizatorul va presupune ca ieirea respectiv trebuie si pstreze valoarea
curent i astfel se va genera un latch pentru ieirea respectiv, cea ce nseamn a
irosi din resursele cipului n care urmeaz a fi implementat modelul i de asemenea
ntrzieri n plus.
Un program VHDL comportamental mai flexibil care nu include tabelul de
adevr n cod:
library IEEE;
use IEEE.std_logic_1164.all;
USE ieee.numeric_std.ALL;
entity dec3to8 is
port ( S: in std_logic_vector (2 downto 0); --intrari de selectare
EN: in std_logic; -- enable
Y: out std_logic_vector (7 downto 0)); -- iesirile sunt active pe zero
end dec3to8;
architecture dec3to8_comp of dec3to8 is
begin
process (S,EN)
variable i : INTEGER range 0 to 7;
begin
Y <= "11111111";
if (EN = '1') then
for i in 0 to 7 loop
if i = to_integer(unsigned(S)) then Y(i) <= '0' ;
end if;
end loop;
end if;
62

end process;
end dec3to8_comp ;
library IEEE;
use IEEE.std_logic_1164.all;
USE ieee.numeric_std.ALL;
entity dec3to8 is
port ( S: in std_logic_vector (2 downto 0); --intrari de selectare
EN: in std_logic; -- enable
Y: out std_logic_vector (7 downto 0)); -- iesirile sunt active pe zero
end dec3to8;
architecture dec3to8_comp of dec3to8 is
begin
process (S,EN)
begin
Y <= "11111111";
if (EN = '1') then
Y(to_integer(unsigned(S))) <= '0';
end if;
end process;
end dec3to8_comp ;
library IEEE;
use IEEE.std_logic_1164.all;
USE ieee.numeric_std.ALL;
entity dec3to8 is
port ( S: in std_logic_vector (2 downto 0); --intrari de selectare
EN: in std_logic; -- enable
Y: out std_logic_vector (7 downto 0)); -- iesirile sunt active pe zero
end dec3to8;
architecture dec3to8_comp of dec3to8 is
begin
process (S,EN)
variable i :INTEGER;
begin
Y <= "11111111";
if (EN = '1') then
i := to_integer(unsigned(S));
Y(i) <= '0';
end if;
end process;
end dec3to8_comp ;
Acest program poate fi adaptat cu mai mult uurin pentru a realiza
decodoare binare de orice dimensiuni.
63

O alt variant de cod VHDL pentru decodificator, de data aceasta bazat pe


conceptul de flux de date:
library IEEE;
use IEEE.std_logic_1164.all;
entity dec3to8_alt is
port (S: in std_logic_vector(2 downto 0);
En: in std_logic;
Y_L: out std_logic_vector(0 to 7));
end dec3to8_alt;
architecture dec3to8_alt of dec3to8_alt is
signal YI : STD_LOGIC_VECTOR (0 to 7);
begin
with S select YI <=
"01111111" when "000" ,
"10111111" when "001" ,
"11011111" when "010" ,
"11101111" when "011" ,
"11110111" when "100" ,
"11111011" when "101" ,
"11111101" when "110" ,
"11111110" when "111" ,
"11111111" when others;
Y_L <= YI when En ='1' else "11111111";
end dec3to8_alt;
Codificatoare
Un codificator binar cu 2 intrri i n ieiri va genera la ieire un cuvnt de
cod la ieire cnd se va activa o linie la intrare.
Codificator binar
Program VHDL bazat pe flux de date
n

X7
X6
X5
X4
X3
X2
X1
X0

Y2
Y1
Y0

library IEEE;
use IEEE.std_logic_1164.all;
entity CD is port (
X : in std_logic_vector (7 downto 0);
Y : out std_logic_vector (2 downto 0));
end CD;
architecture CD_arch of CD is
begin
Y <=
"000" when X(0)='1' else
"001" when X(1)='1' else
"010" when X(2)='1' else
"011" when X(3)='1' else
"100" when X(4)='1' else
64

"101" when X(5)='1' else


"110" when X(6)='1' else
"111" when X(7)='1' else
"000";
end CD_arch;
Un codificator prioritar poate avea la intrare mai multe linii activate. El va
genera la ieire un cuvnt de cod care corespunde liniei activate cu prioritatea cea
mai mare.
Pentru descrierea unui codificator prioritar se va folosi construcia VHDL
if-then-else care descrie cel mai bine o ierarhie de prioriti. Aceast construcie se
utilizeaz doar n procese, deci descrierea este comportamental.
library IEEE;
use IEEE.std_logic_1164.all;
entity CD_PR is port (
X : in std_logic_vector (7 downto 0);
Y : out std_logic_vector (2 downto 0));
end CD_PR;
architecture CD_PR_arch of CD_PR is
begin
process(X)
begin
Y <= "000";
if
X(7)='1' then Y <= "111";
elsif X(6)='1' then Y <= "110";
elsif X(5)='1' then Y <= "101";
elsif X(4)='1' then Y <= "100";
elsif X(3)='1' then Y <= "011";
elsif X(2)='1' then Y <= "010";
elsif X(1)='1' then Y <= "001";
elsif X(0)='1' then Y <= "000";
end if;
end process;
end CD_PR_arch;
Deoarece toate instruciunile n interiorul unui process se execut secvenial,
prioritatea cea mai mare o are prima instruciune. Astfel intarea X(7) are prioritatea
cea mai mare.
Sumatoare binare
Sumator cu transport succesiv pe 8 bii.
Expresiile logice pentru un sumatior complet de 1 bit:

65

Pentru descrierea sumatorului se folosete instruciunea loop cu ajutorul


creia se genereaz logica specific sumatorului.
n cod se definete un semnal temporar signal c: std_logic_vector(7 downto
0);, pentru a pstra valoarea semnalului carry care se propag intern.
library IEEE;
use IEEE.std_logic_1164.all;
entity adder8 is port (
a,b: in std_logic_vector (7 downto 0); semnalele de intrare
cin: in std_logic; transport la intrare
sum: out std_logic_vector(8 downto 0); semnale de ieire
cout: out std_logic); transport la ieire
end adder8;
architecture adder8_arch of adder8 is
signal c: std_logic_vector(8 downto 0);
begin
process (a,b,cin,c)
begin
c(0) <= cin;
for i in 0 to 7 loop
sum(i) <= a(i) xor b(i) xor c(i);
c(i+1) <= (a(i) and b(i)) or (c(i) and (a(i) or b(i)));
end loop;
cout <= c(8);
end process;
end adder8_arch;
n urmtorul exemplu se prezint descrierea unui sumator cu transport
succesiv n care se utilizeaz un generic n, care specific dimensiunea sumatorului.
n cadrul entitii, acest generic este utilizat pentru definirea dimensiunii porturilor.
n cadrul arhitecturii, genericul n este utilizat pentru specificarea domeniului buclei
for.
library ieee;
use ieee.std_logic_1164.all;
entity add_succ is
generic (n: natural);
port (a, b: in std_logic_vector (n-1 downto 0);
cin: in std_logic;
s: out std_logic_vector (n-1 downto 0);
cout: out std_logic);
end add_succ;
architecture structural of add_succ is
66

begin
process (a, b, cin)
variable c: std_logic;
begin
c := cin;
for i in 0 to n-1 loop
s(i) <= a(i) xor b(i) xor c;
c := (a(i) and b(i)) or (a(i) and c) or (b(i) and c);
end loop;
cout <= c;
end process;
end structural;
n urmtorul exemplu se descrie un sumator pe 4 bii utiliznd instruciuni
concurente de asignare a semnalelor i instruciunea for generate. n acest
exemplu, semnalul de transport c s-a transformat ntr-un vector. Fiecare bit de
transport este un semnal separat, iar numrul de semnale necesare depinde de
parametrul generic n. Dimensiunea vectorului este dat de parametrul generic,
aceast dimensiune fiind mai mare cu 1 fa de dimensiunea operanzilor care se
adun pentru a furniza un transport de ieire.
library ieee;
use ieee.std_logic_1164.all;
entity add_succ is
generic (n: natural := 4);
port (a, b: in std_logic_vector (n-1 downto 0);
cin: in std_logic;
s: out std_logic_vector (n-1 downto 0);
cout: out std_logic);
end add_succ;
architecture structural of add_succ is
signal c: std_logic_vector (n downto 0);
begin
c(0) <= cin;
gen: for i in 0 to n-1 generate
s(i) <= a(i) xor b(i) xor c(i);
c(i+1) <= (a(i) and b(i)) or (a(i) and c(i)) or
(b(i) and c(i));
end generate;
cout <= c(n);
end structural;
O alt descriere a sumatorului folosete operatorii aritmetici. Aceti
operatori sunt aplicabili doar tipurilor reale, ntregi i fizice. Ei nu pot fi aplicai
tipurilor BIT_VECTOR i STD_LOGIC_VECTOR. Operatorii aritmetici sunt
67

definii n pachhetul IEEE.std_logic_arith. Acest pachet definete dou tipuri


tablou noi, SIGNED i UNSIGNED i un set de funcii de comparare pentru
operanzii de tipurile INTEGER, SIGNED i UNSIGNED.
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_arith.all;
entity adder is port (
a,b: in unsigned (7 downto 0);
c: in signed (7 downto 0);
d: in std_logic_vector (7 downto 0);
s: out unsigned (8 downto 0);
t: out signed (8 downto 0);
u: out signed (7 downto 0);
v: out std_logic_vector(8 downto 0) );
end adder8;
architecture adder_arch of adder8 is
begin
s <= ('0'& a) + ('0' & b);
t <= a+c ;
u <= c + signed (d) ;
v <= c - unsigned (d) ;
end adder_arch;
Rezultatul s are 9 bii pentru a afla transportul rezultant.Operatorul de
concatenare & este folosit pentru a extinde operanzii a i b astfel ca funcia de
adunare s returneze bitul de transport n poziia MSB a rezultatului.
Lungimea unui rezultat este, n mod normal, egal cu cea mai mare dintre
lungimile operanzilor. ns cnd un operand UNSIGNED se combin cu un
operand SIGNED sau INTEGER, lungimea acestui operand se mrete cu 1 pentru
a include i un bit de semn 0, apoi se stabilete lungimea rezultatului. Astfel,
rezultatul, t, are tot lungimea de 9 bii.
n mod normal, dac vreunul dintre operanzi este de tipul SIGNED,
rezultatul este SIGNED. La fel este i pentru tipul UNSIGNED. Dar dac
rezultatul se atribuie unui semnal sau unei variabile de tipul
STD_LOGIC_VECTOR, atunci rezultatul SIGNED sau UNSIGNED se
convertete n acel tip.
Rezultatul u este de tip SIGNED, de 8 bii. Intrarea d este convertit n
SIGNED. n ultima instruciune d este convertit la UNSIGNED, fiind extins
automat cu un bit i sczut din c, rezultnd v, de 9 bii.
Descrierea circuitelor secveniale n VHDL
Semnalele generate la ieirile unui circuit secvenial depind att de
semnalele de intrare, ct i de starea circuitului.
68

Starea prezent a circuitului este determinat de o stare anterioar i de


valorile semnalelor de intrare.
Circuitele secveniale conin elemente de memorare i circuite
combinaionale.
Efectul de memorare se datoreaz unor legturi inverse (bucle de reacie)
prezente n schemele logice ale acestor circuite.
n cazul circuitelor secveniale sincrone, modificarea strii se poate realiza la
momente bine definite de timp sub controlul unui semnal de ceas. n cazul
circuitelor secveniale asincrone, modificarea strii poate fi cauzat de schimbarea
aleatoare n timp a valorii unui semnal de intrare.
Comportamentul unui circuit asincron este mai puin sigur, evoluia strii
fiind influenat i de timpii de ntrziere ai componentelor circuitului. Trecerea
ntre dou stri stabile se poate realiza printr-o succesiune de stri instabile,
aleatoare.
Circuitele secveniale sincrone sunt mai fiabile i au un comportament
predictiv. Toate elementele de memorare ale unui circuit sincron i modific
simultan starea, ceea ce elimin apariia unor stri intermediare instabile. Prin
testarea semnalelor de intrare la momente bine definite de timp se reduce influena
ntrzierilor i a eventualelor zgomote.
Bistabile
Descrierea unui bistabil sincron Program VHDL comportamental
de tip D acionat pe nivelul semnalului
de ceas (latch).
library IEEE;
use IEEE.std_logic_1164.all;
D
Q
entity D_latch is
port (D, Clk : in std_logic;
Q , nQ : out std_logic);
Q
C
end entity D_latch;
architecture D_comp of D_latch is
begin
Tabelul de tranziie
p0: process (Clk) is
Dt Qt+1 nQt+1
begin
0 0
1
if (Clk = '1') then
1 1
0
Q <= D;
nQ <= not D;
end if;
end process p0;
end architecture D_comp;
Pornind de la aceast descriere, compilatorul VHDL deduce logic un
circuit latch, ntruct codul nu arat cum trebuie de procedat n cazul n care clk nu
este 1. Bistabilul creat va pstra valoarea Q ntre apelrile procesului.

69

n general, un compilator VHDL deduce un circuit latch pentru un semnal


cruia i se atribuie o valoare n cadrul unei instruciuni if sau case, dac nu se iau
n consideraie toate combinaiile de intrare.
Majoritatea schemelor digitale modelate cu VHDL sunt sisteme sincrone,
realizate cu bistabile active pe front (flip-flop). Pentru descrierea comportrii
activate pe front se folosete atributul event. Atributul event poate fi ataat unei
denumiri de semnal pentru ca valoarea rezultat s fie true dac semnalul i
schimb valoarea i false n caz contrar.
Folosind atributul event putem crea un model de bistabil activ pe front.
Construcia if (clk`event) ntoarce valoarea true pe oricare front al semnalului de
tact. Construcia if (clk`event and clk=`1`) ntoarce valoarea true doar pe frontul
cresctor al semnalului de tact.
Codul VHDL pentru un bistabil sincron de tip D acionat pe frontul cresctor
al semnalului de ceas cu intrare asincron de resetare.
library IEEE;
use IEEE.std_logic_1164.all;
entity vdff is
port (D, Clk, Clr : in std_logic;
Q , nQ : out std_logic);
end entity vdff;
architecture D_comp of vdff is
begin
p0: process (Clk, Clr) is
variable state: std_logic;
begin
if clr='1' then Q <= '0'; nQ <= '1';
elsif rising_edge(Clk) then
-- eslif (clk'event and clk = '1') then Q <= D; nQ <= not D; acelai efect
state := D;
end if;
Q <= state;
nQ <= not state;
end process p0;
end architecture D_comp;
Procesul utilizat pentru descrierea bistabilului este sensibil numai la
modificrile semnalului de ceas clk. Tranziia semnalului de intrare D nu
determin activarea procesului. n acest model intrarea asincron de tergere CLR
este dominant fa de orice comportare determinat de semnalul de tact CLK, deci
este prima evaluat n clauza if. Cnd CLR este negat, se evalueaz clauza
elsif.
Descrierea unui bistabil de

Program comportamental
70

tip JK cu resetare asincron


J

C
Q

clr

library ieee;
use ieee.std_logic_1164.all;
entity JK_FF is
port ( clk, J, K, clr: in std_logic;
Q, Qn: out std_logic );
end JK_FF;
architecture behv of JK_FF is
signal s: std_logic;
signal x: std_logic_vector(1 downto 0);
begin
x <= J & K; -- vector JK concatenat;
process (clk, clr) is
begin
if (clr = '1') then s <= '0';
elsif (rising_edge(clk)) then
case (x) is
when "11" => s <= not s;
when "10" => s <= '1';
when "01" => s <= '0';
when others => null;
end case;
end if;
end process;
Q <= s; --instruciuni concurente
Qn <= not s;
end behv;

Funcia rising_edge este definit n pachetul std_logic_1164, avnd rolul de


a detecta frontul cresctor al unui semnal. Aceast funcie se poate utiliza n locul
expresiei (clk'event and clk = '1'), dac semnalul clk este de tip std_logic. n acelai
pachet este definit i funcia falling_edge, care detecteaz fronturile
descresctoare ale semnalelor. Aceste funcii sunt preferate de ctre unii proiectani
deoarece la simulare funcia rising_edge, de exemplu, va asigura c tranziia este
de la '0' la '1' i nu va ine cont de alte tranziii, cum este cea de la 'U' la '1'.
Program comportamental
Descrierea unui bistabil
de tip SR cu resetare i
setatare asincron.
library ieee;
use ieee. std_logic_1164.all;
use ieee. std_logic_arith.all;
use ieee. std_logic_unsigned.all;
entity SR-FF is
port ( S,R,CLK,clr,set: in std_logic;
Q, nQ: out std_logic);
71

set

C
Q

clr

end SR-FF;
architecture SR_arch of SR-FF is
begin
process (CLK,clr, set)
variable x: std_logic;
begin
if (clr = '0') then
x:='0';
elsif (set = '0') then
x:='1';
elsif (CLK='1' and CLK'EVENT) then
if( S='0' and R='0') then
x:=x;
elsif (S='1' and R='1') then
x:='Z';
elsif (S='0' and R='1') then
x:='0';
else
x:='1';
end if;
end if;
Q<=x;
nQ<=not x;
end process;
end SR_arch;

Registre
Descrierea unui registru de 8 bii. D i Q sunt vectori. Registrul are un semnal de
validare a ceasului (ce).
library ieee;
use ieee.std_logic_1164.all;
entity reg8 is
port (clk, ce: in std_logic;
D: in std_logic_vector (7 downto 0);
Q: out std_logic_vector (7 downto 0));
end reg8;
architecture reg8_arch of reg8 is
begin
process (clk)
begin
if (clk'event and clk = '1') then
72

if (ce = '1') then Q <= D;


end if;
end if;
end process;
end reg8_arch;
Registre de deplasare
Un registru de deplasare este un circuit secvenial care deplaseaz la stnga
sau la dreapta coninutul registrului cu o poziie n fiecare ciclu de ceas. De obicei,
intrrile unui registru de deplasare sunt reprezentate de semnalul de ceas, o intrare
serial de date, un semnal de setare/resetare sincron sau asincron i un semnal de
validare a ceasului. n plus, un registru de deplasare poate avea semnale de control
i de date pentru ncrcarea paralel sincron sau asincron. Datele de ieire ale
unui registru de deplasare pot fi accesate fie serial, atunci cnd este accesibil numai
coninutul ultimului bistabil pentru restul circuitului, fie n paralel, atunci cnd este
accesibil coninutul mai multor bistabile.
Utilitarele de sintez ale diferitor firme conin resurse dedicate (ex. primitivele
SRL16 i SRL32, XILINX) care permit o implementare eficient a registrelor de
deplasare fr utilizarea unor bistabile suplimentare. Totui, aceste resurse permit
numai operaii de deplasare la stnga i au un numr limitat de semnale de
intrare/ieire: ceas, validarea ceasului, intrare serial de date i ieirea sincron.
Exist mai multe posibiliti pentru descrierea registrelor de deplasare n
limbajul VHDL:
- Utilizarea operatorului de concatenare: reg <= reg (6 downto 0) & SI;
- Utilizarea construciilor for loop;
- Utilizarea operatorilor de deplasare predefinii (sll, srl, sla, sra).
Descrierea unui registru de deplasare la stnga de 8 bii cu semnale de
validare a ceasului, intrare serial i ieire serial. Pentru descrierea registrului de
deplasare se utilizeaz o construcie for loop.
library ieee;
use ieee.std_logic_1164.all;
entity reg8_depl is
port (clk, ce, si: in std_logic;
so:
out std_logic);
end reg8_depl;
architecture reg_depl of reg8_depl is
signal tmp: std_logic_vector (7 downto 0);
begin
process (clk)
begin
if (clk'event and clk = '1') then
if (ce = '1') then
for i in 0 to 6 loop
tmp(i+1) <= tmp(i);
73

end loop;
tmp(0) <= si;
end if;
end if;
end process;
so <= tmp(7);
end reg_depl;

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_bit.all;
entity test is
port(clk,il,ir :in bit;
s :in bit_vector(1 downto 0);
i : in bit_vector(3 downto 0);
q : out bit_vector(3 downto 0));
end test;
architecture beh2 of test is
signal qtmp: bit_vector(5 downto 0);
begin
process(clk)
begin
if (clk = '1' and clk'event) then
case s is
when "00" => qtmp <= qtmp;
when "01" => qtmp <=il&i&ir;
when "10" => qtmp <= (il&qtmp(4 downto 1)&ir) sll 1;
when "11" => qtmp<= (il&qtmp(4 downto 1)&ir) srl 1 ;
when others => null;
end case;
end if;
end process;
q<=qtmp(4 downto 1);
end beh2;
Numrtoare
Descriea unui numrtor de 3 bii.
library ieee;
use ieee.std_logic_1164.all;
entity num3 is
port (clk: in std_logic;
74

num: out integer range 0 to 7);


end num3;
architecture num3_integer of num3 is
signal tmp: integer range 0 to 7;
begin
cnt: process (clk)
begin
if (clk'event and clk = '1') then
tmp <= tmp + 1;
end if;
end process cnt;
num <= tmp;
end num3_integer;
n exemplul anterior, pentru semnalul num, care este de tip integer, se
utilizeaz operatorul de adunare. Majoritatea utilitarelor de sintez permit aceast
utilizare, convertind tipul integer la tipul bit_vector sau std_logic_vector.
Utilizarea tipului integer pentru porturi pune ns unele probleme:
1) Pentru a utiliza valoarea num ntr-o alt poriune a proiectului pentru care
interfaa are porturi de tip std_logic, trebuie efectuat o conversie de tip.
2) Vectorii aplicai n timpul simulrii codului surs nu pot fi utilizai pentru
simularea modelului generat n urma sintezei. Pentru codul surs, vectorii trebuie
s fie valori ntregi. Modelul generat n urma sintezei necesit vectori de tip
std_logic.
Deoarece operatorul nativ + al limbajului VHDL nu este definit pentru
tipurile bit sau std_logic, acest operator trebuie redefinit nainte de adunarea
operanzilor care au aceste tipuri. Standardul IEEE 1076.3 definete funcii pentru
redefinirea operatorului + pentru urmtoarele perechi de operanzi: (unsigned,
unsigned), (unsigned, integer), (signed, signed) i (signed, integer). Aceste funcii
sunt definite n pachetul numeric_std al standardului 1076.3.
n urmtorul exemplu se utilizeaz tipul unsigned pentru ieirea
numrtorului.
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity num3 is
port (clk: in std_logic;
num: out unsigned (2 downto 0));
end num3;
architecture num3_unsigned of num3 is
signal tmp: unsigned (2 downto 0);
begin
cnt: process (clk)
begin
if (clk'event and clk = '1') then
tmp <= tmp + 1;
75

end if;
end process cnt;
num <= tmp;
end num3_unsigned;
De obicei, utilitarele de sintez pun la dispoziie pachete suplimentare care
redefinesc operatorii pentru tipul std_logic. Dei acestea nu sunt pachete standard,
ele se utilizeaz adesea de ctre proiectani, deoarece permit operaii aritmetice i
relaionale cu tipul std_logic, din acest punct de vedere fiind chiar mai utile dect
pachetul numeric_std. De asemenea, aceste pachete nu necesit utilizarea a dou
tipuri suplimentare (signed, unsigned) n plus fa de tipul std_logic_vector i nici
a funciilor necesare conversiei ntre aceste tipuri. La utilizarea unuia din aceste
pachete pentru operaiile aritmetice, utilitarul de sintez va utiliza pentru tipul
std_logic_vector o reprezentare fr semn sau una cu semn (n complement fa de
2) i va genera componentele aritmetice corespunztoare.
n urmtorul exemplu se prezint descrierea modificat a numrtorului din
exemplele precedente pentru a se utiliza pachetul std_logic_unsigned i tipul
std_logic_vector pentru ieirea numrtorului.
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity num3 is
port (clk: in std_logic;
num: out std_logic_vector (2 downto 0));
end num3;
architecture num3_std_logic of num3 is
signal tmp: std_logic_vector (2 downto 0);
begin
cnt: process (clk)
begin
if (clk'event and clk = '1') then
tmp <= tmp + 1;
end if;
end process cnt;
num <= tmp;
end num3_std_logic;
Numrtor de 8 bii cu semnale asincrone de resetare i setare.
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity num8 is
port (clk: in std_logic;
rst, set: in std_logic;
76

en, load: in std_logic;


data: in std_logic_vector (7 downto 0);
num: out std_logic_vector (7 downto 0));
end num8;
architecture arh_num8 of num8 is
signal tmp: std_logic_vector (7 downto 0);
begin
cnt: process (rst, set, clk)
begin
if (rst = '1') then
tmp <= (others => '0');
elsif (set = '1') then
tmp <= (others => '1');
elsif (clk'event and clk = '1') then
if (load = '1') then
tmp <= data;
elsif (en = '1') then
tmp <= tmp + 1;
end if;
end if;
end process cnt;
num <= tmp;
end arh_num8;
Majoritatea circuitelor programabile dispun de ieiri cu trei stri sau semnale
bidirecionale de I/E. n plus, anumite circuite dispun de buffere interne cu trei
stri. Un semnal cu trei stri poate avea valorile '0', '1' i 'Z', toate acestea fiind
permise de tipul std_logic.
Descrierea modificat a numrtorului din exemplul precedent pentru a
utiliza ieiri cu trei stri. Acest numrtor nu dispune de un semnal de setare
asincron.
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity num8 is
port (clk, rst: in std_logic;
en, load: in std_logic;
oe: in std_logic;
data: in std_logic_vector (7 downto 0);
num: out std_logic_vector (7 downto 0));
end num8;
architecture arh_num8 of num8 is
signal tmp: std_logic_vector (7 downto 0);
begin
cnt: process (rst, clk)
77

begin
if (rst = '1') then
tmp <= (others => '0');
elsif rising_edge (clk) then
if (load = '1') then
tmp <= data;
elsif (en = '1') then
tmp <= tmp + 1;
end if;
end if;
end process cnt;
oep: process (oe, tmp)
begin
if (oe = '0') then
num <= (others => 'Z');
else
num <= tmp;
end if;
end process oep;
end arh_num8;
n aceast descriere se utilizeaz un semnal suplimentar oe pentru controlul
ieirilor cu trei stri. Procesul etichetat cu oep descrie ieirile cu trei stri ale
numrtorului. Dac semnalul oe nu este activat, ieirile sunt trecute n starea de
nalt impedan. Descrierea procesului oep este n concordan cu funcionarea
unui buffer cu trei stri:

Proiectarea automatelor de stare cu VHDL


n domeniul circuitelor digitale, n majoritatea cazurilor, proiectanii trebuie
s proiecteze circuite care efectueaz anumite secvene specifice de operaii, de
exemplu, controlere utilizate pentru comanda funcionrii altor circuite.
Automatele de stare reprezint o metod foarte eficient pentru modelarea
circuitelor secveniale. Prin modelarea automatelor de stare ntr-un limbaj de
descriere hardware i utilizarea programelor de sintez proiectanii se pot
concentra doar asupra modelrii secvenei dorite de operaii fr a-i pune
probleme n privina implementrii circuitului. Aceast operaie este lsat
programelor de sintez.
78

Un automat de stare este un circuit secvenial cu mai multe stri interne. n


comparaie cu circuitele secveniale obinuite (numrtoare, regitri), tranziiile
dintr-o stare n alta i secvena de evenimente este mult mai complicat. Dei
diagrama bloc de baz a unui automat de stare este similar cu cea a unui circuit
secvenial obinuit, procedura de proiectare este diferit. Astfel, modelul unui
automat de stare se construiete plecnd de la un model mult mai abstract, cum ar
fi o diagram de stri, care descrie n format grafic interaciunile i tranziiile dintre
strile interne.
Formal, un automat de stare este specificat de 5 elemente: strile simbolice,
semnalele de intrare, semnalele de ieire, funcia pentru stabilirea strii urmtoare
i funcia pentru stabilirea valorilor de la ieire.
Dup tipul funciei pentru stabilirea valorilor de la ieire, automatele de stare
se mpart n dou categorii: Mealy i Moore.
n cazul automatelor Mealy, semnalele de ieire depind att de starea
curent, ct i de intrrile prezente.

n cazul circuitelor secveniale Moore, ieirile sunt dependente numai de


starea curent, fr s depind n mod direct de intrri.

Metoda Mealy permite implementarea unui anumit circuit printr-un numr


minim de elemente de memorare (bistabile), ns eventualele variaii necontrolate
ale semnalelor de intrare se pot transmite semnalelor de ieire. Proiectarea prin
metoda Moore necesit mai multe elemente de memorare pentru acelai tip de
comportament, dar funcionarea circuitului este mai sigur.

79

Implementarea in VHDL
Spre deosebire de alte limbaje de descriere hardware, VHDL nu este
prevzut cu elemente de limbaj speciale pentru modelarea automatelor de stare.
De aceea, pentru descrierea funcional a automatelor de stare se utilizeaz o
simpl translatare a diagramei de stare n instruciuni case i if.
Particulariti:
1. Tipul strilor este definit de utilizator. De obicei se utilizeaz tipul
enumerare.
TYPE state_type IS (idle, tap1, tap2, tap3, tap4 );
2. Se folosesc semnale sau variabile interne n arhitectur pentru memorarea
strilor.
SIGNAL filter : state_type;
3. Pentru a determina tranziia n starea urmtoare se folosete
insruciunea case.
4. Pentru a determina semnalele de ieire se folosete fie un proces
combinaional cu instruciunea case, fie asignarea condiional sau
selectiv de semnal.
Pentru descrierea automatului de stare, se pot utiliza diferite stiluri de
descriere:
1.
Un singur proces
conine att tranziia strilor ct i funciile de ieire;
2.
Dou procese
proces combinaional care conine logica strii urmtoare i logica
de ieire;
proces secvenial pentru actualizarea strii prezente, sincron cu
semnalul de ceas;
3.
Trei procese
proces combinaional care conine logica strii urmtoare ;
proces secvenial pentru actualizarea strii prezente, sincron cu
semnalul de ceas;
proces combinaional care conine logica de ieire;
Iniializare sincron i asincron
Orice automat de stare necesit o iniializare. Dac aceasta nu este inclus,
semnalele i variabilele de tipul std_logic se vor afla n starea `U` (neiniializat).
Vom analiza iniializarea sincron. Considerm c automatul de stare trece
din orice stare n starea iniial cnd semnalul reset este egal cu 0.
state_machine : process (clk)
begin
if (clk'EVENT AND clk = '1') then
if (reset = '0') then
80

state_vector <= idle;


else
-- condiiile de tranziie a strilor
end if;
end if;
end process state_machine;
Deoarece semnalul reset nu a fost inclus n lista de sensibilitate, doar
semnalul clk va activa procesul. A doua condiie if va fi evaluat doar atunci cnd
semnalul de ceas va trece din `0` n `1`. State_vector poate fi un semnal sau
variabil, care trece n starea idle atunci cnd semnalul reset este `0` pe frontul
cresctor al semnalului de ceas.
n cazul iniializrii asincrone semnalul reset va fi inclus n lista de
sensibilitate a procesului. Astfel procesul se va activa cnd unul dintre semnalele
clk i reset se va modifica.
state_machine : process (clk, reset)
begin
if (reset = '0') then
-- resetare asincron pe `0`
state_vector <= idle;
-- trecere n starea iniial
elsif (clk'EVENT AND clk = '1') then -- sincron cu frontul pozitiv
-- condiiile de tranziie a strilor
end if;
end process state_machine;
Semnalul reset are prioritate fa de semnalul clk, deoarece instruciunile se
evalueaz n ordine succesiv, deci condiia de resetare este analizat prima.
Reprezentarea automatelor finite
Automatele finite pot fi reprezentate prin digrame de stare (sisteme simple)
sau scheme bloc (sisteme complexe). Ambele reprezentri utilizeaz notaii
simbolice care arat tranziia dintre stri i valorile de la ieire n dependen
de anumite condiii.
Exemplu de diagram de stare
Exemplu de
pentru automatul Moore:
(Automatul Moore):

81

schem

bloc

Pentru automatul Mealy:


Pentru automatul Mealy:

Exemple de automate.
S se efectuieze sinteza unui detector de secven. Detectorul genereaz la
ieire valoarea 1 logic doar atunci cnd la intrare este aplicat secvena 0110.
Automatul Mealy.
Diagrama de stare:

82

x=0/z=1
x=0/z=0 s1
s0
rst

x=1/z=0

x=1/z=0
s2

s3

x=1/z=0

Codul VHDL pentru automatul Mealy descris cu 2 procese.


Library IEEE;
Use IEEE.std_logic_1164.all;
Entity mealy2 is
Port (CLK, rst,x: in std_logic;
Z: out std_logic);
End entity mealy2;
Architecture Mealy2_arch of mealy2 is
Type State is (s0, s1, s2, s3);
Signal cs, ns: state;
Begin
Secv: process (CLK, rst) is
begin
If (rising_edge(clk)) then
If (rst='1') then cs<=s0; else cs<=ns;
end if;
end if;
end process secv;
com: process (cs, x) is
begin
z<='0';
case cs is
when s0 => if (x='0') then ns<=s1; else ns<=s0; end if;
when s1=> if (x='0') then ns<=s1; else ns<=s2; end if;
when s2 => if (x='0') then ns<=s1; else ns<=s3; end if;
when s3 => if (x='0') then ns<=s1; z<='1'; else ns<=s0; end if;
end case;
end process com;
end architecture Mealy2_arch;

Diagrama de stare pentru automatul Moore

83

Codul VHDL pentru automatul Moore descris cu 2 procese.


Library IEEE;
Use IEEE.std_logic_1164.all;
Entity moore2 is
Port (CLK, rst,x: in std_logic;
Z: out std_logic);
End entity moore2;
Architecture moore2_arch of moore2 is
Type State is (s0, s1, s2, s3, s4);
Signal cs, ns: state;
Begin
Secv: process (CLK, rst) is
begin
If (rising_edge(clk)) then
If (rst='1') then cs<=s0; else cs<=ns;
end if;
end if;
end process secv;
com: process (cs, x) is
begin
z<='0';
case cs is
when s0 => if (x='0') then ns<=s1; else ns<=s0; end if;
when s1=> if (x='0') then ns<=s1; else ns<=s2; end if;
when s2 => if (x='0') then ns<=s1; else ns<=s3; end if;
when s3 => if (x='0') then ns<=s4; else ns<=s0; end if;
when s4 => z <='1'; ns <= s0;
84

end case;
end process com;
end architecture Moore2_arch;

Codul VHDL pentru automatul Moore descris cu 3 procese.

Library IEEE;
Use IEEE.std_logic_1164.all;
Entity Moore3 is
Port (CLK, rst,x: in std_logic;
Z: out std_logic);
End entity Moore3;
Architecture Moore3_arch of Moore3 is
Type State is (s0, s1, s2, s3, s4);
Signal cs, ns: state;
Begin
Secv: process (CLK) is
begin
If (rising_edge(clk)) then
If (rst='1') then cs<=s0; else cs<=ns;
end if;
end if;
end process secv;
com: process (cs, x) is
begin
case cs is
when s0 => if (x='0') then ns<=s1; else ns<=s0; end if;
when s1=> if (x='0') then ns<=s1; else ns<=s2; end if;
when s2 => if (x='0') then ns<=s1; else ns<=s3; end if;
when s3 => if (x='0') then ns<=s4; else ns<=s0; end if;
when s4 => ns <= s0;
end case;
end process com;
outputz: process (cs) is
begin
case cs is
when s0 | s1 | s2 | s3 => z<='0';
when s4 => z<='1';
end case;
end process outputz;
end architecture Moore3_arch;

85

Definirea i codificarea strilor


n mod implicit majoritatea utilitarelor de sintez folosesc codificarea
automat a strilor. Pot fi utilizate mai multe stiluri de codificare:
1. Codificare binar consecutiv.
2. Codificarea Gray.
3. Codificarea cu un bistabil pe stare.
4. Codificarea definit de utilizator.
Utilizatorul poate schimba aceast codificare folosind atribute predefinite
sau direct n mediul de programare.
n Quartus II se utilizeaz atributul syn_encoding .
TYPE count_state is (zero, one, two, three);
ATTRIBUTE syn_encoding
: STRING;
ATTRIBUTE syn_encoding OF count_state : TYPE IS "11 01 10 00";
SIGNAL present_state, next_state
: count_state;
Pentru a schimba codificarea n mediul de programare se acceseaz:
Assignments Settings Analysis & Synthesis Settings More Settings.

1. Codificare binar consecutiv (Sequential).


Avantajul: numr minim de bistabile (log2n);
Dezavantajul: Funcii complexe de tranziie a strilor; logic complicat
de decodare a strii curente; mai multe bistabile i pot schimba starea n
acelai timp.
86

S presupunem c avem un automat cu ase stri: idle, state1, state2,


state3, state4, state5. Atunci codificarea strilor va fi urmtoare:
idle
000
state1 001
state2 010
state3 011
state4 100
state5 101

2. Codul Gray.
Avantajul: Este cea mai sigur implementare, deoarece tranziia de la o stare
la alta va fi determinat de schimbarea valorii unui singur bistabil, deci este
exclus apariia unor stri intermediare. Este important n special n cazul
automatelor asincrone.
Dezavantaje: Funcii complexe de tranziie a strilor; logic complicat de
decodare a strii curente;
idle
000
state1 001
state2 011
state3 010
state4 110
state5 111
3. Codificarea cu un bistabil pe stare (one hot).
Tehnica de codificare cu un bistabil pe stare utilizeaz n bistabile pentru a
reprezenta un automat cu n stri. Pentru fiecare stare exist cte un bistabil, un
singur bistabil fiind setat la un moment dat. Decodificarea strii prezente const n
simpla identificare a bistabilului care este setat. Tranziia dintr-o stare n alta
const n modificarea strii bistabilului corespunztor strii vechi din 1 n 0 i a
strii bistabilului corespunztor strii noi din 0 n 1.
Avantajul principal al automatelor care utilizeaz codificarea cu un bistabil
pe stare este c numrul de pori necesare pentru decodificarea informaiei de stare
pentru ieiri i pentru tranziiile strilor este cu mult mai redus dect numrul de
pori necesare n cazul utilizrii altor tehnici. Aceast diferen de complexitate
crete pe msur ce numrul de stri devine mai mare.
idle
000001
state1 000010
state2 000100
state3 001000
state4 010000
state5 100000
n funcie de arhitectura circuitului utilizat pentru implementare, un automat
de stare care utilizeaz codificarea cu un bistabil pe stare poate necesita o cantitate
semnificativ mai redus de resurse pentru implementare dect un automat care
87

utilizeaz alte metode de codificare. De asemenea, logica strii urmtoare necesit,


de obicei, un numr mai redus de nivele logice ntre registrele de stare, ceea ce
permite o frecven mai ridicat de funcionare. Codificarea cu un bistabil pe stare
nu reprezint ns soluia optim n toate cazurile, n principal datorit faptului c
necesit un numr mai mare de bistabile dect codificarea secvenial. n general,
codificarea cu un bistabil pe stare este avantajoas atunci cnd arhitectura
circuitului programabil utilizat conine un numr relativ mare de bistabile i un
numr relativ redus de pori logice ntre bistabile. De exemplu, aceast codificare
este cea mai avantajoas pentru automatele de stare implementate cu circuite
FPGA, care conin un numr mai mare de bistabile dect circuitele CPLD.

Tolerana la defecte a automatelor de stare


n practic, anumite hazarduri, zgomote sau combinaii ilegale ale intrrilor
pot determina modificarea strii unuia sau a mai multor bistabile, ceea ce poate
avea ca efect tranziia automatului ntr-o stare ilegal.
Automatul poate rmne definitiv n aceast stare ilegal, sau poate activa o
combinaie ilegal a ieirilor, ceea ce poate cauza alte efecte nedorite. Automatele
de stare pot fi proiectate astfel nct s fie tolerante la defecte prin adugarea unei
logici care s asigure ieirea din strile ilegale.
Posibiliti de proiectare a automatelor de stare sigure.
1. Utilizarea construciei when others.
when others => stare <= idle;
Prin specificarea tranziiei din strile ilegale ntr-o stare cunoscut se va
genera o logic suplimentar.
Exist cazuri n care costul acestei soluii nu este justificat de necesitatea
unui automat tolerant la defecte.
n aceste cazuri, se poate specifica n mod explicit faptul c tranziia dintr-o
stare ilegal este o condiie indiferent (deci, nu are importan starea n care se
efectueaz tranziia dintr-o stare ilegal, deoarece nu este de ateptat ca automatul
s treac ntr-o asemenea stare).
n cazul codificrii explicite, condiiile indiferente pot fi declarate sub
forma:
when others => stare <= "---";
unde s-a presupus c semnalul stare este un vector de 3 bii.
Condiia when others poate fi necesar i atunci cnd toate strile
automatului sunt descrise, deoarece tipul vectorului de stare este std_logic_vector,
deci sunt 9 valori posibile, i nu doar valorile '1' sau '0'.
2. Suplimentarea numrului de stri pn la o putere a lui 2.
type stare is (s0, s1, s2, nedefinit);
signal cs, ns: stare;

case cs is
88


when nedefinit => ns<=s0;
end case;
type stare is (s0, s1, s2, s3, s4, u1, u2, u3);
signal cs, ns: stare;

case cs is

when others => ns<=s0;


end case;

89