Sunteți pe pagina 1din 19

LIMBAJUL VHDL

138

LUCRAREA NR. 8
DOMENIUL CONCURENT
1. Scopul lucrrii
Lucrarea urmrete familiarizarea cu noiunile fundamentale
referitoare la domeniul concurent al descrierilor VHDL. Se prezint detaliat
problematica arhitecturilor concurente, cea a proceselor elementare i cea a
semnalelor multi-surs i a funciilor lor de rezoluie. Noiunile expuse pot fi
asimilate i aprofundate cu ajutorul numeroaselor exemple oferite.

2. Noiuni introductive
2.1 Arhitecturi concurente
n VHDL putem descrie sistemele sub forma unor mulimi de
subsisteme funcionale opernd n mod concurent. Fiecare dintre aceste
sisteme care pot fi interdependente vor fi specificate sub forma unor
procese separate. Nivelul de detaliere (sau granularitatea) depinde de
necesiti uneori un proces poate descrie funcionarea unei componente
complexe, cum ar fi un microprocesor, alteori vom avea cte un proces
pentru fiecare component elementar de genul porilor logice fundamentale.
Unitate
central de
prelucrare

Sistem de
intrare /
ieire

Memorie

Unitate
de
dischet

Hard disc

Figura 8.1 Arhitectura clasic a unui microcalculator

139

LIMBAJUL VHDL

Descrierea comportamental a unui sistem va consta deci dintr-o


mulime de procese secveniale care opereaz n mod concurent.
De exemplu, pentru arhitectura clasic a microcalculatorului din
figura 8.1, descrierea VHDL va arta astfel:
architecture EXEMPLU of MICROCALC is
signal DATABUS: BIT_VECTOR (31 downto 0);
begin
UCP: process -- Unitatea Central de Prelucrare
begin
...
end process UCP;
MEM: process -- Memoria
begin
...
end process MEM;
I_E: process -- Sistemul de intrare i ieire a datelor
begin
...
end process I_E;
DISC: process -- Hard discul
begin
...
end process DISC;
FLOPPY: process -- Unitatea de dischet
begin
...
end process FLOPPY;
end architecture EXEMPLU;

Pentru nelegerea domeniului concurent al VHDL este esenial o


foarte bun cunoatere a noiunilor legate de arhitecturi. Obiectul VHDL
arhitectur este alctuit dintr-un antet i un corp.
Antetul specific numele arhitecturii i limitele corpului arhitecturii.
De asemenea, se precizeaz entitatea creia i aparine arhitectura. n plus,
aici se declar eventualele obiecte care vor fi interne arhitecturii.
Corpul arhitecturii are o structur concurent, care poate fi la nceput
mai dificil de neles, datorit faptului c toate instruciunile (procesele i
coninutul lor) sunt scrise n ordine secvenial (este singura posibilitate
existent n cadrul actualelor sisteme de calcul, bazate pe fiiere). Cu toate
acestea, trebuie s reinem c toate procesele din interiorul unei arhitecturi
sunt executate concurent unele fa de celelalte. Toate procesele din cadrul

DOMENIUL CONCURENT

140

descrierii n VHDL a sistemului vor fi complet specificate n interiorul


corpului arhitecturii.
Iat n continuare dou exemple foarte scurte de descriere
comportamental. Primul exemplu arat modelarea n VHDL a unui bistabil
D cu acionare pe frontul ascendent, cu un generator de tact intern, care
poate fi mascat de semnalul M, activ pe '0' logic (este un bistabil D cu
semnalul M pe post de clock enable). Desigur, niciun bistabil fizic nu are un
generator de tact intern, dar codul de mai jos reprezint un model foarte util
numai pentru simularea mai rapid i mai eficient a bistabilului.
entity BIST_D is
port (M, D: in BIT;
Q, NQ: buffer BIT);
end BIST_D;
architecture ARH of BIST_D is
signal S1, S2, CLOCK: BIT;
begin
CLK: process -- Generatorul de semnal de tact
begin
CLOCK <= '0';
wait for 5 ns;
CLOCK <= '1';
wait for 5 ns;
end process CLK;
N1: process(M)
begin
S1 <= not(M);
end process N1;
NAND1: process(S1, CLOCK)
begin
S2 <= S1 nand CLOCK;
end process NAND1;
D1: process(S2)
begin
if S2 = '1' then
Q <= D;
NQ <= not(D);
end if;
end process D1;
end architecture ARH;

