Sunteți pe pagina 1din 157

Dan NICULA

2019
Cuvânt c tre cetitor
Prezenta carte este a doua în seria de autor "Carte de înv t,  tur ". Dup  prima carte, "Electronic  digital 
aceast  a doua carte cuprinde lect, ii de Verilog.
- Carte de înv t,  tur  2.0",

Lect, iile sunt utilizate la disciplina "Limbaje de descriere hardware" predat  la Universitatea Transilvania din
Bras, ov.

Verilog este un limbaj de descriere hardware (engl. HDL = Hardware Description Language) a c rui denumire
provine din concatenarea cuvintelor din limba englez  "Very-logic" (foarte logic).
Abordarea lect, iilor de Verilog necesit  cunoas, terea not, iunilor de electronic  digital . Pentru a  rezolvate
activit t, ile practice propuse în cadrul ec rei lect, ii este necesar  cunoas, terea de c tre student, i a not, iunilor
teoretice prezentate în preambulul lect, iei.
A fost intent, ia autorului ca activit t, ile practice propuse s  necesite un timp de realizare mai mare decât cele
dou  ore alocate unui laborator. Fiecare student este stimulat s  realizeze cât mai mult din aceste activit t, i.
Student, ii dornici de a înv t, a mai mult în acest domeniu sunt invitat, i s  acorde timp suplimentar pentru realizarea
tuturor activit t, ilor propuse de lect, ii.
Aceast  abordare permite inginerilor care lucreaz  în domeniul de modelare Verilog s  revin  la lect, iile din
aceast  carte de înv t,  tur  s, i dup  absolvire, pentru a g si aici mai mult ajutor decât au remarcat în timpul
studiilor.
Lect, iile se bazez  pe simulatorul ModelSim PE Student Edition, release 10.4a, care ruleaz  sub sistem de
operare Windows. Acest simulator poate  desc rcat gratuit de c tre student, i, de pe site-ul produc torului.

www.mentor.com/company/higher_ed/modelsim-student-edition
Pentru editarea codului Verilog se recomand  folosirea editorului Notepad sau a unui editor specializat pentru

HDL: EditPlus , Notepad++ .

Pentru vizualizarea imaginilor în format .raw se recomand  folosirea utilitarului IrfanView .

Pentru vizualizarea datelor în format binar se recomand  folosirea utilitarului HxD Hexeditor .

Bras, ov, 2019. Dan NICULA

www.DanNicula.ro/books/verilog
ii Limbaje de descriere hardware - Laborator
Cuprins

1 Metodologia de simulare a modelelor HDL cu ModelSim 1


1.1 Scopurile lect, iei 1
1.2 Not, iuni teoretice 1
1.3 Metodologia de proiectare a circuitelor integrate digitale 4
1.4 Cod HDL 5
1.5 Metodologia de simulare a modelelor HDL cu ModelSim 9
1.6 Activit t, i practice 18

2 Simularea modelelor HDL cu ModelSim 21


2.1 Scopurile lect, iei 21
2.2 Not, iuni teoretice 21
2.3 Cod HDL 27
2.4 Activit t, i practice 29

3 Modelarea circuitelor logice combinationale , 35


3.1 Scopurile lect, iei 35
3.2 Not, iuni teoretice 35
3.3 Generator de test pentru circuite combinat, ionale 42
3.4 Activit t, i practice 42

4 Modelarea circuitelor cu bistabile 45


4.1 Scopurile lect, iei 45
4.2 Not, iuni teoretice 45
4.3 Activit t, i practice 51

5 Modelarea mediului de testare HDL 55


5.1 Scopurile lect, iei 55
5.2 Not, iuni teoretice 55
5.3 Activit t, i practice 67

6 Modelarea num r toarelor 73
6.1 Scopurile lect, iei 73
6.2 Not, iuni teoretice 73
6.3 Activit t, i practice 78

7 Modelarea FSM 81
7.1 Scopurile lect, iei 81
7.2 Not, iuni teoretice 81
7.3 Activit t, i practice 88

8 Modelarea memoriilor 95
8.1 Scopurile lect, iei 95
8.2 Not, iuni teoretice 95
8.3 Activit t, i practice 101

9 Modelarea circuite digitale cu HDL 105


9.1 Scopurile lect, iei 105
9.2 Tema de proiectare 105
9.3 Activit t, i practice 106

A Teme laborator 111


A.1 Memorie FIFO 112
A.2 Memorie LIFO 114
A.3 Circuit pipeline pentru determinarea maximului unor date 115
A.4 Circuit pipeline pentru sortarea datelor 116
A.5 Arbitru de bus cu protocol request-acknowledge 117
A.6 Arbitru de bus cu protocol valid-ready 119
A.7 Circuit watchdog 121
A.8 Circuit de înmult, ire secvent, ial  123
A.9 Circuit de împ rt, ire secvent, ial  127

B Proiect 135
B.1 Cerint, e generale 136
B.2 Module reutilizate 137
B.3 Cerint, e specice 138
B.4 Interfat,   142
B.5 Etape de realizare 143

Cuvântul de nal 151


Lect, ia 1

Metodologia de simulare a modelelor


HDL cu ModelSim
Aceast  lect, ie prezint  modalitatea de simulare a unui model de sistem digital descris în HDL folosind simulatorul
ModelSim. Dispozitivul de testat (engl. Device Under Test, DUT) este instant, iat al turi de un modul pentru
generare de stimuli (engl. Test-Bench, TB) într-un mediu de testare (modul f r  porturi care instant, iaz  DUT
s, i TB).
Lect, ia prezint , pas cu pas, simularea modelului unui num r tor sincron presetabil prin utilizarea simula-
torului ModelSim, prin meniuri s, i prin comenzi scriptice.
La nalul lect, iei, se prezint  un script de automatizare a simul rii, posibil de reutilizat ca s, ablon pentru
lect, iile urm toare.

1.1 Scopurile lectiei ,

• Familiarizarea cu modulele HDL asociate proiectului (DUT, TB, TEST).

• Prezentarea metodologiei de proiectare a circuitelor integrate digitale s, i a metodologiei de simulare a


modelelor HDL cu ModelSim.

• Lansarea în execut, ie s, i congurarea ModelSim prin meniuri s, i comenzi textuale.

• Compilarea s, i simularea unui proiect. Comenzile vlog s, i vsim.

• Examinarea ierarhiei unui proiect. Ferestrele transcript, sim, objects.

• Examinarea formelor de und  ale semnalelor. Fereastra wave.

• Realizarea unui script ce cont, ine comenzi ModelSim pentru rularea automat  a simul rii.

1.2 Notiuni teoretice


,

1.2.1 Denirea unor notiuni ,

Directorul de proiect este directorul din sistemul de siere unde se vor g si toate sierele si bibliotecile
, , ,

asociate proiectului. Utilizatorul trebuie s  aib  drept de scriere în acest director. În continuare, se va
considera utilizarea directorului C:\home ca ind director de proiect.

Fisierele cu cod surs  sunt siere text care contin module Verilog. Se recomand  ca ecare modul Verilog
, , ,

s  e stocat într-un s, ier separat iar numele s, ierului (cu extensia .v) s  e identic cu numele modulului

1
2 LECT, IA 1. Metodologia de simulare a modelelor HDL cu ModelSim

cont, inut. De exemplu, modulul counter_up va  inclus în s, ierul counter_up.v. Editarea s, ierelor
surs  se va face cu editoare de text simple (nu Word): Notepad, Notepad++, EditPlus+.

Compilarea reprezint  conversia codului surs  într-un format specic simulatorului. Compilarea necesit  ca
parametrii unul sau mai multe nume de s, iere cu cod surs . La simulatorul ModelSim, comanda de
compilare se numes, te vlog.

Biblioteca de lucru este un director unde se vor plasa rezultatele compil rii, în formatul specic simulatoru-
lui. ModelSim este un simulator de cod Verilog/VHDL compilat. În comanda de compilare este necesar 
specicarea unei biblioteci unde se va plasa codul compilat. Pentru bibliotec , se recomand  folosirea
denumirii implicite work. Rezultatul compil rii se depune în biblioteca specicat  (implicit work).

Simularea reprezint  procesul de creare a unui model abstract pentru sistemul simulat. La simulatorul Model-
Sim comanda de simulare se numes, te vsim. Comanda de simulare necesit  ca parametru un modul Verilog.
Totdeauna modelul ce se pune în simulare nu are porturi. În modulul pus în simulare se instant, iaz  modelul
circuitului de testat DUT s, i module sau specicat, ii adit, ionale: generatoarele de stimului TB, monitoarele
de semnale, module care veric  asert, ii. Toate aceste module sunt instant, iate în modulul de nivel înalt,
f r  porturi, care se lanseaz  în simulare.

Rularea modelului reprezint  procesul de simulare a function rii sistemului digital în timp. La simulatorul
,

ModelSim, comanda de rulare se numes, te run. Ea are ca parametru timpul pentru care se va rula modelul.
Exist  opt, iunea de a se rula modelul la innit, cu comanda run -all.

Modelul RTL (engl. RTL = Register Transfer Level) reprezint  un model HDL pentru un circuit ce urmeaz 
a  implementat în hardware. Datorit  proces rii ulterioare automate, sunt acceptate doar anumite
specicat, ii Verilog, posibil de convertit într-o structur  hardware. Modelul structural rezultat, denumit
netlist (engl. net-list = list  de componente) este un model HDL ce cont, ine instant, e de componente
specice unei biblioteci de tehnologie, interconectate într-o ret, ea. Modelul RTL detaliaz  comportamentul
sistemului pân  la nivelul transferului de date între elementele de memorare (registre).

Sinteza RTL reprezint  procesul de conversie automat  a codului RTL într-un netlist, cu ajutorul unor pro-
grame software specializate (engl. EDA = Electronic Design Automation), pe baza unei biblioteci de
tehnologie.

1.2.2 Modulele HDL asociate proiectului (DUT, TB, TEST)


Simularea HDL necesit  4 tipuri de module, ecare cu particularit t, ile lor.

Modulul de testat este modelul pentru circuitul digital ce se va implementa în hardware. Acesta este referit
cu abrevierea DUT. Scopul simul rii este vericarea comportamentului acestui modul prin comparat, ie
cu specicat, iile de proiectare. Modulul de testat trebuie descris în HDL doar cu specicat, ii acceptate de
sintetizatoare RTL. În cazul unor circuite complexe, modulul poate  structurat în module de complexitate
mai mic . În cazul unor circuite simple, modelarea este comportamental , la nivel RTL (f r  a instat, ia
port, i logice predenite în limbaj sau modele de tranzistoare).

Generatorul de stimuli este modelul pentru sistemul exterior modulului de testat. În cazul unor stimuli
simpli, acest modul poate lipsi, ind înlocuit cu specicat, ii de atribuire de semnale prezente în modulul
de test. Pentru modelarea generatoarelor de stimuli pot  folosite orice specicat, ii, deoarece aceste module
au rol exclusiv pentru vericarea DUT (nu se sintetizeaz  în hardware).

Modulul de test este modelul pentru sistemul format din modulul de testat DUT s, i generatorul de stimuli
TB. Acest modul cont, ine instant, a modelului DUT care se veric . Al turi de aceasta se pot instant, ia unul
sau mai multe generatoare de stimuli sau module de monitorizare a datelor. Tot aici pot ap rea specicat, ii
pentru vericarea uxului de date (asert, ii). Se remarc  faptul c  modulul de test are întotdeauna interfat, a
vid  (nu are porturi).

Monitoarele de date sunt modele optionale care încapsuleaz  reguli de vericare (asertii) asupra datelor.
, ,

Acestea au exclusiv rol în vericarea DUT.


1.2. Not, iuni teoretice 3

Figura 1.1 prezint  grac relat, iile dintre diversele modele HDL implicate în simulare. Scopul simul rii este
de a se certica faptul c  modulul DUT se comport  conform specicat, iilor, prin expunerea acestuia la diverse
scenarii de vericare.

Figura 1.1 Reprezentarea grac  a modelelor implicate în simulare: DUT, generator de stimuli TB, monitoare, modul
de test TEST.

În simulatorul ModelSim, modulele implicate în simulare sunt prezentate textual, în fereastra sim. Pentru
cazul unui num r tor presetabil, gura 1.6 prezint  grac relat, iile dintre diversele modele HDL implicate în
simulare. Figura 1.12, în fereastra sim, se observ  prezentarea textual  a relat, iilor dintre module.

1.2.3 Structura de directoare asociate proiectului


În cadrul unui proiect de simulare HDL sunt implicate multiple s, iere, cu roluri diferite:

• s, iere RTL care modeleaz  hardware s, i vor  utilizate în continuare pentru sintez ,

• s, iere care modeleaz  mediul de vericare s, i sunt utilizate exclusiv pentru vericare,

• s, iere pentru automatizarea simul rii,

• s, iere generate de simulator pentru stocarea diferitelor date.

Într-un proiect mare, num rul acestor s, iere impune o disciplin  a gestion ri acestora. De aceea, se im-
pune structurarea riguroas  a s, ierelor în directoare specice. O propunere de structurare a directoarelor este
prezentat  în continuare. Pentru exemplicare, se consider  ca director de proiect directorul C:\home.

• Directorul C:\home\doc cont, ine s, iere cu specicat, ii pentru descrierea comportamentului sau structurii
modelului RTL.

• Directorul C:\home\hdl cont, ine s, iere RTL care modeleaz  hardware s, i vor  utilizate în continuare pentru
sintez .

• Directorul C:\home\include cont, ine s, iere incluse de c tre modulele RTL care modeleaz  asert, ii s, i specicat, ii
utilizate pentru depanarea modulului RTL (comenzi de acces la s, iere în scopul extragerii de date pentru
depanare). Aceste s, iere sunt incluse în simulare dar nu sunt utilizate pentru sinteza RTL.
4 LECT, IA 1. Metodologia de simulare a modelelor HDL cu ModelSim

• Directorul C:\home\debug cont, ine dou  directoare cu s, iere utilizate exclusiv pentru depanare.
 Directorul C:\home\debug\hdl contine siere utilizate pentru vericare: generatoare de stimuli, medii
, ,

de testare, monitoare.
 Directorul C:\home\debug\sim este directorul utilizat ca director de proiect pentru simulator. Aici
se stocheaz  s, iere utilizate pentru automatizarea simul rii sim.do, wave.do. Tot aici se va crea,
prin intermediul ModelSim, directorul asociat bibliotecii work în care simulatorul va stoca, într-un
format intern, modulele simulate. Acest director se poate structura, dup  necesit t, i, prin crearea
unor directoare specice funct, iilor. De exemplu:
∗ Directorul C:\home\debug\sim\input_data pentru s, iere de date citite de generatoarele de sti-
muli sau de monitoare (s, iere cu datele as, teptate).
∗ Directorul C:\home\debug\sim\output_data pentru s, iere scrise în cursul simul rii cu date
es, antionate în anumite puncte din circuit, la anumite momente de timp.
• În directorul C:\home pot exista s, iere batch (cu extensia .bat) utilizate pentru operat, ii asupra s, ierelor
s, i directoarelor. De exemplu:
 Fisierul
, cleanup.bat care include comenzi pentru eliminarea s, ierelor temporare în vederea arhiv rii
proiectului, prin p strarea exclusiv a s, ierelor surs  necesare.
 Fis, ierul build.bat care colecteaz  exclusiv s, ierele RTL în vederea transmiterii acestora spre vericare
sau sintez .

Pentru exemplicare, în continuare se prezint  structura de directoare asociat  acestei lect, ii.

Directory of c:\home\
cleanup.bat
<DIR> debug
<DIR> hdl

Directory of c:\home\debug
<DIR> hdl
<DIR> sim

Directory of c:\home\debug\hdl
ck_rst_tb.v
counter_preset_tb.v
counter_preset_test.v

Directory of c:\home\debug\sim
sim.do
wave.do

Directory of c:\home\hdl
counter_preset.v

1.3 Metodologia de proiectare a circuitelor integrate digitale


Metodologia de proiectare a circuitelor integrate digitale, prezentat  grac în gura 1.2, include urm toarele 3
etape majore:

Modelarea reprezint  scrierea de c tre proiectant a unui cod HDL RTL. Prin simulare se veric  faptul c 
acesta se comport  conform specicat, iilor de proiectare.
Sinteza reprezint  conversia automat  a modelului RTL într-un netlist cu componente din biblioteca de
tehnologie. Simularea netlist-ului este necesar  deoarece exist  posibilitatea ca sintetizatorul s  nu pro-
duc  structura hardware as, teptat , îndeosebi datorit  model rii incorecte de c tre proiectant, ne-observate
în timpul simul rii RTL.
1.4. Cod HDL 5

Implementarea reprezint  conversia netlist-ului într-un model la nivel zic, prin plasarea si rutarea compo-
,

nentelor din biblioteca de tehnologie prezente în acest model. La nalul acestei etape se obt, ine un netlist
ce cont, ine informat, ii temporale asociate semnalelor. Aceste informat, ii permit simularea modelului la
frecvent, e reale s, i realizarea diferitelor statistici s, i m sur tori: banda de date necesare, puterea consumat 
în regim normal, etc.

Figura 1.2 Metodologia de proiectare a circuitelor integrate digitale. Se observ  multiple simul ri în cadrul metodologiei:
simulare RTL, simulare netlist, simulare model temporal.

Simularea modelelor este necesar  în cadrul ec rei din cele 3 etape deoarece proces rile intermediare realizate
cu software EDA pot schimba comportamentul modelului RTL init, ial. Fiecare model al sistemului proiectat
(RTL, netlist, model temporal) ar trebui simulat în acelas, i mediu de test. Mediul de testare reprezint  un model
pentru sistemul proiectat (DUT) conectat în mediul exterior.

1.4 Cod HDL


1.4.1 Num rator presetabil cu validare, DUT
Pentru exemplicarea modului de utilizare a simulatorului ModelSim pentru simularea Verilog RTL este con-
siderat cazul unui num r tor presetabil al c rui simbol este prezentat în gura 1.3.
Fis, ierul counter_preset.v cont, ine modelul circuitului de testat DUT.

module c o u n t e r _ p r e s e t #(
6 LECT, IA 1. Metodologia de simulare a modelelor HDL cu ModelSim

Figura 1.3 Simbolul num r torului presetabil utilizat ca exemplicare.

parameter WIDTH = ' d8 // numar d e biti ai numaratorului


) (
input clk , // semnal de ceas
input rst_n , // semnal de reset asincron , activ low
input count_up , // comanda d e numarare , activa high
input load , // comanda presetare , activa high ,
// prioritara fata de numarare
input [WIDTH − 1:0] data_preset , // data presetare
output reg [WIDTH − 1:0] counter_out , // iesire numarator
output carry_out // transport de iesire
);

always @( posedge c l k or negedge rst_n )


