Title: Aspecte avansate
1Aspecte avansate
- (Advanced topics)
- Capitolul 7
2Cuprins
- 7.1. Functii de rezolutie
- 7.2. Semnale gardate. Deconectare
- 7.3. Instructiunea GENERATE
37.1.Functii de rezolutie
- Se utilizeaza pentru a rezolva valoarea unui
semnal atunci cind semnalul are mai multe drivere
(surse) - In VHDL este ilegal ca un semnal cu mai multe
drivere sa nu fie rezolvat - Functia de rezolutie
- Se scrie de catre programator
- Se apeleaza de catre simulator
- Atunci cind cel putin unul din driverele
semnalului are un eveniment. - La aparitia acelui eveniment se executa functia
care va returna o valoare obtinuta din valorile
tuturor driverelor semnalului. - Spre deosebire de alte HDL in VHDL nu exista
functii de rezolutie predefinite.
4Functii de rezolutie
- O functie de rezolutie
- are un singur parametru de intrare
- Care este intotdeauna un unconstrained array cu
elemente de tipul semnalului - si returneaza o singura valoare
- Valoarea are tipul semnalului si se numeste
valoare rezolvata - Parametrul de intrare este unconstrained array
deoarece atunci cind se scrie functia nu se
cunoaste cite drivere va avea semnalul in
momentul apelului functiei. - Pentru un semnal rezolvat (declarat ca atare) se
apeleaza functia de rezolutie chiar daca semnalul
are un singur driver.
5Declararea unui semnal rezolvat
Exemplu gresit TYPE fourval IS
(X,L,H,Z) SUBTYPE fourval_rez IS frez fourval
-- frez este functia de rezolutie -- Ex e gresit
deoarece functia de rezolutie nu a fost
specificata sau declarata. In concluzie, pt
declararea unui semnal rezolvat trebui respectata
o succesiune stricta de pasi PACKAGE frezpack
IS TYPE fourval IS (X,L,H,Z) TYPE
fourval_vector IS ARRAY(NATURAL RANGEltgt) OF
fourval FUNCTION frez(t fourval_vector) RETURN
fourval SUBTYPE fourval_rez IS frez
fourval END PACKAGE frezpack
6Declararea unui semnal rezolvat
Un semnal rezolvat poate fi declarat in doua
moduri 1. ca subtip rezolvat 2. prin
utilizarea functiei de rezolutie in declararea
semnalului. Exemplu (continuare) USE
WORK.frezpack.ALL ENTITY ex IS END ARCHITECTURE
ex_rezolvat OF ex IS SIGNAL s1,s2
fourval_rez--modul 1 SIGNAL s3 frez
fourval--modul 2 BEGIN END ARCHITECTURE
7Functii de rezolutie exemplu
In mod normal o functie de rezolutie e asociativa
si comutativa pentru ca rezultatul returnat sa nu
depinda de ordinea in care se parcurg intrarile
functiei (adica driverele semnalului) deoarece
programatorul nu controleaza ordinea
respectiva. Exemplu de functie de rezolutie
pentru tipul fourval Taria valorilor tipului
fourval
X inseamna valoare nedeterminata, Z inseamna
impedanta ridicata. L si H au aceeasi
tarie. Atunci cind exista cel putin un driver L
si cel putin unul H functia de rezolutie va
returna X.
8Functii de rezolutie exemplu
Tabelul dupa care functioneaza functia
X L H Z
X X X X X
L X L X L
H X X H H
Z X L H Z
9Functii de rezolutie exemplu
Functia din exemplu PACKAGE BODY frezpack
IS FUNCTION frez(t fourval_vector) RETURN
fourval IS VARIABLE result fourvalZ--se
initializeaza cu --valoarea cea mai slaba a
tipului fourval BEGIN FOR i IN tRANGE LOOP
--tRANGE parcurge tot tabloul t CASE t(i)
IS WHEN X gt resultX RETURN result WHEN
Lgt CASE result IS WHEN XH gt resultX
RETURN result WHEN LZ gt
resultL END CASE
10 WHEN Hgt CASE result IS WHEN XL gt
resultX RETURN result WHEN HZ gt
resultH END CASE WHEN Z gt NULL--result
ramine neschimbat END CASE END LOOP RETURN
result END FUNCTION frez END PACKAGE
BODY Observatie In acest caz functia s-ar fi
putut implementa si cu IF in loc de CASE, dar cu
CASE e o metoda mai generala.
11Functii de rezolutie pentru magistrale
- Daca exista mai multe dispozitive conectate la o
magistrala trebuie avut grija ca la un moment dat
un singur dispozitiv sa controleze magistrala - Trebuie tratata situatia cind mai multe
dispozitive vor sa controleze magistrala - gt e conflict
- Se semnaleaza printr-o valoare speciala multiple
drivers returnata de functia de rezolutie - Trebuie tratata si situatia cind nici un
dispozitiv nu controleaza magistrala - Functia de rezolutie va returna o valoare
speciala not driven - Aceasta valoare o are si un semnal ca sa arate ca
dispozitivul respectiv nu controleaza magistrala - Valorile speciale se pot lua dintre valorile
neutilizate ale magistralei (de ex valori
negative de adrese) sau - Daca nu exista valori neutilizate atunci
- Se va transforma tipul magistralei intr-un record
- se mai adauga inca un cimp la valorile normale
ale magistralei
12Exemplu
Presupunem ca avem o magistrala de date si
adrese, iar valorile adreselor pot fi doar
intregi nenegativi, deci se pot alege doua valori
negative ca valori speciale. PACKAGE busrez
IS TYPE xtype IS RECORD addr INTEGER--are
doar valori gt0 data INTEGER --cimp_suplimen
tar INTEGER END RECORD CONSTANT notdriven
xtype(-1,-1) CONSTANT multipledrivers xtype
(-2,-2) TYPE xtype_vector IS ARRAY(NATURAL
RANGE ltgt) OF xtype FUNCTION xf(txtype_vector)
RETURN xtype SUBTYPE xbus IS xf xtype END
PACKAGE busrez
13PACKAGE BODY busrez IS FUNCTION
xf(txtype_vector) RETURN xtype IS VARIABLE
result xtypenotdriven VARIABLE count
INTEGER0 BEGIN IF tLENGTH0 THEN --LENGTH
atribut ce retunreaza lungimea unui
tablou resultnotdriven REPORT nici un
driver SEVERITY WARNING END IF-- situatia
poate aparea doar pt semnale gardate, ale caror
drivere se pot --deconecta FOR i IN tRANGE
LOOP IF t(i) / notdriven THEN count count
1 resultt(i) END IF
14IF countgt1 THEN resultmultipledrivers REPORT
mai multe drivere ! SEVERITY ERROR RETURN
result END IF END LOOP IF count0 THEN
REPORT nici un driver ! SEVERITY WARNING END
IF RETURN result END xf END PACKAGE BODY
busrez
157.2. Semnale gardate
- Declaratia de semnale are sintaxa
- SIGNAL list_of_signals resolution_function
signal_type signal_kind expression - unde signal_kind poate fi BUS sau REGISTER
- Definitie semnalele gardate sint semnale
speciale declarate a fi BUS sau REGISTER. - Semnalele gardate trebuie sa fie semnale
rezolvate si deci trebuie sa aiba functie de
rezolutie. - Semnalelor gardate li se pot asigna valori doar
in interiorul unor blocuri gardate. - Catre semnalele gardate se pot face
- - asignari concurente gardate sau
- - asignari secveniale, dar
- - NU se pot face asignari concurente negardate.
16Semnale gardate
- In interiorul unui bloc gardat, atunci cind
semnalul GURAD devine FALSE, va avea loc
deconectarea driverului semnalului gardat - Deconectarea are loc dupa o perioada de timp
numita disconnect time. - Atunci cind garda este TRUE, driverul semnalului
primeste valori conform instructiunii de asignare
de semnal - In cazul unui semnal negardat care are o asignare
concurenta gardata, atunci cind garda devine
FALSE nu se deconecteaza driverul semnalului, ci
driverul isi mentine valorile anterioare, fara a
lua in considerare noile valori care ar putea fi
generate de instructiunea de asignare de semnal
(am spus ca driverul se dezactiveaza) - A se vedea exemplul.
- Timpul dupa care se face deconectarea unui
semnal gardat poate fi specificat prin
disconnect_specification (dupa declararea
semnalului) - DISCONNECT nume_semnal_gardat signal_type AFTER
time_expression - Deconectarea unui driver este un eveniment, deci
se va apela functia de rezolutie.
17Exemplu
ARCHITECTURE guarded_ex OF exemplu IS SIGNAL
semnal_gardat wired_or BIT REGISTER SIGNAL
semnal_negardat wired_and BIT--nu e nevoie sa
fie semnal rezolvat BEGIN b BLOCK(guard_expressio
n) BEGIN semnal_gardat lt GUARDED expression1
AFTER time1 semnal_negardat lt GUARDED
expression2 AFTER time2 END BLOCK b END
ARCHITECTURE Exemplul este echivalent cu
18Exemplu (continuare)
ARCHITECTURE guarded_ex OF exemplu IS SIGNAL
semnal_gardat wired_or BIT REGISTER SIGNAL
semnal_negardat wired_and BIT--nu e nevoie sa
fie semnal rezolvat BEGIN b BLOCK(guard_expressio
n) BEGIN p1 PROCESS BEGIN IF GUARD THEN
semnal_gardat lt expression1 AFTER
time1 ELSE semnal_gardat lt NULL -- se
deconecteaza -- semnalltNULL inseamna
deconectarea driverului END IF WAIT ON GUARD,
signals_in_expression1 END PROCESS p1
19p2 PROCESS BEGIN IF GUARD THEN semnal_negardat
lt expression2 AFTER time2 END IF --nu are
ELSE deoarece NU SE INTIMPLA NIMIC atunci cind
-- GUARD FALSE WAIT ON GUARD,
signals_in_expression2 END PROCESS p2 END BLOCK
b END ARCHITECTURE
20Diferentele intre BUS si REGISTER
- Dupa locul unde pot aparea
- Semnalele gardate BUS pot fi
- atit semnale declarate local intr-o arhitectura
cit si - Porturi ale unei entitati
- Semnalele gardate REGISTER pot fi
- Doar semnale declarate local.
- Dupa modul cum se face deconectarea ultimului
driver - La un semnal gardat BUS
- Daca se deconecteaza toate driverele, trebuie
specificata valoarea pe care sa o aiba semnalul - Adica functia de rezolutie trebuie sa specifice o
valoare pt cazul cind nici un driver nu este
conectat. - La un semnal gardat REGISTER
- Cind se deconecteaza ultimul driver, semnalul isi
va pastra valoarea anerioara - Nu se apeleaza functia de rezolutie la
deconectarea ultimului driver - gt functia de rezolutie nu trebuie neaparat sa
specifice o valoare pt acest caz.
21Exemplu de multiplexor 41 cu semnale gardate
USE WORK.my_pack.ALL -- my pack contine functia
de rezolutie sau_cablat ENTITY mux
IS GENERIC(mux_del TIME 5ns) PORT(din IN
BIT_VECTOR(3 DOWNTO 0) sel IN BIT_VECTOR(1
DOWNTO 0) z OUT BIT) END mux ARCHITECTURE
cu_semnale_gardate OF mux IS SIGNAL temp
sau_cablat BIT BUS -- in acest caz poate fi si
REGISTER BEGIN
22b0 BLOCK (sel00) BEGIN templt GUARDED
din(0) END BLOCK b0 b1 BLOCK
(sel01) BEGIN templt GUARDED din(1) END
BLOCK b1 b2 BLOCK (sel10) BEGIN templt
GUARDED din(2) END BLOCK b2 b3 BLOCK
(sel11) BEGIN templt GUARDED din(3) END
BLOCK b3 z lt temp AFTER mux_del END
ARCHITECTURE -- in acest caz nu are mare
importanta cum e functia de rezolutie, deoarece
-- semnalul temp va avea un singur driver la un
moment dat, restul de 3 -- drivere fiind
deconectate.
237.3. Instructiunea GENERATE
- Este utilizata in special pentru descrierea
structurilor regulate - reprezinta un mecanism de compliare conditionata
in VHDL - Sintaxa instructiunii este
- label_id generation_scheme GENERATE
- concurrent_statements
- END GENERATE label_id
24GENERATE (continuare)
- Schema de generare poate fi de tip
- FOR indexul utilizat nu trebuie declarat
- IF nu are ELSIF si nici ELSE
- IF si FOR nu au nici o semantica de executie
(nici o legatura cu instructiunile secventiale IF
si LOOP FOR) - Instructiunile concurente din corpul lui GENERATE
sunt in mod tipic (dar nu neaparat) instantieri
de componente. - Compilatorul expandeaza codul din interiorul lui
GENERATE. - De exemplu daca se utilizeaza o schema de
generare de tip FOR cu 5 iteratii si in corpul
lui GENERATE se utilizeaza o instructiune de
instantiere de componenta, atunci vor aparea 5
instantieri de componenta in codul expandat.
25Exemplu
Descriem un registru de deplasare pe 4 biti
utilizind GENERATE.Registrul e alcatuit din 4
bistabile de tip D. Descrierea bistabilului
D ENTITY dff_1 IS GENERIC(tp time1ns)
PORT(d, clk, reset IN BIT q, qb OUT
BIT) END dff_1 ARCHITECTURE behave OF dff_1
IS BEGIN PROCESS(reset, clk, d) BEGIN
IF(reset'0') AND reset'EVENT THEN qlt'0'
AFTER tp qblt'1' AFTER tp
ELSIF(clk'1') AND clk'EVENT AND
clk'LAST_VALUE'0 THEN
26 qlt d AFTER tp qbltNOT d AFTER
tp END IF END PROCESS END
ARCHITECTURE CONFIGURATION dff_cfg OF dff_1 IS
FOR behave END FOR END CONFIGURATION --
registrul de deplasare ENTITY shift_reg IS
GENERIC(len NATURAL4) PORT(reset, clock,
a IN BIT bOUT BIT) END shift_reg
27Registrul de deplasare
z(3)
z(4)
b
z(0)
z(1)
z(2)
a
D
Q
D
Q
Q
D
Q
D
clk
clk
clk
clk
reset
reset
reset
reset
reset
clock
shift_reg
Fig 11. Registru de deplasare realizat cu
bistabile de tip D (D flip-flops)
28Schema de generare de tip FOR
-- Instructiunea GENERATE cu -- schema de
generare de tip FOR ARCHITECTURE shift_gen_1 OF
shift_reg IS COMPONENT dff IS
GENERIC(tpTIME1ns) PORT(d, clk,
reset IN BIT q, qb OUT BIT)
END COMPONENT SIGNAL z BIT_VECTOR(0 TO
4) BEGIN z(0)lta g FOR i IN 0 TO 3
GENERATE dffx dff PORT MAP(z(i), clock,
reset, z(i1), OPEN) END GENERATE
bltz(4) END shift_gen_1
29GENERATE cu schema de tip FOR si IF
Dezavantajul acestei descrieri este ca nu sunt
tratate unitar, in cadrul instructiunii GENERATE,
bistabilele de la capetele registrului de
deplasare. Acest lucru se poate face combinind
schema de generare de tip FOR cu scheme de tip
IF -- Instructiunea GENERATE cu scheme de
generare de tip -- FOR si IF ARCHITECTURE
shift_gen_2 OF shift_reg IS COMPONENT dff IS
GENERIC(tpTIME1ns) PORT(d,
clk, reset IN BIT q, qb OUT BIT)
END COMPONENT SIGNAL zBIT_VECTOR(1 TO
len-1)
30BEGIN g1 FOR i IN 0 TO (len-1) GENERATE
g2 IF i0 GENERATE dffx dff PORT
MAP(dgta, clkgt clock,
resetgtreset, qgtz(1), qbgtOPEN) END
GENERATE g2 g3 IF i(len-1) GENERATE
dffx dff PORT MAP(dgtz(len-1),
clkgtclock, resetgtreset, qgtb,
qbgtOPEN) END GENERATE --g3
g4 IF (igt0) AND (iltlen-1) GENERATE
dffx dff PORT MAP(z(i), clock,
reset, z(i1), OPEN) END GENERATE g4
END GENERATE -- g1 END ARCHITECTURE
shift_gen_2
31Configuratie pentru GENERATE
Configuratia registrului de deplasare --
Configuratia pentru arhitectura shift_gen_2 va
fi CONFIGURATION cfg_gen OF shift_reg IS FOR
shift_gen_2 FOR g1 FOR g2
FOR ALL dff USE CONFIGURATION WORK.dff_cfg
END FOR END FOR--g2 FOR
g3 FOR ALL dff USE ENTITY
WORK.dff_1(behave) END FOR
END FOR--g3 FOR g4 FOR ALL
dff USE ENTITY WORK.dff_1(behave)
END FOR END FOR--g4 END FOR --
g1 END FOR -- shift_gen_2 END cfg_gen
32O entitate de test a registrului de deplasare
entity test_shift_reg is end architecture
a_test of test_shift_reg is COMPONENT
shift_reg IS GENERIC(len NATURAL4)
PORT(reset, clock, a IN BIT bOUT BIT)
END COMPONENT SIGNAL insig, r, cl, outsig
BIT BEGIN l shift_reg PORT MAP(r, cl,
insig, outsig) clltNOT cl AFTER 50ns
rlt'1', '0' after 3ns, '1' after 40ns
insiglt'1' after 145ns, '0' after 380ns, '1'
after 1680ns end
33configuration cfg_test of test_shift_reg is for
a_test for l shift_reg use configuration
work.cfg_gen end for end for end cfg_test