141

LIMBAJUL VHDL

Al doilea exemplu arat implementarea n VHDL a arhitecturii din


figura 8.2, reprezentnd un sumator complet de numere pe un bit.

Figura 8.2 Sumator complet de numere pe un bit


entity SUMATOR_COMPLET is
port (A, B, CARRY_IN: in BIT;
SUM, CARRY_OUT: out BIT);
end SUMATOR_COMPLET ;
architecture ARH1 of SUMATOR_COMPLET is
signal S1, S2, S3, S4: BIT;
begin
P1: process(B, CARRY_IN)
begin
S1 <= B xor CARRY_IN;
end process P1;
P2: process(B, CARRY_IN)
begin
S2 <= B and CARRY_IN;
end process P2;
P3: process(A, B)
begin
S3 <= A and B;
end process P3;
P4: process(A, CARRY_IN)
begin
S4 <= A and CARRY_IN;
end process P4;
P5: process(A, S1)
begin
SUM <= A xor S1;
end process P5;
P6: process(S2, S3, S4)
begin
CARRY_OUT <= S2 or S3 or S4;

DOMENIUL CONCURENT

142

end process P6;


end architecture ARH1;

Dup cum s-a prezentat deja n lucrarea nr. 6, un proces suspendat va


fi reactivat atunci cnd oricare dintre semnalele de pe lista sa de sensibilitate
i modific valoarea. Aceast regul se aplic i n cazul n care exist mai
multe procese ntr-o arhitectur: atunci cnd un semnal i modific valoarea,
toate procesele care au respectivul semnal n lista lor de sensibilitate vor fi
reactivate. Instruciunile din interiorul proceselor reactivate vor fi aadar
executate secvenial, n ordine. Subliniem ns c aceste instruciuni vor fi
executate independent de instruciunile aflate n interiorul celorlalte procese.
Conceptul de concuren ar fi probabil mult mai uor de neles dac
am putea scrie procesele unul lng cellalt, i nu unul dup cellalt, aa cum
suntem obligai s o facem n fiierul surs, pe orice sistem de calcul existent
n momentul de fa.
ntruct procesele nu fac deosebirea ntre semnalele generate extern
(provenite din mediul exterior) i cele generate intern (declarate n interiorul
arhitecturii), rezult c semnalele care activeaz procesele pot fi generate i
de ctre alte procese existente n interiorul aceleiai arhitecturi.
De fiecare dat cnd un semnal aflat pe lista de sensibilitate a unui
anumit proces i modific valoarea, procesul respectiv va fi activat. Acest
lucru se ntmpl indiferent dac modificarea valorii semnalului a fost
produs de ctre mediul exterior sau de ctre un alt proces.
Observaie
Pentru a realiza transferuri de informaie ntre procese nu se pot
utiliza dect semnale. Datorit faptului c variabilele sunt obiecte locale
proceselor, ele nu pot fi utilizate ca purttoare de informaie ntre procese.
Noiunile expuse mai sus sunt ilustrate n urmtorul exemplu: un
bistabil JK construit cu bistabil D, avnd un generator de semnal de tact
descris n interiorul arhitecturii.

143

LIMBAJUL VHDL

entity BIST_JK is
port (J, K: in BIT;
Q, NQ: buffer BIT);
end BIST_JK;
architecture ARH of BIST_JK is
signal S1, S2, S3, S4, CLOCK: BIT;
begin
CLK: process -- Generatorul de semnal de tact
begin
CLOCK <= '0';
wait for 5 ns;
CLOCK <= '1';
wait for 5 ns;
end process CLK;
NAND1: process(J, NQ)
begin
S1 <= J nand NQ;
end process NAND1;
NAND2: process(S1, S4)
begin
S2 <= S1 nand S4;
end process NAND2;
NAND3: process(S3, Q)
begin
S4 <= S3 nand Q;
end process NAND3;
NOT1: process(K)
begin
S3 <= not(K);
end process NOT1;
process(CLOCK)
begin
if CLOCK = '1' then
Q <= S2;
NQ <= not(S2);
end if;
end process;
end architecture ARH;