i f (~ rst_n ) counter_out <= {WIDTH{ 1 ' b0 } } ; el se // resetare asincrona
i f ( load ) counter_out <= d a t a _ p r e s e t ; el se // presetare
i f ( count_up ) counter_out <= counter_out + 1 ; // numarare

assign carry_out = (~ l o a d ) & // nu se incarca si


count_up & // numara si
(& counter_out ) ; // valoarea curenta este c e a maxima , 11...1

endmodule // counter_preset

1.4.2 Generator de stimuli


Fis, ierul ck_rst_tb.v cont, ine un generator de semnal de ceas s, i semnal asincron de reset activ în 0. Simbolul
acestui modul prezint  doar ies, iri (gura 1.4). Acest modul se recomand  a  refolosit pe parcursul lect, iilor
urm toare.
module ck_rst_tb (
output reg clk , // semnal de ceas
output reg rst_n // semnal de reset asincron , activ low
);

i n i t i a l begin
c l k = 1 ' b0 ;
forever #5 c l k = ~ c l k ;
end
1.4. Cod HDL 7

i n i t i a l begin
rst_n <= 1 ' b1 ;
@( posedge c l k ) ;
rst_n <= 1 ' b0 ;
@( posedge c l k ) ;
@( posedge c l k ) ;
rst_n <= 1 ' b1 ;
@( posedge c l k ) ;
end

endmodule // ck_rst_tb

Figura 1.4 Simbolul generatorului de semnal de ceas si de reset asincron activ în 0.


,

Fis, ierul counter_preset_tb.v cont, ine un generator de stimuli pentru modulul counter_preset.

module c ou n t e r _ p r e s e t _ t b #(
parameter WIDTH = ' d8 // numar d e biti ai numaratorului
) (
input clk , // semnal de ceas
input rst_n , // semnal de reset asincron , activ low
output reg count_up , // comanda d e numarare , activa high
output reg load , // comanda presetare , activa high ,
// prioritara fata de numarare
output reg [WIDTH − 1:0] data_preset // data presetare
);

i n i t i a l begin
count_up <= 1 ' bx ;
load <= 1 ' bx ;
d a t a _ p r e s e t <= {WIDTH{ 1 ' bx } } ;

// initializeaza numaratorul la 0, la activarea reset asincron


@( negedge rst_n ) ;
count_up <= 1 ' b0 ;
load <= 1 ' b0 ;
d a t a _ p r e s e t <= {WIDTH{ 1 ' bx } } ;
@( posedge rst_n ) ;

// numarator initializat , asteapta


repeat ( 5 ) @( posedge c l k ) ;

// numara d e la 0 la 15 si reia numararea de la 0


count_up <= 1 ' b1 ;
repeat ( 2 0 ) @( posedge c l k ) ;

// dezactiveaza numararea si asteapta


8 LECT, IA 1. Metodologia de simulare a modelelor HDL cu ModelSim

count_up <= 1 ' b0 ;


repeat ( 5 ) @( posedge c l k ) ;

// preseteaza starea in 13
load <= 1 ' b1 ;
d a t a _ p r e s e t <= ' d13 ;
@( posedge c l k ) ;
load <= 1 ' b0 ;
d a t a _ p r e s e t <= ' bx ;
@( posedge c l k ) ;

// asteapta
repeat ( 5 ) @( posedge c l k ) ;

// reia numararea de la valoarea presetata


count_up <= 1 ' b1 ;
repeat ( 2 0 ) @( posedge c l k ) ;

// dezactiveaza numararea si asteapta


count_up <= 1 ' b0 ;
repeat ( 5 ) @( posedge c l k ) ;

$display ( "%M %0t INFO : F i n a l s i m u l a r e . " , $time ) ;


$stop ;

end

endmodule // counter_preset_tb

Simbolul acestui modul prezint  ies, iri asociate intr rilor circuitului num r tor presetabil DUT (gura 1.5).
Adit, ional, modulul cont, ine intr ri pentru semnalul de ceas s, i cel de reset.

Figura 1.5 Simbolul generatorului de stimuli pentru num r torul presetabil.

1.4.3 Mediu de testare


Fis, ierul counter_preset_test.v cont, ine mediul de testate pentru DUT.

module c o u n t e r _ p r e s e t _ t e s t ;
localparam WIDTH = ' d4 ; // numar d e biti ai numaratorului
1.5. Metodologia de simulare a modelelor HDL cu ModelSim 9

wire clk ; // semnal de ceas


wire rst_n ; // semnal de reset asincron , activ low
wire count_up ; // comanda d e numarare , activa high
wire load ; // comanda presetare , activa high ,
// prioritara fata de numarare
wire [WIDTH − 1:0] data_preset ; // data presetare
wire [WIDTH − 1:0] counter_out ; // iesire numarator
wire carry_out ; // transport de iesire

c o u n t e r _ p r e s e t #(
.WIDTH (WIDTH )
) DUT_counter_preset (
. clk ( clk ),
. rst_n ( rst_n ),
. count_up ( count_up ),
. load ( load ),
. data_preset ( data_preset ),
. counter_out ( counter_out ),
. carry_out ( carry_out )
);

ck_rst_tb i_ck_rst_tb (
. clk ( clk ),
. rst_n ( rst_n )
);

co u n t e r _ p r e s e t _ t b #(
.WIDTH (WIDTH )
) i_counter_preset_tb (
. clk ( clk ),
. rst_n ( rst_n ),
. count_up ( count_up ),
. load ( load ),
. data_preset ( data_preset )
);

endmodule // counter_preset_test

Mediul de testare este prezentat grac în gura 1.6. Se observ  instant, ierea DUT, a generatorului de semnal
de ceas s, i a generatorului de stimuli pentru num r tor. Porturile de ies, ire ale generatorului de stimuli au fost
conectate la porturile de intrare asociate ale DUT prin intermediul unor semnale cu aceleas, i nume. Parametru
local al modulului de test (WIDTH, cu valoare 4) a fost propagat ca valoare pentru parametrii corespunz tori
ai DUT s, i TB.

1.5 Metodologia de simulare a modelelor HDL cu ModelSim


Simularea cu ModelSim presupune existent, a s, ierelor cu codul surs :

• Fis, ier cu modelul DUT,

• Fis, iere cu modele pentru generatoare de stimuli TB,

• Fis, ierul cu mediul de testare TEST.

Etapele simul rii sunt:


10 LECT, IA 1. Metodologia de simulare a modelelor HDL cu ModelSim

Figura 1.6 Mediu de test pentru num r torul presetabil.

• Lansarea simulatorului;
• Init, ierea unui proiect s, i congurarea acestuia;
• Compilarea s, ierelor cu cod surs ;
• Simularea modelului de test;
• Rularea simul rii;
• Diagnoza comportamentului sistemului de testat, prin utilizarea resurselor simulatorului;
• Automatizarea procesului de simulare.

În sect, iunile urm toare se vor detalia aceste etape, cu exemplicare pentru cazul simul rii unui num r tor
sincron presetabil.

1.5.1 Lansarea în executie si congurarea ModelSim prin meniuri si comenzi


, , ,

ModelSim se poate lansa în execut, ie cu dou  interfet, e:

• interfat,   grac , recomandat  pentru depanarea unui modul, permite vizualizarea formelor de und  s, i
utilizarea unor comenzi prin meniuri grace s, i
• interfat,   text,
recomandat  pentru rul ri multiple, ne-interactive, pentru vericarea unor multiple scenarii,
dup  ce s-a realizat depanarea cazurilor frecvente.

În continuarea lect, iei se presupune rularea ModelSim în mediu grac.

ModelSim se lanseaz  în execut, ie în mod grac prin dublu-clic pe icon-ul prezent pe desktop sau din
meniul de programe. Se va deschide fereastra principal , similar  cu cea prezentat  în gura 1.7. Se observ 
meniurile, tastele cu comenzi rapide s, i ferestrele Library s, i Transcript.
Din meniul principal al ModelSim, se stabiles, te directorul de simulare ca director curent:
File > Change Directory... selectat, i C:/home/debug/sim.

Comanda asociat  acestei act, iuni este:


ModelSim> cd C:/home/debug/sim
1.5. Metodologia de simulare a modelelor HDL cu ModelSim 11

Figura 1.7 Fereastra principal  a ModelSim.

1.5.2 Compilarea si simularea unui proiect


,

Compilarea unui s, ier reprezint  analiza codului Verilog din acel s, ier s, i realizarea unui model de simulare
într-un format propriu simulatorului. Modelul de simulare este stocat într-o bibliotec  de simulare materializat 
sub forma unui director s, i a unor informat, ii stocate în s, iere gestionate de c tre simulator. Înainte de a compila
un s, ier cu cod Verilog, trebuie creat  o bibliotec  de proiect s, i asociat  cu un nume generic. Se recomand 
p strarea numelui implicit work pentru bibliotec .
Crearea bibliotecii se poate face din meniul grac astfel:
File > New > Library...

În caseta de dialog Create a New Library (gura 1.8) se selecteaz :


Create > a new library and a logical mapping to it.

Se recomand  p strarea câmpurilor Library Name s, i Library Physical Name cu valorile completate implicit
work. Selectati OK.,

Aceast  act, iune va determina crearea unui subdirector numit work, biblioteca de proiect, în directorul curent.
Acest subdirector cont, ine un s, ier particular, denumit _info.
Ca alternativ , se poate crea biblioteca de lucru cu o comand  specic  lansat  în fereastra Transcript sau
12 LECT, IA 1. Metodologia de simulare a modelelor HDL cu ModelSim

Figura 1.8 Caseta de dialog Create a New Library.

din s, iere script:


ModelSim> vlib work

Ulterior, biblioteca de lucru se asociaz  cu un nume generic prin comanda:


ModelSim> vmap work work

Având biblioteca creat  s, i asociat  cu un nume, se poate trece la etapa de compilare a s, ierelor surs . Ordinea
de compilare a modulelor Verilog este indiferent . ModelSim face vericarea existent, ei tuturor modulelor referite
în proiect numai în momentul simul rii modulului în care se instant, iaz  acestea (nu în momentul compil rii).

Compilarea s, ierelor surs  Verilog se face prin act, ionarea butonului Compile sau cu comanda textual :
ModelSim> vlog <nume s, ier>

Fis, ierele se compileaz  unul câte unul sau mai multe deodat  prin select, ia multipl  a acestora. Se vor
compila atât s, ierele RTL DUT cât s, i s, ierele cu generatoarele de stimuli TB s, i mediul de testare TEST. Nu
se vor compila s, ierele incluse cu specicat, ia Verilog 'include. Acestea se for include automat prin execut, ia
specicat, iei de includere prezente în codul Verilog compilat.
Fis, ierele incluse sunt c utate implicit în directorul de proiect. Se poate ment, iona o alt  locat, ie pentru s, ierele
incluse, prin utilizarea opt, iunii +incdir pentru comanda vlog:
ModelSim> vlog <nume s, ier> "+incdir+<cale s, iere incluse>"

De exemplu, dac  directorul de proiect este C:\home\debug\sim iar s, ierul surs  C:\home\hdl\counter_preset.v
include un s, ier de asert, ii C:\home\include\counter_preset_assert.v, atunci, comanda de compilare va :
ModelSim> vlog ../hdl/counter_preset_assert.v +incdir+../../include

Calea spre s, ierele incluse este referit  din directorul de proiect, nu din directorul s, ierului surs .
În s, ierul C:\home\hdl\counter_preset.v trebuie s  apar  specicat, ia:
'include "counter_preset_assert.v"
Structura proiectului se va putea vizualiza ulterior, dup  simularea proiectului, în fereastra dedicat  sim
(gura 1.12).

La ap sarea butonului Compile se va deschide caseta de dialog Compile Source Files (gura 1.9). În
aceast  caset  se permite selectarea multipl  a s, ierelor cu cod Verilog, urmat  de ap sarea tastei Compile.
Urmare a compil rii, în fereastra Transcript apar posibilele mesaje de eroare sau de atent, ionare. Se închide
caseta de dialog prin ap sarea butonului Done.
Dup  nalizarea compil rii, modulele se g sesc în biblioteca de simulare work, într-un format propriu simu-
1.5. Metodologia de simulare a modelelor HDL cu ModelSim 13

Figura 1.9 Caseta de dialog Compile HDL Source Files.

latorului. Acest lucru se poate verica în fereastra Library, dup  selectarea bibliotecii work (gura 1.10).
Simularea se face întotdeauna cu precizarea modulului cu mediul de test (cel cu interfat,   vid  în care este

instant, iat modulul de testat DUT). Simularea se lanseaz  selectând butonul Simulate sau la prompterul
ferestrei Transcript:
Modelsim> vsim <modul de top>

Va ap rea caseta de dialog Start Simulation, similar  celei prezentate în gura 1.11.
Caseta de dialog Load Design permite selectarea din biblioteca specicat  a modulului de top ce se va simula,
counter_preset_test. Se poate selecta s, i rezolut, ia de simulare, implicit având valoarea 1 ns. Biblioteca implicit 
din care se va prelua modulul de simulat este work.
Comanda alternativ  în fereastra Transcript este:
Modelsim> vsim -gui work.counter_preset_test

Ca efect, în fereastra Transcript apar mesajele:

# vsim -gui
# Start time: 10:00:00 on Oct 1,2019
# Loading work.counter_preset_test
# Loading work.counter_preset
# Loading work.ck_rst_tb
# Loading work.counter_preset_tb

Dup  nalizarea simul rii, în partea stânga-jos a ferestrei principale apare timpul de simulare:
14 LECT, IA 1. Metodologia de simulare a modelelor HDL cu ModelSim

Figura 1.10 Fereastra Library cu modulele continute de biblioteca work.


,

Pornirea simul rii se face prin ap sarea butonul Run Aceast  act, iune va determina rularea simul rii
pentru un timp selectat (implicit 100 ns).
Se poate da o comand  de rulare s, i din fereastra Transcript:

VSIM> run

Timpul curent al simul rii este as, at în partea de jos a ferestrei principale (gura 1.12).

Se poate rula simularea la innit prin act, ionarea butonului Run All sau cu comanda:
VSIM> run -all

Oprirea simulatorului comandat s  ruleze la innit se face prin ap sarea butonului Break .

1.5.3 Ferestre ale simulatorului ModelSim


Simulatorul ModelSim prezint  mai multe ferestre interne, dedicate diverselor funct, ii. Ferestrele mai frecvent
utilizate sunt:

• Fereastra Transcript, în care sunt as, ate mesaje referitoare la starea execut, iei comenzilor s, i mesajele de
eroare sau atent, ionare. În aceast  fereastr  se pot lansa comenzi textuale individuale sau scripturi de
comenzi (cu comanda do <sier.do>).

• Fereastra Objects, în care se vizualizeaz  semnalele asociate unui modul selectat. Exist  posibilitatea
transfer rii acestora în fereastra Wave pentru a  vizualizate ca forme de und  sau fereastra List. În
gura 1.12 se observ  în fereastra Objects semnalele declarate în modulul selectat în fereastra sim (modulul
ck_rst_tb, instant, iat cu numele i_ck_rst_tb).

• Fereastra sim, în care se prezint  o descriere textual  a ierarhiei proiectului. În aceast  fereastr  se
poate selecta modulul curent la care se face referire pentru vizualizarea informat, iilor în alte ferestre:
lista de semnale, codul surs , etc. În gura 1.12 se observ  în fereastra sim prezentarea textual  a
ierarhiei proiectului simulat, similar  cu reprezentarea grac  din gura 1.6. Modulul counter_preset_test
instant, iaz  3 module:

1. counter_preset (cu nume de instant,   DUT_counter_preset),


1.5. Metodologia de simulare a modelelor HDL cu ModelSim 15

Figura 1.11 Caseta de dialog Start Simulation.

2. ck_rst_tb (cu nume de instant,   i_ck_rst_tb),

3. counter_preset_tb (cu nume de instant,   i_counter_preset_tb).

1.5.4 Fereastra formelor de und  ale semnalelor


Fereastra wave, gura 1.13, permite vizualizarea variat, iei în timp a semnalelor selectate (forme de und ). Pe
orizontal  este axa timpului iar pe vertical  sunt as, ate diversele semnale prezente în proiect.
Semnalele ce se doresc a  vizualizate trebuie aduse explicit în fereastra wave. Exist  mai multe forme de a
aduce un semnal în fereastra wave. Cea mai simpl  procedur  este:

• se selecteaz  modulul dorit în fereastra sim,

• se selecteaz  semnalele dorite în fereastra Objects,

• dup  select, ia multipl  a semnalelor s, i clic-dreapta pe unul din semnale apare un meniu de unde se selecteaz 
opt, iunea Add Wave.

Semnalele selectate se vor reg si în fereastra de forme de und  wave.

O alternativ  const  în selectarea unui modul în fereastra sim s, i clic-dreapta urmat de select, ia opt, iunii Add
Wave din meniul ap rut. Exist  s, i opt, iunea utiliz rii tastei scurte Ctrl+W dup  select, ia unui modul sau a unor
semnale în ferestrele asociate (sim, Objects).
Congurarea ferestrei Wave poate  salvat  într-un s, ier extern, pentru a  reutilizat  într-o sesiune viitoare,
cu meniul:
File > Save format... sau tasta scurt  Ctrl+S.

Fis, ierul salvat va avea extensia .do (se recomand  denumirea wave.do) s, i va putea  executat cu comanda
do wave.do lansat  dup  simulare la prompterul ferestrei Transcript.
Cursoarele sunt utile pentru a marca timpul la care se investigheaz  valoarea semnalelor s, i pentru a face
m sur tori de timp.
16 LECT, IA 1. Metodologia de simulare a modelelor HDL cu ModelSim

Figura 1.12 Fereastra principal  a ModelSim dup  pornirea rul rii simul rii.

Ad ugarea s, i eliminarea cursoarelor din fereastra de as, are a formelor de und  se face cu comenzi specice.
La prima deschidere a ferestrei Wave exist  un singur cursor, plasat la timpul 0. Cursorul se mut  automat la
timpul la care se face clic în fereastra Wave. Pot  plasate pe ecran maximum 12 cursoare. Cursoarele sunt
însot, ite de casete care precizeaz  intervalele de timp dintre cursoare.

Se pot ad uga s, i elimina cursoare cu butoanele Add Cursor s, i Delete Cursor .

1.5.5 Realizarea unui script cu comenzi ModelSim pentru rularea automat  a


simul rii
Comenzile generate prin meniuri au un corespondent textual. Acesta se prezint  în fereastra Trasnscript. Prin
preluarea comenzilor textuale (cu copy & paste) se poate edita un s, ier de comenzi, cu extensia .do. Fis, ierele
de comenzi se pun în execut, ie, ca o singur  comand , la prompterul ferestrei Trasnscript cu comanda:
VSIM> do <sier.do>
În acest mod, se pot executa rapid multiple comenzi pentru congurarea mediului de simulare, compilare,
simulare, rulare s, i particularizarea fereastrei cu formele de und .
Fisierul sim.do contine comenzi scriptice ModelSim pentru:
, ,

• Crearea bibliotecii de lucru work (comanda vlib).

• Asocierea bibliotecii de lucru work cu numele generic work (comanda vmap).


1.5. Metodologia de simulare a modelelor HDL cu ModelSim 17

Figura 1.13 Fereastra Wave cu semnalele interne ale modulului de testat counter_preset.

• Compilarea s, ierelor surs  Verilog (DUT, test-bench TB s, i test) (comanda vlog).

• Lansarea în execut, ie a simul rii (comanda vsim).

• Înc rcarea formelor de und  ce se doresc a  vizualizate (comanda do cu un s, ier auxiliar de descriere a
formelor de und ).

• Rularea simul rii (comanda run).

v l i b work
vmap work work

vlog . . / . . / hdl / counter_preset . v


vlog . . / h d l / ck_rst_tb . v
vlog . . / hdl / counter_preset_tb . v
vlog . . / hdl / counter_preset_test . v

vsim −novopt work . c o u n t e r _ p r e s e t _ t e s t

do wave . do

run − a l l

Automatizarea simul rii nu este necesar  pentru proiecte de dimensiuni mici. Pentru proiecte complexe,
ce cont, in zeci sau sute de module, este absolut necesar  scrierea unor scripturi de comenzi prin care s  se
preg teasc  simularea.
18 LECT, IA 1. Metodologia de simulare a modelelor HDL cu ModelSim

1.6 Activit ti practice ,

1. Urm rit, i metodologia de simulare prezentat  în sect, iunea 1.5 pentru simularea unui num r tor presetabil
cu validare. Preluat, i modelul RTL s, i mediul de depanare din directoarele specice lect, iei. Urm rit, i
metodologia de simulare: compilare, simulare, rulare, observare forme de und .
În cadrul simul rii num r torului presetabil cu validare, descoperit, i funct, ionalitatea meniurilor s, i feres-
trelor ModelSim.

2. Modicat, i codul RTL s, i ad ugat, i num r torului posibilitatea de a num ra s, i în sens cresc tor s, i în sens
descresc tor. Ad ugat, i o intrare de comand  de num rare în sens descresc tor, activ  în 1, denumit 
count_down. Modicat, i s, ierul de generare de stimuli s, i cel al mediului de testare pentru a depana
aceast  nou  caracteristic  a num r torului.
Vericat, i comportamentul num r torului în cazul: count_down=count_up=1. Inspectat, i formele de und 
simulate s, i decidet, i dac  circuitul se comport  conform as, tept rilor.
Completat, i tabelul de funct, ionare a num r torului.

+
rst_n clk load count_up count_down counter_out Act, iune
0 - - - - 0 init, ializare
1 ↑ 1 - - data_preset presetare
1 ↑ 0 1 0 counter_out+1 num r  în sens cresc tor
1 ↑ 0 0 1 counter_out-1 num r  în sens descresc tor
1 ↑ 0 0 0 ... ...
1 ↑ 0 1 1 ... ...

Ad ugat, i informat, ia despre comportamentul ies, irii carry_out în cazul num r rii în sens cresc tor sau
descresc tor.

3. Modicat, i codul RTL s, i ad ugat, i num r torului posibilitatea de a-s, i deplasa cont, inutul la stânga s, i la
dreapta. Ad ugat, i intr rile sh_left s, i sh_right. Modicat, i s, ierul de generare de stimuli s, i cel al mediului
de testare pentru a depana aceste noi caracteristici ale num r torului.
Completat, i tabelul de funct, ionare a num r torului.

+
rst_n clk load count_up count_down sh_left sh_right counter_out Act, iune
0 - - - - - - 0 init, ializare
1 ↑ 1 - - - - ... ...
1 ↑ 0 1 - - - ... ...
1 ↑ 0 0 1 - - ... ...
1 ↑ 0 0 0 1 - ... ...
1 ↑ 0 0 0 0 1 ... ...
1 ↑ 0 0 0 0 0 ... ...

4. Pe baza codului RTL asociat modulului counter_preset, presupunând WIDTH=4, desenat, i de mân  o
schem  intern  cu simboluri pentru registre/bistabile, circuite aritmetice, port, i logice, multiplexoare,
etc. Ce resurse suplimentare sunt necesare pentru implementarea num r rii reversibile s, i a deplas rii
cont, inutului?

5. Extindet, i modulul generatorului de stimuli pentru testarea tuturor funct, iilor num r torului pentru WIDTH=4.
De exemplu:

• Presetare la valoarea 5.
• Num rare în sens cresc tor, pân  la generarea semnalului de dep s, ire (carry_out=1).
• Num rare în sens descresc tor, pân  la generarea semnalului de dep s, ire (carry_out=1) s, i apoi cu
pauze pân  la valoarea counter_out=5.
• Deplasare stânga cu 3 pozit, ii.
• Deplasare dreapta cu 3 pozit, ii.
1.6. Activit t, i practice 19

Vericat, i c  at, i acoperit în simulare cazurile prezentate în tabelul urm tor:

load count_up count_down sh_left sh_right


1 1 - - -
1 0 1 - -
1 0 0 0 1
0 1 1 0 -
0 1 1 1 1
0 0 1 1 -
0 0 0 1 1
0 0 0 0 1
0 0 0 0 0

Ce modic ri trebuie aduse mediului de simulare pentru a verica modulul counter_preset, cu WIDTH=8?

6. Realizat, i un script de automatizare prin copierea comenzilor din fereastra Transcript. Denumit, i scriptul
sim.do. Includet, i în script toate comenzile necesare pentru rularea simul rii, începând cu crearea bibliotecii
de lucru work s, i pân  la rularea simul rii (run -all), inclusiv înc rcarea unor forme de und .
Vericat, i scriptul prin lansarea în execut, ie a acestuia din fereastra Transcript cu comanda: do sim.do.
Lect, ia 2

Simularea modelelor HDL cu ModelSim


Aceast  lect, ie prezint  realizarea integral  a model rii unui sistem digital s, i a simul rii acestuia cu simulatorul
ModelSim.

Se vor modela circuite simple, accentul ind pus pe însus, irea metodologiei de simulare s, i utilizarea programului
de simulare.

2.1 Scopurile lectiei ,

• Proiectarea unui modul RTL comportamental s, i a unui mediu de testare pentru un sumator s, i o unitate
logico-aritmetic .

• Proiectarea unui modul RTL structural pentru un circuit secvent, ial de acumulare, pe baza instant, ierii
unui sumator s, i a unui registru.

• Proiectarea unui modul RTL structural pentru un circuit secvent, ial de multiplicare s, i acumulare.

• Utilizarea simulatorului ModelSim pentru simularea unor scenarii de comportament pentru circuitele
proiectate.

• Examinarea formelor de und  asociate semnalelor.

• Conceperea unui monitor pentru vericarea automat  a rezultatelor obt, inute din simulare prin comparare
cu cele as, teptate.

2.2 Notiuni teoretice


,

2.2.1 Modulul
Verilog este un limbaj de descriere hardware în care se pot modela atât circuite ce urmeaz  a  implementate
în mod real sub forma unui circuit integrat digital cât s, i medii de testare, utilizate exclusiv pentru simulare.
Verilog nu este un limbaj de programare.
Un program este o secvent,   de instruct, iuni executate de un procesor.
Din acest motiv, este improprie not, iunea de "cod Verilog". Este recomandat  utilizarea not, iunii de "model
Verilog". Modelul Verilog se poate simula. Dac  modelul este compus exclusiv din specicat, ii sintetizabile,
modelul se poate sintetiza. Sinteza reprezint  transformarea modelului RTL într-o structur  hardware de c tre
un set de programe software specializate. Setul de programe software utilizate pentru proiectare în electronic 
este cunoscut sub abrevierea EDA (engl. Electronic Design Automation).

21
22 LECT, IA 2. Simularea modelelor HDL cu ModelSim

Verilog permite atât descrierea comportamentului cât s, i descrierea structurii unui circuit digital. Modelele
Verilog pot  dezvoltate pe diferite nivele de abstractizare:

• Nivel algoritmic: un model care descrie algoritmul unui circuit digital prin construct, ii de nivel înalt
ale limbajului, f r  corespondent,   direct  cu resursele hardware s, i f r  a modela detaliat temporizarea
circuitului. Acest nivel este utilizat pentru generarea rapid  a unui model care descrie comportamentul,
f r  a  utilizat direct pentru sinteza de hardware.
• RTL (engl. Register Transfer Level): un model care descrie transferul datelor între registre s, i modul de
procesare a acestora. Modelele sistemelor ce se vor implementa hardware sunt descrise de c tre proiectant, i
la acest nivel de detaliere.
• Nivel de poart  logic : un model care descrie port, ile logice s, i conexiunile dintre port, i logice. De obicei,
modelele de acest tip sunt generate automat s, i sunt utilizate pentru a simula funct, ionarea unui circuit
deja implementat.
• Nivel de comutare: un model care descrie circuitul logic realizat cu tranzistoare, similar cu modelele
SPICE.

Modulul este blocul elementar de construct, ie Verilog. Un modul cont, ine modelul unui circuit sau a unei
p rt, i de circuit. Limbajul Verilog are multe similitudini cu limbajul de programare C. De exemplu, similar cu
instant, ierea unei clase, un modul poate  instant, iat în cadrul altui modul. În acest mod, se poate realiza o
descriere a structurii unui modul complex.
Modulul Verilog este delimitat de cuvintele rezervate module s, i endmodule. Numele modulului este obli-
gatoriu s, i apare imediat dup  cuvântul rezervat module. Se recomand  utilizarea unor nume sugestive pentru
module.
module numarator
. . .
endmodule

Opt, ional, modulul poate avea parametrii (constante). Descrierea parametrilor se face imediat dup  numele
modulului, între paranteze rotunde precedate de simbolul #. Fiecare parametru, introdus prin cuvântul rezervat
parameter, are un nume s, i o valoare implicit . Valoarea implicit  a parametrului poate  modicat  la
instant, ierea modulului.
module numarator #(
parameter NO_BITS = 1 ' b8 , // numar d e biti
parameter MODULO_NUM = ' d35 // numar d e stari
)
. . .
endmodule

Opt, ional, modulul poate cont, ine o list  de porturi, între paranteze rotunde. Porturile sunt conexiunile
modulului cu lumea exterioar . Fiecare port este introdus printr-un cuvânt rezervat care desemneaz  direct, ia
acestuia (input, output sau inout) urmat de dimensiunea portului s, i numele acestuia. Dimensiunile portului
se exprim  prin indexul celui mai semnicativ bit s, i indexul celui mai put, in semnicativ bit, între paranteze
drepte. Dimensiunea unui port poate  exprimat  pe baza parametrilor.
module numarator #(
parameter NO_BITS = 1 ' b8 , // numar d e biti
parameter MODULO_NUM = ' d35 // numar d e stari
)
(
// semnale de ceas si reset
input clk , // ceas
input rst_n , // reset asincron activ 0
// semnale de control
input load , // incarcare
2.2. Not, iuni teoretice 23

input count_up , // numara in sens crescator


input count_dn , // numara in sens descrescator
output reg ovf_r , // depasire

input [ NO_BITS − 1:0] data_in , // date presetate


output reg [ NO_BITS − 1:0] data_out // iesire numarator
);
. . .
endmodule

Specicat, iile din cadrul modulului modeleaz  comportamentul acestuia sau permit instant, ierea unor alte
module, în mod ierarhic. Modelarea comportamental  se realizeaz  cu specicat, ii assign s, i always.
module numarator #(
parameter NO_BITS = 1 ' b8 , // numar d e biti
parameter MODULO_NUM = ' d35 // numar d e stari
)
(
// semnale de ceas si reset
input clk , // ceas
input rst_n , // reset asincron activ 0
// semnale de control
input load , // incarcare
input count_up , // numara in sens crescator
input count_dn , // numara in sens descrescator
output ovf , // depasire

input [ NO_BITS − 1:0] data_in , // date presetate


output reg [ NO_BITS − 1:0] data_out // iesire numarator
);

// valoare maxima , pe b a z a MODULO_NUM


localparam MAX_VAL = MODULO_NUM − 1 ;

// registru numarator cu presetare


