Documente Academic
Documente Profesional
Documente Cultură
Lab4 Secventiale PDF
Lab4 Secventiale PDF
LABORATOR4
DESCRIEREANVHDLACIRCUITELORSECVENIALE.
DEFINIREACONSTRNGERILORDETIMP
SCOPULLUCRRII
Logica secvenial este termenul generic folosit pentru proiectele care conin
elemente de stocare, n special bistabile. Toate circuitele secveniale beneficiaz de un
semnaldesincronizarenumitsemnaldetactsauclock.
IINTRODUCERETEORETIC
Figura1.Sistemsecvenial
librarydeclarareabibliotecilorfolosite
entitynume_modelis
port
(
listaintrriloriaieirilor
);
endnume_mode;
architecturebehaviorofnume_modelis
declararedesemnaleinterne
begin
procesulstatedefineteelementeledestocare
state:process(listasenzitivitilorclock,reset,next_stateinputs)
begin
instruciuniVHDL
endprocessstate;
procesulcombinaionalvadefiniilogicacombinaional
comb:process(listasensitivitilordeobiceiincludetoatesemnaleledeintrare)
begin
instruciuniVHDL
endprocesscomb;
endbehavior;
Figura2.ModeldedescriereacircuitelorsecvenialenVHDL
Latchicircuitebistabile
Rolul unui element secvenial de tip latch sau bistabil este de a pstra o valoare (a unui
semnal)oanumitperioaddetimp.naceastseciunevorfiprezentatectevaexemple
VHDL care modeleaz un astfel de comportament. Latchurile i bistabilele sunt de fapt
celuledememoriecarepotstocalaunmomentdat1bit.Diferenadintreeleestecalatch
ul comut pe nivel logic (0 sau 1), n timp ce bistabilul comut pe frontul semnalului
(cresctorsaudescresctor).
ModelVHDLpentruLatchdetipD
n figura 3 este prezentat modelul VHDL al latchului de tip D. Am ales acest tip pentru
exemplificare datorit frecventei lui utilizrii mai ales ca element de stocare a biilor de
control(ex.stocareabituluideflag).Gndindlatchulnacetitermeni,valoareaintrriiDse
varegsiilaieireoridecteoriintrareadecontrolCarevaloarea1,altfelieirilelatchului
rmnneschimbate.
Modeluldelatchdinfigura3esteunmodelcomportamental(behavioralmodel)caredup
cumsepoateobservaanecesitatpracticdouliniidecod(vezicoduldininteriorulblocului
proces).Compilatorul VHDL va asocia aceast descriere cu un latch deoarece n cod nu sa
specificatcesentmpldacsemnalulCnuarevaloarea1.Astfelcompilatorulvageneraun
latchpentruareinevaloarealuiQntredouinvocrialeprocesului.
n general compilatorul VHDL genereaz latchuri pentru semnalele din cadrul
instruciunilorifsaucase,ncazulncarenusainutcontdetoatecombinaiilesemnalelor
deintrare.
libraryIEEE;
useIEEE.std_logic_1164.all;
entitydlatchis
port(D,C:inSTD_LOGIC;
Q,QN:bufferSTD_LOGIC);
enddlatch;
architecturedlatchc_bofdlatchis
begin
process(C,D,Q)
begin
if(C='1')thenQ<=D;
QN<=notQ;
endif;
endprocess;
enddlatchc_b;
Figura3.CodVHDLidiagramablocpentrulatchuldetipD
nsecvenadecoddinfigura3semaipoateobservafolosireaunuinoutipdeport,buffer.
Acesttipesteasemntorcutipulout,cudeosebireacsemnaleledelaacestportpotfii
citite,adicncadruuneisecvenedecodsemnalulpoateapreanmembrulstngalunei
declaraiideatribuire.
ModeleVHDLpentrubistabilidetipD
Bistabilelemaisuntdeasemeneacunoscuteisubnumelederegistre(peunbit),ele
suntmodelatenVHDLncadrulblocurilorprocesfolosindinstruciunilewaitiif,deoarece
instruciuneawaitnuestesintetizabilnunevomocupadeea.
Deasemeneancadrulprocesuluimaiapariexpresiicarepermitdetectareatranziieiunui
semnal(nacestcazestevorbadesemnaluldetact).
nfigura4.a.seprezintcodulVHDLcaremodeleazcomportamentalunbistabilde
tipD.
Dupcumsepoateobservadinambelecoduri(figura4a.i4b.)pentruadescrieun
bistabil folosim atributul event, care este un atribut specific semnalelor. Dac SIG este un
numedesemnal,atunciconstruciaSIGeventvareturnavaloareabooleanadevrat
(adicprocesuldincarefacepartesemnalulSIGvafievaluat,sevorexecutainstruciunile
din acest bloc) ori de cte ori semnalul SIG tranziteaz dintro stare logic n alta, altfel
valoareareturnatestefals.ncadrulinstruciuniiifexpresiaCLKeventdeclaneazo
evaluareaprocesuluilafiecaretranziieasemnaluluiCLK,pentruaneasiguracvaloarea
semnalului D este atribuit ieirii Q numai la tranziiile semnalului CLK din 0 n 1 (front
cresctor)semaiimpuneicondiiaCLK=1.Aseobservacnlistasenzitivitiloreste
prezent numai semnalul CLK, tranziiile pe care le sufer semnalul D nu pot s declaneze
evalurialeprocesului.AcesttipdeprocesencareunfrontalsemnaluluiCLKsincronizeaz
toateatribuiriledesemnalesenumescprocesesincronecutactul(clockedprocess).
libraryIEEE;
useIEEE.std_logic_1164.all;
entitydffis
port(D,CLK:inSTD_LOGIC;
Q:outSTD_LOGIC);
enddff;
architecturedff_bofdffis
begin
process(CLK)
begin
if(CLKeventandCLK=1)
then
Q<=D;
endif;
endprocess;
enddff_b;
Figura4.a.CodulVHDLpentru
bistabiluldetip
LibraryIEEE;
useIEEE.std_logic_1164.all;
entitydff74is
port(
D,CLK,PR_L,CLR_L:inSTD_LOGIC;
Q,QN:outSTD_LOGIC);
enddff74;
architecturedff74_bofdff74is
signalPR,CLR:STD_LOGIC;
begin
process(CLR_L,CLR,PR_L,PR,CLK)
begin
PR<=notPR_L;CLR<=notCLR_L;
if(CLRandPR)=1then
Q<=0;QN<=0;
elsifCLR=1thenQ<=0;QN<=1;
elsifPR=1thenQ<=1;QN<=0;
elsif(CLKeventandCLK=1)then
Q<=D;QN<=notD;
endif;
endprocess;
enddff74_b;
Figura4.b.CodulVHDLidiagramablocpentrubistabiluldetipDcu
intrriasincrone
Conformsecveneidecoddinfigura4.b.modeluldebistabilDpoatefiextinsdescriinduise
i intrri asincrone de preset, clear, precum i o ieire QN. Ieirea QN poate avea un
comportament necomplementar fa de Q dac se face o setare simultan a intrrilor de
preset i clear. n modelul din figura 4.b. semnalele de preset i clear sunt asincrone cu
tactul,dacnsexpresia(CLKeventandCLK=1)thenvafitrecutcaprimcondiien
cadru instruciunii if , atunci innd cont de faptul ca toate instruciunile din cadrul unui
proces sunt executate secvenial, atribuirea semnalelor de preset i clear se va desfura
sincroncutactulastfelobinembistabiluldetipDcupreseticlearsincron.
ModelVHDLpentruregistre
Ungrupdenbistabilecareausemnaldetactcomunformeazunregistrupenbii.
Cel mai adesea regitri sunt folosii pentru a stoca o colecie (grup) de bii nrudii, spre
exempluunbytededate.nfigura5esteprezentatcodulVHDLidiagramabloccuintrrile
iieirileunuiregistrupe8biicuncrcaresincroniresetasincron.
libraryieee;
useieee.std_logic_1164.all;
entityreg8bitis
port(clk,reset,ld:instd_logic;
din:instd_logic_vector(7downto0);
dout:outstd_(7downto0));
endreg8bit;
architecturebehaviorofreg8bitis
signaln_state:std_logic_vector(7downto0);
signalp_state:std_logic_vector(7downto0);
begin
process(clk,reset)
begin
if(reset=0)thenp_state<=(others=>0);
elsif(clkeventandclk=1)then
if(ld=1)thenn_state<=din;
elsenull;
endif;
p_state<=n_state;
endif;
endprocess;
dout<=p_state;
Resetasincron
ncrcareparalelsincron
othersfolositpentru
atribuireavalorii0tuturor
biilordinsemnalul
p_state
endbehavior;
Figura5.CodVHDLpentruregistrupe8biicuncrcaresincroniresetareasincron
Spredeosebiredebistabileundeinformaiastocatseschimblafiecaresemnaldetact,n
cazul registrului coninutul acestuia se va schimba numai pentru LD=1 (vezi procesul
combinaional) i n mod sincron cu tactul (vezi proces secvenial, expresia p_state <=
n_stateesteevaluatdupclkevent).
Din figura 5 se poate observa c modelul VHDL al registrului respect ntru totul
blocurileprocesprezentatenfigura1cafiindspecificeoricruisistemsincron.
Procesulstatedefineteelementuldestocarepe8bii,sincroncutactuliasincron
cu un semnal de reset activ pe zero. Semnalul de ieire a acestui proces este p_state.
Aciuneadestocareainformaieincadrulacestuiprocesestedatdefaptulcluip_statei
seatribuieovaloarenumaidacsemnalulreset=1sausemnaluldetactnuareotranziie
din0n1.
Alte forme de atribuire de valori semnalelor (pe lng cea din exemplu, care
folosete cuvntul cheie others) sunt: atribuirea poziional (ex. p_state <=
(s,s,s,s,s,s,s,s) i atribuire dup nume, ex. p_state <= (4=>s, 7=>s, 2=>s, 5=>s,
3=>s, 1=>s, 6=>s, 0=>s)), unde s este un semnal de tip std_logic care poate lua
valorile 0 sau 1.
ModelVHDLpentrunumrtorsincron
ageneraadresedememorie.Numrulstrilorprincaretreceunnumrtorpnajungedin
nou la starea din care a plecat (astfel avnd loc un ciclu de numrare) definete modulul
numrtorului.
Unnumrtorcumstrisenumetenumrtormodulomsaunumrtordivizorcu
m.Unnumrtorbinarpenbiiestealctuitdinnbistabileiare2n=mstri.
Unnumrtortrecedelavaloareacurentlaurmtoareavaloarecaurmarearspunsuluipe
careldlaunimpulsdenumrare(tactulsistemului).
n figura 6 se prezintmodelulVHDLisimbolulnumrtorului74x163,acestaeste
un numrtor sincron pe 4bii. Caracteristic numrtorului sincron este faptul c, toate
bistabilele din care este alctuit au semnal de tact comun, astfel nct toate ieirile i
schimb starea n acelai timp. Numrtorul descris n lucrarea de fa este alctuit din
bistabiledetipDpentruafacilitafunciiledencrcare(LD)ireset(CLR).
libraryIEEE;
useIEEE.std_logic_1164.all;
useIEEE.std_logic_arith.all;
entitynum_sinis
port(
CLK,CLR_L,LD_L,ENP,ENT:inSTD_LOGIC;
D:inUNSIGNED(3downto0);
Q:outUNSIGNED(3downto0);
RCO:outSTD_LOGIC);
endnum_sin;
architecturenum_sin_archofnum_sinis
signalIQ:UNSIGNED(3downto0);
begin
process(CLK,ENT,IQ)
begin
ifCLK'eventandCLK='1'then
ifCLR_L='0'thenIQ<=(others=>'0');
elsifLD_L='0'thenIQ<=D;
elsif(ENTandENP)='1'thenIQ<=IQ+1;
endif;
endif;
if(IQ=15)and(ENT='1')thenRCO<='1';
elseRCO<='0';
endif;
Q<=IQ;
endprocess;
endnum_sin_arch;
Biblioteccareconinetipul
unsingnedioperatoriispecifici
acestuitip
IQsemnalintern,pstreazstarea
curentanumrtorului
Figura6.SimbolstandardicodVHDLpentrunumrtorsincronpe4biicuncrcareiresetaresincron
nprogramsedefineteunsemnalinternIQpentruapstravaloareacurentanumrtorului.Amfi
putuutilizadirectsemnalulQdarnacestcaztrebuiasaldeclarmcaportdetipbuffer.
Desfurarealucrrii
Pasul1:Creareaproiectului.
n directorul personal se va crea un subdirector cu numele lab4, aici vor fi salvate toate
proiectelecevorficreatencadrulacesteilucrri.
Sevacreaunproiectcunumelenum,atenieladirectoruldelucru.
SevaselectacaTopLevelSource...,HDL,vezilaborator2.
Dupceproiectulafostcreat,conformlaboratorului2,seadaugunfiiersursnou,Project
New Source, se alege un nume pentru fiierul surs num_sin i se alege s fie de tipul
VHDL, vezi laborator 1. Porturile pot fi adugate, conform codului din figura 6, utiliznd
wizardulsaudacsetrecepesteaceastetap,potfiadugatedirectncodulVHDLgenerat
la crearea fiierului. n aceast etap poate fi fcut o verificare a sintaxei, din fereastra
Processes,Synthesize,CheckSyntax.
Pasul2:VizualizareaconversieiRTLanumrtoruluidescrisnVHDL
Alegnd opiunea View RTL Schematic (din Processes, Synthesize...),vezi figura 7, poate fi
vizualizat sub form schematic traducerea proiectului din descriere abstract (cod
VHDL) ntro descriere cu simboluri implementabile n hardware, aa numita descriere RTL
(RegisterTransferLevel),vezifigurile8,9,10.Cuclickdreaptapesimboluldinfigura8iprin
alegereaopiuniiPushIntoSelectedInstance,sepotvizualizablocurileierarhiceinferioare.
Seobservcsageneratunnumrtor,opoartIcu5intrriacesteasuntcomponente
primare i un bloc de cotrol. Prin acelai procedeu Push..., se poate observa c n urma
sintezeibloculdecontrolestealctuitdindouporilogice(I,SAUcuintrarenegat),vezi
figura10.Senchidefereastradeschematic.
Figura7.
Figura8.
Figura9.
Figura10.
Pasul3:Creareatestbenchuluiisimulareafuncionalaproiectului
Astfelsemnaleledelaintrarevorfivalidenaintecu10nsdefrontulcresctoralsemnalului
declockiarlaieirevorrmnevalide10nsdupfrontulcresctor.Duratasimulriivafide
2000ns.Setriletrebuiesfiecaiceledinfigura11.
Figura11.
nfigura12,semnaluldetergereCLR_L,pleacdin0,sefaceunreset,semnaleledevalidare
ENP, ENT, vor fi trecute n 1 pentru a permite numrarea, la intrarea de date D[3:0] se
stabilescvalorialeatorii(clickpe+pentruaexpandamagistrala),acesteavorficititedoarn
momentul n care intrarea LD_L trece n 0, n toate situaiile _L semnific faptul c
semnalulesteactivpe0.Dacsedclickdreaptapeoricaredintresemnalesepoatealege
baza numeric de reprezentare a semnalului , n situaia de fa se recomand Decimal
(unsigned).Sesalveazisenchideeditorul.
Figura12.
n fereastra Sources, Sources for se selecteaz Behavioral Simulation, Xilinx ISE Simulator,
SimulateBehavioralModel.
nfigura13,suntprezentaterezultatelesimulrii.
Figura13.
10
Pasul4:Creareaconstrngerilordetimp
ncontinuaresevorspecificaconstrngeriledetimpcuprivirelafrecvenadelucrulacare
neateptmsfuncionezenumrtorulimplementatnFPGAideasemeneacuprivirela
ntrzierile de la pinii circuitului FPGA. Cu alte cuvinte se vor specifica momentele n care
circuitul FPGA este pregtit sprimeascdatelapiniicttimpspstrezedatevalidela
pini.
Se revine Sources for, Synthesis..., se selecteaz codul VHDL, iar n fereastra Processes se
alegeUserConstraints,CreateTimingConstraints.Vafirulatetapadetranslataredinfaza
deimplementareisevacreaautomatunfiierUCF,sedclickYespefereastracareapare.
FiierulUCFseadaugproiectuluiidevinevizibilnfereastracufiieresurs.
SevadeschideeditoruldeconstrngeriisedclickpetabulGlobal,seselecteazcmpul
Periodisedclickpesimbolul
dinbarademeniurisaudubluclickncmpulPeriod,se
specificperioada40ns(frecvenatactuluivafi25MHz)iselasfactoruldeumplere50%,
vezifigura14,clickOK.
Figura14.
DubluclickncmpulPadtosetup,seintroducevaloarea10nsncmpulOFFSET,seseteaz
cucttimpnaintedeaaveaunfrontcresctordatelesfiestabile,vezifigura15,clickOK.
DubluclickncmpulClocktopad,seintroducevaloarea10nsncmpulOFFSET,seseteaz
cttimpdatelermnvalidelaieiredupunfrontcresctordetact,vezifigura16,clickOK.
Figura15.
Figura16.
11
Toateconstrngerilevorapreanfereastradinstngajosaeditoruluischematic,clickSave
inchideieditoruldeconstrngeri.
Pasul5:Implementareaproiectuluiiverificareaconstrngerilor
nSources,SourcesforserevinedinnoulaSynthesis/Implementation.
Implementareaserealizeazconformproceduriidinlaboratorul1.
Se identific Static Timing Report n fereastra Design Sumarry i se alege Timing Sumarry,
vezifigura17,sepoateobservacfrecvenamaximdelucrueste176MHz,constrngerea
delaintrare(4,59ns)esterespectatfiindmaimicde10ns,darlaieire(10,87ns)aceasta
este depit, astfel c pentru a finaliza implementarea cu succes aceasta va trebui
modificatlaovaloaremaimare.
Modificaiireimplementai.Deasemeneapentruavedeacesentmplsepoatecretei
constrngereadeclockla200MHz.
Figura17.
Pasul6:Definireaconstrngerilorlapini
12
Activitisuplimentare
- SevorrepetaoperaiuniledescriseanteriorpentrufiecaredincodurileVHDLdinfigurile
3,4, 5. Pentru fiecare cod n parte se va crea un proiect cu numele entitii, n
subdirectorulLAB4.
-
Sevorimplementaconstrngeridetimpidelocpentrufiecareproiectisevoranaliza
fiiereleraport.
Indicaie!!!
Datorit faptului c semnalul de clock din hardware este de 50 MHz, dac nu se face o
divizareaacestuia,laimplementareanhardwaresecvenadenumrare,pentrunumrtor
saudedeplasareabiilorncazulregistrelor,nuvaputeafiurmrit.
Se recomand divizarea semnalului de clock, secvena de cod corespunztoare, pentru
numrrtor este prezentat n figura18,similarseprocedeazipentrucelelelatecircuite
secveniale.
architecturenum_sin_archofnum_sinis
signalIQ:UNSIGNED(3downto0);
signaldiv:std_logic_vector(24downto0);
signalC:std_logic;
begin
sefacedivizareasemnaluluideclockcu2**25
p1:process(clk)
begin
ifCLK'eventandCLK='1'then
div<=div+1;
endif;
C<=div(24);
endprocess;
P2:process(C,ENT,IQ)
begin
ifC'eventandC='1'then
ifCLR_L='0'thenIQ<=(others=>'0');
elsifLD_L='0'thenIQ<=D;
elsif(ENTandENP)='1'thenIQ<=IQ+1;
endif;
endif;
if(IQ=15)and(ENT='1')thenRCO<='1';
elseRCO<='0';
endif;
Q<=IQ;
endprocess;
LEDG<='1';
endnum_sin_arch;
Figura18.
13