2.2 Procese elementare


n anumite cazuri este necesar s utilizm pori logice elementare ca
module separate n cadrul arhitecturii, precum n exemplul de mai jos:

DOMENIUL CONCURENT

144

IEIRE_I <= IN1 and IN2;

Specificarea unui asemenea comportament foarte simplu cu ajutorul


unui proces ar necesita nc trei instruciuni suplimentare (antetul procesului,
clauza begin i clauza end process), ceea ce este de prisos n cazul unei
simple pori logice I. Limbajul VHDL permite simplificarea proceselor de
acest gen (cele care conin o singur instruciune) prin utilizarea
instruciunilor singulare de asignare concurent de valori semnalelor
(numite astfel deoarece ocup, de regul, o singur linie de cod).
O instruciune de asignare concurent de semnal poate aprea n
interiorul unei arhitecturi, eventual n paralel cu unele procese, i poate fi
executat concurent cu alte instruciuni, n mod similar proceselor. Dac
dou sau mai multe instruciuni de asignare apar n cadrul unui proces, ele
vor fi executate secvenial n ordinea n care au fost scrise. ns, dac
reprezint instruciuni de asignare concurent de semnal (deci apar n afara
oricrui proces), ele vor fi executate n mod concurent.
Observaie
Instruciunile de asignare concurent a semnalelor sunt echivalente cu
un proces coninnd o singur instruciune de asignare de semnal. Dac n
cadrul unui proces apar dou sau mai multe instruciuni de asignare, ele vor fi
executate ntr-o anumit secven predefinit. Cu toate acestea, dac aceleai
instruciuni vor aprea ca asignri concurente de semnal (deci apar n afara
oricrui proces), ele vor fi executate concurent.
Implementarea unui bistabil RS asincron constituie o ilustrare foarte
bun a utilizrii instruciunilor de asignare concurent:
entity BIST_RS is
port (SET, RESET: in BIT;
Q, NQ: buffer BIT);
end BIST_RS;
architecture ARH of BIST_RS is
begin
Q <= not(NQ and SET) after 1 ns;
NQ <= not(Q and RESET) after 1 ns;
end architecture ARH;

Cele dou arhitecturi din exemplul de mai jos sunt echivalente:

145

LIMBAJUL VHDL

architecture ARH1 of ENTITATE is


signal IN1, IN2: BIT;
begin
P1: process (A, C)
begin
IN1 <= A or C;
end process P1;
P2: process (B, D)
begin
IN2 <= B or D;
end process P2;
P3: process (IN1, IN2)
begin
OUT <= IN1 and IN2;
end process P3;
end architecture ARH1;
architecture ARH2 of ENTITATE is
signal IN1, IN2: BIT;
begin
IN1 <= A or C;
IN2 <= B or D;
OUT <= IN1 and IN2;
end architecture ARH2;

Pentru activarea proceselor am artat deja c se folosesc listele de


sensibilitate i instruciunile wait. Atunci, cum stau lucrurile cu instruciunile
de asignare concurent a semnalelor, care nu au nici instruciuni wait i nici
liste de sensibilitate?
Dup cum se poate observa n exemplul de mai sus, listele de
sensibilitate ale tuturor proceselor conin semnale care apar ulterior n
membrul drept al instruciunilor de asignare. Prin urmare, instruciunea de
asignare concurent de semnal este sensibil la orice modificare a oricrui
semnal care apare n membrul ei drept. Aceast asignare poate fi ntrziat cu
ajutorul clauzei after, folosindu-se n acest scop modelul de ntrziere
inerial sau transport (prezentate n lucrarea nr. 3).
Revenind la exemplul anterior cu descrierea sumatorului complet de
numere pe un bit din figura 8.2, o implementare echivalent este cea care
urmeaz:

DOMENIUL CONCURENT

146

entity SUMATOR_COMPLET is
port (A, B, CARRY_IN: in BIT;
SUM, CARRY_OUT: out BIT);
end SUMATOR_COMPLET;
architecture ARH2 of SUMATOR_COMPLET is
signal S1, S2, S3, S4: BIT;
begin
S1 <= B xor CARRY_IN;
S2 <= B and CARRY_IN;
S3 <= A and B;
S4 <= A and CARRY_IN;
SUM <= A xor S1;
CARRY_OUT <= S2 or S3 or S4;
end architecture ARH2;