always @( posedge c l k or negedge rst_n )
i f (~ rst_n ) data_out <= {NO_BITS{ 1 ' b0 } } ; el se
i f ( load ) data_out <= data_in ; el se
i f ( count_up ) data_out <= o v f ? {NO_BITS{ 1 ' b0 }} : data_out + 1 ; el se
i f ( count_dn ) data_out <= o v f ? MAX_VAL : data_out − 1 ;

// logica de depasire a numararii


assign o v f = ( ( ~ l o a d ) & count_up & ( data_out == MAX_VAL )) |
( ( ~ l o a d ) & count_dn & ( data_out == {NO_BITS{ 1 ' b0 } } ) ) ;

// registru de depasire
always @( posedge c l k or negedge rst_n )
i f (~ rst_n ) ovf_r <= 1 ' b0 ; el se
ovf_r <= o v f ; el se

endmodule // numarator

Modelarea structural  se realizeaz  prin instant, ierea altor module.


module numarator #(
parameter NO_BITS = 1 ' b8 , // numar d e biti
parameter MODULO_NUM = ' d35 // numar d e stari
)
24 LECT, IA 2. Simularea modelelor HDL cu ModelSim

(
// semnale de ceas si reset
input clk , // ceas
input rst_n , // reset asincron activ 0
// semnale de control
input load , // incarcare
input count_up , // numara in sens crescator
input count_dn , // numara in sens descrescator
output ovf , // depasire

input [ NO_BITS − 1:0] data_in , // date presetate


output reg [ NO_BITS − 1:0] data_out // iesire numarator
);

// valoare maxima , pe b a z a MODULO_NUM


localparam MAX_VAL = MODULO_NUM − 1 ;

reg [ NO_BITS − 1:0] next_data ; // valoarea viitoare

// registrul numaratorului
reg_param #(
. NO_BITS (NO_BITS)
) i_reg_param (
. clk ( clk ),
. rst_n ( rst_n ),
. data_in ( next_data ) ,
. data_out ( data_out )
);

// logica starii viitoare ( combinational )


always @( ∗ )
i f ( load ) next_data = data_in ; el se
i f ( count_up ) next_data = o v f ? {NO_BITS{ 1 ' b0 }} : data_out + 1 ; el se
i f ( count_dn ) next_data = o v f ? MAX_VAL : data_out − 1 ;

// logica de depasire a numararii


assign o v f = ( ( ~ l o a d ) & count_up & ( data_out == MAX_VAL )) |
( ( ~ l o a d ) & count_dn & ( data_out == {NO_BITS{ 1 ' b0 } } ) ) ;

// registru de depasire
reg_param #(
. NO_BITS ( 1 ' b1 )
) i_reg_param (
. clk ( clk ),
. rst_n ( rst_n ),
. data_in ( o v f ),
. data_out ( ovf_r )
);

endmodule // numarator

În acest caz, în modulul numarator a fost instat, iat modulul reg_param (registru cu l t, ime parametrizabil )
atât pentru modelarea registrului de ies, ire (data_out) cât s, i pentru modelarea bistabilului plasat pe ies, irea
ovf_r.

module reg_param #(
parameter NO_BITS = 1 ' b8 // numar d e biti
2.2. Not, iuni teoretice 25

)
(
input clk , // ceas
input rst_n , // reset asincron activ 0
input [ NO_BITS − 1:0] data_in , // date presetate
output reg [ NO_BITS − 1:0] data_out // iesire numarator
);

always @( posedge c l k or negedge rst_n )


i f (~ rst_n ) data_out <= {NO_BITS{ 1 ' b0 } } ; el se
data_out <= data_in ;

endmodule // reg_param

2.2.2 Tipuri de date


Verilog are mai multe tipuri de date, îns  dou  sunt frecvent utilizate pentru modelarea RTL.

• Tipul net, introdus prin cuvântul rezervat wire, modeleaz  conexiunile zice dintre elementele struc-
turale. Un obiect de acest tip se comport  similar cu o sârm  a c rei valoare este dat  de singura surs 
aplicat . Valoarea unei date de acest tip este determinat  de sursa sa, care poate  o specicat, ie de
atribuire continu  assign sau o instant, iere de component  (printr-un port de ies, ire). În lipsa unei surse
pentru semnal, data de tip wire are valoarea implicit  'bz. În cazul mai multor surse cu valori comple-
mentare, semnalul de tip wire are valoarea nedeterminat  'bx. O sârm  declarat  de tip wire are valoarea
continuu atribuit  de c tre sursa sa.

• Tipul register, introdus prin cuvântul rezervat reg, modeleaz  un element abstract de stocare a datelor.
Valorile obiectelor de acest tip pot  atribuite cu specicat, ii always. Valoarea implicit  a acestui tip de
date este 'bx. O sârm  declarat  de tip reg îs, i p streaz  valoarea pân  la atribuirea unei noi valori.

2.2.3 Specicatii , assign si always


,

Modelarea circuitelor combinat, ionale se poate face cu specicat, ii assign. În acest caz, semnalul de ies, ire al
circuitului combinat, ional trebuie declarat ca ind de tip wire.
În cazul unor funct, ii logice mai complexe, care necesit  specicat, ii secvent, iale (if sau case), se pot mode-
la circuite combinat, ionale cu specicat, ii always. În acest caz, semnalul trebuie declarat ca ind de tip reg.
Este obligatoriu ca, în cazul model rii unui circuit combinat, ional, specicat, ia always s  cuprind  în lista de
senzitivit t, i toate semnalele ce determin  valoarea ies, irii. O alternativ  la enumerarea semnalelor într-o list 
de semnale desp rt, ite de virgule este de a se utiliza simbolul specic @(*).
Exemple:
wire a;
wire b;
wire y; // circuit combinational y(a , b)
reg z; // circuit combinational z (a , b)

assign y = a & b ; // atribuire concurenta , y = a.b

always @( a or b )
z = a & b; // atribuire secventiala , z = a.b

wire [ 3 : 0 ] i1 ; // operatori
wire [ 3 : 0 ] i2 ;
wire [ 1 : 0 ] sel ; // expresie de selectie
26 LECT, IA 2. Simularea modelelor HDL cu ModelSim

reg [3:0] u ; // circuit combinational u( sel , i1 , i2 )

always @( ∗ ) // echivalent cu : a l w a y s @( s e l or i1 or i2 )
case ( s e l )
2 ' b01 : u = i1 − i2 ; // diferenta , daca s e l = 01
2 ' b10 : u = i1 & i2 ; // AND p e biti , daca s e l = 10
2 ' b11 : u = i1 | i2 ; // OR p e biti , daca s e l = 11
default : u = i1 + i2 ; // suma , daca sel nu are nicio valoare mentionata anterior
endcase ;

Modelarea circuitelor secvent, iale se face întotdeauna cu specicat, ii always, semnalele ind declarate de tip
reg. În lista de senzitivit t, i a specicat, iei always trebuie s  apar  unul din cuvintele rezervate posedge sau
negedge ce preced numele semnalului de ceas. Opt, ional, poate ap rea s, i sintagma ce modeleaz  un semnal de
reset asincron. Diferent, a între semnalul de ceas s, i cel de reset este c  semnalul de ceas nu apare în corpul
specicat, iei always dar semnalul de reset apare în condit, ia asociat  specicat, iei secvent, iale if.
Exemple:

parameter N = 8;
wire [ N− 1 : 0 ] d ; // sarma de 8 biti
reg [ N− 1 : 0 ] q ; // sarma ce modeleaza iesirea unui registru de 8 biti
reg rst_n ; // semnal de reset asincron activ 0
reg [ N− 1 : 0 ] z ; // sarma ce modeleaza iesirea unui registru de 8 biti

always @( posedge c l k )
q <= d ; // bistabil /registru

// registru cu reset asincron


always @( posedge c l k or negedge rst_n ) // bistabil /registru cu reset asincron
i f (~ rst_n ) z <= {N{ 1 ' b0 } } ; el se // rst_n activ in 0
z <= d ;

reg clk ; // semnal de ceas , activ pe front pozitiv


reg rst_n ; // semnal de reset asincron activ 0

wire en ;
wire [3:0] i1 ; // operatori
wire [3:0] i2 ;
wire [1:0] sel ; // expresie de selectie
reg [3:0] u ;

always @( posedge c l k or negedge rst_n )


i f (~ rst_n ) u <= N' b0 ; el se
i f ( en )
case ( s e l )
2 ' b01 : u <= i 1 − i 2 ; // diferenta , daca s e l = 01
2 ' b10 : u <= i 1 & i 2 ; // AND p e biti , daca s e l = 10
2 ' b11 : u <= i 1 | i 2 ; // OR p e biti , daca s e l = 11
// in lipsa "default ", u isi pastreaza valoarea
endcase ;
// in lipsa "else ", u isi pastreaza valoarea
2.3. Cod HDL 27

2.2.4 Operatori
Verilog are trei tipuri de operatori:

1. Unari, cu un singur operand plasat dup  operator.


a = ~b; // complementare logic  (a = b̄)
2. Binari, cu doi operanzi ce încadreaz  operatorul.
a = b & c; // operator binar cu funct, ie logic  AND (a = b.c)

3. Ternari,cu trei operanzi delimitat, i de simbolurile operatorului. Exist  un singur operator ternar ce
modeleaz  comportamentul de select, ie al unui multiplexor 2:1.
y = s ? i1 : i0; // operator ternar cu funct, ie de multiplexor 2:1 (y = s.i1+s̄.i0)

Tabelul urm tor prezint  operatorii Verilog.

Operator Descriere
+ Operator unar pentru num r pozitiv
- Operator unar pentru num r negativ
! Operator unar pentru negare logic 
~ Operator unar pentru negare pe bit, i
& Operator de reducere AND (aplicat unui vector produce un bit)
~& Operator de reducere NAND
^ Operator de reducere XOR
~^ Operator de reducere XNOR
| Operator de reducere OR
~| Operator de reducere NOR
* Operator binar de multiplicare
/ Operator binar de împ rt, ire
% Operator binar modulo
+ Operator binar de adunare
- Operator binar de sc dere
<< Operator binar de deplasare stânga
>> Operator binar de deplasare dreapta
< Operator binar de comparare "mai mic"
<= Operator binar de comparare "mai mic sau egal"
> Operator binar de comparare "mai mare"
>= Operator binar de comparare "mai mare sau egal"
== Operator binar de egalitate logic 
!= Operator binar de inegalitate logic 
=== Operator binar de egalitate cu select, ie
!== Operator binar de inegalitate cu select, ie
& Operator binar logic  AND pe bit, i (aplicat unor operanzi vectori produce un vector)
^ Operator binar logic  XOR pe bit, i
~^ Operator binar logic  XNOR pe bit, i
| Operator binar logic  OR pe bit, i
&& Operator binar AND logic (aplicat unor expresii, produce o valoare de adev r a unei condit, ii)
|| Operator binar OR logic
? : Operator ternar condit, ional

2.3 Cod HDL


2.3.1 Circuit sumator
Model RTL
28 LECT, IA 2. Simularea modelelor HDL cu ModelSim

module adder #(
parameter WIDTH = ' d8 // numar d e biti ai operanzilor
) (
input [WIDTH − 1:0] op1 , // operand 1
input [WIDTH − 1:0] op2 , // operand 2
output [WIDTH+1 − 1:0] rezultat // rezultat
);

assign r e z u l t a t = op1 + op2 ;

// a l w a y s @( ∗ )
// r e z u l t a t = op1 + op2 ;

endmodule // adder

Generator de vectori de test


module adder_tb #(
parameter WIDTH = ' d8 , // numar d e biti ai operanzilor
parameter CYCLE = ' d10 // interval de timp intre schimbarea
// stimulilor
) (
output reg [WIDTH − 1:0] op1 , // operand 1
output reg [WIDTH − 1:0] op2 // operand 2
);

i n i t i a l begin
op1 <= ' bx ;
op2 <= ' bx ;
#CYCLE;

op1 <= ' d1 ;


op2 <= ' d2 ;
#CYCLE;

repeat ( 1 0 ) begin
op1 <= $random ;
op2 <= $random ;
#CYCLE;
end

$display ( "%M %0t INFO : F i n a l s i m u l a r e . " , $time ) ;


$stop ;
end

endmodule // adder_tb

Mediu de testare
module a d d e r _ t e s t #(
parameter WIDTH = ' d8 , // numar d e biti ai numaratorului
parameter CYCLE = ' d10 // interval de timp intre schimbarea
// stimulilor
);
wire [WIDTH − 1:0] op1 ; // operator 1
wire [WIDTH − 1:0] op2 ; // operator 2
wire [WIDTH+1 − 1:0] rezultat ; // rezultat
2.4. Activit t, i practice 29

adder_tb #(
.WIDTH (WIDTH ) ,
.CYCLE (CYCLE )
) i_adder_tb (
. op1 ( op1 ), // operand 1
. op2 ( op2 ) // operand 2
);

adder #(
.WIDTH (WIDTH )
) i_adder_DUT (
. op1 ( op1 ), // operand 1
. op2 ( op2 ), // operand 2
. rezultat ( rezultat ) // rezultat
);

endmodule // adder_test

2.3.2 Registru paralel de l time parametrizabil 


,

module r e g i s t e r #(
parameter WIDTH = ' d8 // numar d e biti ai numaratorului
) (
input clk , // semnal de ceas
input rst_n , // semnal de reset asincron , activ low
input [WIDTH − 1:0] reg_input , // intrare in registru
output reg [WIDTH − 1:0] reg_output // iesire din registru
);

always @( posedge c l k or negedge rst_n )


i f (~ rst_n ) reg_output <= {WIDTH{ 1 ' b0 } } ; el se // resetare asincrona
reg_output <= reg_input ;

endmodule // register

2.4 Activit ti practice ,

2.4.1 Sumator
Vericat, i prin simulare comportamentul circuitului sumator. Lansat, i în execut, ie, de la prompterul din fereastra
Transcript, scriptul sim_adder.do

ModelSim> do sim_adder.do

Scriptul va crea biblioteca work, o va asocia cu numele work, va compila s, ierul surs  adder.v s, i s, ierele de
simulare adder_tb.v, adder_test.v, apoi va simula modulul de top adder_test. Se va înc rca s, ierul cu descrierea
formelor de und  wave_adder.do s, i se va lansa în execut, ie simularea.

• Urm rit, i metodologia de simulare: compilare, simulare, rulare, observare forme de und .


• Inspectat, i fereastra de forme de und  s, i vericat, i funct, ionarea corect  a sumatorului. Modelul existent
veric  numai câteva cazuri. Considerat, i c  sunt suciente? Câte combinat, ii trebuie vericate pentru
sumatorul de 8 bit, i? Modicat, i mediul de testare pentru a verica mult mai multe cazuri.
• Cum apreciat, i vericarea vizual  a comportamentului în fereastra de forme de und ? Cât timp v-ar lua
vericarea tuturor cazurilor? Ad ugat, i în mediul de testare specicat, ii care s  fac  automat vericarea
rezultatului obt, inut cu cel as, teptat.
30 LECT, IA 2. Simularea modelelor HDL cu ModelSim

De exemplu, ad ugat, i în modulul adder_test specicat, iile:


i n i t i a l begin
forever begin
#CYCLE;
i f ( r e z u l t a t !== op1 + op2 ) begin
$display ( "%M %0t EROARE: %0d+%0d=%0d ( r e z u l t a t %0d ) " , $time ,
op1 , op2 , op1 + op2 , r e z u l t a t ) ;
$stop ;
end
end
end
Explicat, i ce rol au specicat, iile prezentate. Vericat, i funct, ionarea lor prin simulare. Putet, i s, tii c 
funct, ioneaz  monitorul de vericare?
Pentru a verica faptul c  monitorul funct, ioneaz , modelat, i o gres, eal  intent, ionat  în codul RTL. De
exemplu, modicat, i linia:
assign r e z u l t a t = op1 + op2 ;
pentru a  astfel:
assign r e z u l t a t = op1 + op2 + ( ( op1 == ' d13 ) ? 1 : 0 ) ;
Ca efect, în cazul în care op1=13 rezultatul însum rii va  viciat prin adunare cu o unitate.
Vericat, i acum dac  monitorul semnaleaz  aceast  eroare intent, ionat .

• În modulul adder înlocuit, i linia ce modeleaz  efectiv operat, ia de adunare:


assign r e z u l t a t = op1 + op2 ;
cu specicat, ia always cu acelas, i efect:
always @( ∗ )
r e z u l t a t = op1 + op2 ;

Cum explicat, i eroarea de compilare 'Illegal reference to net "rezultat".'?

Corectat, i omisiunea, reluat, i simularea s, i vericat, i comportamentul sumatorului.

2.4.2 ALU (engl. ALU = Arithmetic-Logic Unit)

Pornind de la modulul adder, dezvoltat, i un modul alu care s  realizeze mai multe funct, ii aritmetice s, i logice,
pe baza unei intr ri de select, ie. Funct, iile implementate sunt descrise în tabelul urm tor.

sel rezultat operat, ie


00 op1 + op2 ADD
01 op1 - op2 SUM
10 op1 & op2 AND
11 op1 | op2 OR

Interfat, a modulului alu este:


module a l u #(
parameter WIDTH = ' d8 // numar d e biti ai operanzilor
) (
input [WIDTH − 1:0] op1 , // operand 1
input [WIDTH − 1:0] op2 , // operand 2
output [WIDTH+1 − 1:0] rezultat , // rezultat
2.4. Activit t, i practice 31

input [2 − 1:0] sel // selectie operatie


);

// codul aici

endmodule // alu

Utilizat, i parametrii locali (localparam) pentru alocarea unor nume pentru codurile de select, ie asociate
operat, iilor.
localparam ADD = 2 ' b00 ;
localparam SUM = 2 ' b01 ;
localparam AND = 2 ' b10 ;
localparam OR = 2 ' b11 ;

Modicat, i mediul de simulare al sumatorului pentru a  folosit la vericarea unit t, ii logico-aritmetice.

2.4.3 Circuit de acumulare


Realizat, i un model structural pentru un circuit secvent, ial de acumulare. Instant, iat, i modulul sumator adder s, i
modulul de registru register. Ad ugat, i logica suplimentar  necesar . Interfat, a circuitului acumulator este:
module acumulator #(
parameter WIDTH = ' d8 // numar d e biti ai numaratorului
) (
input clk , // semnal de ceas
input rst_n , // semnal de reset asincron , activ low
input clr , // incarcare cu 0
input load , // incarcare
input acc , // acumulare date
input [WIDTH − 1:0] data_in , // date de intrare
output reg [WIDTH − 1:0] data_out , // iesire din registru
output reg ovf // depasire valoare acumulata
);

// codul se va scrie aici

// se vor instantia modulele :


// ∗ register
// ∗ adder

endmodule // acumulator

2.4.4 Circuit de multiplicare si acumulare ,

Realizat, i un model structural pentru un circuit secvent, ial de multiplicare s, i acumulare. Interfat, a modulului
mac este:
module mac #(
parameter WIDTH = ' d8 // numar d e biti ai numaratorului
) (
input clk , // semnal de ceas
input rst_n , // semnal de reset asincron , activ low
// semnale de control
input clr , // incarcare cu 0
input load , // incarcare
32 LECT, IA 2. Simularea modelelor HDL cu ModelSim

input acc , // multiplicare si acumulare date


output reg ovf , // depasire valoare acumulata
// semnale de date
input [WIDTH − 1:0] op1 , // operanzi de intrare
input [WIDTH − 1:0] op2 , // operanzi de intrare
output reg [WIDTH+4 − 1:0] data_acc // iesirea de date acumulate
);

// codul se va scrie aici

endmodule // mac

Circuitul este sincron, având intrarea de ceas clk activ  pe frontul pozitiv.
Init, ializarea circuitului se face prin semnalul de reset asincron rst_n activ în starea 0.
Intr rile clr, load s, i acc controleaz  comportamentul circuitului. Ies, irea data_acc are o l t, ime parametrizabil 
WIDTH. Intr rile op1 s, i op1 au l t, imi parametrizabile WIDTH s, i determin  datele necesare pentru operat, ia
aritmetic  implementat  de circuit.
Ies, irea ovf este activ  dac  ultima operat, ie de acumulare a determinat dep s, irea valorii posibil de acumulat.
În acest caz, valoarea expus  la ies, irea data_acc este cea mai mare valoare posibil de reprezentat.
Se consider  c  datele reprezint  numere întregi s, i pozitive.
Circuitul poate realiza 3 act, iuni, sincron pe ceas:

1. Aducere la zero a valorii interne, în cazul clr = 1. data_acc = {WIDTH{1'b0}}.

2. Înc rcarea unei valori, în cazul clr = 0 s, i load = 1. Valoarea înc rcat  este valoarea prezent  pe
intrarea op1. data_acc = op1.

3. Acumularea valorii, în cazul clr = 0, load = 0 s, i acc = 1. Valoarea nal , dup  acumulare, se obt, ine
din valoarea curent  prin adunarea valorii obt, inute din înmult, irea celor doi operanzi op1 s, i op2.

data_acc+ = data_acc + op1 ∗ op2

Dac  noua valoare acumulat  nu poate  reprezentat  pe num rul de bit, i WIDTH, atunci valoarea se
limiteaz  la valoarea maxim  data_acc = {W IDT H{1′ b1}} s, i se activeaz  ies, irea ovf = 1. Ies, irea care
semnaleaz  dep s, irea valorii revine la valoarea init, ial  ovf = 0 dup  una din comenzile clr sau load sau
dup  resetul asincron rst_n = 0.

În cazul clr = 0, load = 0 s, i acc = 0 circuitul îs, i p streaz  starea.


Figura 2.1 prezint  grac structura circuitului de multiplicare cu adunare.
Realizat, i urm toarele activit t, i:

• Completat, i codul modulului mac cu specicat, iile necesare pentru modelarea structurii prezentate în gura
2.1.

• Modelat, i un mediu de testare pentru modulul mac.

• Depanat, i codul RTL prin utilizarea ModelSim s, i a facilit t, ilor acestuia (meniuri s, i ferestre).
2.4. Activit t, i practice 33

Figura 2.1 Structura circuitului de multiplicare si adunare mac.


,
Lect, ia 3

Modelarea circuitelor logice


combinationale ,

Aceast  lect, ie prezint  modelarea circuitelor combinat, ionale în Verilog.


Sunt realizate modele parametrizabile pentru:

• multiplexor,
• demultiplexor,
• codicator cu prioritate.

3.1 Scopurile lectiei ,

• Modelarea circuitelor combinat, ionale simple cu specicat, ia assign s, i operatori Verilog.


• Modelarea circuitelor combinat, ionale complexe cu specicat, ia always s, i specicat, ii secvent, iale.
• Parametrizarea circuitelor combinat, ionale.
• Modelarea unui generator de stimuli care acoper  toate combinat, iile de intr ri, posibil de utilizat pentru
testarea oric ror circuite combinat, ionale.

3.2 Notiuni teoretice


,

3.2.1 Multiplexor
Multiplexorul este circuitul digital care implementeaz  în hardware funct, ia de select, ie a unei intr ri.
Multiplexorul 2N : 1 selecteaz  pe baza unui cod de N bit, i una din cele 2N intr ri de date pe care o transmite
la unica ies, ire.
Funct, ionarea multiplexorului 2:1 (o intrare de select, ie s, i dou  intr ri de date) se poate descrie astfel:
"dac  select, ia este egal  cu 0, ies, irea ia valoarea intr rii I0 , iar dac  select, ia este egal  cu 1, ies, irea ia valoarea
I1 " .
intr rii

Multiplexorul implementeaz  în hardware funct, ia de decizie, similar  cu specicat, ia software "if ... then ...
. . ." (în cazul MUX 2:1) sau "case" (în cazul MUX de dimensiuni mai mari).
else

Ecuat, iile funct, iilor logice implementate de MUX sunt:

35
36 LECT, IA 3. Modelarea circuitelor logice combinat, ionale

MUX 2:1 Y = S · I1 + S · I0

MUX 4:1 Y = S1 · S0 · I3 + S1 · S0 · I2 + S1 · S0 · I1 + S1 · S0 · I0

MUX 8:1 Y = S2 · S1 · S0 · I7 + S2 · S1 · S0 · I6 + S2 · S1 · S0 · I5 + S2 · S1 · S0 · I4 +
+S2 · S1 · S0 · I3 + S2 · S1 · S0 · I2 + S2 · S1 · S0 · I1 + S2 · S1 · S0 · I0

Datele multiplexate pot avea unul sau mai mult, i bit, i.


Figura 3.1 prezint  grac simboluri de multiplexoare.

Figura 3.1 Simboluri de multiplexoare: MUX 2:1, MUX 4:1, MUX 2N : 1, MUX 2N : 1 cu date pe M biti. ,

Codurile RTL asociate multiplexoarelor din gura 3.1 sunt prezentate în continuare:
Multiplexor 2:1 modelat cu operator ternar.
module mux2x1 (
input sel , // selectie
input data_0 , // data de intrare selectata pentru s e l =0
input data_1 , // data de intrare selectata pentru s e l =1
output data_out // data de iesire
);

assign data_out = s e l ? data_1 : data_0 ;

endmodule // mux2x1

Multiplexor 4:1 modelat cu specicatie case. ,

module mux4x1 (
input [1:0] sel , // selectie , 2 biti
input [3:0] data_in , // data de intrare , 2^2 biti
output reg data_out // data de iesire
);

always @( ∗ )
case ( s e l )
2 ' b01 : data_out = data_in [ 1 ] ;
2 ' b10 : data_out = data_in [ 2 ] ;
2 ' b11 : data_out = data_in [ 3 ] ;
default : data_out = data_in [ 0 ] ;
endcase

endmodule // mux4x1

Multiplexor 2N : 1 modelat cu specicatie assign si selectia datelor.


, , ,
3.2. Not, iuni teoretice 37

module muxNx1 #(
parameter WIDTH_SEL = ' d1 // numar d e biti de selectie
)(
input [WIDTH_SEL − 1:0] s e l , // selectie
input [(1<<WIDTH_SEL) − 1:0] data_in , // data de intrare
output data_out // data de iesire
);

assign data_out = data_in [ s e l ] ;

endmodule // muxNx1

Multiplexor 2N : 1 cu date pe M biti. ,

module mux #(
parameter WIDTH_SEL = ' d1 , // numar d e biti de selectie
parameter WIDTH_DATA = ' d1 // numar d e biti de date
// d i m e n s i u n e a mux− u l u i este 2^WIDTH_SEL : 1
// date reprezentate p e WIDTH_DATA b i t i
// p e n t r u MUX 2 : 1 parametrii sunt cei impliciti
) (
input [WIDTH_SEL − 1:0] s e l , // selectie
input [WIDTH_DATA∗(1<<WIDTH_SEL) − 1:0] data_in , // data de intrare
output reg [WIDTH_DATA − 1:0] data_out // data de iesire
);

reg [WIDTH_SEL − 1:0] i ;

always @( ∗ )
for ( i =0; i <(1<<WIDTH_SEL) ; i=i +1)
data_out = data_in [ (WIDTH_DATA∗ i )+:WIDTH_DATA] ;

endmodule // mux

În proiecte mari, multiplexorul nu se încapsuleaz  într-un modul. Specicat, ia ce modeleaz  multiplexorul


poate ap rea în modulul ierarhic superior al turi de specicat, ii concurente ce modeleaz  o logic  suplimentar .

3.2.2 Demultiplexor
Demultiplexorul DMUX 1 : 2N selecteaz  pe baza unui cod de N biti una din cele 2N iesiri de date pe care
, ,

transmite intrarea de date.


Funct, ionarea demultiplexorului 1:2 (o intrare de select, ie s, i dou  ies, iri de date) se poate descrie astfel:
"dac  select, ia este egal  cu 0, intrarea este transmis  la ies, irea Y0 , iar dac  select, ia este egal  cu 1, intrarea
este transmis  la ies, irea Y1 ".
Ecuat, iile funct, iilor logice implementate de DMUX sunt:

DMUX 1:2 Y1 = S · I Y0 = S · I

DMUX 1:4 Y3 = S1 · S0 · I Y2 = S1 · S0 · I Y1 = S1 · S0 · I Y0 = S1 · S0 · I

DMUX 1:8 Y7 = S2 · S1 · S0 · I Y6 = S2 · S1 · S0 · I Y5 = S2 · S1 · S0 · I Y4 = S2 · S1 · S0 · I
Y3 = S2 · S1 · S0 · I Y2 = S2 · S1 · S0 · I Y1 = S2 · S1 · S0 · I Y0 = S2 · S1 · S0 · I

Circuitele DMUX 1 : 2N au un comportament similar cu cel al unui decodicator de N bit, i cu intrare de


validare. Dac  la un DMUX 1 : 2N se conecteaz  intrarea I = 1, circuitul este echivalent cu un DCD N : 2N .
38 LECT, IA 3. Modelarea circuitelor logice combinat, ionale

Datele demultiplexate pot avea unul sau mai mult, i bit, i.


Figura 3.2 prezint  grac simboluri de demultiplexoare.

Figura 3.2 Simboluri de demultiplexoare: DMUX 1:2, DMUX 1:4, DMUX 1 : 2N , DMUX 1 : 2N cu date pe M biti. ,

Codurile RTL asociate demultiplexoarelor din gura 3.2 sunt prezentate în continuare:
Demultiplexor 1:2 modelat cu specicatii assign. ,

module dmux1x2 (
input sel , // selectie
input data_in , // data de intrare
output data_out0 , // data de iesire pentru s e l =0
output data_out1 // data de iesire pentru s e l =1
);

assign data_out0 = ~ s e l & data_in ;


assign data_out1 = s e l & data_in ;

endmodule // dmux1x2

Demultiplexor 1 : 2N modelat cu specicatie for prin care se atribuie valori ec rei iesiri.
, ,

module dmux1xN #(
parameter WIDTH_SEL = ' d1 // numar d e biti de selectie
) (
input [WIDTH_SEL − 1:0] sel , // selectie , N biti
input data_in , // data de intrare
output reg [(1<<WIDTH_SEL) − 1:0] data_out // data de iesire , 2^N biti
);

reg [WIDTH_SEL − 1:0] i;

always @( ∗ )
for ( i =0; i <(1<<WIDTH_SEL) ; i=i +1)
data_out [ i ] = ( s e l == i ) & data_in ;

endmodule // dmux1xN

Demultiplexor 1 : 2N cu date pe M biti. ,

module dmux #(
parameter WIDTH_SEL = ' d1 , // numar d e biti de selectie
parameter WIDTH_DATA = ' d1 // numar d e biti de date
// d i m e n s i u n e a dmux− u l u i este 1 : 2^WIDTH_SEL
// date reprezentate p e WIDTH_DATA b i t i
// p e n t r u DMUX 1 : 2 parametrii sunt cei impliciti
) (
3.2. Not, iuni teoretice 39

input [WIDTH_SEL − 1:0] s e l , // selectie


input [WIDTH_DATA − 1:0] data_in , // data de intrare
output reg [WIDTH_DATA∗(1<<WIDTH_SEL) − 1:0] data_out // data de iesire
);

reg [WIDTH_SEL − 1:0] i ;

always @( ∗ )
for ( i =0; i <(1<<WIDTH_SEL) ; i=i +1)
data_out [ (WIDTH_DATA∗ i )+:WIDTH_DATA] = ( s e l == i ) & data_in ;

endmodule // dmux

În proiecte mari, demultiplexorul nu se încapsuleaz  într-un modul. Specicat, ia ce modeleaz  demultiplexorul


poate ap rea în modulul ierarhic superior al turi de specicat, ii concurente ce modeleaz  o logic  suplimentar .

3.2.3 Codicatorul prioritar

Codicatorul prioritar de 2N biti are 2N intr ri si N iesiri. La iesire se prezint  codul binar al celei mai
, , , ,

prioritare intr ri activate. Codicatorul poate avea o ies, ire care semnaleaz  aparit, ia pe intrare a unei congurat, ii
valide (cu cel put, in un bit egal cu 1).
Tabelul de adev r al codicatorului prioritar de 8 bit, i este prezentat în continuare.

Codicator prioritar de 8 biti ,

Intrare Ies, ire Valid


1xxx_xxxx 111 1
01xx_xxxx 110 1
001x_xxxx 101 1
0001_xxxx 100 1
0000_1xxx 111 1
0000_01xx 010 1
0000_001x 001 1
0000_0001 000 1
0000_0000 000 0

Interfat, a unui codicator prioritar de 8 bit, i este prezentat  în continuare:

module e n c o d e r (
input [ 8 − 1:0] data_in , // data de intrare
output [ 3 − 1:0] data_out , // data de iesire
output valid // data de iesire valida
);

Exist  posibilitatea ca ies, irea codicatorului s  prezinte cea mai prioritar  intrare activat  cu codicare "one-
hot" (un singur bit egal cu 1). În acest caz, tabelul de adev r este prezentat în continuare. Codicatorul
prioritar de 2N bit, i are 2N intr ri s, i 2N ies, iri.
40 LECT, IA 3. Modelarea circuitelor logice combinat, ionale

Codicator prioritar de 8 biti, one-hot ,

Intrare Ies, ire Valid


1xxx_xxxx 1000_0000 1
01xx_xxxx 0100_0000 1
001x_xxxx 0010_0000 1
0001_xxxx 0001_0000 1
0000_1xxx 0000_1000 1
0000_01xx 0000_0100 1
0000_001x 0000_0010 1
0000_0001 0000_0001 1
0000_0000 0000_0000 0

Interfat, a unui codicator prioritar de 8 bit, i one-hot este prezentat  în continuare:

module encoder_onehot (
input [ 8 − 1:0] data_in , // data de intrare
output [ 8 − 1:0] data_out , // data de iesire , codata one− h o t
output valid // data de iesire valida
);

În proiecte mari, codicatorul nu se încapsuleaz  într-un modul. Specicat, ia ce modeleaz  codicatorul poate
ap rea în modulul ierarhic superior al turi de specicat, ii concurente ce modeleaz  o logic  suplimentar .

3.2.4 Modelarea circuitelor combinationale complexe ,

În cazul unor funct, ii logice complexe, este greu de exprimat funct, ia de transfer a circutului logic combinat, ional
utilizând exclusiv operatori logici s, i aritmetici. Funct, ia ar putea  exprimat  mai us, or cu specicat, ii secvent, iale
(if s, i case). Îns , acestea pot  utilizate exclusiv în corpul specicat, iei always. Pentru a modela circuite
combinat, ionale, specicat, ia always trebuie s  cont, in  în lista de senzitivit t, i o enumerare a tuturor semnalelor
de intrare (delimitate prin cuvântul rezervat or) sau sintagma @(*) care desemneaz  "toate semnalele de intrare"
(aate în dreapta simbolului de atribuire "="). În cadrul specicat, iei always, semnalele se vor atribui cu simbolul
de atribuire blocant  "=". În cazul model rii circuitelor combinat, ionale, semnalele se comport  similar cu
variabile din limbajul C: îs, i modic  valoarea imediat ce i-a fost atribuit  o nou  valoare.
Ca exemplu, se consider  un circuit combinat, ional care genereaz  numerele lui Fibonacci. Circuitul com-
binat, ional primes, te la intrare un num r între 0 s, i 31 (reprezentat pe 5 bit, i). Pe baza acestui index, circuitul
genereaz  combinat, ional num rul cu indexul corespunz tor din s, irul lui Fibonacci.
Matematic, numerele Fibonacci sunt denite prin urm toarea relat, ie de recurent,  :
F0 = 0, F1 = 1, Fi = Fi−1 + Fi−2 , pentru i ≥ 2.
Astfel, ecare num r Fibonacci este suma celor dou  numere Fibonacci anterioare, rezultând secvent, a:

0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, . . .

Conceptual, este un circuit logic combinat, ional cu 5 intr ri s, i 21 de ies, iri. Num rul de bit, i de ies, ire (21)
a fost determinat ca ind num rul minim de bit, i necesari pentru reprezentarea celei mai mari valori, F31 =
1.346.269 < 221 = 2.097.152.
Îns  funct, ia de transfer nu este simplu de exprimat cu operatori Verilog.
3.2. Not, iuni teoretice 41

Numerele lui Fibonacci


Index Valoare [baza 10] Valoare [baza 2]
0 0 0_0000_0000_0000_0000_0000
1 1 0_0000_0000_0000_0000_0001
2 1 0_0000_0000_0000_0000_0001
3 2 0_0000_0000_0000_0000_0010
4 3 0_0000_0000_0000_0000_0011
5 5 0_0000_0000_0000_0000_0101
6 8 0_0000_0000_0000_0000_1000
7 13 0_0000_0000_0000_0000_1101
8 21 0_0000_0000_0000_0001_0101
9 34 0_0000_0000_0000_0010_0010
10 55 0_0000_0000_0000_0011_0111
11 89 0_0000_0000_0000_0101_1001
12 144 0_0000_0000_0000_1001_0000
13 233 0_0000_0000_0000_1110_1001
14 377 0_0000_0000_0001_0111_1001
15 610 0_0000_0000_0010_0110_0010
16 987 0_0000_0000_0011_1101_1011
17 1597 0_0000_0000_0110_0011_1101
18 2584 0_0000_0000_1010_0001_1000
19 4181 0_0000_0001_0000_0101_0101
20 6765 0_0000_0001_1010_0110_1101
21 10946 0_0000_0010_1010_1100_0010
22 17711 0_0000_0100_0101_0010_1111
23 28657 0_0000_0110_1111_1111_0001
24 46368 0_0000_1011_0101_0010_0000
25 75025 0_0001_0010_0101_0001_0001
26 121393 0_0001_1101_1010_0011_0001
27 196418 0_0010_1111_1111_0100_0010
28 317811 0_0100_1101_1001_0111_0011
29 514229 0_0111_1101_1000_1011_0101
30 832040 0_1100_1011_0010_0010_1000
31 1346269 1_0100_1000_1010_1101_1101

Codul Verilog care modeleaz  un circuit combinat, ional ce genereaz  num rul Fibonacci asociat indexului de
la intrare prezint  o specicat, ie always ce cont, ine o specicat, ie de select, ie case:

• Dac  i = 0, F0 = 0,

• Dac  i = 1, F1 = 1,

• Altfel, pentru i > 1, Fi = Fi−1 + Fi−2 .

module f i b o n a c c i (
input [5 − 1:0] f i b _ i d x , // index al termenului
output reg [ 2 1 − 1:0] v a l o a r e // valoare termen
);

reg [6 − 1:0] i ;
reg [ 2 1 − 1:0] v a l o a r e 0 ; // prima valoare
reg [ 2 1 − 1:0] v a l o a r e 1 ; // a doua valoare

always @( ∗ )
case ( f i b _ i d x )
' d0 : v a l o a r e = ' d0 ;
42 LECT, IA 3. Modelarea circuitelor logice combinat, ionale

' d1 : v a l o a r e = ' d1 ;
default : begin
v a l o a r e 0 = ' d0 ;
v a l o a r e 1 = ' d1 ;
valoare = ' d1 ;
for ( i =2; i<=f i b _ i d x ; i=i +1) begin
valoare = valoare1 + valoare0 ;
valoare0 = valoare1 ;
valoare1 = valoare ;
end
end
endcase

endmodule // fibonacci

3.3 Generator de test pentru circuite combinationale ,

Un circuit combinat, ional cu N intr ri are 2N combinat, ii de intrare în care trebuie testat. Se poate concepe un
modul generator de semnal care genereaz  toate aceste combinat, ii. În cadrul modulului de test se instant, iaz 
modulul de testat s, i generatorul de semnal. Ies, irile generatorului de semnal se conecteaz  la intr rile circuitului
combinat, ional. În cazul unui num r mic de intr ri, vericarea se poate face pe forme de und . Pentru un num r
mare de intr ri, este necesar  conceperea unui monitor de vericare a datelor.
Modulul propus are parametrii pentru num rul de bit, i prezentat, i la ies, ire s, i pentru timpul dintre dou 
schimb ri succesive ale combinat, iei de ies, ire. Combinat, iile sunt generate în ordine de la 00 . . . 0 pân  la 11 . . . 1.
Exist  un semnal (enable) care valideaz  aparit, ia combinat, iilor de ies, ire (combinat, iile încep imediat ce enable
= 1). Circuitul semnaleaz  terminarea combinat, iilor prin activarea semnalului nish = 1. Acest semnal poate
 utilizat în mediul de testare pentru a termina rularea.
Formele de und  care caracterizeaz  generatorul de combinat, ii sunt prezentate în gura 3.3.

Figura 3.3 Forme de und  ce caracterizeaz  generatorul de combinatii. ,

3.4 Activit ti practice ,

Simul rile din aceast  lect, ie necesit  instant, ierea unui modul care genereaz  toate combinat, iile de intrare ale
circuitelor combinat, ionale testate. Acest modul, denumit generator_combinatii, se poate instat, ia (cu parametrii
potrivit, i) al turi de modulul de testat, într-un mediu de testare realizat de c tre student, i.

• Vericat, i comportamentul generatorului de stimuli prin simularea modulului generator_combinatii_test.


În acest modul este instant, iat modulul generator_combinatii cu parametru WIDTH = 6. Vizualizat, i
formele de und  ale semnalelor generate de modulul generator_combinatii.
3.4. Activit t, i practice 43

3.4.1 Multiplexor
• Vericat, i comportamentul circuitului multiplexor 2:1 prin simularea mediului de testare mux2x1_test ce
instant, iaz  modulul mux2x1 s, i generatorul de combinat, ii generator_combinatii. Parametrul WIDTH al
generatorului de combinat, ii trebuie s  aib  valoarea 3 (deoarece sunt 3 intr ri în modulul de testat: o
intrare de select, ie s, i dou  intr ri de date). Intrarea de select, ie este conectat  pe bitul cel mai semnicativ
al generatorului de combinat, ii.
Observat, i în fereastra formelor de und  (gura 3.4) c , dac  select, ia este 0, ies, irea multiplexorului copiaz 
forma de und  a intr rii 0 iar, dac  select, ia este 1, ies, irea multiplexorului copiaz  forma de und  a intr rii
1.

Figura 3.4 Forme de und  pentru multiplexorul 2:1.

• Modicat, i mediul de testare pentru testarea altor multiplexoare:

 mux4x1,

 muxNx1 instant, iat cu parametru WIDTH_SEL = 8,

 mux instant, iat cu parametru WIDTH_SEL = 2 s, i WIDTH_DATA = 16.

• Multiplexoare cu select, ie one-hot. În cazul acestor multiplexoare, select, ia este reprezentat  pe acelas, i
num r de bit, i ca num rul de date dintre care se face select, ia. Datele selectate vor avea bitul de select, ie
egal cu 1. Este obligatoriu de îndeplinit condit, ia ca în vectorul de select, ie s  existe cel mult un singur bit
egal cu 1. Avantajul acestor multiplexoare const  în faptul c  poate selecta dintr-un set de date cu un
num r diferit de o putere a lui 2.
Interfat, a unui asemenea multiplexor one-hot (cu 5 intr ri de date selectate) este prezentat  în continuare.
module mux5x1_onehot (
input [5 − 1:0] sel , // selectie , 5 biti , one− h o t
input [5 − 1:0] data_in , // data de intrare , 5 biti
output reg data_out // data de iesire
);

Completat, i modulul mux5x1_onehot cu specicat, iile ce modeleaz  comportamentul acestuia. Vericat, i


comportamentul prin simulare.

3.4.2 Demultiplexor
• Modelat, i un mediu de testare s, i vericat, i comportamentul circuitului demultiplexor 1:2 prin simularea
modulului dmux1x2 conectat la generatorul de combinat, ii generator_combinatii. Parametrul WIDTH al
generatorului de combinat, ii trebuie s  aib  valoarea 2 (deoarece sunt 2 intr ri în modulul de testat, o
intrare de select, ie s, i o intrare de date). Intrarea de select, ie este conectat  pe bitul cel mai semnicativ al
generatorului de combinat, ii.

• Modicat, i mediul de testare pentru testarea altor demultiplexoare:

 dmux1xN instant, iat cu parametru WIDTH_SEL = 8,

 dmux instant, iat cu parametru WIDTH_SEL = 2 s, i WIDTH_DATA = 16.


44 LECT, IA 3. Modelarea circuitelor logice combinat, ionale

3.4.3 Codicator cu prioritate


• Completat, i modulul encoder cu specicat, iile care modeleaz  comportamental codicatorul prioritar. Ve-
ricat, i modelul prin simulare.

• Completat, i modulul encoder_onehot cu specicat, iile care modeleaz  comportamental codicatorul prio-
ritar one-hot. Vericat, i modelul prin simulare.

3.4.4 Numerele lui Fibonacci


• Studiat, i codul propus pentru circuitul combinat, ional care generez  numerele lui Fibonacci.
• Realizat, i un mediu de testare s, i vericat, i funct, ionarea corect  a circuiului.

• Instant, iat, i modulul generator_combinatii.v.

• Modicat, i modulul bonacci.v pentru a genera primele 256 de numere ale lui Fibonnaci (index reprezentat
pe 8 bit, i). Cât, i bit, i sunt necesari pentru a reprezenta valoarea F255 ?

• Modicat, i mediul de testare existent pentru a genera cele 256 combinat, ii de intrare.

• Realizat, i o modalitate de a verica datele generate de modelul Verilog (MatLab, Excel, C).
Lect, ia 4

Modelarea circuitelor cu bistabile

Aceast  lect, ie prezint  modelarea bistabilelor s, i a unor circuite implementate cu bistabile s, i port, i logice.
Se vor modela bistabilele D, T, RS, JK. Se va prezenta modelarea semnalului de reset sincron s, i asincron.
În limba englez , circuitul bistabil este denumit "ip-op" (prescurtat "FF").

4.1 Scopurile lectiei ,

• Modelarea bistabilelor cu specicat, ia always.

• Modelarea semnalelor de ceas s, i de reset.


• Parametrizarea circuitelor secvent, iale.
• Vericarea prin simulare a funct, ion rii circuitelor cu bistabile.

4.2 Notiuni teoretice


,

4.2.1 Bistabilul D
Bistabilul D stocheaz  un bit de informat, ie în intervalul de timp dintre dou  fronturi active succesive ale
semnalului de ceas. În momentul determinat de aparit, ia frontului activ de ceas, bistabilul D es, antioneaz 
intrarea s, i o "memoreaz " pân  la momentul urm torului front activ de ceas. Bistabilul poate comuta e pe
front cresc tor, e pe front c z tor, îns  nu pe ambele fronturi. În continuare, se va considera c  toate bistabilele
comut  pe frontul activ cresc tor (CK =↑).
În tabelul care descrie funct, ionarea bistabilului D s-a notat cu Q starea prezent  s, i Q+ starea viitoare a
bistabilului.
Dac  CK =↑, bistabilul copiaz  starea intr rii D s, i o ment, ine pe durata unei perioade de ceas.

Tabelul de functionare al bistabilului D, DFF


,

CK D Q+ Act, iune
↑ 0 0 copiaz  intrarea, în momentul frontului cresc tor al ceasului
↑ 1 1 copiaz  intrarea, în momentul frontului cresc tor al ceasului
0/1 − Q p streaz  starea, între dou  fronturi active ale semnalului de ceas

45
46 LECT, IA 4. Modelarea circuitelor cu bistabile

Modelul Verilog pentru DFF este prezentat în continuare. Condit, ia "front cresc tor de ceas" este modelat 
cu specicat, ia:
always @( posedge c l k )

module d f f (
input clk , // semnal de ceas , activ pe frontul crescator
input d , // intrare D
output reg q // iesire Q
);

always @( posedge c l k )
q <= d ;

endmodule // dff

Într-un sistem sincron, bistabilul D întârzie semnalul între intrare s, i ies, ire cu un tact. As, a se justic 
denumirea "D" (engl. "Delay = Întârziere"). O aplicat, ie a bistabilului D const  din realizarea unei linii de
întârziere a semnalelor cu un anumit num r de perioade de tact prin conectarea în serie a mai multor bistabile
(ies, irea Q a unui bistabil la intrarea D a urm torului bistabil).
Bistabilele pot avea facilitatea de init, ializare asincron  într-o anumit  stare logic . Intr rile asincrone (de set
sau de reset) sunt prioritare fat,   de semnalul de ceas (îs, i realizeaz  funct, ia independent de aparit, ia frontului
activ al semnalului de ceas). În simbolurile bloc, exist  intr ri dedicate pentru intr rile asincrone de reset.
Intr rile asincrone pot  active e în starea 1, e în starea 0.
Modelul Verilog pentru DFF cu reset asincron activ în starea 0 este prezentat în continuare. Condit, ia "front
este modelat  cu specicat, ia:
cresc tor de ceas sau front negativ al semnalului de reset"

always @( posedge c l k or negedge rst_n )

module d f f r (
input clk , // semnal de ceas , activ pe frontul crescator
input rst_n , // semnal de reset asincron activ in 0
input d , // intrare D
output reg q // iesire Q
);

always @( posedge c l k or negedge rst_n )


i f (~ rst_n ) q <= 1 ' b0 ; el se
q <= d ;

endmodule // dffr

Reset-ul sincron reprezint  aducerea bistabilului în starea 0, în momentul frontului activ de ceas, datorit 
unui semnal prioritar ce condit, ioneaz  intrarea D. Modelul Verilog pentru DFF cu reset asincron dar s, i un
semnal de reset sincron este prezentat în continuare.
module d f f _ r r (
input clk , // semnal de ceas , activ pe frontul crescator
input rst_async , // semnal de reset asincron activ in 1
input rst_sync , // semnal de reset sincron activ in 1
input d , // intrare D
output reg q // iesire Q
);

always @( posedge c l k or posedge r s t _ a s y n c )


i f ( r s t _ a s y n c ) q <= 1 ' b0 ; el se
i f ( r s t _ s y n c ) q <= 1 ' b0 ; el se
4.2. Not, iuni teoretice 47

q <= d ;

endmodule // dff_rr

Circuitul bistabil cu reset asincron s, i reset sincron cont, ine un bistabil cu reset asincron s, i o logic  adit, ional 
pentru realizarea reset rii sincrone, implementat  e cu multiplexor, e cu port, i logice, as, a cum este prezentat
în gura 4.1.

Figura 4.1 Bistabil cu reset asincron si reset sincron realizat cu multiplexor sau cu porti logice.
, ,

Bistabilul D poate avea o intrare suplimentar  de validare a funct, ion rii. Dac  E = 1 (engl. "Enable = a
permite, a valida"), bistabilul D cu validare funct, ioneaz  ca un bistabil D convent, ional. Altfel, dac  E = 0,
bistabilul D cu validare îs, i p streaz  starea, indiferent de intrarea D. Tabelul ce descrie funct, ionarea bistabilului
D cu validare este urm torul:

Tabelul de functionare al bistabilului D cu validare, DFFE


,

CK E D Q+ Act, iune
↑ 1 0 0 copiaz  intrarea, în momentul frontului cresc tor al ceasului
↑ 1 1 1 copiaz  intrarea, în momentul frontului cresc tor al ceasului
↑ 0 − Q p streaz  starea, indiferent de intrarea D (este invalidat)
0/1 − − Q p streaz  starea, între dou  fronturi active ale semnalului de ceas

Modelul Verilog pentru DFFE este prezentat în continuare.


module d f f e (
input clk , // semnal de ceas , activ pe frontul crescator
input rst_n , // semnal de reset asincron activ in 0
input en , // validare , activa in 1
input d , // intrare D
output reg q // iesire Q
);

always @( posedge c l k or negedge rst_n )


i f (~ rst_n ) q <= 1 ' b0 ; el se
i f ( en ) q <= d ; // nu e x i s t a " e l s e "
// pastreaza starea in cazul en=0

endmodule // dffe

Intrarea de validare poate  interpretat  s, i ca intrare care valideaz  înc rcarea datelor în bistabil (datele ind
ment, inute mai multe perioade de tact, între dou  pulsuri succesive de înc rcare).
Extensia paralel a unui bistabil poart  numele de registru. Modelul unui registru paralel-paralel este similar
celui al bistabilului D. L t, imea registrului poate  parametrizat  cu specicat, ia:
48 LECT, IA 4. Modelarea circuitelor cu bistabile

parameter WIDTH = ' d8 // latimea registrului

Modelul comportamental este identic cu cel al bistabilului D.

module reg_param #(
parameter WIDTH = ' d8 // latimea registrului
)(
input clk , // semnal de ceas , activ pe frontul crescator
input rst_n , // semnal de reset asincron activ in 0
input [WIDTH− 1 : 0 ] d , // intrare D
output reg [WIDTH− 1 : 0 ] q // iesire Q
);

always @( posedge c l k or negedge rst_n )


i f (~ rst_n ) q <= {WIDTH{ 1 ' b0 } } ; el se // reset asincron activ in 0
// toti bitii devin 0
q <= d ;

endmodule // reg_param

4.2.2 Bistabilul RS
Bistabilul RS are dou  intr ri de date care permit în mod explicit trecerea bistabilului în cele dou  st ri 0
(reset) s, i 1 (set). Funct, ionarea bistabilului RS este descris  de tabelul urm tor:

Tabelul de functionare al bistabilului RS, RSFF


,

CK R S Q+ Act, iune
↑ 1 − 0 reseteaz  starea, 0
↑ 0 1 1 seteaz  starea, 1
↑ 0 0 Q p streaz  starea.
0/1 − − Q p streaz  starea, între dou  fronturi active ale semnalului de ceas

Bistabilul RS se utilizeaz  pentru cazurile în care trecerea între st rile 0 s, i 1 se face pe baza a dou  comenzi
diferite, independente. Se observ  în tabel c  (în acest caz) intrarea de reset este prioritar  fat,   cea de set
(ies, irea trece în 0 dac  R = 1, indiferent de valoarea logic  a lui S ).
Interfat, a modelul Verilog pentru RSFF este prezentat  în continuare.

module r s f f (
input clk , // semnal de ceas , activ pe frontul crescator
input rst_n , // semnal de reset asincron activ in 0
input r , // i n t r a r e R, reset sincron
input s , // intrare S, set sincron
output reg q // iesire Q
);

4.2.3 Bistabilul T
Bistabilul T, ca orice bistabil, comut  exclusiv pe frontul activ al semnalului de ceas. Regula de comutare
este prezentat  în tabelul urm tor:
4.2. Not, iuni teoretice 49

Tabel de functionare TFF, bistabil T


,

CK T Q+ Act, iune
↑ 0 Q p streaz  starea
↑ 1 Q complementeaz  starea
0/1 − Q p streaz  starea, între dou  fronturi active ale semnalului de ceas

Funct, ionarea bistabilului T (engl. "Toggle = Comutare") se poate descrie astfel: dac  T = 0 bistabilul îs, i
p streaz  starea, iar dac  T = 1 bistabilul îs, i complementeaz /neag  starea.

Se remarc  faptul c  bistabilul T are nevoie de a se init, ializa asincron într-o stare cunoscut .
Modelul Verilog pentru TFF este prezentat în continuare.
module t f f (
input clk , // semnal de ceas , activ pe frontul crescator
input rst_n , // semnal de reset asincron activ in 0
input t , // intrare T
output reg q // iesire Q
);

always @( posedge c l k or negedge rst_n )


i f (~ rst_n ) q <= 1 ' b0 ; el se
if (t) q <= ~q ; // c o m p l e m e n t e a z a starea , in cazul t =1
// pastreaza starea , in cazul t =0

endmodule // tff

O aplicat, ie a bistabilului T const  în obt, inerea unui semnal cu perioad  dubl  fat,   de semnalul de ceas, prin
conectarea acestuia cu intrarea T = 1. Aceast  proprietate este folosit  s, i la realizarea num r toarelor binare.

4.2.4 Bistabilul JK
Bistabilul JK combin  functionalitatea unui bistabil RS cu cea a unui bistabil T. Regula de comutare este
,

prezentat  în tabelul urm tor:

Tabelul de functionare al bistabilului JK, JKFF


,

CK J K Q+ Act, iune
↑ 0 0 Q p streaz  starea.
↑ 0 1 0 reseteaz  starea, 0
↑ 1 0 1 seteaz  starea, 1
↑ 1 1 Q complementeaz  starea.
0/1 − − Q p streaz  starea, între dou  fronturi active ale semnalului de ceas

Dac  se realizeaz  conectarea intr rilor J = K = T , bistabilul JK se comport  ca un bistabil T.

4.2.5 Mediu de testare pentru circuite secventiale ,

Pentru simularea circuitelor cu bistabile este necesar un semnal de ceas. Modelarea semnalului de ceas periodic
se poate descrie conform specicat, iei: "are init, ial valoarea 0 s, i îs, i complementeaz  valoarea la ecare jum tate
de perioad ". Acest lucru este modelat în Verilog astfel:

c l k = 1 ' b0 ; // valoare initiala 0


forever #CK_SEMIPERIOD // valoare complementata la fiecare semi − p e r i o a d a
clk = ~clk ;
50 LECT, IA 4. Modelarea circuitelor cu bistabile

Semnalul de reset asincron se recomand  a avea valoarea init, ial  inactiv  s, i a se activa ulterior timpului zero
de simulare. Des, i modeleaz  un semnal asincron (independent de semnalul de ceas) se recomand  ca semnalul
de reset s  comute în momente determinate de frontul activ de ceas iar durata de activare s  e mai mare de o
perioad  de ceas.
Codul urm tor prezint  modelul integral pentru un generator de semnal de ceas s, i de reset asincron.
module ck_rst_tb #(
parameter CK_SEMIPERIOD = ' d10 // semi − p e r i o a d a semnalului de ceas
)(
output reg clk , // ceas
output reg rst_n // reset asincron activ 0
);
initial
begin
c l k = 1 ' b0 ; // valoare initiala 0
forever #CK_SEMIPERIOD // valoare complementata la fiecare semi − p e r i o a d a
clk = ~clk ;
end

i n i t i a l begin
rst_n <= 1 ' b1 ; // initial inactiv
@( posedge c l k ) ;
rst_n <= 1 ' b0 ; // activare sincrona
@( posedge c l k ) ;
@( posedge c l k ) ;
rst_n <= 1 ' b1 ; // inactivare dupa doua perioade de ceas
@( posedge c l k ) ; // ramane inactiv pentru totdeauna
end

endmodule // ck_rst_tb

Formele de und  generate sunt prezentate în gura 4.2.

Figura 4.2 Forme de und  ale generatorului de semnal de ceas si de reset asincron.
,

Un generator de semnale pentru circuite cu bistabile trebuie s  modeleze schimbarea semnalelor exclusiv pe
frontul activ al semnalului de ceas. Pentru aceasta, se recomand  ca timpul s  nu e modelat cu întârzieri
absolute (de exemplu #10) ci cu întârzieri multiple ale perioadei de ceas: @(posedge clk).
De exemplu, port, iunea de cod urm toare modeleaz  forma de und  prezentat  în gura 4.3.
i n i t i a l begin
d <= 1 ' bx ; // valoare initiala x
v a l <= 4 ' bx ; // valoare initiala x
@( negedge rst_n ) ; // asteapta activarea resetului asincron
d <= 1 ' b0 ; // atribuie valoari initiale datorate resetului
v a l <= 4 ' b0 ;
@( posedge rst_n ) ; // asteapta inactivarea resetului asincron
@( posedge c l k ) ; // asteapta un front activ de ceas

// modifica valori
d <= 1 ' b1 ;
4.3. Activit t, i practice 51

@( posedge c l k ) ;
v a l <= 4 ' d1 ;
@( posedge c l k ) ;
@( posedge c l k ) ;
d <= 1 ' b0 ;
v a l <= 4 ' d10 ;
repeat ( 5 ) @( posedge c l k ) ;
d <= 1 ' b1 ;
@( posedge c l k ) ;
@( posedge c l k ) ;
v a l <= 4 ' d7 ;
@( posedge c l k ) ;
@( posedge c l k ) ;
$display ( "%M %0t INFO : F i n a l s i m u l a r e . " , $time ) ;
$stop ;
end

Figura 4.3 Forme de und  ale generatorului de semnal de date sincrone: proiectate si rezultate prin simulare.
,

4.3 Activit ti practice ,

Simul rile din aceast  lect, ie necesit  instant, ierea unui modul care genereaz  semnale de ceas s, i de reset. Se
poate instant, ia modulul ck_rst_tb.v prezentat în sect, iunea 4.2. Modulele generatoare de date se vor modela
conform recomand rilor prezentate în sect, iunea 4.2.

4.3.1 Bistabile si registre ,

• Vericat, i prin simulare comportamentul unui bistabil D, utilizând modulul d.v. Modelat, i un generator
de semnal pentru intrarea D pentru a testa diverse scenarii.

• Vericat, i prin simulare comportamentul unui bistabil D cu reset asincron, utilizând modulul dr.v.
Modelat, i resetul asincron conform formelor de und  prezentate în gura 4.4.

Figura 4.4 Forme de und  pentru vericarea bistabilului D cu reset asincron.


52 LECT, IA 4. Modelarea circuitelor cu bistabile

• Vericat, i prin simulare comportamentul unui bistabil D cu validare, utilizând modulul de.v.

• Vericat, i prin simulare comportamentul unui bistabil T, utilizând modulul t.v. Studiat, i efectul lipsei
specicat, iei de init, ializare a bistabilului (prin reset asincron) prin comentarea specicat, iei:
i f (~ rst_n ) q <= 1 ' b0 ; el se

• Vericat, i prin simulare comportamentul unui bistabil RS, utilizând modulul rs.v. Cum se comport 
bistabilul în cazul în care ambele intr ri sunt activate simultan S = R = 1? Modelat, i stimulii potrivit, i
pentru a verica modul în care se comport  bistabilul. Completat, i în gura 4.5 forma de und  as, teptat 
pentru ies, irea bistabilului, modelat, i stimulii RS corespunz tori s, i apoi vericat, i forma de und  a ies, irii
prin simulare.

Figura 4.5 Forme de und  pentru vericarea bistabilului RS. De completat forma de und  pentru iesirea q . ,

• Modicat, i modelul de bistabil D prin extindere paralel pentru a realiza un registru. Parametrizat, i l t, imea
registrului. Modicat, i mediul de testare al bistabilului D pentru a testa un registru de 4 bit, i.

4.3.2 Reset sincron. Reset Asincron.


Vericat, i prin simulare comportamentul unui bistabil D care are atât reset asincron cât s, i reset sincron, utilizând
modulul d_rr.v. Modelat, i formele de und  ale semnalelor conform gurii 4.6. Completat, i gura cu forma de
und  as, teptat  la ies, irea bistabilului s, i apoi vericat, i cu forma de und  obt, iunut  prin simulare.

Figura 4.6 Forme de und  pentru compararea comportamentului în cazul resetului asincron cu comportamentul în cazul
resetului sincron. De completat forma de und  pentru iesirea q .
,

4.3.3 Notiuni avansate


,

• Set de registre. Modelat, i un set de 16 registre de câte 32 de bit, i. Vericat, i prin simulare accesarea
setului de registre în scriere s, i în citire. Interfat, a modulului este urm toarea:
module r e g _ f i l e _ 1 6 x 3 2 (
input clk , // semnal de ceas , activ pe frontul crescator
input rst_n , // semnal de reset asincron activ in 0
input [ 3 : 0 ] addr , // adresa registrului accesat
4.3. Activit t, i practice 53

input we , // validare scriere ( d a c a we=1)


input [ 3 1 : 0 ] data_in , // intrare de date
output reg [ 3 1 : 0 ] data_out // intrare de date
);

Registrul trebuie s  e capabil s  memoreze 16 date de câte 32 de bit, i. Datele prezente la intrarea data_in
sunt scrise la adresa addr dac  wr=1. Dac  wr=0, datele stocate la adresa addr sunt prezentate în ciclul
de ceas urm tor pe ies, irea data_out.
Pentru vericare, modelat, i formele de und  prezentate în gura 4.7.

Figura 4.7 Forme de und  pentru vericarea setului de registre. De completat forma de und  pentru iesirea data_out.
,

• Modelat, i circuitele cu bistabile s, i port, i logice prezentate în gurile 4.8 a) s, i b).

a)

b)

Figura 4.8 Circuite cu bistabile.

 Explicati comportamentul asteptat pentru ecare circuit.


, ,

 Completati formele de und  asteptate, ca în gura 4.9.


, ,
54 LECT, IA 4. Modelarea circuitelor cu bistabile

 Modelati circuitele.
,

 Modelati un mediu de vericare pentru circuite. Concepeti generatoare de secvente care pun în
, , ,

evident,   comportamentul circuitelor.


 Comparati formele de und  obtinute din simulare cu cele asteptate. Justicati comportamentul
, , , ,

determinat.

a)

b)

Figura 4.9 Forme de und  pentru circuitele cu bistabile. De completat formele de und .

• Proiectat, i un circuit logic secvent, ial care accept  la intrare 4 bit, i la ecare perioad  de ceas. Circuitul
semnaleaz  la ies, ire dac , în dou  tacte succesive, num rul zecimal asociat intr rii este strict mai mare
decât 11.
 Desenati circuitul proiectat cu porti logice si bistabile.
, , ,

 Modelati circuitul proiectat.


,

 Modelati un mediu de vericare pentru circuit. Concepeti un generator de secvente care acoper 
, , ,

toate cazurile posibile.


 Comparati formele de und  obtinute din simulare cu cele asteptate.
, , ,

• Proiectat, i un circuit secvent, ial sincron care l t, es, te cu trei perioade de ceas palierul de 1 al unui semnal
de intrare. Palierul de 0 al semnalului este de minimum 6 perioade de tact.
 Desenati circuitul proiectat cu porti logice si bistabile.
, , ,

 Modelati circuitul proiectat.


,

 Modelati un mediu de vericare pentru circuit. Concepeti un generator de secvente care acoper 
, , ,

câteva cazuri posibile: puls de 1, 2, 3, 4, 5 perioade de ceas.


 Comparati formele de und  obtinute din simulare cu cele asteptate.
, , ,
Lect, ia 5

Modelarea mediului de testare HDL

Aceast  lect, ie prezint  modelarea unor construct, ii utilizate exclusiv pentru vericarea modelelor hardware.
Se vor prezenta specicat, ia initial s, i funct, ii de sistem utilizate frecvent. Pentru exemplicare, se vor considera
dou  protocoale de interfat, are utilizate frecvent pentru comunicarea între dou  module hardware:

• protocol "cerere-conrmare" (engl. "request-acknowledge") s, i


• protocol "valid-gata" (engl. "valid-ready").

5.1 Scopurile lectiei ,

• Prezentarea specicat, iilor utilizate pentru modelarea unor generatoare de vectori complexe (specicat, ia
initial, task-uri pentru generare de stimuli).
• Prezentarea unor funct, ii sistem utilizate în depanare ($display, $stop, $random).

5.2 Notiuni teoretice


,

5.2.1 Specicatia initial


,

Verilog are dou  specicat, ii concurente (se execut  în paralel, ordinea în cod este indiferent ) care modeleaz 
resurse hardware sintetizabile: assign s, i always.
Specicat, ia assign permite atribuirea de valori c tre semnale declarate de tip wire în mod continuu (la orice
modicare a semnalelor ce determin  valoarea semnalului atribuit).
Specicat, ia always este o specicat, ie concurent  care înglobeaz  specicat, ii secvent, iale s, i care permite
atribuirea de valori c tre semnale declarate de tip reg. Specicat, iile secvent, iale incluse în specicat, ia always
se execut  în ordinea în care apar în cod. Dup  execut, ia ultimei specicat, ii, s, irul specicat, iilor se reia cu prima
specicat, ie în mod permanent, pe toat  durata rul rii timpului de simulare.
Specicat, ia initial este similar  cu specicat, ia always din punctul de vedere al comportamentului legat
de execut, ia specicat, iilor secvent, iale. Spre deosebire de specicat, ia always, specicat, iile incluse în specicat, ia
initial sunt executate o singur  dat . Dup  execut, ia ultimei specicat, ii incluse în initial, specicat, ia
initial îs, i termin  denitiv efectul, pân  la încheierea simul rii. Din acest motiv, specicat, ia initial nu
modeleaz  resurse hardware reale s, i, ca efect, nu este sintetizabil . Specicat, ia initial se foloses, te exclu-
siv pentru a modela comportamentul semnalelor utilizate pentru a servi ca intr ri pentru modulele hardware
simulate.
Specicat, ia initial îs, i începe execut, ia la timpul 0. În cadrul specicat, iei initial pot  introduse întârzieri
de timp e ca timp absolut (#10 înseamn  "o întârziere de 10 unit t, i de timp"), e care timp relativ la un

55
56 LECT, IA 5. Modelarea mediului de testare HDL

eveniment asociat unui semnal (@(posedge clk) înseamn  "as, teapt  pân  la aparit, ia unui front prozitiv al
semnalului clk").

În cadrul unui modul ce modeleaz  un mediu de testare pot coexista oricâte specicat, ii initial. Toate îs, i
încep execut, ia la momentul 0 al simul rii, indiferent de ordinea acestora în cod. Finalizarea specicat, iilor poate
avea loc la momente de timp diferite, în funct, ie de clauzele de timp ale ec rei specicat, ii.
De remarcat c , similar cu specicat, ia always, ecare specicat, ie initial în care este atribuit un semnal
devine o "surs " (engl. "driver") pentru acel semnal. Deci, dac  un semnal este atribuit în dou  specicat, ii
initial este foarte probabil s  apar  conicte datorit  existent, ei surselor multiple pentru semnal.
Ca exemplicare, sunt prezentate în continuare modurile de modelare a unor semnale utilizate ca intr ri în
orice sistem secvent, ial sincron: semnalul de ceas s, i semnalul de reset.
initial
begin
c l k = 1 ' b0 ; // valoare initiala 0
forever #CK_SEMIPERIOD // valoare complementata la fiecare semi − p e r i o a d a
clk = ~clk ;
end

i n i t i a l begin
rst_n <= 1 ' b1 ; // initial inactiv
@( posedge c l k ) ;
rst_n <= 1 ' b0 ; // activare sincrona
@( posedge c l k ) ;
@( posedge c l k ) ;
rst_n <= 1 ' b1 ; // inactivare dupa doua perioade de ceas
@( posedge c l k ) ; // ramane inactiv pentru totdeauna
end
Se observ  c  cele dou  semnale au fost modelate cu dou  specicat, ii initial independente.
În cazul specicat, iei care modeleaz  semnalul de ceas, prima specicat, ie atribuie valoarea init, ial  a semnalului
de ceas (clk = 1'b0;), iar a doua modeleaz  regula de complementare a semnalului, pentru totdeauna, cu o în-
târziere între comut ri: (forever #CK_SEMIPERIOD clk = ~clk;). Specicat, ia forever va face ca specicat, ia
initial s  nu se nalizeze niciodat .
În cazul specicat, iei care modeleaz  semnalul de reset, prima specicat, ie atribuie valoarea init, ial  a semnalului
de reset (rst_n <= 1'b1;), iar urm toarele specicat, ii sunt întârziate cu momente de timp relative la semnalul
de ceas (@(posedge clk);). În acest mod, forma de und  a semnalului de reset este p strat  corelat  cu cea
a semnalului de ceas, chiar dac  ulterior semnalul de ceas îs, i modic  perioada prin schimbarea parametrului
CK_SEMIPERIOD. Specicat, ia initial se va naliza dup  execut, ia ultimei specicat, ii secvent, iale incluse. Se
modeleaz  astfel un semnal ce este activat init, ial s, i apoi este l sat inactiv pân  la nalizarea simul rii.
Figura 5.1 prezint  formele de und  ale semnalelor de ceas s, i de reset denite de specicat, ia initial prezen-
tat , pentru dou  valori ale parametrului: CK_SEMIPERIOD=10 s, i CK_SEMIPERIOD=15. Se observ  scalarea formei
de und  a semnalului de reset fat,   de semnalul de ceas.
Specicat, ia initial permite modelarea unor forme de und  complexe pentru semnale de intrare a c ror
tranzit, ii s  e condit, ionate de un semnal de ceas. Urm toarea port, iune de cod modeleaz  cu specicat, ie
initial formele de und  prezentate în gura 5.3.
i n i t i a l begin
req <= 1 ' b0 ;
ack <= 1 ' b0 ;
req_data <= ' bx ;
ack_data <= ' bx ;
@( negedge rst_n ) ;
@( posedge rst_n ) ;
@( posedge clk );
5.2. Not, iuni teoretice 57

Figura 5.1 Formele de und  ale semnalelor de ceas si de reset, pentru CK_SEMIPERIOD=10 si CK_SEMIPERIOD=15.
, ,

req <= 1 ' b1 ;


ack <= 1 ' b0 ;
req_data <= ' d0 ;
ack_data <= ' bx ;
repeat ( 3 ) @( posedge c l k ) ;

req <= 1 ' b0 ;


req_data <= ' bx ;
@( posedge c l k ) ;

ack <= 1 ' b1 ;


ack_data <= ' d1 ;
@( posedge c l k ) ;

ack <= 1 ' b0 ;


ack_data <= ' bx ;
repeat ( 2 ) @( posedge c l k ) ;

req <= 1 ' b1 ;


ack <= 1 ' b1 ;
req_data <= ' d2 ;
ack_data <= ' d2 ;
@( posedge clk );

req <= 1 ' b0 ;


ack <= 1 ' b0 ;
req_data <= ' bx ;
ack_data <= ' bx ;
@( posedge clk );

req <= 1 ' b1 ;


req_data <= ' d3 ;
@( posedge c l k ) ;

ack <= 1 ' b1 ;


ack_data <= ' d3 ;
@( posedge c l k ) ;

req <= 1 ' b0 ;


58 LECT, IA 5. Modelarea mediului de testare HDL

req_data <= ' bx ;


@( posedge c l k ) ;

ack <= 1 ' b0 ;


ack_data <= ' bx ;
@( posedge c l k ) ;

req <= 1 ' b1 ;


req_data <= ' d4 ;
@( posedge clk );
req_data <= ' d5 ;
@( posedge clk );

ack <= 1 ' b1 ;


ack_data <= ' d5 ;
@( posedge c l k ) ;

req <= 1 ' b0 ;


ack <= 1 ' b0 ;
req_data <= ' bx ;
ack_data <= ' bx ;
repeat ( 2 ) @( posedge c l k ) ;

req <= 1 ' b1 ;


req_data <= ' d6 ;
@( posedge clk );
ack <= 1 ' b1 ;
ack_data <= ' d6 ;
@( posedge clk );
ack <= 1 ' b0 ;
ack_data <= ' bx ;
req_data <= ' d7 ;
@( posedge clk );
req <= 1 ' b0 ;
req_data <= ' bx ;
repeat ( 2 ) @( posedge c l k ) ;
$display ( "%M %0t INFO : F i n a l s i m u l a r e . " , $time ) ;
$stop ;
end
Se observ  c  toate schimb rile sunt condit, ionate de frontul activ al semnalului de ceas, iar la nal se furnizeaz 
un mesaj de atent, ionare urmat de o specicat, ie de încheiere a simul rii.
$display ( "%M %0t INFO : F i n a l s i m u l a r e . " , $time ) ;
$stop ;

În acest mod, proiectantul poate rula simularea pentru un timp indenit, simularea oprindu-se în momentul
când s-au epuizat modic rile stimulilor de intrare.

5.2.2 Functii de sistem


,

$display

Funct, ia $display permite as, area unor mesaje ce pot  particularizate prin utilizarea unor variabile. As, area
variabilelor este determinat  de opt, iunea existent  în cadrul s, irului as, at. Ordinea variabilelor trebuie s 
corespund  opt, iunilor din lista de argumente. Lista de argumente este delimitat  de caractere apostrof dublu
(").
5.2. Not, iuni teoretice 59

Caracterul special procent (%) indic  faptul c  în s, irul as, at va  prezent  valoarea unei variabile. Specicarea
formatului de as, are a unei variabile se face cu una din opt, iunile prezentate în tabelul urm tor.

Opt, iune Descriere


%d sau %D Baza 10
%b sau %B Baza 2
%h sau %H Baza 16
%o sau %O Baza 8
%c sau %C Caracter
%m sau %M Nume module
%s sau %S S, ir de caractere
%t sau %T Timp curent

Pentru as, area caracterului procent (%) se va scrie caracterul procent dublu: (%%).
Dac  opt, iunea este precedat  de "0", atunci se vor elimina valorile de 0 din partea mai semnicativ  (stâng )
a numerelor.
Un caz particular îl constituie opt, iunea %m, care este singura opt, iune f r  argumente. Se recomand  utilizarea
acestei opt, iuni pentru a identica numele modulului care a generat mesajul. Acest lucru este de foarte mare
ajutor în proiecte mari, compuse dintr-un num r mare de module.
Funct, ia $write se comport  similar cu funct, ia $display cu diferent, a c  $display adaug  la nalul s, irului
caracterul "linie nou ", în timp ce $write nu scrie acest caracter.
De exemplu, codul urm tor:

module code ;

wire [ 7 : 0 ] aaa = 8 ' b0000_0101 ;

i n i t i a l begin
#1;

$display ( "%0b" , aaa ) ; // afiseaza : 101


$display ( "%b" , aaa ) ; // afiseaza : 00000101
$display ( "%b_%b" , aaa [ 4 + : 4 ] , aaa [ 0 + : 4 ] ) ; // afiseaza : 0000 _0101

$display ( " Acesta " ) ;


$display ( " e s t e " ) ;
$display ( "un" ) ;
$display ( " mesaj " ) ;
$display ( " imprimat cu f u n c t i a $ d i s p l a y . " ) ;

$ w r i t e ( " Acesta " ) ;


$write (" este " ) ;
$ w r i t e ( "un " ) ;
$ w r i t e ( " mesaj " ) ;
$ w r i t e ( " imprimat cu f u n c t i a $ w r i t e . " ) ;
end

endmodule // code

produce urm toarele texte în fereastra Transcript:


60 LECT, IA 5. Modelarea mediului de testare HDL

$stop s, i $finish

Funct, iile $stop s, i $finish sunt utilizate pentru a opri simularea la timpul la care sunt apelate. Diferent, a dintre
cele dou  funct, ii const  în act, iunea realizat  dup  oprirea simul rii.
Funct, ia $finish întrerupe simularea s, i închide simulatorul. Ea este recomandat  a  utilizat  pentru -
nalizarea simul rii în cazul rul rii la linie de comand .
Funct, ia $stop opres, te simularea s, i pune simulatorul în mod de depanare. Este permis  reluarea simul rii de
la timpul curent, cu simulatorul în mod grac.
În cazul lect, iilor, se va face depanarea modulelor. Se recomand  utilizarea funct, iei $stop în momentul în care
stimulii sunt nalizat, i. În acest mod, un proiectant poate rula simularea cu comanda run all f r  a cunoas, te
durata necesar  pentru simulare.
Este recomandat ca înainte de apelul funct, iei $stop s  existe un apel de funct, ie $display prin care s  se
precizeze motivul pentru care s-a oprit simularea. De exemplu:
$display ( "%M %0t INFO : F i n a l s i m u l a r e . " , $time ) ;
$stop ;

$random

Funct, ia $random se utilizeaz  pentru a genera numere aleatorii, necesare pentru stimulii de intrare în scopul veri-
c rii modulelor proiectate. Desigur, funct, ia nu este sintetizabil  s, i se foloses, te exclusiv în modulele generatoare
de stimuli.
Funct, ia $random genereaz  numere pseudo-aleatorii. Adic , un modul ce cont, ine un apel al funct, iei $random,
simulat pe acelas, i simulator, va produce de ecare dat  aceeas, i secvent,   de numere aleatorii. Rularea codului
pe alt simulator nu garanteaz  aceeas, i succesiune de numere aleatorii.
Funct, ia $random produce un num r aleatoriu reprezentat ca întreg pe 32 de bit, i. Dac  se doresc numere
aleatorii în domenii cu anumite restrict, ii, funct, ia se apeleaz  împreun  cu alte construct, ii sintactice. Exemplele
urm toare prezint  modalit t, i de generare a numerelor aleatorii cu constrângerile mai frecvente.
module a l e a t o r i u ;

reg c l k ;
i n i t i a l begin
clk = 0;
forever #10 c l k = ~ c l k ;
end

reg we ;
reg [ 1 6 − 1:0] data ;
reg [ 8 − 1:0] addr_8b ;
integer addr_int ;

reg [ 3 1 : 0 ] numar_1 ;
integer numar_2 ;
5.2. Not, iuni teoretice 61

integer numar_3 ;

integer num_10_20 ;
integer num_10_20__30_40 ;

i n i t i a l begin

@( posedge c l k ) ;

$display ( ">>> we ( 1 b i t ) , data ( 1 6 b i t i ) , adrdr_8b ( 8 b i t i ) , addr_int ( 3 2 b i t i ) " ) ;


repeat ( 1 0 ) begin
@( posedge c l k ) ;
we = $random ; // un b i t
data = $random ; // 16 b i t i
addr_8b = $random ; // 8 b i t i
addr_int = $random ; // 32 d e b i t i cu semn , d e c l a r a t i e d e i n t r e g
$display ( "we = %b , data = %d , adrdr_8b = %d , addr_int = %d" ,
we , data , addr_8b , addr_int ) ;
end

// numere aleatorii intre 0 si 9


$display ( ">>> numere a l e a t o r i i i n t r e 0 s i 9 " ) ;
repeat ( 1 0 ) begin
@( posedge c l k ) ;
numar_1 = $random % 1 0 ; // modulo 10 , 32 biti , numere cu semn
numar_2 = {$random} %10 ; // modulo 10 , 32 biti , numere pozitive
// prin simbol de concatenare de biti {}
numar_3 = $ u n s i g n e d ( $random ) %10 ; // numere pozitive prin functie explicita
// $unsigned ()
$display ( "numar_3 = %0d , numar_2 = %0d , numar_1 = %0d" ,
numar_3 , numar_2 , numar_1 ) ;
end

// numere aleatorii intre 10 si 20


$display ( ">>> numere a l e a t o r i i i n t r e 10 s i 20 " ) ;
repeat ( 1 0 ) begin
@( posedge c l k ) ;
num_10_20 = 10 + {$random} % ( 2 0 − 1 0 ) ;
$display ( "num_10_20 = %0d" , num_10_20 ) ;
end

// numere aleatorii intre 10 si 20 sau intre 30 si 40


$display ( ">>> numere a l e a t o r i i i n t r e 10 s i 20 sau i n t r e 30 s i 40 " ) ;
repeat ( 1 0 ) begin
@( posedge c l k ) ;
i f ( $random % 2 ) num_10_20__30_40 = 10 + {$random} % ( 2 0 − 1 0 ) ; el se
num_10_20__30_40 = 30 + {$random} % ( 4 0 − 3 0 ) ;
$display ( "num_10_20__30_40 = %0d" , num_10_20__30_40 ) ;
end

Efectul codului de generare de numere aleatorii este prezentat în continuare, as, a cum este generat în fereastra
Transcript:
62 LECT, IA 5. Modelarea mediului de testare HDL

5.2.3 Protocolul "request-acknowledge"

Protocolul "cerere-conrmare" (engl. "request-acknowledge") este un protocol lent pentru comunicarea unor
informat, ii de control sau date de volum mic între dou  module. Protocolul accept  cereri al turate în timp
(engl. "back-to-back"), îns  cea mai rapid  vitez  de transmisie este o dat  la ecare dou  tacte succesive.
Avantajul protocolului îl constituie simplitatea acestuia.
Parametrii s, i porturile necesare unei interfet, e "request-acknowledge" sunt prezentate în tabelul urm tor.
5.2. Not, iuni teoretice 63

Parametrii interfetei "request-acknowledge"


,

Parametru Descriere Domeniu


REQDAT A_W IDT H Num r de bit, i ai datelor transferate simultan cu cererea, de la ≥0
master la slave, când req = 1
ACKDAT A_W IDT H Num r de bit, i ai datelor transferate simultan cu conrmarea, de ≥0
la slave la master, când ack = 1

Porturile interfetei "request-acknowledge"


,

Denumire Descriere Direct, ie Dimensiune (bit, i) Observat, ii


port (master)
req Cerere activ  în 1, pân  când ack = 1 O 1 obligatoriu
reqdata Date transferate de la master la slave (sta- O opt, ional
bile cât timp req = 1) REQDAT A_W IDT H
ack Conrmare, puls activ 1, numai ca r spuns I 1 obligatoriu
la o cerere req = 1
ackdata Date transferate de la slave la master (re- I opt, ional
levante doar când ack = 1) ACKDAT A_W IDT H

Comunicarea începe cu activarea de c tre modulul master a semnalului de cerere, req = 1.


Simultan, modulul master depune pe portul reqdata eventualele date ce trebuie transferate spre modulul
slave. Portul de date reqdata are l t, ime parametrizabil  s, i este opt, ional. Se pot imagina cereri care nu necesit 
date transmise. De exemplu, cererea unor date dintr-o coad  de as, teptare are semnicat, ia "trimite datele
urm toare". În cazul în care nu sunt necesare date, parametrul REQDAT A_W IDT H = 0 iar portul reqdata
lipses, te. Datele trebuie ment, inute stabile (f r  a se modica) pe toat  durata unei cereri req = 1. Modicarea
datelor când req = 1, în lipsa conrm rii ack = 1, reprezint  o eroare de protocol.
Conrmarea ack = 1 este emis  de modulul slave exclusiv ca urmare a unei cereri. Emiterea unei conrm ri
în lipsa unei cereri reprezint  o eroare de protocol (req = 0 s, i ack = 1). De asemenea, este o eroare de protocol
s, i emiterea unei conrm ri simultane cu cererea. Conrmarea trebuie activat  cu un tact în avans fat,   de
momentul es, antion rii acesteia de c tre master. Pentru c  nu se poate intui momentul când modulul master
va init, ia o cerere, modulul slave nu poate activa conrmarea decât cu întârziere de minimum un tact fat,   de
cerere, dup  es, antionarea cererii activate, req = 1.
Rezult  c  la ecare cerere exist  minimum un tact în care req = 1 s, i ack = 0. Conrmarea ack = 1 are
întotdeauna durata de o perioad  de tact. Des, i în momentul conrm rii (req = 1 s, i ack = 1) modulul master
poate decide s  init, ieze o nou  cerere, modulul slave este obligat s  dezactiveze conrmarea dup  primul tact.
Un modulul master poate  capabil de a lansa cereri succesive f r  pauz  între ele (cereri "back-to-back"). În
cazul cererilor "back-to-back", cererea din partea masterului este continu  req = 1 pentru mai multe transferuri,
f r  a se dezactiva req = 0 între acestea. Conform protocolului, între dou  pulsuri succesive de conrmare
ack = 1 exist  cel put, in o perioad  de ceas în care ack = 0.
Modulul slave are posibilitatea ca, simultan cu conrmarea (perioada de ceas când ack = 1), s  trans-
mit  c tre master un set de date de r spuns. Datele ackdata trebuie es, antionate de c tre modulul master
exact în momentul conrm rii (req = 1 s, i ack = 1). Dac  nu sunt necesare date de conrmare, parametrul
ACKDAT A_W IDT H = 0 iar portul ackdata lipses, te. Se pot imagina cereri care nu necesit  date de conr-
mare. De exemplu, cererea pentru depunerea unor date într-o coad  de as, teptare are semnicat, ia "preia aceste
date s, i conrm  preluarea, pentru a putea transmite altele".

Vericarea respect rii protocolului poate  realizat  de module specice care monitorizeaz  toate semnalele.
Un modul de vericare de protocol (engl. "checker") are doar porturi de intrare s, i nu atribuie valori niciunui
semnal. Modulul face exclusiv veric ri asupra corelat, iei semnalelor ("asert, ii"), conform protocolului stabilit,
s, i lanseaz  mesaje de noticare c tre proiectant.
În gura 5.2 sunt prezentate scenarii corecte pentru utilizarea protocolului "request-acknowledge".

• La momentul 2, modulul master activeaz  cererea req = 1, simultan cu datele req _D0. Datele sunt
64 LECT, IA 5. Modelarea mediului de testare HDL

ment, inute constante pân  la primirea conm rii (momentul 5). Modulul slave observ  cererea la momentul
3, o proceseaz  s, i activeaz  conrmarea la momentul 4. Conrmarea este es, antionat  de modulul master la
momentul 5, moment la care decide dezactivarea cererii req = 0. Modulul slave dezactiveaz  conrmarea
dup  un tact de la activarea acesteia, la momentul 5.

• La momentul 6, modulul master activeaz  cererea req = 1, simultan cu datele req _D1. În acest caz,
modulul slave are cea mai rapid  react, ie: observ  cererea la momentul 7 s, i la acelas, i moment activeaz 
conrmarea. Modulul master observ  conrmarea la dou  tacte de la activarea cererii (la momentul 8).

• La momentul 10, modulul master activeaz  cererea req = 1, simultan cu datele req _D2. La momentul 12,
modulul observ  conrmarea s, i decide s  init, ieze o nou  cerere "back-to-back" prin ment, inerea req = 1,
dar cu modicarea datelor req _D3. Cele dou  cereri sunt conrmate ecare în parte.

Figura 5.2 Denirea protocolului "request-acknowledge".

În gura 5.3 sunt prezentate erori ale protocolului "request-acknowledge".

• La momentul 2, modulul master activeaz  cererea req = 1, simultan cu datele req _D0. Cererea este
abandonat  la momentul 5, f r  a exista conrmare, generând o eroare de protocol.

• La momentul 6, modulul slave activeaz  conrmarea ack = 1, f r  a exista o cerere, generând o eroare de
protocol.

• La momentul 9, modulul slave activeaz  cererea req = 1, îns  în acelas, i timp se activeaz  s, i conrmarea
ack = 1. Este o eroare de protocol determinat  de modulul slave deoarece în momentul 9, când a
activat conrmarea, acesta nu a es, antionat cererea activ  req = 1. Es, antionarea cererii în momentul 9 ar
determina valoarea req = 0.

• Cererea init, iat  în momentul 11 este nalizat  corect, îns  modulul slave nu dezactiveaz  conrmarea la
un tact dup  activare, producând o eroare de protocol similar  cu cea de la momentul 7: conrmare f r 
cerere.

• La momentul 15, modulul master activeaz  cererea req = 1, simultan cu datele req _D4, îns  produce o
eroare de protocol prin modicarea datelor în req _D5 înainte de primi conrmarea. Eroarea de protocol
poate  observat  la momentul 17, când datele sunt diferite de cele de la momentul 16, des, i cererea nu a
fost conrmat . Modulul master trebuia s  ment, in  aceleas, i date pân  la primirea conrm rii.

• La momentul 20, modulul master activeaz  cererea req = 1, simultan cu datele req _D6. Modulul mas-
ter primes, te corect conrmarea la momentul 22. Îns , cererea "back-to-back" de la momentul 22 este
abandonat  ulterior la momentul 23, f r  conrmare, cauzând o eroare de protocol similar  cu cea de la
momentul 5.
5.2. Not, iuni teoretice 65

Figura 5.3 Erori ale protocolului "request-acknowledge".

5.2.4 Protocol "valid-ready"


Protocolul "valid-gata" (engl. "valid-ready") este un protocol rapid pentru comunicarea unor informat, ii de
control sau date de volum mare între dou  module. Protocolul accept  cereri al turate în timp (engl. "back-
to-back"). Cea mai rapid  vitez  de transmisie se obt, ine în cazul în care transmit,  torul are date disponibile de
a  transmise iar receptorul este capabil s  le primeasc  f r  pauze. În acest caz, prin protocolul "valid-ready"
pot  transmise date în ecare perioad  de ceas.
Parametrii s, i porturile necesare unei interfet, e "valid-ready" sunt prezentate în tabelul urm tor.

Parametrii interfetei "valid-ready"


,

Parametru Descriere Domeniu


DAT A_W IDT H Num r de bit, i ai datelor transferate de la master la slave, când >0
val = 1 s, i rdy = 1

Porturile interfetei "valid-ready"


,

Denumire Descriere Direct, ie Dimensiune (bit, i) Observat, ii


port (master)
val Modulul master are date de transferat O 1 obligatoriu
rdy Modulul slave este disponibil s  accepte I 1 obligatoriu
date
data Date transferate de la master la slave: sta- O DATA_WIDTH obligatoriu
bile cât timp val = 1, es, antionate când
val = 1 s, i rdy = 1 simultan

Pe o interfat,   valid-ready, datele se transmit într-un singur sens. Modulul emit,  tor este cel care controleaz 
semnalul val. Modulul receptor este cel care controleaz  semnalul rdy .
Modulele emit,  tor s, i receptor lucreaz  independent, act, iunile unui modul nu trebuie s  e condit, ionate de
starea celuilalt modul. Emit,  torul trebuie s  activeze val = 1 când are date valide, necondit, ionat de starea
receptorului. Receptorul trebuie s  activeze rdy = 1 când este disponibil s  primeasc  date, necondit, ionat de
existent, a datelor valide dinspre emit,  tor.
Odat  ce a activat val = 1, emit,  torul trebuie s  t, in  datele valide s, i constante pân  când acestea sunt
preluate de c tre receptor. Preluarea datelor se face în ciclul în care val = 1 s, i rdy = 1 simultan.
Receptorul are voie s  activeze s, i s  dezactiveze rdy oricând. Obligat, ia lui este de a prelua datele în cazul în
care val = 1 s, i rdy = 1 simultan.
Simultan cu val = 1, modulul emit,  tor depune pe portul data datele ce trebuie transferate spre modulul
receptor. Portul de date data are l t, ime parametrizabil . Datele pot  structurate pentru a r spunde diverselor
cerint, e de proiectare. De exemplu, în cazul trimiterii unui ux de date ce descriu o imagine, se pot dedica
anumit, i bit, i de date pentru semnale de control (SOL/EOL - start/end of line, SOF/EOF - start/end of frame)
iar anumit, i bit, i pentru valoarea pixelului (sau a mai multor pixeli).
66 LECT, IA 5. Modelarea mediului de testare HDL

Datele trebuie ment, inute stabile (f r  a se modica) pe toat  durata unei cereri val = 1. Modicarea datelor
când val = 1, când emit,  torul nu este gata (rdy = 0), reprezint  o eroare de protocol. Inactivarea cererii
val = 0 în lipsa primirii datelor de c tre receptor (rdy = 1) reprezint  o eroare de protocol. Altfel spus, val
comut  din 1 în 0 exclusiv când rdy = 1.
Modulul receptor poate s  îs, i declare disponibilitatea de a primi date (rdy = 1) chiar dac  emit,  torul nu are
date disponibile (val = 0). Receptorul are dreptul oricând s  decid  c  nu mai primes, te date, chiar dac  a fost
disponibil dar nu a primit nicio dat . Altfel spus, rdy comut  din 1 în 0 indiferent de val.
Protocolul "valid-ready" permite ca val = 1 s, i rdy = 1 s  e activate simultan, neind condit, ionate. În
aceast  situat, ie, datele sunt preluate de receptor cu o întârziere de un tact fat,   de momentul când au fost
depuse de emit,  tor.
Rezult  c , în cazul când atât emit,  torul cât s, i receptorul permit (val = 1 s, i rdy = 1), datele se pot transfera
în ecare ciclu de tact.
Un modulul emit,  tor poate  capabil de a lansa cereri succesive f r  pauz  între ele (cereri "back-to-back").
În cazul cererilor "back-to-back", cererea din partea emit,  torului este continu  (val = 1) pentru mai multe
transferuri f r  a se dezactiva (val = 0) între acestea.
Vericarea respect rii protocolului poate  realizat  de module specice care monitorizeaz  toate semnalele.
Un modul de vericare de protocol (engl. "checker") are doar porturi de intrare s, i nu atribuie valori niciunui
semnal. Modulul face exclusiv veric ri asupra corelat, iei semnalelor ("asert, ii"), conform protocolului stabilit,
s, i lanseaz  mesaje de noticare c tre proiectant.
În gura 5.4 sunt prezentate scenarii corecte pentru utilizarea protocolului "valid-ready".

• La momentul 2, modulul emit,  tor activeaz  val = 1 simultan cu datele D0. Datele sunt ment, inute
constante pân  la momentul când sunt preluate (momentul 5, val = 1 s, i rdy = 1 simultan). În momentul
5, modulul emit,  tor decide c  nu mai are date de transmis s, i dezactiveaz  val = 0. Simultan (independent
de emit,  tor), modulul receptor decide la momentul 5 c  nu mai poate primi alte date s, i dezactiveaz 
rdy = 0.

• La momentul 6, modulul receptor devine disponibil s  primeasc  noi date s, i activeaz  rdy = 1. La
momentul 8, emit,  torul are noi date de transmis s, i activeaz  val = 1. Din aceste motive, la momentul 9,
val = 1 s, i rdy = 1 simultan, datele sunt transferate de la emit,  tor la receptor.

• La momentul 9, modulul emit,  tor decide c  nu mai are alte date, dar modulul receptor r mâne în con-
tinuare disponibil s  primeasc  date.

• La momentul 11, emit,  torul transmite noi date D2 care vor  preluate imediat la momentul 12. La
momentele 12 s, i 13, modulul emit,  tor sesizeaz  c  datele curente au fost preluate s, i init, iaz  alte cereri de
transfer (cu date modicate) "back-to-back". La momentele 12, 13, 14 se transfer  date succesive, ind
ambele module disponibile (val = 1 s, i rdy = 1 simultan).

• La momentul 14, receptorul devine indisponibil (rdy = 0). Emit,  torul este nevoit s  ment, in  datele valide
pân  acestea sunt preluate, la momentul 16.

• La momentul 17 receptorul devine disponibil pentru un singur tact (rdy = 1). La momentul 18 receptorul
se declar  indisponibil (rdy = 0), chiar dac  nu a primit date în timp ce a fost disponibil. Este posibil
ca modulul emit,  tor s  fac  alte act, iuni care s  nu îi mai permit  s  primeasc  date. De exemplu, un
controller de memorie DRAM care declans, eaz  act, iunea de refresh devine indisponibil pentru cereri din
partea modulului client.

• La momentul 19, f r  a  corelate, cele dou  module activeaz  simultan val = 1 s, i rdy = 1. În acest caz,
datele sunt imediat preluate la momentul 20.

În gura 5.4 sunt marcate cu o s geat  vertical  momentele când are loc transferul efectiv al datelor de la
emit,  tor la receptor.
În gura 5.5 sunt prezentate erori ale protocolului "valid-ready".
5.3. Activit t, i practice 67

Figura 5.4 Denirea protocolului "valid-ready".

• La momentul 2, modulul emit,  tor activeaz  cererea val = 1 simultan cu datele D0. Cererea este abando-
nat  la momentul 5, f r  ca datele s  e preluate (rdy = 1), generând o eroare de protocol.
• La momentul 6, modulul receptor devine disponibil s, i apoi, la momentul 7, devine indisponibil, f r  a 
date transferate. Acest comportament este acceptabil, neind o eroare de protocol.
• La momentul 8, modulul emit,  tor activeaz  cererea val = 1 cu datele D1. La momentul 10, f r  ca datele
D1 s  e preluate, modulul emit,  tor modic  datele în D2. Aceasta este o eroare de protocol a modulului
emit,  tor care a modicat datele f r  ca receptorul s  le primeasc  (rdy = 1).

Figura 5.5 Erori ale protocolului "valid-ready".

5.3 Activit ti practice ,

5.3.1 Modelarea interfetei "request-acknowledge"


,

Realizat, i o simulare conform gurii 5.6. Modulul de top cont, ine urm toarele module:

• model de simulare pentru un modul master cu interfat,   "request-acknowledge" (master_rq_ack.v),


• model de simulare pentru un modul slave cu interfat,   "request-acknowledge" (slave_rq_ack.v),
• generator de ceas s, i reset (ck_rst_tb.v) conectat pe intr rile corespunz toare ale modulelor master s, i
slave.

5.3.2 Vericarea protocolului pe interfat  "request-acknowledge"


,

Modicat, i mediul de testare prin instant, ierea unui modul de vericare a protocolului "request-acknowledge".
Modulul de vericare (checker_rq_ack.v) trebuie conectat cu intr rile pe semnalele interfet, ei, as, a ca în gura
68 LECT, IA 5. Modelarea mediului de testare HDL

Figura 5.6 Mediu de testare pentru interfata "request-acknowledge".


,

5.7.

Figura 5.7 Mediu de testare pentru interfata "request-acknowledge" si modul de vericare.


, ,

În modulele de referint,   master_rq_ack.v s, i slave_rq_ack.v nu sunt erori. Din acest motiv, nu exist 
garant, ia c  modulul de vericare chiar funct, ioneaz . Pentru a "verica modulul de vericare" ar trebui generate
cazuri de eroare intent, ionate.
Modulul scenarios_rq_ack.v este un modul de simulare, nesintetizabil, care genereaz  un set de erori de
protocol "request-acknowledge". Conectat, i acest modul la modulul de vericare pentru a valida corectitudinea
modulului de vericare prin observarea detect rii erorilor introduse intent, ionat. Realizat, i un mediu de testare
similar cu cel prezentat în gura 5.8.
Ad ugat, i în modulul scenarios_rq_ack.v specicat, ii pentru vericarea altor scenarii posibile ale semnalelor
din interfat, a "request-acknowledge".
5.3. Activit t, i practice 69

Figura 5.8 Mediu de testare pentru modulul de vericare de protocol "request-acknowledge".

5.3.3 Task-uri pentru generare de stimuli


Specicat, ia task permite gruparea unor specicat, ii secvent, iale pentru a  apelate cu parametrii diferit, i de
multiple ori. Aceasta permite scrierea condensat  a unor secvent, e repetitive. De exemplu, un modul master pe
o interfat,   "request-acknowledge" lanseaz  o cerere dup  urm torul algoritm:

• Activeaz  cererea (req = 1) simultan cu stabilirea datelor (reqdata).

• As, teapt  urm torul front de ceas.

• Cât timp nu a sosit conrmarea (ack = 0), as, teapt  urm torul front de ceas.

• Când a sosit conrmarea (ack = 1), nalizeaz  transferul.

• Dac  nu urmeaz  o cerere "back-to-back", dezactiveaz  cererea (req = 1), pune datele în stare indiferent 
(reqdata = x) s, i as, teapt  num rul de perioade de ceas de pauz  între cererile succesive.

Din algoritm se observ  c  sunt necesari 2 parametrii: valoarea datelor s, i durata pauzei între cereri. Se
consider  c  dac  durata pauzei este 0, urm toarea cerere este "back-to-back". Task-ul poate  descris de codul
urm tor:
task send_req ;
input [REQDATA_WIDTH − 1:0] data_p ; // date transmise
input [ 3 2 − 1:0] delay_p ; // pauza intre cereri succesive
begin
r e q <= 1 ' b1 ;
req_data <= data_p ;
@( posedge c l k ) ;
while (~ ack ) @( posedge c l k ) ;
i f ( delay_p != ' d0 ) begin
r e q <= 1 ' b0 ;
req_data <= ' bx ;
70 LECT, IA 5. Modelarea mediului de testare HDL

repeat ( delay_p ) @( posedge c l k ) ;


end
end
endtask

Se observ  faptul c  intr rile task-ului (data_p s, i delay_p) sunt similare unor argumente formale ale unei
funct, ii. Aceste intr ri vor primi valori în momentul apel rii task-ului.
Urm toarea secvent,  , din cadrul unei specicat, ii initial, reprezint  apeluri multiple ale task-ului:
send_req ( ' d0 , ' d2 ) ;
send_req ( ' d1 , ' d3 ) ;
send_req ( ' d2 , ' d0 ) ;
send_req ( ' d3 , ' d1 ) ;

Îmbun t t, i task-ul ment, ionat pentru a face s, i vericarea datelor conrmate. Algoritmul ar trebui s  includ :

• Când a sosit conrmarea (ack = 1), veric  datele conrmate ackdata c  sunt conform celor as, teptate
(introduse ca intrare în task).

Adaugat, i task-ului o intrare suplimentar :


input [ACKDATA_WIDTH -1:0] ackdata_p;

5.3.4 Modelarea interfetei "valid-ready" ,

• Scriet, i module de referint,   (nesintetizabile) pentru protocolul "valid-ready" (master s, i slave).

• Scriet, i un modul care veric  regulile protocolului "valid-ready".

• Scriet, i un modul slave (sintetizabil) care controleaz  accesul la o memorie pe o interfat,   "valid-ready".

• Realizat, i un mediu de testare care s  instant, ieze urm toarele module, conform gurii 5.9:

 modul RTL de testat (controller de memorie cu interfat,   "valid-ready"),


 generator de vectori de test (master cu interfat,   "valid-ready"),
 modul de memorie (mem_256x8.v),
 modul generator de ceas s, i de reset,
 modul de vericare a protocolului "valid-ready".

Utilizat, i modelul de memorie cu un singur port (mem_256x8.v).


module mem256x8 (
input clk , // ceas ( front pozitiv )
input ce , // chip enable ( activ 1)
input we , // write enable ( activ 1)
input [ 7 : 0 ] addr , // adresa
input [ 7 : 0 ] wr_data , // date scrise
input be , // byte enable , ( activ 1)
output reg [ 7 : 0 ] rd_data // date citite
);

reg [7:0] mem[ 2 5 5 : 0 ] ; // matrice de memorie

// scriere
always @( posedge c l k )
i f ( c e & we & be ) mem[ addr ] <= wr_data ;
5.3. Activit t, i practice 71

Figura 5.9 Mediu de testare pentru interfata "valid-ready".


,

// citire
always @( posedge c l k )
i f ( c e & (~we ) ) rd_data <= mem[ addr ] ; el se
rd_data <= 8 ' bx ;

endmodule // mem256x8
Lect, ia 6

Modelarea num r toarelor

Aceast  lect, ie prezint  modelarea num r toarelor în Verilog. Se vor modela diverse num r toare: cu presetare,
cu num rare în sens cresc tor sau descresc tor, cu num rare modulo parametrizabil, cu indicatoare de stare
(dep s, ire, limitare, zero).
Se vor prezenta circuitele LFSR (engl. Linear Feedback Shift Register), ca un caz particular de num r toare.

6.1 Scopurile lectiei ,

• Modelarea num r toarelor de dimensiune parametrizabil  s, i cu diverse comportamente.


• Modelarea num r toarelor cu condit, ii de comutare complexe.
• Modelarea num r toarelor în cod pseudo-aleatoriu, LFSR.

6.2 Notiuni teoretice


,

Num r toarele sunt circuite logice secventiale la care starea urm toare este determinat  exclusiv pe baza
,

st rii prezente, printr-o funct, ie de num rare. Structura "clasic " a unui num r tor sincron este prezentat  în
gura 6.1. În cazul implement rii cu registru D, structura este similar  cu a unui semi-automat pentru care
circuitul logic care determin  starea urm toare este realizat cu un sumator care incrementeaz  starea prezent .

6.2.1 Num r toare, presetabile, cu functii multiple, validare


,

Adit, ional funct, iei clasice de num rare, num r toarele pot avea diverse intr ri care controleaz  funct, ia de
num rare:

• direct, ia de num rare (în sens cresc tor sau în sens descresc tor),


• condit, ia de num rare (num rarea se realizeaz  numai în cazul îndeplinirii unei condit, ii, altfel se p streaz 
starea),
• intervalul de num rare (între un minim s, i un maxim, nu în tot intervalul din domeniul între 0 s, i 2N − 1,
unde s-a notat cu N num rul de bit, i ai num r torului),
• codul de num rare (nu neap rat în ordinea de num rare "plus 1" ci în cod "pseudo-aleatoriu").

Pe lâng  starea curent , num r toarele mai pot furniza informat, ii adit, ionale despre starea valorii curente:

• atingerea num rului maxim ce poate  reprezentat pe num rul nit de bit, i (engl. overow).

• atingerea valorii de zero sau a altei valori prestabilite.

73
74 LECT, IA 6. Modelarea num r toarelor

Figura 6.1 Schema bloc a num r toarelor sincrone.

6.2.2 Modelarea indicatorilor de dep sire, num rare modulo


,

Figura 6.2 prezint  simbolul unui num r tor clasic, cu num r de bit, i parametrizabil. Num r torul are o in-
trare de ceas s, i o intrare de reset asincron. Resetarea este necesar  pentru init, ializarea st rii num r torului.
Num rarea va avea 2W IDT H st ri (între 0 s, i 2W IDT H − 1).

Figura 6.2 Simbol bloc pentru un num r tor, pe un num r parametrizabil de biti.


,

Num r torul cu simbolul bloc prezentat în gura 6.3 are suplimentar o intrare de validare (ce = Count Enable)
care condit, ionez  comutarea. În cazul în care intrarea nu este valid  (ce = 0) num r torul îs, i p streaz  starea.
Num r torul cu simbolul bloc prezentat în gura 6.4 are o intrare a c rei activare (ld = 1) determin  aducerea
num r torului într-o stare denit  de intrarea data_in. Utilizând aceast  facilitate, împreun  cu un circuit
adit, ional, se poate realiza un num r tor modulo, cu un num r de st ri care nu este putere a lui 2.
De exemplu, presupunând W IDT H = 5, dac  circuitul extern implementeaz  funct, ia ld = (data_out == 27),
iar data_in = 5′ b00000, atunci num r torul va avea 28 de st ri s, i va cicla între 0 s, i 27.
Dac  data_in = 5′ b00011, atunci num r torul va cicla între 3 s, i 27.
În gura 6.5 este prezentat simbolul bloc al unui num r tor capabil de a num ra atât în sens cresc tor cât s, i
în sens descresc tor, pe baza unor comenzi independente. Tabelul de funct, ionare este urm torul:
6.2. Not, iuni teoretice 75

Figura 6.3 Simbol bloc pentru un num r tor cu validare.

Figura 6.4 Simbol bloc pentru un num r tor cu presetare.

ld cu cd data_out+ Funct, ie
1 - - data_in presetare
0 1 - data_out + 1 num r  în sens cresc tor
0 0 1 data_out − 1 num r  în sens descresc tor
0 0 0 data_out p streaz  starea

6.2.3 Num r toare LFSR


Un tip particular de num r toare îl constituie circuitele LFSR (engl. Linear Feedback Shift Register, Registru
de deplasare cu react, ie liniar ).

Un num r tor clasic pe N bit, i prezint  o secvent,   cu un num r maxim de 2N st ri (num rare între 0 s, i
2 − 1). Pentru a genera secvent, a de lungime maxim , în ordinea de num rare clasic  (starea comut  din
N

unu în unu), num r torul utilizeaz  un sumator de N bit, i. Datorit  complexit t, ii circuitului combinat, ional
care implementeaz  funct, ia aritmetic  de adunare, acest sumator va limita frecvent, a maxim  de operare a
num r torului. Exist  aplicat, ii în care nu este necesar  num rarea în ordine clasic  ci este necesar  doar
generarea unei secvent, e de o lungime mare (raportat  la num rul de bit, i ai num r torului). Un exemplu îl
constituie aplicat, iile de generare a unor secvent, e de comezi sau de num rare a unui num r x de st ri (chiar
76 LECT, IA 6. Modelarea num r toarelor

Figura 6.5 Simbol bloc pentru un num r tor cu presetare si num rare în sens cresc tor si descresc tor.
, ,

dac  num rul nu este o putere a lui 2). Acest tip de comportament se poate obt, ine cu o logic  mai mic  decât
un sumator (care va funct, iona la o frecvent,   mai mare) dac  se renunt,   la constrângerea de num rare clasic 
în favoarea unei num r ri pseudo-aleatorii.
Num rarea pseudo-aleatorie este o num rare determinist , dar care pare aleatorie dac  este realizat  pe un
num r mare de bit, i s, i este es, antionat  într-un num r mic de valori. Pentru anumite polinoame caracteristice,
circuitele LFSR pe N bit, i prezint  o secvent,   de num rare de lungime maxim  2N − 1.
Registrul de deplasare cu react, ie liniar  reprezint  o modalitate de obt, inere a unei secvent, e de num rare
lungi cu un num r mic de bistabile s, i care s  funct, ioneze la frecvent,   mare (cu un circuit logic combinat, ional
minimal). În structura unui LSFR de N bit, i exist  N bistabile. Starea viitoare a celor mai put, in semnicativi
N − 1 bit, i se obt, ine prin preluarea bit, ilor de index superior ai st rii curente. Un singur bistabil, cel mai
semnicativ, primes, te la intrare o funct, ie logic  XOR determinat  pe baza unor bit, i mai put, ini semnicativi.
Determinarea bit, ilor care intr  în calculul valorii viitoare a bitului cel mai semnicativ se face pe baza unui
polinom. Gradul polinomului caracteristic al unui circuit LFSR desemneaz  num rul de bistabile din cadrul
acestuia. Polinomul grupeaz  variabilele cu puterile egale cu indecs, ii bit, ilor care determin  valoarea viitoare a
celui mai semnicativ bit.
De exemplu, în cazul unui LFSR de 4 bit, i, având structura prezentat  în gura 6.6, polinomul caracteristic
este X 4 + X 3 + 1. Polinomul are gradul 4 deoarece circuitul are 4 bit, i. Valoarea viitoare a bitului cel mai
semnicativ este determinat  prin funct, ia XOR între bitul 0 s, i bitul 3 (deoarece în polinom apare X 3 s, i X 0 ).
Secvent, a va avea 24 − 1 = 15 st ri.
Se remarc  urm toarele:

• Funct, ia XOR realizeaz  funct, ia de adunare aritmetic  a bit, ilor.

• Pentru N bistabile se obt, ine o secvent,   de num rare de lungime maxim  2N − 1.

• Starea 000...0 este o stare de blocare. Starea de blocare este ment, inut  pân  la aparit, ia unei comenzi
explicite de init, ializare într-o alt  stare.

• Nu orice polinom produce secvent, e de num rare de lungime maxim . În funct, ie de polinomul ales, se pot
obt, ine mai multe secvent, e de num rare de lungimi mai mici decât lungimea maxim .

• Un circuit LFSR poate  considerat un generator de numere pseudo-aleatorii, dac  are o secvent,  
de num rare foarte lung  (num r mare de bit, i) s, i se utilizeaz  un num r mic de es, antioane succesive. De
exemplu, urm toarele secvent, e de num rare pseudo-aleatorie fac parte dn secvent, a de num rare a unui
LFSR pe 10 bit, i, caracterizat de polinomul X 10 + X 7 + 1. Secvent, a are o lungime total  de 210 − 1 = 1023
st ri.
6.2. Not, iuni teoretice 77

Figura 6.6 Circuit LFSR pe baza polinomului X 4 + X 3 + 1.

Polinom X 10 + X 7 + 1
Secvent, a 1 Secvent, a 2
Baza 10 Baza 2 Baza 10 Baza 2
... .......... ... ..........
572 1000111100 846 1101001110
286 0100011110 423 0110100111
143 0010001111 211 0011010011
71 0001000111 105 0001101001
547 1000100011 564 1000110100
785 1100010001 282 0100011010
904 1110001000 141 0010001101
964 1111000100 70 0001000110
994 1111100010 35 0000100011
009 1111110001 529 1000010001
504 0111111000 776 1100001000
764 1011111100 388 0110000100
894 1101111110 706 1011000010
447 0110111111 865 1101100001
223 0011011111 944 1110110000
111 0001101111 984 1111011000
567 1000110111 1004 1111101100
795 1100011011 1014 1111110110
909 1110001101 1019 1111111011
454 0111000110 509 0111111101
... .......... ... ..........

Se observ  c , în cazul consider rii a numai 20 numere, acestea pot  considerate aleatorii. De remarcat
valorile binare ale secvent, elor pseudo-aleatorii: cu except, ia bitului din stânga (cel mai semnicativ) tot, i
bit, ii preiau valoarea din starea anterioar  a bitului de index superior (deplasare spre dreapta). Bitul din
stânga (cel mai semnicativ) al st rii viitoare se obt, ine prin funct, ia logic  XOR între bit, ii 7 s, i 0 ai st rii
curente.

Codul urm tor modeleaz  circuite LFSR pe baza polinoamelor X 4 + X 3 + 1 s, i X 10 + X 7 + 1.


module l f s r _ 4 (
input clk , // semnal de ceas ,
input rst_n , // semnal de reset asincron activ 0
output reg [ 3 : 0 ] data_o // iesirea lfsr
);
78 LECT, IA 6. Modelarea num r toarelor

always @( posedge c l k or negedge rst_n )


i f (~ rst_n ) data_o <= 4 ' b0001 ; el se
data_o <= { data_o [ 3 ] ^ data_o [ 0 ] , data_o [ 3 : 1 ] } ;

endmodule // lfsr_4

module l f s r _ 1 0 (
input clk , // semnal de ceas ,
input rst_n , // semnal de reset asincron activ 0
output reg [ 9 : 0 ] data_o // iesirea lfsr
);

always @( posedge c l k or negedge rst_n )


i f (~ rst_n ) data_o <= 1 0 ' b00_0000_0001 ; el se
data_o <= { data_o [ 7 ] ^ data_o [ 0 ] , data_o [ 9 : 1 ] } ;

endmodule // lfsr_10

6.3 Activit ti practice ,

6.3.1 Modelare num r toare


Modelat, i comportamentul num r toarele având simbolurile bloc prezentate în gurile 6.2, 6.3, 6.4 s, i 6.5.
Proiectat, i un mediu de testare care s  le instant, ieze pe toate.
Vericat, i proiectarea prin simulare.

6.3.2 Modelare num r toare cu valori într-un domeniu


Modelat, i un num r tor în sens cresc tor între 9 s, i 27. Proiectat, i un num r minim de bit, i pentru num r tor.
Proiectat, i facilitatea de validare s, i existent, a unei ies, iri care s  semnaleze comutarea num r torului din 27 în 9.
Vericat, i proiectarea prin simulare.

6.3.3 Tem  de proiectare: LFSR


Modelat, i un circuit LFSR cu polinom parametrizabil. Stabilit, i parametrii:
parameter WIDTH = ' d10 , // numarul de biti
parameter POLINOM = ' b00_1000_0001 // polinomul caracteristic
// implicit X10+X7+1

Num rul de bit, i ai parametrului POLINOM trebuie s  e egal cu valoarea parametrului WIDTH. Valoarea poli-
nomul prezint  bitul egal cu 1 dac  indexul respectiv este cont, inut de polinom.
Pentru polinomul X 4 + X 3 + 1, WIDTH=4 s, i POLINOM=4'b1001.
Pentru polinomul X 10 + X 7 + 1, WIDTH=10 s, i POLINOM=10'b00_1000_0001.
Modelarea se bazeaz  pe observat, iile:

• Fiecare bit, cu except, ia celui mai semnicativ, îs, i preia valoarea viitoare din valoarea curent  a bitului de
index superior.
6.3. Activit t, i practice 79

• O operat, ie AND pe bit, i între tot, i bit, ii valorii curente s, i polinom determin  un s, ir de bit, i în care diferit, i
de zero sunt doar bit, ii din polinom cu valoarea 1. Altfel spus, parametrul POLINOM realizeaz  prin funct, ia
logic  AND mascarea bit, ilor care nu intr  în calculul bitului cel mai semnicativ.

• Operat, ia XOR pe baza bit, ilor mascat, i determin  valoarea urm toare a bitului cel mai semnicativ.

Vericat, i proiectarea prin simulare.

6.3.4 Tem  de proiectare: num r tor


Proiectat, i un num r tor de 16 bit, i descris structural cu dou  instant, e de num r tor pe 8 bit, i. Num r torul
instant, iat are simbolul bloc similar celui prezentat în gura 6.5. Se vor utiliza facilit, ile de înc rcare (ld), de
num rare în sens cresc tor (cu) s, i de semnalare a dep s, irii la num rare (ovf ).
Vericat, i proiectarea prin simulare.

6.3.5 Tem  de proiectare: divizor de frecvent  ,

Proiectat, i un circuit pe baz  de num r tor presetabil care implementeaz  un divizor de frecvent,   cu 15 s, i factor
de umplere 7/15. Justicat, i proiectarea.
Vericat, i proiectarea prin simulare.
Lect, ia 7

Modelarea FSM

Aceast  lect, ie prezint  modelarea în Verilog a automatelor secvent, iale cu un num r nit de st ri.
Se vor prezenta diverse moduri de modelare pentru FSM.

7.1 Scopurile lectiei ,

• Modelarea FSM.

• Modelarea cod rii one-hot a st rilor automatului.

• Vericarea FSM.

7.2 Notiuni teoretice


,

7.2.1 Automate
Automatele secvent, iale cu num r nit de st ri (engl. FSM = Finite State Machine) au în structura lor un
registru pentru memorarea st rii curente s, i un circuit combinat, ional pentru determinarea st rii urm toare.
Automatele au ca element esent, ial o bucl  realizat  prin faptul c  determinarea st rii viitoare se face pe baza
st rii prezente.
Un automat care nu prezint  ies, iri se numes, te semi-automat. Structura aceastuia este prezentat  în gura
7.1. Se observ  registrul de stare care are la ies, ire codul st rii prezente s, i la intrare codul st rii viitoare. Starea
viitoare este determinat  prin circuitul combinat, ional, pe baza st rii prezente s, i a intr rilor.
În funct, ie de modul de determinare a ies, irilor automatului, automatele se clasic  în:

• automate Moore, cu simbolul bloc prezentat în gura 7.2 a), pentru care ies, irea este dependent  exclusiv
de starea prezent  s, i

• automate Mealy, cu simbolul bloc prezentat în gura 7.2 b), pentru care ies, irea este dependent  atât
de starea prezent  cât s, i de intr ri.

7.2.2 Modelarea FSM


Modelarea FSM în Verilog se poate face în diverse moduri. La alegerea tipului de modelare trebuie avute în
vedere câteva criterii.

81
82 LECT, IA 7. Modelarea FSM

Figura 7.1 Schema bloc a unui semi-automat (automat f r  iesiri). ,

Modelarea este f cut  pentru sintez . Este posibil ca sintetizatoarele s  nu accepte (sau s  nu interpreteze
corect) toate variantele de modelare. De cele mai multe ori, produc torii de software EDA (engl. Electronic
Design Automation) pentru sintez  recomand  anumite tipuri de modelare. Exist  îns  câteva tipuri unanim
acceptate. Acestea sunt prezentate în continuarea lect, iei.
Trebuie t, inut cont s, i de faptul ca automatele cu multe st ri s, i multe condit, ii de comutare între st ri sunt
dicil de testat integral. Mentenant, a s, i simplitatea de depanare a codului reprezint  criterii importante pentru
alegerea modalit t, ii de modelare a FSM.
Pentru exemplicarea model rii FSM se consider  graful de tranzit, ii (engl. state chart) din gura 7.3.
Automatul are 4 st ri, denumite generic idle, initial, iterate s, i nal, posibil de codicat pe un num r minim
de 2 bit, i (22 ≤ 4).
Automatul are dou  intr ri, denumite start s, i zero.

Ies, irile automatului, denumite ready s, i do_iter, depind exclusiv de starea prezent  (numele lor apar în sim-
bolurile de stare, noduri, sub numele st rii în care este activ ). Este un automat de tip Moore. Arcul marcat
cu 'x' desemneaz  o tranzit, ie în care intr rile sunt indiferente.

Modelarea semi-automatului cu o specicatie always ,

Un tip de modelare acceptat de toate sintetizatoarele presupune modelarea semi-automatului cu o singur 


specicat, ie always @(posedge clk) secvent, ial  care cuprinde atât modelul pentru registrul de stare cât s, i
circuitul combinat, ional care implementeaz  funct, ia de tranzit, ie a st rii (gura 7.4).
Se observ  init, ializarea automatului în starea idle în cazul activ rii resetului asincron rst_n=0. Circuitul
combinat, ional este modelat cu o specicat, ie case cu select, ie pe baza st rii curente. Intr rile automatului
inuent, eaz  st rile viitoare.
Ies, irile sunt modelate cu specicat, ii pentru modelarea circuitelor combinat, ionale, assign sau always@(*).
Codul asociat model rii cu o singur  specicat, ie always este urm torul:
module fsm_1 (
input clk , // semnal de ceas ,
input rst_n , // semnal de reset asincron activ 0
input start , // start operatie
input zero , // indicator de stare
7.2. Not, iuni teoretice 83

a) b)

Figura 7.2 Scheme bloc ale automatelor: a) automat Moore (iesirile depind exclusiv de starea prezent ), b) automat
,

Mealy (iesirile depind atât de starea prezent  cât si de intr ri).


, ,

output do_iter , // comanda pentru o iteratie


output ready // terminare operatie
);
reg [ 1 : 0 ] s t a r e ; // registru de stare

// coduri stari ( unice )


localparam s_idle = 2 ' b00 ;
localparam s_initial = 2 ' b01 ;
localparam s_iterate = 2 ' b10 ;
localparam s_final = 2 ' b11 ;

// modeleaza atat circuitul combinational de stare


// cat si registrul de stare
always @( posedge c l k or negedge rst_n )
i f (~ rst_n ) s t a r e <= s _ i d l e ; el se // s t a r e i n i t i a l a a FSM
case ( s t a r e )
s_idle : i f ( s t a r t ) s t a r e <= s _ i n i t i a l ;
s_initial : i f ( z e r o ) s t a r e <= s _ f i n a l ; el se
s t a r e <= s _ i t e r a t e ;
s_iterate : s t a r e <= z e r o ? s _ f i n a l : s _ i t e r a t e ;
default : s t a r e <= s _ i d l e ; // s _ f i n a l
endcase

// modeleaza circuitul combinational de iesire


assign ready = ( s t a r e == s _ f i n a l );
assign d o _ i t e r = ( s t a r e == s _ i t e r a t e ) ;

endmodule // fsm_1
84 LECT, IA 7. Modelarea FSM

Figura 7.3 Graful de tranzitii al unui automat simplu.


,

Se observ  c  este denit un singur semnal pentru stare:


reg [ 1 : 0 ] s t a r e ; // registru de stare

Se observ  codicarea explicit  a st rilor, cu un num r minim de bit, i, realizat  cu specicat, ii localparam. În
acest mod, codurile st rilor nu sunt expuse interfet, ei exterioare a modulului s, i nu se pot modica la instant, ierea
modulului.
localparam s_idle = 2 ' b00 ;
localparam s_initial = 2 ' b01 ;
localparam s_iterate = 2 ' b10 ;
localparam s_final = 2 ' b11 ;

Modelarea semi-automatului cu dou  specicatii always ,

Un alt tip de modelare acceptat de toate sintetizatoarele presupune modelarea semi-automatului cu dou 
specicat, ii always.
O specicat, ie always @(posedge clk) secvent, ial  modeleaz  registrul de stare, ca un registru de tip D.
O alt  specicat, ie always @(*) modeleaz  circuitul combinat, ional care implementeaz  funct, ia de tranzit, ie a
st rii, as, a ca în gura 7.5.
Codul asociat model rii cu dou  specicat, ii always este urm torul:
module fsm_2 (
input clk , // semnal de ceas ,
input rst_n , // semnal de reset asincron activ 0
input start , // start operatie
input zero , // indicator de stare
output do_iter , // comanda pentru o iteratie
7.2. Not, iuni teoretice 85

Figura 7.4 Modelarea integral  a semi-automatului cu o specicatie always secvential .


, ,

output ready // terminare operatie


);

reg [ 1 : 0 ] s t a r e _ p r e z e n t a ;
reg [ 1 : 0 ] s t a r e _ v i i t o a r e ;

// coduri stari ( unice )


localparam s_idle = 2 ' b00 ;
localparam s_initial = 2 ' b11 ;
localparam s_iterate = 2 ' b10 ;
localparam s_final = 2 ' b01 ;

// modeleaza registrul de stare


always @( posedge c l k or negedge rst_n )
i f (~ rst_n ) s t a r e _ p r e z e n t a <= s _ i d l e ; el se // stare initiala a FSM
s t a r e _ p r e z e n t a <= s t a r e _ v i i t o a r e ;

// modeleaza circuitul combinational de stare


always @( ∗ )
case ( s t a r e _ p r e z e n t a )
s_idle : i f ( s t a r t ) s t a r e _ v i i t o a r e <= s _ i n i t i a l ; el se
s t a r e _ v i i t o a r e <= s _ i d l e ;
86 LECT, IA 7. Modelarea FSM

Figura 7.5 Modelarea semi-automatului cu o specicatie always secvential  pentru registru si o specicatie always
, , , ,

combinational  pentru circuitul logic de stare.


,

s_initial : i f ( zero ) s t a r e _ v i i t o a r e <= s _ f i n a l ; el se


s t a r e _ v i i t o a r e <= s _ i t e r a t e ;
s_iterate : s t a r e _ v i i t o a r e <= z e r o ? s _ f i n a l : s _ i t e r a t e ;
default : s t a r e _ v i i t o a r e <= s _ i d l e ; // s _ f i n a l
endcase

// modeleaza circuitul combinational de iesire


assign ready = ( s t a r e _ p r e z e n t a == s _ f i n a l );
assign d o _ i t e r = ( s t a r e _ p r e z e n t a == s _ i t e r a t e ) ;

endmodule // fsm_2

Se observ  c , în acest caz, sunt denite explicit semnale pentru starea viitoare (atribuite din specicatia ,

always combinational ) si pentru starea prezent  (atribuite din specicatia always secvential ):
, , , ,

reg [ 1 : 0 ] s t a r e _ p r e z e n t a ;
reg [ 1 : 0 ] s t a r e _ v i i t o a r e ;
7.2. Not, iuni teoretice 87

Modelarea semi-automatului cu codarea st rilor "one-hot"

Modelarea cu st ri codicate "one-hot" are avantajul producerii unui circuit care lucreaz  la frecvent,   maxim ,
datorit  simplit t, ii circuitului combinat, ional care implementeaz  funct, ia de tranzit, ie a st rii. Fiec rei st ri îi
este asociat un bistabil. La un moment dat, un singur bistabil are valoare 1, acesta având semnicat, ia de stare
curent . Fiecare bistabil, împreun  cu logica ce îi determin  starea urm toare, este modelat cu o specicat, ie
always @(posedge clk), as, a cum se prezint  în gura 7.6.
Condit, iile în care un bistabil se seteaz  se deduc din descrierea arcelor care intr  în nodul asociat st rii
respective. De exemplu, se ajunge în starea iterate (s_iterate<= 1'b1) dac  starea prezent  este initial s, i
zero=1'b0 sau dac  starea prezent  este iterate s, i zero=1'b0.

Figura 7.6 Modelarea semi-automatului cu codare st rilor "one-hot". Fiecare specicatie always modeleaz  un bit de
,

stare si logica de deasupra bistabilului.


,

Codul asociat model rii cu codicare "one-hot" este urm torul:


module fsm_3 (
input clk , // semnal de ceas ,
input rst_n , // semnal de reset asincron activ 0
input start , // start operatie
input zero , // indicator de stare
output do_iter , // comanda pentru o iteratie
output ready // terminare operatie
);

// coduri stari ( unice )


reg s_idle ;
88 LECT, IA 7. Modelarea FSM

reg s_initial ;
reg s_iterate ;
reg s_final ;

// modeleaza cate un bit pentru fiecare stare


always @( posedge c l k or negedge rst_n )
i f (~ rst_n ) s _ i d l e <= 1 ' b1 ; el se // stare initiala a FSM
s_idle <= s_final | // arce care intra in stare
( s _ i d l e & (~ s t a r t ) ) ;
always @( posedge c l k or negedge rst_n )
i f (~ rst_n ) s _ i n i t i a l <= 1 ' b0 ; el se
s _ i n i t i a l <= s _ i d l e & s t a r t ;
always @( posedge c l k or negedge rst_n )
i f (~ rst_n ) s _ i t e r a t e <= 1 ' b0 ; el se
s _ i t e r a t e <= ( s _ i n i t i a l & (~ z e r o ) ) |
( s _ i t e r a t e & (~ z e r o ) ) ;
always @( posedge c l k or negedge rst_n )
i f (~ rst_n ) s _ f i n a l <= 1 ' b0 ; el se
s_final <= ( s _ i n i t i a l & z e r o ) |
( s_iterate & zero ) ;

// modeleaza circuitul combinational de iesire


assign ready = s_final ;
assign d o _ i t e r = s_iterate ;

endmodule // fsm_3

Se observ  c  nu exist  coduri asociate st rilor dar exist  semnale asociate pentru ecare stare în parte.
Dezavantajul model rii cu codarea st rilor "one-hot" îl constituie riscul asumat de proiectant. Dac  ecuat, iile
st rilor urm toare sunt gres, ite, este posibil ca doi sau mai mult, i bit, i de stare s  ajung  simultan egali cu 1 în
mod eronat. Aceast  eroare nu este semnalat  de simulator. Ar trebui ca proiectantul s  adauge cod suplimentar
pentru aceast  vericare: "în orice moment exist  un singur bit de stare diferit de zero".
i n i t i a l begin
@( negedge rst_n ) ;
@( posedge rst_n ) ;
forever begin
@( posedge c l k )
i f ( ( s _ i d l e + s _ i n i t i a l + s _ i t e r a t e + s _ f i n a l ) != ' d1 ) begin
$display ( "%M %0t EROARE s t a r e one−hot ( s t a r e=%b%b%b%b ) " , $time ,
s_idle , s _ i n i t i a l , s_iterate , s_final ) ;
$stop ;
end
end
end

7.3 Activit ti practice ,

7.3.1 Modelarea si depanarea unui automat secvential


, ,

Realizat, i un mediu de vericare în care s  se instant, ieze toate cele 3 tipuri de modelare FSM, ca în gura 7.7.
Atât semnalele de ceas s, i de reset cât s, i semnalele de intrare, start s, i zero, provin din aceleas, i surse. Semnalele
de ies, ire ale celor 3 instant, e sunt diferite.
Observat, i comportamentul ies, irilor celor 3 automate. Observat, i codurile celor 3 tipuri de modele s, i faptul c 
7.3. Activit t, i practice 89

Figura 7.7 Mediu de testare pentru FSM cu 3 instante de modele pentru acelasi FSM.
, ,

ies, irile sunt identice chiar dac  în interior automatele au st ri codicate diferit. Altfel spus, comportamentul
ies, irilor nu trebuie s  depind  de tipul de modelare s, i nici de tipul de codicare a st rilor.
Observat, i c  stimulii propus, i în s, ierul fsm_test.v nu veric  tranzit, ia st rii din starea initial în starea nal.
Modicat, i mediul de testare pentru a verica tranzit, ia st rii din initial în nal.
Observat, i us, urint, a interpret rii st rii în cazul "one-hot" în fereastra de forme de und  a simulatorului (gura
7.8). Modelul cont, ine semnale cu nume ce sugereaz  st rile. Starea este interpretat  rapid de un proiectant
prin observarea semnalului de stare egal cu 1.
Pentru instant, ele cu modelare cu codicare cu num r minim de bit, i, ad ugat, i specicat, ii pasive (semnale
care nu determin  ale semnale) pentru us, urarea depan rii. De exemplu:

wire dbg_idle = ( stare == s_idle );


wire dbg_initial = ( stare == s_initial );
wire dbg_iterate = ( stare == s_iterate );
wire dbg_final = ( stare == s_final );

Figura 7.8 prezint  forme de und  cu simularea mediului din gura 7.7. Se observ  c  semnalele de ies, ire
sunt identice (ready s, i do_iter), des, i în interior cele 3 instant, e au semnale de stare diferite.
90 LECT, IA 7. Modelarea FSM

Figura 7.8 Forme de und  obtinute prin simularea celor 3 tipuri de modelare ale unui FSM.
,

7.3.2 Modicarea function rii FSM ,

Pornind de la un model existent pentru graful prezentat în gura 7.3, modicat, i codul pentru a modela un
automat a c rui comportament este descris de graful prezentat în gura 7.9.
Automatul are 5 st ri: idle, initial, left, middle s, i right.

Automatul are cinci intr ri: start, go_left, go_middle, go_right s, i zero.

Automatul nu are ies, iri explicite. Automatul expune starea spre exterior.
Se remarc  faptul c  anumite intr ri au nume similare cu numele generice ale unor st ri. Ies, irile sunt porturi
pentru modul s, i trebuie p strate ca în specicat, ii. Numele generice ale st rilor nu apar ca porturi ale modulului
s, i sunt alese de c tre proiectant. Se recomand  modelarea cu specicat, ii localparam a unor coduri asociate cu
nume ce sugereaz  numele generice ale st rilor.
Se presupune c  în starea initial o singur  intrare din cele 3 (go_left, go_middle s, i go_right) este activ 
(adic  go_left + go_middle + go_right = 1, în acest context simbolul '+' desemneaz  suma aritmetic ).
Modelat, i automatul cu comportamentul descris de graful din gura 7.9. Asigurat, i-v  c  în mediul de testare
at, i vericat toate tranzit, iile asociate arcelor prezente în graf.

7.3.3 Tem  de proiectare: FSM complex


Modelat, i semi-automatul al c rui comportament este descris prin graful de tranzit, ii prezentat în gura 7.10.
Simbolul bloc al semi-automatului este prezentat în gura 7.11.
Automatul are 5 intr ri (start, nal, jos, mijloc s, i sus), îns  nu toate sunt relevante în toate st rile pentru a
decide st rile viitoare. Din acest motiv, o modelare recomandat  este cu specicat, ia casex. Specicat, ia casex
permite ca în expresia de select, ie anumit, i bit, i s  e declarat, i ca "indiferent, i" (irelevant, i).
Port, iunea de cod urm toare modeleaz  interfat, a FSM s, i o parte din graful de tranzit, ii din gura 7.10.
7.3. Activit t, i practice 91

Figura 7.9 Graf de tranzitii.


,

module fsm_casex (
input clk , // semnal de ceas ,
input rst_n , // semnal de reset asincron activ 0
// intrari
input start ,
input sfarsit ,
input jos ,
input mijloc ,
input sus ,
output reg [ 2 : 0 ] stare // registru de stare si iesirea
);

// coduri stari ( unice )


localparam s_idle = 3 ' b000 ;
localparam s_initial = 3 ' b001 ;
localparam s_regular = 3 ' b010 ;
localparam s_single_up = 3 ' b011 ;
localparam s_single_down = 3 ' b100 ;

// modeleaza atat circuitul combinational de stare


// cat si registrul de stare
always @( posedge c l k or negedge rst_n )
i f (~ rst_n ) s t a r e <= s _ i d l e ; el se // s t a r e initiala a FSM
casex ( { s t a r t , j o s , m i j l o c , sus , s f a r s i t , s t a r e } )
{ 5 'b1_x_x_x_x , s _ i d l e } : stare <= s _ i n i t i a l ;
92 LECT, IA 7. Modelarea FSM

Figura 7.10 Graful de tranzitii al unui semi-automat complex.


,

{ 5 'bx_x_1_x_x , s_initial} : stare <= s_regular ;


{ 5 'bx_x_0_x_x , s_initial} : stare <= s_single_up ;
{ 5 'bx_x_x_x_1 , s_regular } : stare <= s_idle ; // sfarsit
{ 5 'bx_x_1_x_0 , s_regular } : stare <= s_regular ; // mijloc
{ 5 'bx_x_0_1_0 , s_regular } : stare <= s_single_up ; // sus
{ 5 'bx_1_0_0_0 , s_regular } : stare <= s_single_down ; // jos
// . . .
default : // { 5 ' b00_x_x_x_x , s_idle }
stare <= s _ i d l e ;
endcase

endmodule // fsm_casex

Completat, i modelul FSM s, i vericat, i-l prin simulare.


7.3. Activit t, i practice 93

Figura 7.11 Modelarea unui semi-automat, cu o singur  specicatie always ce înglobeaz  o specicatie casex.
, ,
Lect, ia 8

Modelarea memoriilor

Aceast  lect, ie prezint  aspecte specice model rii memoriilor: sintax , init, ializare s, i lucru cu s, iere.

8.1 Scopurile lectiei ,

• Modelarea unei memorii single-port.


• Init, ializarea modelelor de memorie.
• Gestiunea s, ierelor pentru lucru cu memorii.

8.2 Notiuni teoretice


,

O memorie se poate modela în Verilog ca o variabil  bidimensional :


reg [WIDTH-1:0] mem[DEPTH-1:0];
În etapa de sintez  RTL, variabila bidimensional  trebuie înlocuit  cu resurse hardware reale. Dac  se dores, te
implementarea cu o memorie specic  unei tehnologii, atunci în biblioteca de tehnologie trebuie s  existe modele
potrivite iar sintetizatorul s  e informat prin asocierea unui model de memorie cu o memorie zic . Alternativa
o constituie sintetizarea variabilei bidimensionale sub forma unui set de registre, implementat cu bistabile D.
Diferent, a dintre setul de registre s, i memorie o constituie faptul c  toate datele din setul de registre se pot
accesa simultan s, i tot timpul iar datele din memorie se pot accesa, la un moment dat, numai cele de la adresa
curent .

8.2.1 Memorii
Dup  modul în care sunt efectuate act, iunile de c tre o memorie (citire s, i scriere), memoriile pot  clasicate în:

• memorii sincrone, pentru care accesarea datelor se face sincron cu frontul activ al unui semnal de ceas,
sau
• memorii asincrone, pentru care accesarea datelor se face la activarea unor semnale de control specice
(citire sau scriere).

Num rul de porturi ale memoriei este reprezentat de num rul de adrese pe baza c rora se poate accesa
memoria, la un moment dat. Dup  num rul s, i tipul porturilor, memoriile pot  clasicate astfel:

• 1RW - memoria single-port, un sigur port prin care se face atât citirea cât s, i scrierea (poate face o singur 
act, iune odat , e citire, e scriere),

95
96 LECT, IA 8. Modelarea memoriilor

• 1R1W - memoria cu dou  porturi independente, unul de scriere s, i altul de citire (poate face simultan o
citire s, i o scriere la adrese diferite),
• 2RW - memoria cu dou  porturi independente prin care se pot face atât act, iuni de citire cât s, i de scriere
(pot  realizate orice dou  act, iuni simultan, inclusiv dou  scrieri la adrese diferite).

Se pot imagina diverse tipuri de memorii, cu mai multe porturi sincrone pe acelas, i semnal de ceas sau pe
semnale de ceas asincrone (ecare port cu ceasul propriu).
În aceast  lect, ie, se vor ment, iona exclusiv memoriile mai des utilizate: memoriile single-port, 1RW, cu o
singur  adres , capabile s  acceseze la un moment dat o singur  locat, ie de memorie, e pentru citire, e pentru
scriere (dar nu simultan scriere s, i citire).
Simbolul bloc al memoriei single-port este prezentat în gura 8.1.
Figurile 8.2 s, i 8.3 prezint  simbolurile bloc al memoriilor 1R1W s, i 2RW.

Figura 8.1 Simbol bloc pentru memoria 1RW (engl. "single-port").

Figura 8.2 Simbol bloc pentru memoria 1R1W (un port de citire si unul de scriere).
,

Variabila bidimensional  care modeleaz  memoria este declarat  astfel:


reg [ 8 ∗WORD_BYTES −1 : 0 ] mem[MEM_DEPTH −1 : 0 ] ;

Memoria are date de l time WORD_BYTES bytes, adic  8*WORD_BYTES biti. Adâncimea memoriei este de
, ,

MEM_DEPTH locatii. De remarcat c  este necesar ca MEM_DEPTH ≤ 2ADDR_W IDT H .


,

Modelul de memorie mem_1rw descrie parametrii memoriei, interfat, a s, i act, iunile de citire s, i de scriere efectuate
asupra matricii de memorie.
8.2. Not, iuni teoretice 97

Figura 8.3 Simbol bloc pentru memoria 2RW (engl. "true dual-port").

module mem_1rw #(
parameter ADDR_WIDTH = 8 ,
parameter MEM_DEPTH = 256 , // MEM_DEPTH <= 2^ADDR_WIDTH
parameter WORD_BYTES = 8 // latimea datelor ( biti ) = 8 ∗ WORD_BYTES
)(
input clk , // ceas ( front pozitiv )
input ce , // chip enable ( activ 1)
input we , // write enable ( activ 1)
input [ADDR_WIDTH −1 : 0] addr , // adresa
input [ 8 ∗WORD_BYTES −1 : 0] wr_data , // date scrise
input [WORD_BYTES −1 : 0] be , // byte enable , ( activ 1)
output reg [ 8 ∗WORD_BYTES −1 : 0] rd_data // date citite
);

reg [ 8 ∗WORD_BYTES −1 : 0 ] mem[MEM_DEPTH −1 : 0 ] ;

// scriere memorie
always @( posedge c l k )
i f ( c e & we )
mem[ addr ] <= (mem[ addr ] & (~ be ) ) | // pastreaza datele nescrise
( wr_data & be ) ; // modifica datele scrise

// citire memorie
always @( posedge c l k )
i f ( c e & (~we ) ) rd_data <= mem[ addr ] ; el se // date citite
rd_data <= ' bx ; // date necunoscute

endmodule // mem_1rw
98 LECT, IA 8. Modelarea memoriilor

8.2.2 Initializarea memoriei cu o constant 


,

În mod normal, o memorie se scrie prin circuit înainte de a  citit . Din acest motiv, nu este nevoie ca memoria
s  e init, ializat  cu date cunoscute. Dac  nu este init, ializat , ca orice variabil  Verilog, se poate considera c 
valorile memorate sunt toate 'bx.
Exist  îns  cazuri când este necesar  init, ializarea memoriilor. Exemple de memorii ce trebuie init, ializate sunt
memoriile ROM sau modulele LUT (engl. "Look-Up Table").
Alteori, module de memorie RAM (deci care se scriu înainte de a  citite) sunt utilizate pentru a testa
exclusiv circuitul care preia date din memorie. Se poate presupune c  datele au fost scrise anterior (de c tre un
alt modul) s, i nu se dores, te simularea perioadei de scriere a memoriei. De exemplu, dac  se testeaz  un circuit
care preia datele din memorie pentru a  as, ate ("driver video").
Init, ializarea variabilelor bidimensionale care modeleaz  memoriile este un proces exclusiv de simulare (nu are
corespondent în hardware real).
Init, ializarea tuturor locat, iilor memoriei cu aceeas, i valoare constant  se poate face într-o specicat, ie initial
în care toate locat, iile sunt init, ializate secvent, ial, una câte una, la timpul 0 de simulare, cu valoarea constant :
integer idx ; // index
i n i t i a l begin

// initializare totala cu o valoare constanta


for ( i d x =0; i d x < MEM_DEPTH; i d x=i d x +1)
mem[ i d x ] = 'hAB ; // valoare constanta

end

8.2.3 Initializarea memoriei cu $readmemb, $readmemh


,

Funct, iile Verilog $readmemb s, i $readmemh init, ializeaz  o matrice de memorie (variabil  bidimensional ) cu valori
dintr-un s, ier extern. Fis, ierul cont, ine caractere ASCII ce reprezint  valori binare ("0" sau "1") sau în baza 16
("0-9", "A-F"). Valorile trebuie s  aib  aceeas, i l t, ime cu cea a memoriei (exprimat  în bit, i) s, i s  e separate
cu spat, ii. Valorile adreselor de început s, i de sfârs, it sunt valori în baza 16 (atât pentru $readmemb cât pentru s, i
$readmemh) precedate de caracterul "@".
Sintaxa specicat, iilor de init, ializare a memoriilor este:
$readmemb ( " nume_file " , mem) ;
$readmemh ( " nume_file " , mem) ;

Pentru memoria mem_1rw, init, ializarea cu specicat, ie $readmemh se realizeaz  prin includerea acesteia într-o
specicat, ie initial:
i n i t i a l begin

// initializare din fisier extern cu date in hexa


$readmemh ( "mem. hex " , mem) ; // initializare memorie

end

8.2.4 Functii pentru accesul la siere de intrare/iesire


, , ,

Verilog permite accesul la s, ierele de pe calculatorul local pentru a us, ura împlementarea unor medii de vericare
complexe s, i pentru a înlesni depanarea. Specicat, iile de acces la s, iere nu sunt sintetizabile s, i trebuie utilizate
exclusiv în module ce modeleaz  mediul de vericare.
8.2. Not, iuni teoretice 99

Funct, ii de acces la s, ierele de pe mediul de stocare al calculatorului sunt apelate prin funct, ii specice Verilog.
Numele acestor funct, ii este precedat de simbolul $. Un s, ier local, identicat prin cale s, i nume în sistemul
de s, iere al calculatorului, este asociat cu un descriptor de s, ier în Verilog. Calea s, ierului se recomand  a 
relativ  la directorul de simulare pentru a asigura portabilitatea modelului.
Sintaxa asocierii dintre un s, ier s, i un descriptor este urm toarea:

integer f i l e _ i d ; // d e s c r i p t o r d e fisier
f i l e _ i d = $fopen ( " file_name " [ , type ] ) ;

Tipul s, ierului semnic  scopul pentru care este deschis s, ierul. Cele mai utilizate tipuri sunt ment, ionate în
tabelul urm tor:

Tip s, ier Descriere


"r" sau "rb" Deschidere pentru citire
"w" sau "wb" Creare pentru scriere
"a" sau "ab" Scriere în continuarea unui s, ier existent (engl. append)

$fopen deschide un s, ier s, i îi asociaz  un descriptor, declarat ca un întreg pe 32 de bit, i. Descriptorul va
 utilizat ulterior de c tre specicat, iile de acces la s, ier. În caz de eroare, descriptorul are valoarea zero. Se
recomand  ca dup  o specicat, ie de deschidere de s, ier s  se verice dac  s, ierul a putut  deschis, prin testarea
descriptorului de s, ier:

i f ( d a t a _ f i l e == 0 ) begin
$display ( "Nu s e p o a t e d e s c h i d e f i s i e r u l <c a l e /nume f i s i e r >." ) ;
$stop ;
end

Caracterul "b" prezent în tipul s, ierului desemneaz  un "s, ier binar" (cont, ine valori binare). În lipsa acestuia,
s, ierul este de tip text (cont, ine caractere ASCII).
Comanda de închidere a unui s, ier este:

$fclose ( f i l e _ i d ) ;

Pentru citirea din sier exist  comenzi specice. Scrierea în sier se poate face cu comenzile $display sau
, ,

$fdisplay. Scrierea se face temporar într-un buer de iesire. Buerul este depus în sier e cu comenzi explicite
, ,

$flush(file_id); e la întreruperea sau nalul simul rii. Exist  si comenzi de control pentru lucru cu siere.
, ,

Comenzile uzuale de lucru cu siere sunt prezentate în tabelul urm tor.


,

Se presupun urm toarele declarat, ii de date:

reg [ 7 : 0 ] ch ;
string str ;
integer status ;
reg [ 7 : 0 ] mem [ 7 : 0 ] ;
100 LECT, IA 8. Modelarea memoriilor

Comand  Descriere
Citire din sier ,

ch = $fgetc(file_id); cites, te un byte (un caracter) dintr-un s, ier


status = $fgets(str, file_id); cites, te o linie (s, ir de caractere terminat cu CR)
dintr-un s, ier
status = $fscanf(file_id, "format", sig, ...); cites, te date dintr-un s, ier conform unui format
status = $fread(mem, file_id[, start[, end]]); cites, te date binare dintr-un s, ier într-o memorie
Control sier ,

status = $ftell(file_id); întoarce oset-ul curent în cadrul s, ierului


status = $fseek(file_id, offset, operation); caut  în s, ier o pozit, ie
status = $rewind(file_id); init, ializez  oset-ul la începutul s, ierului, similar
cu $fseek(0,0)
$fflush([file_id]); scrie buerul de ies, ire în s, ier
status = $ferror(file_id, str); obt, ine informat, ii despre eroarea de accesare a
s, ierului
Scriere în sier ,

$swrite(str, sig, ...); scrie variabile într-un s, ir


$sformat(str, "format", sig, ...); scrie variabile formatate într-un s, ir
$fdisplay(file_id, "format", sig, ....); scrie data în s, ier s, i trece la o linie nou 
$fwrite(file_id, "format", sig, ...); scrie data în s, ier f r  a trece la o linie nou 

8.2.5 Initializarea memoriei din sier $fread


, ,

Funct, iile de init, ializare a memoriilor $readmemb s, i $readmemh au ca argument un s, ier extern ce cont, ine
caractere ASCII. Dac  se dores, te init, ializarea unei memorii dintr-un s, ier binar (de exemplu o imagine în
format .raw) aceast  opt, iune nu este potrivit .
În schimb, se poate deschide s, ierul în citire ca ind de tip binar (opt, iunea "rb - read, binar") s, i atribui câte
o valoare ec rei locat, ii de memorie.
integer file_id ; // handler fisier

integer status ; // stare operatie cu fisiere

i n i t i a l begin

// initializeaza memoria sursa


file_id = $fopen ( " input_data /mem_map_256x128 . raw" , " rb " ) ;
i f ( f i l e _ i d == 0 ) begin
$display ( "Nu s e p o a t e d e s c h i d e f i s i e r u l input_data /mem_map_256x128 . raw" ) ;
$stop ;
end
for ( i d x =0; idx < ( 2 5 6 ∗ 1 2 8 ) ; i d x=i d x +1)
s t a t u s = $ f r e a d ( i_mem_1rw_256x128x8 .mem[ i d x ] , f i l e _ i d ) ;
$fclose ( f i l e _ i d ) ;
end

8.2.6 Salvarea continutului memoriei în sier $fwrite


, ,

De multe ori este necesar  inspectarea cont, inutului unui memorii la un anumit timp de simulare. Eventual, este
nevoie de interpretarea datelor existente în memorie (de exemplu ca ind o imagine în format .raw). Solut, ia
const  din transferul cont, inutului memoriei într-un s, ier binar. Fis, ierul se va deschide pentru scriere de tip
binar (opt, iunea "wb - write, binar"). Printr-o specicat, ie for se poate copia în s, ier ecare locat, ie de memorie,
formatat  cu opt, iunea "%c" (caracter).
integer file_id ; // handler fisier
8.3. Activit t, i practice 101

i n i t i a l begin
// scrie memoria destinatie in fisier binar
file_id = $fopen ( " output_data /mem_map_32x32 . raw" , "wb" ) ;
i f ( f i l e _ i d == 0 ) begin
$display ( "Nu s e p o a t e d e s c h i d e f i s i e r output_data /mem_map_32x32 . raw" ) ;
$stop ;
end
for ( i d x =0; idx < ( 3 2 ∗ 3 2 ) ; i d x=i d x +1)
$fwrite ( f i l e _ i d , "%c " , i_mem_1rw_32x32x8 .mem[ i d x ] ) ;
$fclose ( f i l e _ i d ) ;
end

8.3 Activit ti practice ,

8.3.1 Testarea memoriei single-port


Realizat, i un mediu de testare pentru memoria single-port mem_1rw, similar celui prezentat în gura 8.4. Mediu
cont, ine dou  instant, e ale aceleias, i memorii, cu parametrii diferit, i. Valorile actuale ale parametrilor asociat, i celor
dou  instant, e sunt prezentat, i în gura 8.4.

Figura 8.4 Mediu de testare pentru memorii single-port.

Prima instant,   de memorie are capacitatea de memorare 215 × 8 s, i poate stoca o imagine de dimensiune
256 × 128, cu pixelii reprezentat, i pe 8 bit, i.
A doua instant,   de memorie are capacitatea de memorare 210 × 8 s, i poate stoca o imagine de dimensiune
32 × 32, cu pixelii reprezentat, i pe 8 bit, i.

• Simulat, i mediul de testare furnizat în lect, ie (mem_crop_test.v) s, i observat, i structurile de date asociate
memoriilor prin inspectarea ferestrelor ModelSim.
102 LECT, IA 8. Modelarea memoriilor

• Inspectat, i codul surs  al modului de test mem_crop_test.v s, i observat, i ce regiune din memoria mare
este transferat  în memoria mic .

• Modicat, i mediul de testare pentru a decupa din imaginea mare o port, iune de 20 × 20 pixeli aat, i cu
colt, ul din stânga sus la coordonatele (189, 63) s, i a depune imaginea rezultat  în memoria mic , cu colt, ul
din stânga sus la coordonatele (0, 0).

8.3.2 Modic ri asupra mediului de testare a memoriei single-port


În mediul de simulare descris în s, ierul mem_crop_test.v, o parte din imagine (de dimensiune 32 × 32 pixeli)
este copiat  din prima instant,   de memorie în cea de-a doua. Copierea este realizat  cu transferuri de date
între dou  variabile Verilog. Desigur, as, a ceva nu este posibil în hardware real.

• Modicat, i mediul de testare pentru a genera secvent, e de control potrivite pentru transferul datelor ca
în realitate. Specicat, ia care modeleaz  mediul de testare trebuie s  atribuie valori c tre porturile ce s, i
addr ale ambelor instant, e. Celelate porturi trebuie legate la valori constante, cum este prezentat în gura
8.4.

• Plasat, i anumite locat, ii de memorii în fereastra de forme de und  a simulatorului s, i observat, i modicarea
datelor de la acele locat, ii, în corelat, ie cu semnalele de control.

8.3.3 Operatiuni cu siere


, ,

Mediul de testare mem_crop_test.v implementeaz  câteva operat, iuni cu s, iere:

• deschidere s, ier cu $fopen,

• închidere s, ier cu $fclose,

• init, ializare variabil  de memorie cu $fread,

• init, ializare variabil  de memorie cu $readmemb s, i $readmemh,

• scriere date din variabila de memorie în s, ier cu $fwrite.

Identicat, i specicat, iile de accesare a s, ierelor în codul surs . Identicat, i s, ierele de intrare s, i de ies, ire.
Fis, ierele generate au extensii potrivite pentru tipul de date stocate.

• Fis, ierele cu extensia .raw cont, in date care reprezint  imagini. Aceste s, iere pot  deschise cu un editor
de imagini, de exemplu IrfanView . Este necesar  cunoas, terea dimensiunii imaginii stocate.

• Aceleas, i s, iere cu extensia .raw pot  deschise cu un editor binar, de exemplu HxD Edit .

• Fis, ierele cu extensia .hex sau .bin sunt s, iere cu caractere ASCII asociate valorilor numerice. Aceste

s, iere pot  deschise cu editoare de texte, de exemplu Notepad++ .

Modicat, i mediul de testare pentru a transfera în s, iere cont, inutul ambelor memorii, imediat ce a fost
transferat a zecea dat . Vericat, i funct, ionarea inspectând s, ierele generate.
8.3. Activit t, i practice 103

8.3.4 Tem  de proiectare: Numerele lui Fibonacci


Implementat, i un circuit care genereaz  num rul lui Fibonacci asociat indexului primit la intrare. Numerele lui
Fibonacci sunt denite astfel:
f ib_out(0) = 0
f ib_out(1) = 1
f ib_out(idx) = f ib_out(idx − 1) + f ib_out(idx − 1)
Simbolul generatorului de numere Fibonacci este prezentat în gura 8.5.

Figura 8.5 Simbolul generatorului pentru numerele lui Fibonacci.

Interfat, a modulului b.v este urm toarea:


module f i b (
input clk , // ceas ( front pozitiv )
input rst_n , // reset asincron activ 0
input ce , // chip enable , activ 1
input [4 : 0] idx , // index numar , in domeniul 0..19
output reg [ ? : 0 ] fib_out // numarul lui Fibonacci asociat indexului
);

// codul aici

endmodule // fib

• Utilizat, i o memorie single-port mem_1rw initializat  dintr-un s, ier binar extern. Generat, i cont, inutul
s, ierului extern prin export dintr-un tabel Excel.

• Determinat, i l t, imea necesar  pentru a reprezenta primele 20 de numere ale lui Fibonacci.
• Modicat, i modelul pentru a  capabil s  genereze primele 100 de numere ale lui Fibonacci. Ce trebuie
schimbat? Explicat, i limit rile programului Excel în a calcula corect numerele lui Fibonacci.
Lect, ia 9

Modelarea circuite digitale cu HDL

Aceast  lect, ie propune student, ilor realizarea unui exercit, iu de modelare a unui sistem digital ale c rui specicat, ii
sunt prezentare sub forma unui desen RTL.

9.1 Scopurile lectiei ,

• Deprinderea student, ilor cu modelarea unor sisteme digitale complexe, cu specicat, ii prezentate sub form 
de structur  RTL.

• Utilizarea not, iunilor legate de testarea sistemelor digitale modelate în Verilog: generatoare de stimuli
complexe, monitoare de vericare, lucru cu s, iere.

9.2 Tema de proiectare


Tema de proiectare o constituie realizarea unui model RTL pentru un circuit multiplicator secvent, ial cu
interfat,   request-acknowledge. Simbolul bloc al multiplicatorului secvent, ial este prezentat în gura 9.1.
Algoritmul propus pentru implementare este cel de adunare repetat . Algoritmul se bazeaz  pe observat, ia c 
produsul a dou  numere se poate obt, ine prin adunarea primului operand cu el însus, i de un num r de ori egal
cu valoarea celui de-al doilea operand.
Multiplicatorul are intr ri pentru semnalul de ceas (activ pe frontul cresc tor) s, i pentru semnalul de reset
asincron, activ în 0.
Interfat, a multiplicatorului respect  protocolul request-acknowledge. Simultan cu cererea, din exterior sunt
prezentat, i cei doi operanzi, de dimensiune parametrizabil  DATA_WIDTH. Simultan cu conrmarea, multiplicatorul
livreaz  spre exterior rezultatul, de dimensiune parametrizabil  2*DATA_WIDTH.
Implementarea hardware a algoritmului este realizat  de circuitul prezentat în gura 9.2.
În schem  sunt prezente port, i logice s, i registre. Elementele secvent, iale sunt simbolizate cu dreptunghiuri
marcate cu simbol de ceas. Circuitele secvent, iale care realizeaz  mai multe funct, ii au prioritate mai mare
pentru intr rile de control prezente în partea de sus a simbolului. De exemplu, pentru bistabilul RS care
determin  ies, irea ack intrarea R este prioritar  fat,   de intrarea S.
Registru care determin  ies, irea ack_data are funct, ionalitatea descris  de urm torul tabel:

CLR LD ADD Q++ Funct, ie


1 - - 0 Înc rcare cu 0
0 1 - D Înc rcare cu D
0 0 1 Q+D Acumulare D
0 0 0 Q P streaz  starea

105
106 LECT, IA 9. Modelarea circuite digitale cu HDL

Figura 9.1 Simbol bloc pentru multiplicatorul secvential cu interfat  request-acknowledge si algoritm de adunare
, , ,

repetat .

Num r torul de iterat, ii are funct, ionalitatea descris  de urm torul tabel:

LD CD Q++ Funct, ie
1 - D Înc rcare cu D
0 1 Q-1 Num rare în sens descresc tor
0 0 Q P streaz  starea

op1 si op2 provin din intrarea req_data, op1 ind partea mai semnicativ .
,

9.3 Activit ti practice


,

9.3.1 Modelare RTL a multiplicatorului


Scriet, i modelul Verilog RTL conform structurii prezentate în gura 9.2. Modelul multiplicatorului secvent, ial
are urm toarea interfat,  :

module seq_mul #(
parameter DATA_WIDTH = ' d4 // Numar d e biti ai operanzilor
)(
input clk , // semnal de ceas ,
input rst_n , // reset asincron activ 0
input req , // cerere
output reg ack , // confirmare , puls activ 1
input [DATA_WIDTH+DATA_WIDTH − 1:0] req_data , // { op1 , op2 }
output reg [ 2 ∗DATA_WIDTH − 1:0] ack_data // rezultat
);

Modelul va cont, ine câte o specicat, ie always pentru ecare registru (sau bistabil). Circuitele combinat, ionale
care genereaz  semnalele prezente în schem  se vor modela cu specicat, ie assign.
9.3. Activit t, i practice 107

Figura 9.2 Structura multiplicatorul secvential (porti si bistabile).


, , ,

9.3.2 Vericarea multiplicatorului


Pentru depanarea modelului de multiplicator secvent, ial este necesar un mediu de testare. Mediul va instant, ia
urm toarele componente:

• instant, a multiplicatorului testat seq_mul, cu parametrul DATA_WIDTH preluat din valoarea parametrului
cu acelas, i nume al mediului de vericare;
• instant, a modulului ck_rst_tb care genereaz  semnalele de ceas s, i de reset;
• instant, a modulului checker_rq_ack care veric  protocolul request-acknowledge.

În modelul de top, se va deni un task utilizat pentru trimiterea de comenzi spre multiplicator s, i vericarea
datelor. Task-ul accept  ca intr ri dou  valori asociate operanzilor înmult, irii s, i un num r reprezentând intervalul
de timp (exprimat în perioade de ceas) pân  la urm toarea comand . Dac  aceast  ultim  valoare este zero,
comanda ce va urma se va lansa back-to-back.
Vericarea rezultatelor se va face prin compararea valorii as, teptate (calculate în task ca produs al operanzilor
lansat, i pentru multiplicator) cu valoarea produs  de multiplicator. Compararea se va face în momentul primirii
conrm rii (ack=1).

task send_req ;
input [DATA_WIDTH − 1:0] op1 ; // date transmise
input [DATA_WIDTH − 1:0] op2 ; // date transmise
input [ 3 2 − 1:0] delay_p ; // pauza intre cereri succesive
begin
// activeaza cererea
req <= 1 ' b1 ;
req_data <= {op1 , op2 } ;
@( posedge c l k ) ;
// asteapta confirmarea
while (~ ack ) @( posedge c l k ) ;
// verifica datele
108 LECT, IA 9. Modelarea circuite digitale cu HDL

i f ( ack_data !== ( op1 ∗ op2 ) ) begin


$display ( "%M %0t EROARE %0d ∗ %0d = %0d , a s t e p t a t %0d . " , $time ,
op1 , op2 , ack_data , ( op1 ∗ op2 ) ) ;
$stop ;
end
el se begin
$display ( "%M %0t CORECT %0d ∗ %0d = %0d . " , $time ,
op1 , op2 , ack_data ) ;
end
// asteapta pauza
i f ( delay_p != ' d0 ) begin
req <= 1 ' b0 ;
req_data <= ' bx ;
repeat ( delay_p ) @( posedge c l k ) ;
end
end
Apelul task-ului se face prin numele task-ului s, i valori pentru intr ri, între paranteze rotunde s, i desp rt, ite
prin virgul . De exemplu:
// s e n d _ r e q ( op1 , op2 , pauza ) ;

send_req ( 2 , 3, 1);
send_req ( 3 , 2, 1);
send_req ( 5 , 0, 1);
send_req ( 4 , 2, 1);
send_req ( 0 , 6, 1);

Apelat, i task-ul cu parametrii determinis, ti asfel încât s  vericat, i cazurile exterme (engl. corner cases):

• operatori egali cu 0 (unul sau ambii);


• operatori egali cu 1 (unul sau ambii);
• operatori egali cu valoarea maxim  (unul sau ambii);
• operatori de parit t, i diferite.

Apelat, i task-ul de multiple ori, cu parametrii aleatorii pentru vericarea intensiv  a modulului.
Apelat, i task-ul pentru a verica în mod determinist toate cazurile pentru valorile operatorilor modulului de
multiplicare.

9.3.3 Vericarea parametrilor


Vericat, i modelul multiplicatorului secvent, ial cu diverse valori ale parametrului DATA_WIDTH (de exemplu 8 s, i
16). Modicat, i valoarea doar în mediul de testare. Valoarea din preambulul mediului de testare trebuie s  se
propage la instant, a modelului de vericat.
module seq_mul_test #(
parameter CK_SEMIPERIOD = 1 0 ,
parameter DATA_WIDTH = ' d4 // Numar d e biti ai operanzilor

···

seq_mul #(
.DATA_WIDTH (DATA_WIDTH)

Vericat, i modelul pentru DATA_WIDTH=8 s, i DATA_WIDTH=16.


Evaluat, i timpul de rulare a veric rilor pentru toate cazurile posibile, 22∗DAT A_W IDT H .
9.3. Activit t, i practice 109

9.3.4 M surarea performantelor ,

Calitatea unui algoritm de înmult, ire se poate aprecia prin timpul necesar pentru efectuarea unui set de înmult, iri.
Pentru a putea compara divers, i algoritmi, trebuie s  existe o m rime cantitativ  care s  caracterizeze ecare
algoritm.
Pentru cazul multiplicatorului secvent, ial, se propune ca metric  intervalul de timp (exprimat în perioade de
ceas) dintre momentul de început s, i momentul de nalizare a unui set de înmult, iri. Desigur, pentru un num r
mare de înmult, iri este necesar  determinarea automat  a valorii acestei metrici. În codul modulului de vericare
pot  incluse specicat, ii prin care s  se raporteze num rul de perioade de timp între dou  repere temporale.
Implementat, i un mecanism de m surare a timpului de execut, ie a unui set de înmult, iri.
Vericat, i relevant, a m sur torii timpului. Intervalul de timp de pauz  între cereri trebuie exclus din m sur -
toarea de performant,  . Modicat, i mediul de testare pentru a init, ia exclusiv cereri back-to-back.

9.3.5 Optimizare RTL


Modicat, i modelul RTL pentru a implementa o optimizare de algoritm. Optimizarea se bazeaz  pe observat, ia
c  multiplicarea secvent, ial  are num rul de iterat, ii (de perioade de ceas) egal cu valoarea celui de-al doilea
operand. T, inând cont c  multiplicarea este o operat, ie comutativ , se poate realiza multiplicarea mai rapid dac 
cel mai mic dintre operanzi este cel de-al doilea.
Adic , pentru 2 ∗ 4 în loc de 2 + 2 + 2 + 2 = 8, rezultat obt, inut dup  4 iterat, ii, se poate calcula 4 + 4 = 8
rezultatul ind disponibil dup  dou  iterat, ii.
Modicarea const  în compararea init, ial  a operanzilor, urmat  de interschimbarea acestora în cazul în care
primul operand este mai mic decât al doilea.
M surat, i performant, ele noului RTL s, i comparat, i-le cu cele ale modelului init, ial pentru a observa care este
îmbun t t, irea de performant,   realizat . Evaluat, i resursele hardware suplimentare necesare pentru imple-
mentarea îmbun t t, irii.

9.3.6 Lucrul cu siere ,

Îmbun t t, it, i mediul de testare cu facilitatea de a scrie într-un s, ier datele (cuplul de operatori) care au fost
vericate. De exemplu, pentru ecare înmult, ire, în s, ier se va scrie o line având cont, inutul:
< operator1 > < operator2 >
Îmbun t t, it, i mediul de testare cu facilitatea de a citi un s, ier cu formatul similar celui scris s, i a init, ia cereri
de înmult, ire pentru acelas, i set de operatori.
Anexa A

Teme laborator

Aceast  anex  prezint  exemple de teme posibil de abordat de c tre student, i dup  însus, irea not, iunilor de baz 
ale sintaxei limbajului Verilog.
Temele prezint  sisteme digitale simple, cu o funct, ionalitate us, or de înt, eles. Interfet, ele circuitelor sunt impuse,
îns  algoritmul implementat s, i structura intern  sunt l sate la latitudinea proiectatului.
Circuitele propuse au anumit, i parametrii pentru a putea  utilizate pentru diverse aplicat, ii.
Cerinte ,

• Descrierea algoritmului utilizat pentru implementare.


• Desen cu structura RTL proiectat .

• Descrierea Verilog a unui modul care modeleaz  circuitul.


• Descrierea Verilog a unui modul care genereaz  un set de vectori de test pentru circuit (test-bench).
• Descrierea Verilog a unui mediu de simulare (test) în care se vor instant, ia dou  componente: una cores-
punz toare circuitului testat (DUT) s, i una corespunz toare generatorului de vectori de test.

• Reprezent rile grace ale modulelor descrise s, i utilizate pentru simulare.

Recomand ri

• Fiecare modul se va stoca într-un s, ier individual. Numele s, ierului va coincide cu numele modulului
cont, inut.

• Fiecare s, ier va avea un antet (comentariu Verilog) în care va  ment, ionat  descrierea modulului.
• Codul Verilog va cont, ine comentarii justicative incluse în cod s, i în afara acestuia.
• Structura modelat  va  însot, it  de justic ri.

• Se vor respecta strict denumirile, tipurile s, i dimensiunile porturilor specicate pentru circuitul primit.
• Comentariile se vor referi la modalitatea de modelare aleas .
• Numele alese pentru module s, i semnale vor sugera rolul acestora.
• În cadrul s, ierului, alinierea se va face cu dou  spat, ii albe (tasta SPACE) nu cu TAB.

• Fis, ierele cu modelele Verilog vor  vericate prin simulare cu simulatorul ModelSim.

111
112 LECT, IA A. Teme laborator

A.1 Memorie FIFO


Memoria FIFO (engl. First In First Out) este un circuit de stocare a datelor cu o funct, ie particular : datele
sunt citite în ordinea în care sunt scrise, "primul sosit, primul servit". Cu memoria FIFO pot  implementate
diverse funct, ii în sisteme digitale:

• Coad  de date. Datele sunt scrise în memorie în ordinea sosirii s, i citite în aceeas, i ordine. Scrierea s, i
citirea pot  la momente de timp diferite, necorelate.

• Linie de întârziere. Pentru situat, iile când este nevoie de întârzierea cu mai multe perioade de ceas a
unui ux de date.

• Buer de date între etaje de procesare pipeline.

Memoria FIFO este caracterizat  de adâncimea memoriei, adic  num rul maxim de date ce pot  stocate în
caz c  datele nu sunt citite.
Memoria FIFO gestioneaz  singur  (în interior) adresa de accesare a memoriei.
Simbolul memoriei FIFO este prezentat în gura A.1.

Figura A.1 Simbolul memoriei FIFO.


A.1. Memorie FIFO 113

Interfat, a memoriei FIFO este prezentat  în tabelele urm toare.

Nume Valoare Domeniu Descriere


parametru implicit  de valori
DATA_WIDTH 8 ≥1 Dimensiunea datelor
ADDR_WIDTH 4 >1 Dimensiunea adresei interne. Determin  adâncimea FIFO
(2ADDR_W IDT H ).

Nume port Directie


, Dimensiune Descriere
Ceas/reset
clk IN 1 Semnal de ceas
rst_n IN 1 Semnal asincron de reset, activ 0
Interfat  client
,

push IN 1 Comand  de scriere date, valid  numai dac  memoria nu


este plin  (full=0).
data_in IN DATA_WIDTH Date scrise.
pop IN 1 Comand  de citire date, valid  numai dac  memoria nu este
goal  (empty=0).
data_out OUT DATA_WIDTH Date citite (prima data scris ).
empty OUT 1 Indicator memorie FIFO goal . Nu sunt permise citiri
(pop).
full OUT 1 Indicator memorie FIFO plin . Nu sunt permise scrieri
(push).
114 LECT, IA A. Teme laborator

A.2 Memorie LIFO


Memoria LIFO (engl. Last In First Out) este un circuit de stocare a datelor cu o funct, ie particular : datele
sunt citite în ordinea "ultimul sosit, primul servit". Cu memoria LIFO pot  implementate diverse funct, ii în
sisteme digitale:

• Memoria stiv . Datele citite sunt ultimele date scrise. Este implementarea hardware care ofer  suport
pentru saltul programelor rulate de microprocesoare la apelarea funct, iilor sau pentru tratarea întrerupe-
rilor.

Memoria LIFO este caracterizat  de adâncimea memoriei, adic  num rul maxim de date ce pot  stocate în
caz c  datele nu sunt citite.
Memoria LIFO gestioneaz  singur  (în interior) adresa de accesare a memoriei.
Simbolul memorie LIFO este prezentat în gura A.2.

Figura A.2 Simbolul memoriei LIFO.

Interfat, a memoriei LIFO este prezentat  în tabele urm toare.

Nume Valoare Domeniu Descriere


parametru implicit  de valori
DATA_WIDTH 8 ≥1 Dimensiunea datelor
ADDR_WIDTH 4 >1 Dimensiunea adresei interne. Determin  adâncimea FIFO
(2ADDR_W IDT H ).

Nume port Directie


, Dimensiune Descriere
Ceas/reset
clk IN 1 Semnal de ceas
rst_n IN 1 Semnal asincron de reset, activ 0
Interfat  client
,

push IN 1 Comand  de scriere date, valid  numai dac  memoria nu


este plin  (full=0).
data_in IN DATA_WIDTH Date scrise.
pop IN 1 Comand  de citire date, valid  numai dac  memoria nu este
goal  (empty=0).
data_out OUT DATA_WIDTH Date citite (ultima data scris ).
empty OUT 1 Indicator memorie LIFO goal . Nu sunt permise citiri
(pop).
full OUT 1 Indicator memorie LIFO plin . Nu sunt permise scrieri
(push).
A.3. Circuit pipeline pentru determinarea maximului unor date 115

A.3 Circuit pipeline pentru determinarea maximului unor date


Circuitul primes, te pe o interfat,   cu protocol valid-ready un set de 8 date ce reprezint  numere pozitive. Circuitul
calculeaz  maximul celor 8 numere s, i în transmite pe o alt  interfat,  , cu acelas, i protocol valid-ready.
Num rul de bit, i de date este parametrizabil (DATA_WIDTH), astfel încât numerele pozitive sunt în intervalul
[0 . . . 2DAT A_W IDT H − 1].
Determinarea num rului maxim se va face în pipe-line, cu un algoritm cât mai ecient, ales de proiectant. În
condit, iile în care modulele exterioare sunt disponibile tot timpul (client_rdy=1 s, i max_rdy=1), iar datele de
intrare se primesc continuu (client_val=1) atunci datele de ies, ire se livreaz  în mod continuu (max_val=1),
cu o întârziere egal  cu num rul de nivele de pipeline din acest modul.
Simbolul circuitului care determin  maximul, cu o procesare pipeline, este prezentat în gura A.3.

Figura A.3 Simbolul circuitului pentru determinarea maximului unor date, implementare pipeline.

Interfat, a circuitului care determin  maximul este prezentat  în tabele urm toare.

Nume Valoare Domeniu de val- Descriere


parametru implicit  ori
DATA_WIDTH 8 ≥1 Dimensiunea datelor

Nume port Directie, Dimensiune Descriere


Ceas/reset
clk IN 1 Semnal de ceas
rst_n IN 1 Semnal asincron de reset, activ 0
Interfat  client
,

client_val IN 1 Valid din partea clientului


client_rdy OUT 1 Ready pentru client
client_data IN 8 * DATA_WIDTH Date de la client, interpretate ca 8 date de câte
DATA_WIDTH bit, i.
Interfat  livrare maximum
,

max_val OUT 1 Date valide livrate


max_rdy IN 1 Modulul receptor este preg tit s  accepte date
max_data OUT DATA_WIDTH Date reprezentând maximul, DATA_WIDTH bit, i.
116 LECT, IA A. Teme laborator

A.4 Circuit pipeline pentru sortarea datelor


Circuitul primes, te pe o interfat,   cu protocol valid-ready un set de 8 date ce reprezint  numere pozitive. Circuitul
sorteaz  cele 8 numere în ordine cresc toare s, i le transmite pe o alt  interfat,  , cu acelas, i protocol valid-ready
(cel mai mare num r pe partea cea mai semnicativ  a bus-ului de ies, ire).
Num rul de bit, i de date este parametrizabil (DATA_WIDTH), astfel încât numerele pozitive sunt în intervalul
[0 . . . 2DAT A_W IDT H − 1].
Sortarea celor 8 numere se va face în pipe-line cu un algoritm cât mai ecient, ales de proiectant. În condit, iile
în care modulele exterioare sunt disponibile tot timpul (client_rdy=1 s, i sort_rdy=1), iar datele de intrare
se primesc continuu (client_val=1) atunci datele de ies, ire se livreaz  în mod continuu (sort_val=1), cu o
întârziere egal  cu num rul de nivele de pipeline din acest modul.
Simbolul circuitului care sorteaz  numerele cu o procesare pipeline este prezentat în gura A.4.

Figura A.4 Simbolul circuitului pentru sortarea numerelor, implementare pipeline.

Interfat, a circuitului care sorteaz  numerele este prezentat  în tabele urm toare.

Nume Valoare Domeniu de val- Descriere


parametru implicit  ori
DATA_WIDTH 8 ≥1 Dimensiunea datelor

Nume port Directie


, Dimensiune Descriere
Ceas/reset
clk IN 1 Semnal de ceas
rst_n IN 1 Semnal asincron de reset, activ 0
Interfat  client
,

client_val IN 1 Valid din partea clientului


client_rdy OUT 1 Ready pentru client
client_data IN 8 * DATA_WIDTH Date de la client, interpretate ca 8 date de câte
DATA_WIDTH bit, i.
Interfat  livrare numere sortate
,

sort_val OUT 1 Date valide livrate


sort_rdy IN 1 Modulul receptor este preg tit s  accepte date
sort_data OUT 8 * DATA_WIDTH Date reprezentând cele 8 numere sortate.
A.5. Arbitru de bus cu protocol request-acknowledge 117

A.5 Arbitru de bus cu protocol request-acknowledge


Circuitul realizeaz  accesul a dou  module client cu protocol request-acknowledge la o resurs  destinat, ie. Cir-
cuitul arbitreaz  cererile provenite de la dou  module independente s, i le transmite spre un alt modul cu acelas, i
protocol request-acknowledge.
Num rul de bit, i de date este parametrizabil (REQ_DATA_WIDTH s, i ACK_DATA_WIDTH). C tre modulul destinat, ie
este ad ugat un bit de date suplimentar care semnic  indexul clientului care a generat cererea.
Simbolul arbitrului de bus cu protocol request-acknowledge este prezentat în gura A.5.

Figura A.5 Simbolul arbitrului de bus cu protocol request-acknowledge.

În sistemele mai mari, arbitrului de bus nu este prezentat ca modul ci ca un bus având mai multe surse s, i
eventual mai multe destinat, ii, as, a ca în gura A.6. Cu linie punctat  este marcat  pozit, ia arbitrului de bus.

Figura A.6 Bus cu protocol request-acknowledge, gurare în sisteme mari.

Interfat, a arbitrului cu protocol request-acknowledge s, i 2 client, i este prezentat  în tabele urm toare.


118 LECT, IA A. Teme laborator

Nume parametru Valoare Domeniu de val- Descriere


implic- ori
it 
REQ_DATA_WIDTH 8 ≥1 Dimensiunea datelor transmise la cerere
ACK_DATA_WIDTH 8 ≥1 Dimensiunea datelor transmise la conrmare

Nume port Directie


, Dimensiune Descriere
Ceas/reset
clk IN 1 Semnal de ceas
rst_n IN 1 Semnal asincron de reset, activ 0
Interfat  clienti
, ,

client0_req IN 1 Cerere din partea client0


client0_data_req IN REQ_DATA_WIDTH Date de la client0
client0_ack OUT 1 Conrmare pentru client0
client0_data_ack OUT ACK_DATA_WIDTH Date pentru client0
client1_req IN 1 Cerere din partea client1
client1_data_req IN REQ_DATA_WIDTH Date de la client1
client1_ack OUT 1 Conrmare pentru client1
client1_data_ack OUT ACK_DATA_WIDTH Date pentru client1
Interfat  destinatar
,

winner_req OUT 1 Cerere c tre destinat, ie


winner_data_req OUT 1+REQ_DATA_WIDTH Date c tre destinat, ie. Msb = index client
winner_ack IN 1 Conrmare de la destinat, ie
winner_data_ack IN ACK_DATA_WIDTH Date conrmate de destinat, ie
A.6. Arbitru de bus cu protocol valid-ready 119

A.6 Arbitru de bus cu protocol valid-ready


Circuitul realizeaz  accesul a dou  module client cu protocol valid-ready la o resurs  destinat, ie. Circuitul
arbitreaz  cererile provenite de la dou  module independente s, i le transmite spre un alt modul cu acelas, i
protocol valid-ready.
Num rul de bit, i de date este parametrizabil (DATA_WIDTH). C tre modulul destinat, ie este ad ugat un bit de
date suplimentar care semnic  indexul clientului care a generat cererea.
Conform protocolului valid-ready, în lipsa cererilor (client0_vld=0 s, i client1_vld=0), modulul trebuie s 
devin  disponibil pentru preluarea datelor (client0_rdy=1 s, i client1_rdy=1).
Simbolul arbitrului de bus cu protocol valid-ready este prezentat în gura A.7.

Figura A.7 Simbolul arbitrului de bus cu protocol valid-ready.

În sistemele mai mari, arbitrului de bus nu este prezentat ca modul ci ca un bus având mai multe surse s, i
eventual mai multe destinat, ii, as, a ca în gura A.8. Cu linie punctat  este marcat  pozit, ia arbitrului de bus.
120 LECT, IA A. Teme laborator

Figura A.8 Bus cu protocol valid-ready, gurare în sisteme mari.

Interfat, a arbitrului cu protocol valid-ready s, i 2 client, i este prezentat  în tabele urm toare.

Nume Valoare Domeniu de Descriere


parametru implicit  valori
DATA_WIDTH 8 ≥1 Dimensiunea datelor transmise

Nume port Directie, Dimensiune Descriere


Ceas/reset
clk IN 1 Semnal de ceas
rst_n IN 1 Semnal asincron de reset, activ 0
Interfat  clienti
, ,

client0_val IN 1 Valid din partea clientului 0


client0_rdy OUT 1 Ready pentru client 0
client0_data IN DATA_WIDTH Date de la client0.
client1_val IN 1 Valid din partea clientului 1
client1_rdy OUT 1 Ready pentru client 1
client1_data IN DATA_WIDTH Date de la client1.
Interfat  destinatar
,

winner_val OUT 1 Valid c tre destinat, ie


winner_rdy IN 1 Destinat, ie preg tit  s  accepte date
winner_data OUT 1+DATA_WIDTH Date c tre destinat, ie. Msb = index client
A.7. Circuit watchdog 121

A.7 Circuit watchdog


Circuitul watchdog este utilizat în sistemele integrate cu microprocesor (engl. "embedded systems") pentru a
reinit, ializa sistemul în ipoteza bloc rii acestuia datorit  unor situat, ii neprev zute sau periferice care nu r spund
la cereri conform as, tept rilor microprocesorului.
Circuitul watchdog genereaz  un semnal de întrerupere c tre procesor în cazul în care nu a primit un semnal
de la acesta într-un interval prestabilit de timp. Circuitul se programeaz  cu o valoare ce reprezint  num rul
de perioade de ceas pe care le va num ra (intrarea delay_preset es, antionat  când ld_delay=1). Valoarea
prestabilit  poate  modicat  de circuitul exterior numai când circuitul watchdog este inactiv (enable=0).
Simplu spus, dup  ce este activat (enable=1), circuitul num r  în sens descresc tor de la valoarea prestabilit .
Dac  în cursul num r rii apare un puls de declans, are (trigger=1), num rarea este reluat  de la valoarea maxim 
prestabilit . Dac  num r torul ajunge la 0, se seteaz  întreruperea (int=1).
Odat  setat  întreruperea, num r torul as, teapt  inactivarea circuitului (enable=0). La inactivarea funct, ion rii,
circuitul watchdog îs, i reseteaz  ies, irea de întrerupere (int=0).
Circuitul îs, i realizeaz  funct, ia doar când este activat (enable=1). Dac  este dezactivat în timpul num r rii,
circuitul abandoneaz  num rarea s, i as, teapt  o nou  activare pentru a relua num rarea în sens descresc tor de
la valoarea prestabilit .
Simbolul circuitului watchdog este prezentat în gura A.9.

Figura A.9 Simbolul circuitului watchdog.


122 LECT, IA A. Teme laborator

Interfat, a circuitului watchdog este prezentat  în tabele urm toare.

Nume Valoare Domeniu de Descriere


parametru implicit  valori
DATA_WIDTH 8 ≥1 Dimensiunea num r torului intern (în bit, i)

Nume port Directie


, Dimensiune Descriere
Ceas/reset
clk IN 1 Semnal de ceas
rst_n IN 1 Semnal asincron de reset, activ 0
Interfat  clienti
, ,

enable IN 1 Validare circuit, activ 1


trigger IN 1 Semnal puls de triggerare, activ 1
ld_delay IN 1 Înc rcare date, activ 1, exclusiv când enable=0
delay_preset IN DATA_WIDTH Valoare maxim  de num rare, relevant  exclusiv
când enable=0 s, i ld_delay=1
int OUT 1 Ies, ire de întrerupere, setat  la nalizare num rare,
resetat  la dezactivare

Figura A.10 prezint  forme de und  caracteristice pentru circuitul watchdog. Se observ  înc rcarea valorii
prestabilite delay_preset=7, cu comanda ld_delay=1, lansat  în timp ce circuitul nu este activat enable=0.
Cu except, ia acestui moment, valoarea delay_preset este indiferent . Apoi circuitul este activat enable=1. La
activare, începe num rarea intern  în sens descresc tor, de la valoarea prestabilit  (7). În cursul num r rii, apar
dou  pulsuri de triggerare (trigger=1 care determin  reluarea num r rii de la valoarea maxim  prestabilit 
(7). Dup  o num rare complet  (valoarea num r torului intern ajunge la zero), num rarea se opres, te s, i se
activeaz  întreruperea int=1. Întreruperea este dezactivat  în momentul deactiv rii circuitului enable=0.
O nou  activare a circutului enable=1 determin  reluarea num r rii în sens descresc tor de la valoarea
maxim  prestabilit  (7).

Figura A.10 Forme de und  care caracterizeaz  circuitul watchdog.


A.8. Circuit de înmult, ire secvent, ial  123

A.8 Circuit de înmultire secvential  , ,

Simbolul circuitului de înmult, ire secvent, ial , cu interfat,   request-acknowledge, este prezentat în gura A.11.

Figura A.11 Simbolul circuitului de înmultire secvential .


, ,

Interfat, a circuitelor de înmult, ire, cu protocol request-acknowledge, este prezentat  în tabelele urm toare.

Nume Valoare Domeniu de Descriere


parametru implicit  valori
DATA_WIDTH 8 ≥1 Dimensiunea operanzilor (în bit, i)

Nume port Directie, Dimensiune Descriere


Ceas/reset
clk IN 1 Semnal de ceas
rst_n IN 1 Semnal asincron de reset, activ 0
Interfat  client (request-acknowledge)
,

req IN 1 Cerere din partea clientului


data_req IN 2*DATA_WIDTH Operanzi concatenat, i ({op1, op0})
ack OUT 1 Conrmare
data_ack OUT 2*DATA_WIDTH Produs

În continuare sunt prezentat, i algoritmi de înmult, ire. Pentru simplicare, au fost notat, i operanzii cu A s, i B
iar produsul cu P. La nalul operat, iei, produsul se va aa în registrul P.

A.8.1 Algoritm de înmultire cu deplasare dreapta


,

- reseteaz  P (n+1 bit, i)


- încarc  deînmult, itul în A (n bit, i)
- încarc  înmult, itorul în B (n bit, i)
- repet  de n ori
- dac  LSB A = 1 atunci
- P <= P + B
- deplaseaz  cu o pozit, ie dreapta A (MSB A = LSB P)
- deplaseaz  cu o pozit, ie dreapta P (MSB P = 0)
- P cont, ine MSB produs, iar A cont, ine LSB produs
124 LECT, IA A. Teme laborator

Figura A.12 Algoritm de înmultire cu deplasare dreapta. 7 ∗ 10 si 233 ∗ 195.


, ,
A.8. Circuit de înmult, ire secvent, ial  125

A.8.2 Algoritm de înmultire cu deplasare stânga


,

- reseteaz  P (2*n bit, i)


- încarc  deînmult, itul in A (n bit, i)
- încarc  înmult, itorul in B (n bit, i)
- repet  de n ori
- deplaseaz  cu o pozit, ie stânga P (LSB P = 0)
- dac  MSB A = 1 atunci
- P <= P + B
- deplaseaz  cu o pozit, ie stânga A (LSB A = X)
- P cont, ine produs
126 LECT, IA A. Teme laborator

Figura A.13 Algoritm de înmultire cu deplasare stânga. 233 ∗ 195.


,
A.9. Circuit de împ rt, ire secvent, ial  127

A.9 Circuit de împ rtire secvential  , ,

Simbolul circuitului de împ rt, ire secvent, ial , cu interfat,   request-acknowledge, este prezentat în gura A.14.

Figura A.14 Simbolul circuitului de împ rtire secvential .


, ,

Interfat, a circuitelor de împ rt, ire, cu protocol request-acknowledge, este prezentat  în tabelele urm toare.

Nume Valoare Domeniu de Descriere


parametru implicit  valori
DATA_WIDTH 8 ≥1 Dimensiunea operanzilor (în bit, i)

Nume port Directie, Dimensiune Descriere


Ceas/reset
clk IN 1 Semnal de ceas
rst_n IN 1 Semnal asincron de reset, activ 0
Interfat  client (request-acknowledge)
,

req IN 1 Cerere din partea clientului


data_req IN 2*DATA_WIDTH Operanzi concatenat, i ({deîmp rt, it, împ rt, itor})
ack OUT 1 Conrmare
data_ack OUT 2*DATA_WIDTH Rezultatul împ rt, irii ({cât, rest})

În continuare sunt prezentat, i algoritmi de împ rt, ire. Pentru simplicare, au fost notat, i operanzii cu A s, i B
iar un registru intermediar cu P. La nalul operat, iei, restul se va aa în registrul P iar câtul în registrul A.
De remarcat c , în cazul numerelor întregi, restul are acelas, i semn ca deîmp rt, itul.

Împ rt, irea numerelor întregi


Corect Incorect
7 : 2 = 3 rest 1
7 : (-2) = (-3) rest 1 7 : (-2) = (-4) rest (-1)
(-7) : 2 = (-3) rest (-1) (-7) : 2 = (-4) rest 1
(-7) : (-2) = 3 rest (-1) (-7) : (-2) = 4 rest 1
128 LECT, IA A. Teme laborator

A.9.1 Algoritm de împ rtire f r  restaurare, numere pozitive


,

- reseteaz  P (n+1 bit, i)


- încarc  deîmp rt, itul în A (n bit, i)
- încarc  împ rt, itorul în B (n bit, i)
- repeta de n ori
- dac  P este negativ (MSB=1) atunci
- deplaseaz  cu o pozit, ie stânga P (LSB P = MSB A)
- P <= P + B
altfel
- deplaseaz  cu o pozit, ie stânga P (LSB P = MSB A)
- P <= P + (-B)
- deplaseaz  cu o pozit, ie stânga A (LSB A = not MSB P)
- dac  P este negativ (MSB=1) atunci
- P <= P + B
- P cont, ine REST
- A cont, ine CÂT
A.9. Circuit de împ rt, ire secvent, ial  129

Figura A.15 Algoritm de împ rtire f r  restaurare, numere pozitive. 75 : 10 si 85 : 10.


, ,
130 LECT, IA A. Teme laborator

Figura A.16 Algoritm de împ rtire f r  restaurare, numere pozitive. 73 : 5.


,
A.9. Circuit de împ rt, ire secvent, ial  131

A.9.2 Algoritm de împ rtire cu restaurare, numere pozitive


,

- reseteaz  P (n+1 bit, i)


- încarc  deîmp rt, itul în A (n bit, i)
- încarc  împ rt, itorul în B (n bit, i)
- repeta de n ori
- deplaseaz  cu o pozit, ie stânga {P, A} (LSb P = MSb A)
- P <= P - B
- dac  P este negativ (MSb P = 1)
- LSb A = 0
- P <= P + B (restaurare P)
- P cont, ine REST
- A cont, ine CÂT

Figura A.17 Algoritm de împ rtire cu restaurare, numere pozitive. 14 : 3.


,
132 LECT, IA A. Teme laborator

A.9.3 Algoritm de împ rtire f r  restaurare (deîmp rtit pozitiv, împ rtitor ne-


, , ,

gativ)
Deîmp rt, it: pozitiv
Împ rt, itor: negativ
Cât: negativ (acelas, i semn cu împ rt, itorul)
Rest: pozitiv (acelasi semn cu deîmp rt, itul)

- reseteaz  P (n+1 bit, i)


- încarc  deîmp rt, itul în A (n bit, i, num r pozitiv, MSB A = 0)
- încarc  împ rt, itorul în B (n bit, i, num r negativ, MSB B = 1)

- P <= P + B

- repet  de n ori
- dac  P este pozitiv (MSB=0) atunci
- deplaseaz  cu o pozit, ie stânga P (LSB P = MSB A)
- P <= P + B
altfel
- deplaseaz  cu o pozit, ie stânga P (LSB P = MSB A)
- P <= P + (-B)
- deplaseaz  cu o pozit, ie stânga A (LSB A = MSB P)

- dac  P este negativ (MSB=1) atunci


- P <= P + (-B)
- P cont, ine REST
- deplaseaz  cu o pozit, ie stânga A (LSB A = MSB P)
- A <= A + 1
- A cont, ine CÂT
A.9. Circuit de împ rt, ire secvent, ial  133

Figura A.18 Algoritm de împ rtire f r  restaurare (deîmp rtit pozitiv, împ rtitor negativ). 6 : (−1) si 7 : (−2).
, , , ,
134 LECT, IA A. Teme laborator

Figura A.19 Algoritm de împ rtire f r  restaurare (deîmp rtit pozitiv, împ rtitor negativ). (7 : (−3)).
, , ,
Anexa B

Proiect

Proiectul const  în scrierea unui model Verilog pentru un sistem de procesare de imagini s, i implementarea
acestuia în tehnologie FPGA, pe o plac  de dezvoltare.
Sistemul este denumit generic ipu - Image Procesing Unit.

Plac  de dezvoltare recomandat  este Spartan-3E Starter Board produs  de rma Digilent, îns  orice
plac  similar  este posibil de utilizat.
Caracteristicile acestei pl ci de dezvoltare sunt prezentate pe site-ul produc torului:

http://store.digilentinc.com/spartan-3e-starter-board-limited-time/

Foaia de catalog a pl cii "Spartan-3E Starter Kit Board User Guide" prezint  detalii de implementare despre
toate perifericele cu care este conectat dispozitivul FPGA pe placa de dezvoltare. Documentul poate  accesat
de pe site-ul produc torului:

https://reference.digilentinc.com/_media/s3e:s3estarter_ug.pdf

Spartan-3E Starter Board este echipat  cu un dispozitiv Xilinx FPGA XC3S200FT256 (aproximativ 200K
port, i logice echivalente).
Tema de proiect o reprezint  proiectarea s, i implementarea pe FPGA a unui sistem de prelucrare de imagini
s, i as, area acestora pe un display VGA. Student, ii primesc anumite module pentru a  re-utilizate. Ei trebuie
s  modeleze modulele care particularizeaz  mira as, at  s, i diferite funct, ii de control.

135
136 LECT, IA B. Proiect

B.1 Cerinte generale


,

1. Sistem sincron, cu ceas 50MHz, preluat de la circuitul oscilator de pe placa Spartan, conform descrierii
g site în capitolul Clock Sources al "Spartan-3E Starter Kit Board User Guide".

2. Reset asincron activ 0, preluat de la un buton prin ap sare al pl cii de dezvoltare.

3. Interfat,   cu buton rotativ s, i switch-uri utilizate pentru congurarea sistemului, conform descrierii
din capitolul Switches, Buttons and Knob al "Spartan-3E Starter Kit Board User Guide".

• Butonul rotativ selecteaz  registrul curent care se scrie (cu valori de la switch-uri) s, i se as, eaz  pe
LCD.
• Butonul central determin , prin ap sare, momentul scrierii registrului selectat.
• Switch-urile determin  valorile scrise în registrul selectat în momentul ap s rii pe butonul rotativ
central.

4. Interfat,   VGA, 640x480, RGB (3 bit, i de culoare). Culorile rezultate din codarea RGB sunt prezentate
în gura B.1.

Figura B.1 Cod de culoare RGB[2:0].

5. Interfat,   cu LCD. Pe rândul de sus se as, eaz  numele registrului de congurare curent selectat. Pe
rândul de jos se as, eaz  valoarea registrului în binar s, i în zecimal. Exemple sunt prezentate în gura B.2.

Figura B.2 Exemple de asare pe LCD.


,

6. Sursa imaginii as, ate se va selecta prin registrele de congurare. Imaginea as, at  provine e de la
ies, irea e de la una din intr rile modului de procesare de imagine.

7. Congurarea. Registrele de congurare au l t, ime de 4 bit, i. Registrul curent (la care se face scriere s, i
de la care se face as, area pe LCD) se modic  prin butonul rotativ. Valoarea congurat  se modic 
prin switch-uri. Prin ap sarea butonului rotativ central se face scrierea în registrul selectat a valorii de la
switch-uri. Valoarea registrului selectat este as, at  pe LCD.
B.2. Module reutilizate 137

B.2 Module reutilizate


Urm toarele module se consider  a  re-utilizate. Student, ii primesc o descriere a funct, iei acestor blocuri s, i
modelele RTL asociate. Student, ii trebuie s  le înt, eleag  funct, ia, s  le verice individual s, i apoi s  le includ  în
proiectul lor.

• vgaDriver - Driver VGA. Genereaz  semnalele de sincronizare pe vertical  s, i pe orizontal  conform


standardului VGA (640 x 480), împreun  cu semnalul de culoare pe 3 bit, i RGB. Modulul genereaz  ca
ies, iri, pentru uzul modulelor interne, rândul s, i coloana curent  a display-ului, as, teptând de la sistem
culoarea asociat  pixelului curent. Acest driver simplist permite as, area a 8 culori primare, similare cu
cele prezentate în gura B.1. Detaliile de interfat, are între FPGA s, i conectorul VGA se g sesc în capitolul
VGA Display Port al "Spartan-3E Starter Kit Board User Guide".

• lcdDriver - Driver LCD. Modulul genereaz  semnalele de control pentru as, ajul LCD. Interfat, a cu
sistemul intern este de tip request-acknowledge (lcdDriver este modul slave). Dispozitivul ce dores, te s 
scrie pe LCD lanseaz  spre lcdDriver o cerere. Simultan cu cererea, modulul master furnizeaz  codul
caracterului as, at s, i rândul s, i coloana pe care se va as, a caracterul. LCD-ul as, eaz  2 rânduri s, i 16
coloane dintr-un buer de 40 de coloane. Detaliile de interfat, are între FPGA s, i display-ul LCD se g sesc
în capitolul Character LCD Screen al "Spartan-3E Starter Kit Board User Guide".

• debounce - Circuit de eliminare a perturbat, iilor care apar din cauza comutatoarelor mecanice.
Butoane s, i switch-urile mecanice pot produce perturbat, ii care trebuie eliminate înainte de preluarea s, i
prelucrarea semnalului generat. Modulul debounce realizeaz  cur t, irea unui semnal provenit de la un
comutator mecanic de zgomotele existente. Modulul debounce are un port de intrare s, i un port de ies, ire.
138 LECT, IA B. Proiect

B.3 Cerinte specice


,

Cerint, ele generale sunt completate de cerint, e specice care individualizeaz  tema ec rui student în parte.
Rubrica "opt, ional" din tabelele urm toare prezint  sugestii pentru îmbun t t, iri posibil de implementat în
sisteme mai complexe.

Num r Pattern Imagini surs  Functie imgPro-


, Imagine Optional
,

tem  cessor destinatie


,

1 1 Complementare Congurabilitate:
procesare sau bypass

2 1 Complementare Congurabilitate:
procesare sau bypass

3 1 Complementare Congurabilitate:
procesare sau bypass

4 2 AND Congurabilitate:
funct, ii logice multiple

5 2 AND Congurabilitate:
funct, ii logice multiple

6 2 AND Congurabilitate:
funct, ii logice multiple
B.3. Cerint, e specice 139

Num r Pattern Imagini surs  Functie imgPro-


, Imagine Optional
,

tem  cessor destinatie


,

7 2 OR Congurabilitate:
funct, ii logice multiple

8 2 OR Congurabilitate:
funct, ii logice multiple

9 2 OR Congurabilitate:
funct, ii logice multiple

10 2 XOR Congurabilitate:
funct, ii logice multiple

11 2 XOR Congurabilitate:
funct, ii logice multiple
140 LECT, IA B. Proiect

Num r Pattern Imagini surs  Functie imgPro-


, Imagine Optional
,

tem  cessor destinatie


,

12 2 XOR Congurabilitate:
funct, ii logice multiple

13 1 Modicare de cu- Congurabilitate:


loare 0 → 1, 1 → 2, tabel  de asociere
2 → 4, 3 → 3, 4 → culori
0, 5 → 6, 6 → 7, 7
→5

14 1 Modicare de cu- Congurabilitate:


loare Culoare → num rul adunat
Culoare + 2

15 1 Modicare de cu- Congurabilitate:


loare 0 → 1, 1 → 2, tabel  de asociere
2 → 4, 3 → 3, 4 → culori
0, 5 → 6, 6 → 7, 7
→5

16 1 Modicare de cu- Congurabilitate:


loare Culoare → tabel  de asociere
Culoare + 2 culori
B.3. Cerint, e specice 141

Num r Pattern Imagini surs  Functie imgPro-


, Imagine Optional
,

tem  cessor destinatie


,

17 3 Colaj (eng. "crop") Congurabilitate: co-


cu o port, iune din ordonate pentru decu-
imaginea 1 inclus  paj
în imaginea 2).

18 2 Sum  Congurabilitate: cu
saturare sau overow

19 2 Sum  Congurabilitate: cu
saturare sau overow

20 2 Diferent,   Congurabilitate: cu
saturare sau overow
142 LECT, IA B. Proiect

B.4 Interfat  ,

Interfat, a modulului proiectat este descris  în tabelul urm tor.

Nume port Pin FPGA Pin PCB Descriere


Ceas/reset
clk C9 - Semnal de ceas, 50MHz
rst_n D18 BTNWEST Semnal asincron de reset activ 0
Buton rotativ
rot_a K18 ROT-A Determin  în conjunct, ie cu rot_b sensul de modicare a
select, iei registrului de congurare
rot_b G18 ROT-B Determin  în conjunct, ie cu rot_a sensul de modicare a
select, iei registrului de congurare
rot_center V16 CENTER Determin  la activare (1) scrierea valorii de la switch-uri în
registrul selectat
Switch-uri
sw[3:0] N17, H18, SW3, SW2, Valoare scris  în registrele de congurare
L14, L13 SW1, SW0
Asaj LCD
,

lcd_e M18 E LCD Enable


lcd_rs L18 RS LCD Register Select
lcd_rw_n L17 RW LCD ReadWrite Control
db[3:0] M15, P17, DB7, DB6, LCD Data
R16, R15 DB5, DB4
Conector VGA
vsync F14 VS Sincronizare pe vertical 
hsync F15 HS Sincronizare pe orizontal 
rgb[2:0] H14, H15, RED, GRN, RGB (red, green, blue)
G15 BLU
B.5. Etape de realizare 143

B.5 Etape de realizare


Arhitectura întregului sistem de procesare de imagini conectat cu periferice este prezentat  în gura B.3.

B.5.1 Etapa 1: vgaDriver


Etapa presupune utilizarea modulului reutilizabil vgaDriver pentru a as, a un ecran monocrom (verde), ca în
gura B.4.
În etapa 1, ecranul trebuie s  se prezinte ca în gura B.5: complet verde.

B.5.2 Etapa a 2-a: patternGen


Sistemul const  dintr-o instant,   a modulului vgaDriver s, i un modul proiectat de student, i, patternGen. Modulul
patternGen genereaz  o dung  vertical  (ros, ie pe fundal verde), pe baza coordonatelor (rând s, i coloan ) primite
de la driverul de display. Structura sistemului dezvoltat la aceast  etap  este prezentat  în gura B.6.
Modulul patternGen implementeaz  funct, ia descris  în pseudo-cod dup  cum urmeaz :

dac  ((coloana > 213) s, i (coloana < 426)) atunci


culoare = ros, u
altfel
culoare = verde

În etapa a 2-a, ecranul trebuie s  se prezinte ca în gura B.7: dung  vertical  ros, ie pe fond verde.

B.5.3 Etapa a 3-a: Multiplexare/asare imagini ,

În etapa a 3-a sistemul este suplimentat cu înc  o instant, iere a modulului patternGen modicat astfel încât s 
genereze dou  pattern-uri, selectate pe baza unei intr ri provenite de la un switch.

• 0: dung  vertical  (ros, ie pe fundal verde),


• 1: dung  orizontal  (albastr  pe fond cyan).

Cele dou  instant, eri ale modulului patternGen sunt parametrizate diferit: una cu congurare 0, alta cu
congurare 1.
Se adaug  un multiplexor 2:1 cu select, ia provenind de la un switch. Intrarea de la switch se va trece printr-un
circuit debouncer, as, a ca în gura B.8.
În etapa a 3-a, ecranul trebuie s  se prezinte ca în gura B.7: dung  vertical  ros, ie pe fond verde sau dung 
orizontal  albastr  pe fond cyan, în funct, ie de pozit, ia switch-ului.

B.5.4 Etapa a 4-a: imgProcessor


În etapa a 4-a se suplimenteaz  sistemul proiectat la etapa a 3-a cu un circuit multiplexor la 3:1 (2 bit, i de
select, ie provenit, i de la dou  switch-uri).
Un switch stabiles, te dac  imaginea as, at  pe display este cea de la intrarea sau de la ies, irea modulului de
procesare.
Al doilea switch este relevant numai dac  se as, eaz  imaginea de la intrare s, i determin  care din cele dou 
imagini de la intrare este as, at .
Se va modela modulul imgProcessor care realizez  o funct, ie logic  cu doi operatori (de exemplu AND).
Sistemul are structura prezentat  în gura B.10.
144 LECT, IA B. Proiect

În etapa a 4-a, ecranul trebuie s  se prezinte ca în gura B.9: trei tipuri de imagini, în funct, ie de starea
switch-urilor. În cazul celui de-al treilea tip de ecran, culoarea este calculat  pe baza culorilor celorlalte dou 
ecrane, printr-o funct, ie logic  (gura B.11).

B.5.5 Etapa a 5-a: lcdDriver


În etapa a 5-a se testeaz  circuitul reutilizabil lcdDriver. Se adaug  un modulul regFile care genereaz  caractere
pentru as, ajul LCD. Sistemul are structura prezentat  în gura B.12.
As, ajul ar trebui s  arate ca în gura B.13.

B.5.6 Etapa a 6-a: regFile


În etapa a 6-a se re-proiecteaz  modulul regFile pentru a genera mai multe informat, ii de congurare, pe baza
intr rilor provenite de la switch-uri s, i buton rotativ. Sistemul are structura prezentat  în gura B.14.
Se observ  modul de conectare a butonului rotativ. Butonul genereaz  pulsuri, cu l t, ime de o perioad  de
ceas, în trei cazuri:

• rotire stânga,

• rotire dreapta,
• ap sare.

Suplimentar, regFile are posibilitatea de a actualiza caracterele pe as, ajul LCD la ap sarea pe butonul rotativ
central.

B.5.7 Etapa a 7-a: ipu


În ultima etap , se instant, iaz  toate modulele s, i se nalizeaz  structura cerut  de tem , ca în gura B.3.
Modulele se particularizeaz  conform temei primite de c tre ecare student.
B.5. Etape de realizare 145

Figura B.3 Arhitectura sistemului de procesare de imagini.


146 LECT, IA B. Proiect

Figura B.4 Etapa 1: Sistem pentru asarea unui ecran monocrom.


,

Figura B.5 Ecranul VGA dup  etapa 1.

Figura B.6 Etapa a 2-a: Mir  cu dung  vertical  rosie pe fond verde.
,
B.5. Etape de realizare 147

Figura B.7 Ecranul VGA dup  etapa a 2-a.

Figura B.8 Etapa a 3-a: Multiplexor de dou  imagini.

Figura B.9 Ecranul VGA dup  etapa a 3-a: dung  vertical  rosie pe fond verde sau dung  orizontal  albastr  pe fond
,

cyan (în functie de starea unui switch).


,
148 LECT, IA B. Proiect

Figura B.10 Etapa a 4-a: Suplimentar o procesare imagini.

Figura B.11 Ecranul VGA dup  etapa a 4-a: trei tipuri de ecran (în functie de starea unui switch).
,

Figura B.12 Etapa a 5-a: Ecran LCD cu driver reutilizabil lcdDriver.


B.5. Etape de realizare 149

Figura B.13 Ecranul LCD dup  etapa a 5-a.

Figura B.14 Etapa a 6-a: Set de registre de congurare.


Cuvântul de nal

Într-o perioad  în care performant, a profesorilor este m surat 


exclusiv prin num rul de articole publicate,
d ruiesc generat, iilor urm toare o "Carte de înv t,  tur ".

Dan NICULA, 2019

www.DanNicula.ro/books/verilog

151

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