2.3 Pilotul (driver-ul) unui semnal


n cadrul acestei seciuni vom relua anumite noiuni referitoare la
semnale, n special cele referitoare la semnalele multi-surs.
Semnalele primesc noi valori n cadrul proceselor numai n momentul
suspendrii acestora, suspendare realizat cu ajutorul instruciunii wait
explicite sau implicite (prin lista de sensibilitate a procesului). n plus, dac
exist mai multe asignri de valori pentru un acelai semnal, numai ultima va
fi luat n considerare. Atunci, cum se pot stoca informaiile referitoare la
evenimentele aprute pe un anumit semnal?
Aceast funcie este ndeplinit de pilotul (driver-ul) semnalului
respectiv. Compilatorul VHDL creeaz cte un pilot pentru fiecare semnal
care primete o valoare n interiorul unui proces. Regula este foarte simpl:
indiferent cte valori sunt atribuite semnalului n cadrul procesului, exist un
singur pilot per semnal per proces. Toate operaiile sunt efectuate asupra
pilotului, care este copiat n semnalul propriu-zis numai atunci cnd procesul
este suspendat.
Datorit pilotului su, fiecare semnal cunoate valorile sale trecute,
prezente i viitoare (acestea din urm pot fi cunoscute deoarece fiecare pilot
poate specifica i forma de und proiectat s apar pe semnalul respectiv).
Fiecrui pilot i poate fi asignat o asemenea form de und care va consta
dintr-o secven de una sau mai multe tranzacii. O tranzacie const dintr-o
valoare a semnalului mpreun cu o valoare de tip TIME, care va specifica
momentul de timp cnd pilotului i va fi asignat noua valoare specificat de
ctre tranzacie.

147

LIMBAJUL VHDL

Forma de und poate fi specificat n mod explicit ca o secven de


valori mpreun cu ntrzierile asociate. Formele de und pot fi considerate
drept viitorul proiectat al semnalului. ntruct simulatoarele stocheaz
tranzaciile fiecrui semnal, ele creeaz ntr-adevr istoria semnalelor.
Un semnal cruia i se poate determina cu uurin istoria i viitorul
este semnalul CLOCK din cadrul exemplelor anterioare de bistabili cu
generator de tact intern (bistabil D i bistabil JK).
Atunci cnd un semnal are un singur pilot, valoarea sa este foarte
uor de determinat. n foarte multe aplicaii, semnalele cu mai multe surse
sunt o apariie obinuit. De exemplu, n interiorul unui calculator cu
arhitectur clasic von Neumann, magistrala intern primete valori din
partea procesorului, a memoriei, a discurilor i a dispozitivelor de intrare /
ieire. Fiecare fir metalic din componena magistralei va fi deci pilotat de mai
multe dispozitive. De vreme ce VHDL este un limbaj de descriere hardware
specializat pentru sistemele numerice, astfel de situaii sunt controlate cu
uurin.
Este greu de stabilit dac un semnal cu mai multe surse va fi
ntotdeauna pilotat (comandat), la un anumit moment dat, de ctre un singur
dispozitiv. n unele sisteme aceast situaie trebuie evitat cu strictee, pe
cnd n altele ea este chiar dorit (de exemplu, n cazul implementrilor de
poart I cablat sau poart SAU cablat (wired AND, respectiv wired
OR)). n general, semnalele cu surse multiple necesit stabilirea unei metode
de determinare a valorii rezultante atunci cnd exist mai multe dispozitive
surs care furnizeaz date n mod concurent.
n cele ce urmeaz prezentm exemplul unui controler de magistral
utilizat pentru citirea i scrierea n / din dispozitive de intrare / ieire.
Magistrala poate fi accesat i din exterior. De remarcat semnalele multisurs i asignarea semnalelor n procese diferite.

library IEEE;
use IEEE.STD_LOGIC_1164.all;
entity SISTEM is
port (INSTR: in INTEGER range 0 to 4;

-- codul instruciunii

DOMENIUL CONCURENT

148

DATA_BUS: inout STD_LOGIC_VECTOR(7 downto 0));


end SISTEM;
architecture ARH of SISTEM is
signal CIT_SCR: STD_LOGIC; -- '1'
signal SELECT_DISP: STD_LOGIC;

= citire, '0' = scriere

-- '1' memoria, '0' interfaa de I/E

begin
CTRL: process(INSTR) -- Procesul de
begin
case INSTR is
when 0 => CIT_SCR <= '1';
SELECT_DISP <= '1';
when 1 => CIT_SCR <= '0';
SELECT_DISP <= '1';
when 2 => CIT_SCR <= '1';
SELECT_DISP <= '0';
when 3 => CIT_SCR <= '0';
SELECT_DISP <= '0';
when 4 => CIT_SCR <= 'Z';
SELECT_DISP <= 'Z';
end case;
end process CTRL;

control

----------

Instruciune de citire
din memorie
Instruciune de scriere
n memorie
Instruciune de citire
din dispozitivul de I/E
Instruciune de scriere
n dispozitivul de I/E
Instruciune nul

MEM: process(SELECT_DISP, CIT_SCR) -- Emularea memoriei


variable CEL: STD_LOGIC_VECTOR (7 downto 0);
begin
if SELECT_DISP = '1' then
if CIT_SCR = '1' then
DATA_BUS <= CEL after 7 ns;
-- Citire din memorie
else CEL := DATA_BUS;
-- Scriere n memorie
end if;
else DATA_BUS <= (others => 'Z'); -- nalt impedan
end if;
end process MEM;

I_E: process(SELECT_DISP, CIT_SCR) -- Emularea interfeei


variable INTR_IES: STD_LOGIC_VECTOR (7 downto 0);
begin
if SELECT_DISP = '0' and SELECT_DISP'EVENT then

de I/E

LIMBAJUL VHDL

149

if CIT_SCR = '1' then


DATA_BUS <= INTR_IES after 12 ns;-else INTR_IES:= DATA_BUS;
-end if;
else DATA_BUS <= (others => 'Z'); -end if;
end process I_E;
end architecture ARH;

Citire de la portul de I/E


Scriere la portul de I/E
nalt impedan

2.4 Rezolvarea semnalelor multi-surs


Simulatorul VHDL nu poate ti cu anticipaie dac un semnal
multi-surs va fi sau nu activat din dou sau mai multe surse simultan.
Datorit acestui fapt, simulatorul trebuie s fie pregtit pentru a mixa
valorile semnalului. Aceast mixare a semnalelor se numete n VHDL
rezolvare (resolving).
Regulile de mixare a valorilor semnalelor sunt specificate sub forma
unui tabel, care se numete funcie de rezoluie. Tabelul conine toate valorile
posibile ale semnalului i fiecare poziie din el conine informaii referitoare la
valoarea care va fi generat dac cele dou valori corespunztoare liniei i
coloanei respective vor fi mixate.
S

A
Y

Figura 8.3 Semnal multi-surs (Y) cu doi piloi


n figura 8.3 este prezentat un exemplu foarte simplu de semnal
multi-surs. Semnalul Y este comandat de doi piloi. Semnalul S va
determina dac ieirea Y va fi conectat la A sau la not(A).
library IEEE;
use IEEE.STD_LOGIC_1164.all;

DOMENIUL CONCURENT

150

entity PILOI1 is
port (A, S: in STD_LOGIC;
Y: out STD_LOGIC);
end PILOI1;
architecture ARH1 of PILOI1
begin
P1: process(A, S)
begin
if S = '1' then
else Y <= 'Z';
end if;
end process P1;
P2: process(A, S)
begin
if S = '0' then
else
end if;
end process P2;
end architecture ARH1;

is

Y <= A;

Y <= not(A);
Y <= 'Z';

Studiind cu mai mult atenie aceast problem, ne putem da seama


c funcia de rezoluie are nevoie de mai multe valori dect cele din
componena setului de baz. O situaie similar apare atunci cnd ncercm s
reprezentm semnale multi-surs n VHDL. De exemplu, pentru tipul BIT,
prima problem care se pune este urmtoarea: ce se va ntmpla dac vom
mixa valorile '0' i '1' (cu alte cuvinte, care este valoarea rezolvat pentru '0'
i '1'?). Problema nu poate fi rezolvat folosind numai dou valori prin
urmare, ntrebarea precedent nu are rspuns.
Acest aspect are o serie ntreag de consecine: dac vom folosi
numai tipurile de date BIT i BIT_VECTOR, atunci NU vom putea specifica
un microprocesor (de exemplu) n VHDL. Tipurile de date nerezolvate (aa
cum sunt cele dou tipuri menionate mai sus, BIT i BIT_VECTOR) nu pot
fi folosite pentru semnale multi-surs, care sunt ns indispensabile pentru
specificarea magistralelor de date (care exist, n mod evident, n orice
microprocesor). Pentru rezolvarea acestei probleme, trebuie s utilizm alt
tip de date, care s conin mai mult de dou valori i care s aib definit o
funcie de rezoluie pentru toate combinaiile valorilor semnalelor.
library IEEE;
use IEEE.STD_LOGIC_1164.all;

151

LIMBAJUL VHDL

entity PILOI2 is
port (A: in BIT;
Y: out BIT;
B: in STD_LOGIC;
Y1: out STD_LOGIC);
end PILOI2;
architecture ARH2 of PILOI2 is
begin
P1: process(A)
begin -- Aceast condiie este suficient pentru detectarea
-- frontului ascendent n cazul tipului BIT
if A = '1' and A'EVENT then Y <= A after 1 ns;
end if;
end process P1;
P2: process(B)
begin -- Aceast condiie este suficient pentru detectarea
-- frontului ascendent n cazul tipului STD_LOGIC
if B = '1' and B'EVENT and B'LAST_VALUE = '0'
then Y1 <= B after 2 ns;
end if;
end process P2;
end architecture ARH2;

Uneori, chiar i semnalele uni-surs necesit mai mult de dou valori


pentru reprezentarea obiectelor hardware. Iat cteva dintre cele mai des
ntlnite valori care pot s apar:
- Dac tim despre un semnal c a fost iniializat, dar nu putem
determina cu precizie dac n acest moment valoarea sa este 0
sau 1 sau Z, atunci valoarea semnalului va fi notat cu X;
- Tampoanele (buffers) tri-state deconecteaz dispozitivele
generatoare de liniile de semnal prin intermediul strii de nalt
impedan, notat cu 'Z';
- Uneori, un semnal poate avea o valoarea neasignat sau
necunoscut, care este diferit de valoarea indiferent. Aceast
stare poate aprea, de exemplu, n cazul unui bistabil, a crui
stare intern nu este cunoscut n momentul punerii sub tensiune
a sistemului, dac nu exist o logic de auto-iniializare; ea se
noteaz cu 'U';
- Valoarea notat cu 'L' nseamn starea '0' slab (de exemplu, ieire
emitor deschis n starea logic '0');

DOMENIUL CONCURENT
-

152

Valoarea notat cu 'H' nseamn starea '1' slab (de exemplu,


ieire emitor deschis n starea logic '1');
- Valoarea notat cu 'W' nseamn starea necunoscut slab;
- Uneori, valoarea semnalului nu este important. Atunci, spunem
c valoarea sa este indiferent (don't care) i se noteaz cu '-'.
Aceste valori i altele, mai puin frecvente, sunt specificate de tipul de
date STD_ULOGIC, definit n cadrul pachetului STD_ULOGIC_1164 (litera
U vine de la termenul Unresolved types). Pachetul conine, de asemenea, o
definiie a tipului vector, care se bazeaz pe tipurile STD_ULOGIC i
STD_ULOGIC_VECTOR. Ambele tipuri au i un set de operaii logice de
baz definite asupra lor. Aceste valori nu pot fi utilizate n cazul semnalelor
multi-surs.
Un semnal care posed o funcie de rezoluie se numete semnal
rezolvat, ceea ce nseamn c poate avea mai multe surse - cu alte cuvinte,
acestui semnal i pot fi asignate mai multe valori, n cadrul unor procese
diferite.
Funcia de rezoluie poate fi menionat la nivelul unei declaraii de
sub-tip de date (situaie n care ea se va aplica tuturor semnalelor de acest
sub-tip) sau a unei declaraii de semnal.
n decursul simulrii, aceast funcie este apelat pentru calcularea
valorii pe care o va lua semnalul. Pentru calcul, ea utilizeaz toate valorile
surselor semnalului respectiv, cu excepia celor care fac obiectul unei
tranzacii nule, adic cele care sunt deconectate. n VHDL este posibil
specificarea deconectrii unui semnal, funcionalitate deosebit de preioas
pentru modelarea unei magistrale.
De ce este asociat funcia de rezoluie unui sub-tip de date sau unui
semnal i nu unui tip de date? Aceast particularitate a limbajului VHDL
permite pstrarea compatibilitii cu tipul de date de baz, oferind totodat
utilizatorului mai multe sub-tipuri de date, fiecare cu propria sa funcie de
rezoluie.
Pentru tipurile compuse, putem avea o funcie de rezoluie la nivelul
elementelor i o alta la nivelul tipului compus nsui. Apare deci un conflict:
care dintre aceste funcii de rezoluie va fi aplicat? Problema este soluionat
astfel: dac exist o funcie de rezoluie definit la nivelul tipului compus, ea
va fi cea luat n considerare, i va masca funcia de rezoluie a elementelor
constituente ale respectivului tip de date.
Funcia de rezoluie nu are dect un singur parametru de intrare care
este un vector (tablou uni-dimensional) neconstrns (numrul de elemente nu

153

LIMBAJUL VHDL

este impus), ale crui elemente sunt de acelai tip ca i semnalul. n timpul
ciclului de simulare, ea va fi utilizat automat de fiecare dat cnd se va pune
problema calculrii valorii rezultante.
Observaie
O funcie de rezoluie trebuie n principiu s fie comutativ i
asociativ, dac se urmrete modelarea corect a unui conflict de valoare.
Dac nu se dorete aa ceva, atunci ordinea apelurilor, care nu se afl sub
controlul proiectantului, va influena valoarea rezultant a unui conflict. Cu
toate acestea, aceste proprieti (comutativitatea i asociativitatea) nu fac
obiectul unor verificri din partea compilatorului.
Cele mai importante aspecte de reinut n cazul funciilor de rezoluie
sunt urmtoarele:
1. Argumentul funciei este unic i este un vector cu elemente de
acelai tip ca i valoarea returnat de funcie;
2. Proiectantul nu controleaz apelul acestei funcii, care se face
automat de ctre simulator atunci cnd apare necesitatea
rezolvrii (la conflicte).
Vom prezenta n continuare dou exemple. Primul este cel al unei
funcii de rezoluie aplicabil unor semnale de tipul BIT_REZOLV.
BIT_REZOLV este un tip de date care conine patru valori: '0', '1', 'X' i 'Z'.
BIT_REZOLV_VECTOR este definit ca un vector cu un numr oarecare de
elemente de tip BIT_REZOLV.
Reamintim c se recomand includerea funciei de rezoluie ntr-un
pachet care s conin i declaraia tipului de date rezolvat corespunztor.
function REZ(SURSE: BIT_REZOLV_VECTOR) return BIT_REZOLV is
variable REZULTAT: BIT_REZOLV := 'Z';
begin
-- Algoritmul calculeaz valoarea returnat (REZULTAT) n
-- funcie de valorile vectorului SURSE
for i in SURSE'RANGE loop
case SURSE(i) is
when 'X' => return 'X';
when '0' => if REZULTAT = '1' then
return 'X';
else REZULTAT := '0';
end if;
when '1' => if REZULTAT = '0' then

DOMENIUL CONCURENT

154

return 'X';
else REZULTAT := '1';
end if;
when 'Z' => null;
end case;
end loop;
return REZULTAT;
end REZ;

Al doilea exemplu este de fapt un extras din codul surs original din
pachetul IEEE STD_LOGIC i reprezint funcia i tabelul de rezoluie
pentru tipul de date STD_LOGIC. Aceasta este cea mai simpl modalitate de
reprezentare a funciei de rezoluie pentru logica cu 9 valori:
package body STD_LOGIC_1164 is
constant RESOLUTION_TABLE: STD_LOGIC_TABLE := (
------------------------------------------------------------ U
X
0
1
Z
W
L
H

-----------------------------------------------------------('U', 'U', 'U', 'U', 'U', 'U', 'U', 'U', 'U'),-- U


('U', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X'),-- X
('U', 'X', '0', 'X', '0', '0', '0', '0', 'X'),-- 0
('U', 'X', 'X', '1', '1', '1', '1', '1', 'X'),-- 1
('U', 'X', '0', '1', 'Z', 'W', 'L', 'H', 'X'),-- Z
('U', 'X', '0', '1', 'W', 'W', 'W', 'W', 'X'),-- W
('U', 'X', '0', '1', 'L', 'W', 'L', 'W', 'X'),-- L
('U', 'X', '0', '1', 'H', 'W', 'W', 'H', 'X'),-- H
('U', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X'),-- -
);
function RESOLVED(S: STD_LOGIC_VECTOR) return STD_ULOGIC is
variable RESULT: STD_ULOGIC := 'Z'; -- implicit e starea cea
-- mai slab
begin
-- Este esenial s se efectueze un test pentru detectarea
-- cazului n care exist un singur pilot, altminteri bucla
-- ar returna valoarea 'X' n cazul n care ar exista un
-- singur pilot de semnal de valoare '-'
if (S'LENGTH = 1) then return S(S'LOW);
else REZULTAT = '0';
for I in S'RANGE loop

LIMBAJUL VHDL

155

RESULT := RESOLUTION_TABLE(RESULT, S(I));


end loop;
end if;
return RESULT;
end RESOLVED;

Recapitulnd: tipul de date STD_ULOGIC suport toate valorile ce


s-ar putea dovedi necesare pentru specificarea oricrui sistem numeric.
Totui, acest tip de date este nerezolvat, fiind inutilizabil n cazul semnalelor
multi-surs. De aceea, n pachetul STD_LOGIC_1164 s-a definit un tip de
date suplimentar: STD_LOGIC, care mbin puterea expresiv a celor nou
valori ale lui STD_ULOGIC cu avantajele funciei de rezoluie, oferind
proiectantului un tip de date universal. n momentul de fa, STD_LOGIC sa impus ca un adevrat standard industrial de facto.
Singura diferen dintre STD_LOGIC i STD_ULOGIC este aceea
c primul este o versiune rezolvat a celui de-al doilea. Din acest motiv, toate
operaiile i funciile (inclusiv RISING_EDGE i FALLING_EDGE) definite
pentru STD_ULOGIC pot fi utilizate i pentru STD_LOGIC, fr nici o alt
declaraie suplimentar. Tipul STD_LOGIC_VECTOR este o versiune
rezolvat a lui STD_ULOGIC_VECTOR.
VALID_A

A
Y
VALID_B

Figura 8.4 Circuit a crui ieire este controlat de doi piloi independeni
n circuitul din figura 8.4, ieirea Y este controlat din dou surse
independente. Specificaia sa n VHDL este prezentat mai jos:
library IEEE;
use IEEE.STD_LOGIC_1164.all;
entity PILOI3 is
port (VALID_A, VALID_B: in BOOLEAN;
A, B: in STD_LOGIC;
Y: out STD_LOGIC);
end PILOI3;
architecture ARH3 of PILOI3 is

DOMENIUL CONCURENT

156

signal SA, SB: STD_LOGIC;


begin
SA <= A when VALID_A else 'Z';
SB <= B when VALID_B else 'Z';
P1: process(SA)
begin
Y <= SA;
end process P1;
P2: process(SB)
begin
Y <= SB;
end process P2;
end architecture ARH2;

3. Desfurarea lucrrii
3.1 Se va desena structura intern (cu pori) a bistabilului D descris n
primul exemplu din lucrare.
3.2 Se va testa sumatorul complet de numere pe un bit din figura 8.2.
Cum se poate face trecerea la un sumator de numere pe 2, 3, 4
etc. bii?
3.3 Se va desena structura intern (cu pori) a bistabilului JK descris
n exemplul din lucrare.
3.4 Se va proiecta o component buffer tri-state cu semnalul de
validare (enable) activ pe 0.
3.5 Se va implementa i testa exemplul funciei de rezoluie pentru
tipul BIT_REZOLV.

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