Sunteți pe pagina 1din 41

(C) 2013 DanNICULA.

ro
Curs HDL
1
Limbaje de
descriere hardware
Dan NICULA
Universitatea TRANSILVANIA din Braov
Departamentul de Electronic i Calculatoare
www.DanNicula.ro/hdl
E-mail dan.nicula@unitbv.ro
URL DanNicula.ro
Informaii administrative
Electronic Aplicat + Calculatoare, Anul 3, sem. 2
1 Curs + 2 Lab [orar/sli]
Pagina de prezentare curs:
DanNicula.ro/hdl
Evaluare:
Colocviu
2013, DanNICULA.ro - dan.nicula@unitbv.ro Curs HDL 2
(C) 2013 DanNICULA.ro
Curs HDL
2
Bibliografie Curs
2013, DanNICULA.ro - dan.nicula@unitbv.ro Curs HDL 3
2013, DanNICULA.ro - dan.nicula@unitbv.ro Curs HDL 4
Bibliografie Laborator
(C) 2013 DanNICULA.ro
Curs HDL
3
2013, DanNICULA.ro - dan.nicula@unitbv.ro Curs HDL 5
n curs de apariie...
Ce este Verilog HDL?
n prezent exist dou limbaje de descriere hardware
(HDL = Hardware Description Language) care acoper
cea mai mare parte din proiectarea sistemelor digitale:
Verilog i VHDL.
Verilog este un limbaj de descriere hardware a crui
denumire provine din concatenarea cuvintelor din limba
englez "Very-logic" (foarte logic).
VHDL este un limbaj de descriere hardware a crui
denumire provine din concatenarea literei "V" (iniiala
VHSIC = Very High Speed Integrated Circuits) i "HDL".
VHDL nu este o abreviere pentru "Verilog HDL". Verilog i
VHDL sunt dou limbaje de descriere hardware diferite.
ntre acestea exist multe asemnri dar exist i
deosebiri.
2013, DanNICULA.ro - dan.nicula@unitbv.ro Curs HDL 6
(C) 2013 DanNICULA.ro
Curs HDL
4
Metodologia de proiectare top-down
2013, DanNICULA.ro - dan.nicula@unitbv.ro Curs HDL 7
Sintaxa declaraiei unui modul
<modul> ::= module <nume_module><lista_porturi>? ;
<articol_modul>*
endmodule
<nume_module> ::=<IDENTIFICATOR>
<lista_porturi> ::=(<port><,<port>>*)
<articol_modul>
::=<declaratie_parametru> =<declaratie_port_intrare>
=<declaratie_port_iesire> =<declaratie_port_bidirectional>
=<declaratie_conexiune> =<declaratie_conexiune_reg>
=<declaratie_timp> =<declaratie_intreg>
=<declaratie_real> =<declaratie_eveniment>
=<instantiere_poarta> =<instantiere_primitiva>
=<instantiere_modul> =<redefinire_parametru>
=<atribuire_continua> =<bloc_specify>
=<specificatie_initial> =<specificatie_always>
=<task> =<functie>
2013, DanNICULA.ro - dan.nicula@unitbv.ro Curs HDL 8
(C) 2013 DanNICULA.ro
Curs HDL
5
Modul vot majoritar
module votMajoritar3Df (
i1, // intrare de vot 1
i2, // intrare de vot 2
i3, // intrare de vot 3
decizie // decizie in urma votului
);
input i1, i2, i3;
output decizie;
wire vot12;
wire vot13;
wire vot23;
assign vot12 = (i1 & i2);
assign vot13 = (i1 & i3);
assign vot23 = (i2 & i3);
assign decizie = vot12 | vot13 | vot23;
endmodule
module votMajoritar3Gl (
i1, // intrare de vot 1
i2, // intrare de vot 2
i3, // intrare de vot 3
decizie // decizie in urma votului
);
input i1, i2, i3;
output decizie;
wire vot12;
wire vot13;
wire vot23;
and (vot12, i1, i2);
and (vot13, i1, i3);
and (vot23, i2, i3);
or (decizie, vot12, vot13, vot23);
endmodule
2013, DanNICULA.ro - dan.nicula@unitbv.ro Curs HDL 9
Numrtor sincron reversibil cu presetare (1)
module upDnCounterPreset (
clk, // intrare de ceas
reset_n, // semnal de reset asincron
upDn_n, // send de numarare: 1=crescator, 0=descrescator
ld, // semnal de presetare
di, // valoare presetata
en, // validarea numararii
count // iesirea numaratorului
);
input clk;
input reset_n;
input upDn_n;
input ld;
input[3:0] di;
input en;
output[3:0] count;
reg[3:0] count;
// ld en upDn_n clk count*
// -------------------------------
// 1 x x ^ di
// 0 1 1 ^ count + 1
// 0 1 0 ^ count - 1
// 0 0 x ^ count
2013, DanNICULA.ro - dan.nicula@unitbv.ro Curs HDL 10
(C) 2013 DanNICULA.ro
Curs HDL
6
Numrtor sincron reversibil cu presetare (2)
always @(posedge clk or negedge reset_n) begin
if (!reset_n) begin // reset asincron
count <= 4'b0;
end
else begin
if (ld) begin // preset sincron
count <= di;
end
else begin
if (en) begin // numarare validata
if (upDn_n) begin // numarare in sens crescator
count <= count + 1;
end
else begin // numarare in sens descrescator
count <= count - 1;
end
end
end
end
end
endmodule
2013, DanNICULA.ro - dan.nicula@unitbv.ro Curs HDL 11
Mediul de simulare a modelelor HDL (1)
modelul sistemului de studiat;
modele de generatoare de stimuli
(similare generatoarelor de semnal);
modele de monitorizare i verificare
(similare aparatelor de msur i control).
2013, DanNICULA.ro - dan.nicula@unitbv.ro Curs HDL 12
(C) 2013 DanNICULA.ro
Curs HDL
7
Mediul de simulare a modelelor HDL (2)
2013, DanNICULA.ro - dan.nicula@unitbv.ro Curs HDL 13
Terminologia Verilog (1)
Aspectul temporal
Concurena evenimentelor
2013, DanNICULA.ro - dan.nicula@unitbv.ro Curs HDL 14
(C) 2013 DanNICULA.ro
Curs HDL
8
Terminologia Verilog (2)
Modulul
[Capitolul 1, "Prezentare general" a documentului iniial editat de OVI (Open Verilog
International) sub titlul de manual de referin al limbajului Verilog (LRM = Language
Reference Manual), versiunea 1.0, noiembrie 1991.]
Verilog HDL descrie un proiect hardware sau o parte
de proiect. Descrierile proiectelor n Verilog HDL sunt
modele Verilog. Verilog HDL este att un limbaj
comportamental ct i structural. Modelele Verilog
HDL pot descrie att funcia unui proiect ct i
componentele i conexiunile dintre componentele
unui proiect.
2013, DanNICULA.ro - dan.nicula@unitbv.ro Curs HDL 15
Terminologia Verilog (3)
Modelele Verilog pot fi dezvoltate pe diferite nivele de
abstractizare. Aceste nivele de abstractizare i tipurile
de modele ce le corespund sunt urmtoarele:
algoritmic: un model care implementeaz un algoritm al
proiectului prin construcii de nivel nalt ale limbajului;
RTL: un model care descrie curgerea datelor ntre registre
i modul de procesare a acestora;
nivel de poart: un model care descrie porile logice i
conexiunile dintre pori logice ntr-un proiect;
nivel de comutare: un model care descrie tranzistoarele i
nodurile de stocare (a informaiei) dintr-un dispozitiv i
conexiunile dintre ele.
2013, DanNICULA.ro - dan.nicula@unitbv.ro Curs HDL 16
(C) 2013 DanNICULA.ro
Curs HDL
9
Terminologia Verilog (4)
Blocul elementar de construcie n Verilog HDL este
modulul. Formatul modulului faciliteaz proiectarea
"top-down" i "bottom-up". Un modul conine modelul
unui proiect sau a unei pri de proiect. Modulele pot
ncorpora alte module pentru a forma un model
ierarhic care descrie cum se includ componentele
unui proiect n ansamblul proiectului. Construciile
Verilog HDL, aa cum sunt declaraiile i specificaiile,
sunt incluse n module. Limbajul Verilog HDL
comportamental este un limbaj structural i
procedural, aa ca limbajul de programare C.
2013, DanNICULA.ro - dan.nicula@unitbv.ro Curs HDL 17
Comparaie Verilog-VHDL
Avantaje evidente ale Verilog HDL:
tipuri de date simple i eficiente;
pori logice definite n limbaj;
cod mai concentrat.
Avantaje evidente ale VHDL:
suport puternic pentru descriere de vectori de test i lucru
cu fiiere;
posibilitatea modelrii sistemelor non-hardware (motoare
electrice, senzori).
2013, DanNICULA.ro - dan.nicula@unitbv.ro Curs HDL 18
(C) 2013 DanNICULA.ro
Curs HDL
10
Comparaie Verilog-VHDL: bistabil D
entity dff is
port (d, clk: in bit; q:
out bit);
end dff;
architecture basic of dff is
begin
process (clk)
begin
if (rising_edge(clk))
then
q <= d;
end if;
end process;
end basic;
module dff (d, clk, q);
input d, clk;
output q;
always @(posedge clk)
q <= d;
endmodule
2013, DanNICULA.ro - dan.nicula@unitbv.ro Curs HDL 19
Comparaie Verilog-VHDL: poarta AND
entity and2 is
port (a, b: in bit; y:
out bit);
end and2;
architecture basic2 of
and2 is
begin
y <= a and b;
end basic2;
module and2 (a, b, y);
input a, b;
output y;
assign y = a & b;
endmodule
2013, DanNICULA.ro - dan.nicula@unitbv.ro Curs HDL 20
(C) 2013 DanNICULA.ro
Curs HDL
11
Setul de valori
0: valoare logic 0 sau condiie fals;
1: valoare logic 1 sau condiie adevrat;
x: valoare logic necunoscut;
z: stare de nalt impedan.
2013, DanNICULA.ro - dan.nicula@unitbv.ro Curs HDL 21
Numere ntregi (1)
[dimensiune] `<baza_de_numeratie> <valoare>
baza 2: desemnat de litera b sau litera B;
baza 8: desemnat de litera o sau litera O;
baza 10: desemnat de litera d sau litera D;
baza 16: desemnat de litera h sau litera H.
2013, DanNICULA.ro - dan.nicula@unitbv.ro Curs HDL 22
(C) 2013 DanNICULA.ro
Curs HDL
12
Numere ntregi (2)
13 numrul 13 exprimat n baza 10 (n binar 1101)
-13 numrul -13 exprimat n baza 10 (n binar, pe 5
bii 1_0011, iar pe 6 bii 11_0011)
4'b1010 numrul 10 exprimat n binar pe 4 bii
12'o327 numr exprimat pe 12 bii n baza 8
16'hBEEF numr exprimat pe 16 bii n baza 16
8'd-3 numr exprimat ilegal (valoarea nu poate fi
negativ)
-8'd3 numr exprimat legal ca fiind complementul fa
de 2 al numrului pozitiv 3, reprezentat pe 8
bii (echivalent cu 8'b1111_1101)
16 'h DEAD form legal cu spaii ntre dimensiune i
caracterul ' i ntre baz de numeraie i
valoare
4' b0010 form ilegal cu spaii ntre caracterul
' i baza de numeraie
2013, DanNICULA.ro - dan.nicula@unitbv.ro Curs HDL 23
Numere ntregi (3)
width'b1010 form ilegal, dimensiunea nu poate fi
un parametru sau o expresie
'b1010 form legal, dimensiunea poate lipsi
(numrul este reprezentat pe numrul
maxim de bii, n acest caz 4'hFF
numr exprimat n baza 16 reprezentat pe
8 bii
8'b101 numr exprimat n baza 2 reprezentat pe
8 bii ca 8'b00000101
8'b0000_0101 numr echivalent cu forma anterioar
(caracterele _ sunt ignorate)
3'b0110_0101 numr echivalent cu 3'b101
(caracterele din stnga sunt trunchiate dac
valoarea are mai muli bii dect dimensiunea
precizat explicit)
2013, DanNICULA.ro - dan.nicula@unitbv.ro Curs HDL 24
(C) 2013 DanNICULA.ro
Curs HDL
13
Numere ntregi (4)
8'b0_11_0_0101 folosire legal a caracterului de
subliniere pentru delimitare
8'b_0110_0101 folosire ilegal a caracterului de
subliniere la nceputul valorii
8'd260 numr echivalent cu 4 n baza 10
(provenit din trunchierea caracterului cel
mai semnificativ al reprezentrii n binar
9'b1_0000_0100.)
8'bx valoare nedefinit extins pe 8 bii
xxxxxxxx
4'bz valoare z extins pe 4 bii zzzz
2013, DanNICULA.ro - dan.nicula@unitbv.ro Curs HDL 25
Numere reale
Numere zecimale (cu virgul).
Exemple: 3.14, -0.268, 11.1512
Numere n format tiinific (cu exponent).
Exemple: 3.1415E2 (314,15), 1.0E3 (1000), 5E-3 (0,005),
1_234.567_89, 5.3E-3, 5. (ilegal).
Numerele reale nu sunt sintetizabile.
Numerele reale sunt automat convertite la numere
ntregi prin rotunjire.
2013, DanNICULA.ro - dan.nicula@unitbv.ro Curs HDL 26
(C) 2013 DanNICULA.ro
Curs HDL
14
iruri
Un ir este o format dintr-o secven de caractere
incluse ntre caractere apostrof duble ("). Fiecare
caracter este reprezentat pe 8 bii i este tratat ca un
ntreg pozitiv. De exemplu, pentru a stoca mesajul
WAIT" este necesar definirea unei variabile de 32
de bii.
parameter nrChar = 4;
reg[nrChar*8-1:0] mesaj;
...
mesaj <= "WAIT";
2013, DanNICULA.ro - dan.nicula@unitbv.ro Curs HDL 27
Tipuri de date i obiecte
Tipul net: Acest tip de date modeleaz o conexiune
fizic ntre elementele structurale. Valoarea unei date
de acest tip este determinat de sursa sa, care poate
fi o specificaie de atribuire continu assign sau o
instaniere de component. Dac nu exist nici o
surs (driver de semnal) atunci data de tip net
pstreaz valoarea implicit z. Cel mai folosit tip din
aceast categorie este tipul wire.
Tipul register: Acest tip de date modeleaz un
element abstract de stocare a datelor. Valorile
obiectelor de acest tip pot fi atribuite din interiorul
specificaiilor always i initial. Valoarea implicit
a acestui tip de date este x.
2013, DanNICULA.ro - dan.nicula@unitbv.ro Curs HDL 28
(C) 2013 DanNICULA.ro
Curs HDL
15
Tipuri de date i obiecte
Srmele de conexiune modelate n Verilog pot fi de
tip net sau de tip register. Diferena dintre cele
dou tipuri const n modul n care se actualizeaz
valoarea obiectelor de acest tip. O srm de tip net
are valoarea continuu atribuit de ctre driverul
ei. O srm de tip register i pstreaz valoarea
pn la urmtoarea atribuire a unei noi valori.
Este absolut incorect afirmaia conform creia
obiectele de tip register modeleaz registre formate
din bistabile.
2013, DanNICULA.ro - dan.nicula@unitbv.ro Curs HDL 29
Tipuri de date i obiecte
Modele de pori logice, modelate cu cele dou tipuri de date.
wire outGate1; // declara un obiect de tip net (wire)
reg outGate2; // declara un obiect de tip register (reg)
assign outGate1 = a & b; // iesirea outGate1 este continuu evaluata
// conform expresiei (a AND b)
always @(a or b) // iesirea outGate2 este evaluata conform
outGate2 <= a & b; // expresiei (a AND b) doar cand exista o
// modificare a semnalului a sau a
// semnalului b
2013, DanNICULA.ro - dan.nicula@unitbv.ro Curs HDL 30
(C) 2013 DanNICULA.ro
Curs HDL
16
Tipuri de date i obiecte
wire Tip folosit cel mai frecvent pentru
declararea de srme. Corespunde
modelului unei srme fizice.
reg Tip folosit cel mai frecvent pentru
declararea de srme "cu memorie".
Este folosit pentru modelarea ieirilor de
bistabile.
integer Tip folosit exclusiv la modelarea la nivel
nalt (nu pentru sintez) fiind echivalent
cu tipul reg pe 32 de bii.
2013, DanNICULA.ro - dan.nicula@unitbv.ro Curs HDL 31
Operatori
a = ~b;
// ~ este operator unar (complementare logica)
c = d & e;
// & este operator binar (functie logica AND)
f = g ? h : i;
// ?: este operator ternar (conditie, functie
// multiplexor) daca g=1, f=h, altfel f=i
2013, DanNICULA.ro - dan.nicula@unitbv.ro Curs HDL 32
(C) 2013 DanNICULA.ro
Curs HDL
17
Operatori aritmetici
+ plus (unar i binar);
- minus (unar i binar);
* multiplicare;
/ mprire;
% modulo.
2013, DanNICULA.ro - dan.nicula@unitbv.ro Curs HDL 33
Operatori relaionali
> mai mare;
< mai mic;
>= mai mare sau egal;
<= mai mic sau egal.
Rezultatul unui operator relaional este "adevrat"
(1) sau "fals (0) .
2013, DanNICULA.ro - dan.nicula@unitbv.ro Curs HDL 34
(C) 2013 DanNICULA.ro
Curs HDL
18
Operatori de egalitate
== egalitate logic;
!= inegalitate logic;
=== egalitate cu selecie;
!== inegalitate cu selecie.
Rezultatul unui operator de egalitate este "adevrat"
(1) sau "fals (0) .
2013, DanNICULA.ro - dan.nicula@unitbv.ro Curs HDL 35
Operatori logici
&& AND logic;
|| OR logic;
! negarea unar.
Rezultatul unui operator logici este "adevrat" (1)
sau "fals (0) . Operanzii vectori sunt evaluai ca 0
dac au toate valorile 0, altfel sunt evaluai ca 1.
2013, DanNICULA.ro - dan.nicula@unitbv.ro Curs HDL 36
(C) 2013 DanNICULA.ro
Curs HDL
19
Operatori logici pe vectori
~ negare bit cu bit;
& AND pe bii;
| OR pe bii;
^ XOR pe bii;
~^ XNOR pe bii.
Operatorii logici pe vectori opereaz "bit cu bit".
Rezultatul unui operator de pe vector este tot un
vector de dimensiunea operanzilor.
2013, DanNICULA.ro - dan.nicula@unitbv.ro Curs HDL 37
Operatori de reducere
& AND ntre toi biii vectorului;
~& inversul operatorului &;
| OR ntre toi biii vectorului;
~| inversul operatorului |;
^ XOR ntre toi biii vectorului;
~^ inversul operatorului ^.
Operatorii de reducere se aplic unui operand
vectori i produc rezultat pe un bit. Aceti operatori
sunt foarte utili n exprimarea unor funcii pe vectori
de dimensiune parametrizabil.
2013, DanNICULA.ro - dan.nicula@unitbv.ro Curs HDL 38
(C) 2013 DanNICULA.ro
Curs HDL
20
Operatori de deplasare
<< deplasare stnga;
>> deplasare dreapta.
Operatorii de deplasare produc deplasarea biilor
operandului din stnga cu numrul de poziii
precizat n dreapta, n direcia precizat de operator.
2013, DanNICULA.ro - dan.nicula@unitbv.ro Curs HDL 39
Operatori condiionali
<conditie> ? <expresie1> : <expresie0>
n cazul condiiei adevrate, operatorul ntoarce
valoarea <expresie1>. Altfel, operatorul ntoarce
valoarea <expresie0>. Comportamentul este similar
cu cel al circuitului multiplexor.
2013, DanNICULA.ro - dan.nicula@unitbv.ro Curs HDL 40
(C) 2013 DanNICULA.ro
Curs HDL
21
Operatori de concatenare i replicare
Concatenarea este operaia de alturare a biilor
ntr-un bus. Dou sau mai multe expresii care
semnific bii se pot altura pentru a forma o valoare
reprezentat pe mai muli bii. Operatorii de
concatenare sunt caracterele acolade: { i }. O
anumit expresie poate fi replicat de un numr de
ori n cadrul concatenrii.
2013, DanNICULA.ro - dan.nicula@unitbv.ro Curs HDL 41
Specificaii concurente
specificaia assign
(numit i specificaia de atribuire continu);
specificaia initial
(construcie lexical procedural executat o
singur dat);
specificaia always
(construcie lexical procedural executat la
infinit).
2013, DanNICULA.ro - dan.nicula@unitbv.ro Curs HDL 42
(C) 2013 DanNICULA.ro
Curs HDL
22
Sintaxa specificaiilor concurente
<atribuire_continua>
::= assign <tarie_driver>? <intarziere>?
<lista_de_atribuiri>
<specificatie_initial>
::=initial <specificatie_secventiala>
<specificatie_always>
::=always <specificatie_secventiala>
2013, DanNICULA.ro - dan.nicula@unitbv.ro Curs HDL 43
Specificaii secveniale
Specificaiile secveniale (procedurale) sunt
specificaii ce pot aprea doar n corpul
specificaiilor concurente initial sau always.
Aceste specificaii se execut strict n ordinea n
care apar n codul surs. Mai multe specificaii
secveniale pot fi grupate ntr-un bloc ce se
comport ca o singur specificaie prin delimitarea
sa prin cuvintele cheie begin i end.
2013, DanNICULA.ro - dan.nicula@unitbv.ro Curs HDL 44
(C) 2013 DanNICULA.ro
Curs HDL
23
Specificaii de atribuire secveniale
Atribuiri secveniale blocante
atriburi cu simbolul =
Atribuiri secveniale neblocante
atriburi cu simbolul <=
2013, DanNICULA.ro - dan.nicula@unitbv.ro Curs HDL 45
Specificaii de atribuire secveniale
module blockingNonblocking ();
reg a, b, c, d, e, f;
initial
begin
// valori initiale
a = 1'b0;
b = 1'b0;
c = 1'b0;
// modificari ale valorilor cu
// atribuiri blocante
a = #10 1'b1;
b = #2 1'b1;
c = #4 1'b1;
#50
a = #10 1'b0;
b = #2 1'b0;
c = #4 1'b0;
end
initial
begin
// valori initiale
d <= 1'b0;
e <= 1'b0;
f <= 1'b0;
// modificari ale valorilor cu
// atribuiri neblocante
d <= #10 1'b1;
e <= #2 1'b1;
f <= #4 1'b1;
#50
d <= #10 1'b0;
e <= #2 1'b0;
f <= #4 1'b0;
end
2013, DanNICULA.ro - dan.nicula@unitbv.ro Curs HDL 46
(C) 2013 DanNICULA.ro
Curs HDL
24
Atribuiri secveniale blocante
// valori initiale
a = 1'b0;
b = 1'b0;
c = 1'b0;
// modificari ale valorilor cu
// atribuiri blocante
a = #10 1'b1;
b = #2 1'b1;
c = #4 1'b1;
#50
a = #10 1'b0;
b = #2 1'b0;
c = #4 1'b0;
2013, DanNICULA.ro - dan.nicula@unitbv.ro Curs HDL 47
Atribuiri secveniale neblocante
// valori initiale
d <= 1'b0;
e <= 1'b0;
f <= 1'b0;
// modificari ale valorilor cu
// atribuiri neblocante
d <= #10 1'b1;
e <= #2 1'b1;
f <= #4 1'b1;
#50
d <= #10 1'b0;
e <= #2 1'b0;
f <= #4 1'b0;
2013, DanNICULA.ro - dan.nicula@unitbv.ro Curs HDL 48
(C) 2013 DanNICULA.ro
Curs HDL
25
Specificaii condiionale
if (<conditie>) begin
<specificatii_secventiale1>
end
[else begin
<specificatii_secventiale0>
end]
if (a_i && b_i) begin
// selectia este AND intre doua intrari
y_o <= c_i ^ d_i;
end
else begin
y_o <= e_i | f_i;
end
2013, DanNICULA.ro - dan.nicula@unitbv.ro Curs HDL 49
Specificaii condiionale
// nr. reset clk en ld cnt sh up lf out++
// ------------------------------------------------
// 1 0 X X X X X X X 0
// 2 1 ^ 0 X X X X X out
// 3 1 ^ 1 1 X X X X data
// 4 1 ^ 1 0 1 X 1 X out+1
// 5 1 ^ 1 0 1 X 0 X out-1
// 6 1 ^ 1 0 0 1 X 1 out<<1
// 7 1 ^ 1 0 0 1 X 0 out>>1
// 8 1 ^ 1 0 0 0 X X out
always @(posedge clk_i or negedge reset_ni) begin
if (!reset_ni) begin
registru_o <= 8'b0; // linia nr. 1
end
else begin
if (enable_i) begin // linia nr. 345678
if (load_i) begin
registru_o <= data_i; // linia nr. 3
end
else begin
if (count_i) begin
if (up_i) begin // linia nr. 45
registru_o <= registru_o + 1; // linia nr. 4
end
else begin
registru_o <= registru_o - 1; // linia nr. 5
end
end
else begin // linia nr. 67
if (sh_i) begin
if (left_i) begin
registru_o <= registru_o << 1; // linia nr. 6
end
else begin
registru_o <= registru_o >> 1; // linia nr. 7
end
end // linia nr. 8 ("if (sh_i)" nu are "else")
end
end
end // linia nr.2 ("if (enable_i)" nu are "else")
end
end
2013, DanNICULA.ro - dan.nicula@unitbv.ro Curs HDL 50
(C) 2013 DanNICULA.ro
Curs HDL
26
Specificaii condiionale
// nr. reset clk en ld cnt sh up lf out++
// ------------------------------------------------
// 1 0 X X X X X X X 0
// 2 1 ^ 0 X X X X X out
// 3 1 ^ 1 1 X X X X data
// 4 1 ^ 1 0 1 X 1 X out+1
// 5 1 ^ 1 0 1 X 0 X out-1
// 6 1 ^ 1 0 0 1 X 1 out<<1
// 7 1 ^ 1 0 0 1 X 0 out>>1
// 8 1 ^ 1 0 0 0 X X out
2013, DanNICULA.ro - dan.nicula@unitbv.ro Curs HDL 51
Specificaii de selecie
case (<expresie>)
valoare{, valoare}:
<specificatii_secventiale>
[default:
<specificatii_secventiale>]
endcase
always @(func_i or leftOp_i or rightOp_i) begin
case (func_i)
`ADD : rez_o <= leftOp_i + rightOp_i;
`SUB : rez_o <= leftOp_i - rightOp_i;
`XOR : rez_o <= leftOp_i ^ rightOp_i;
`AND : rez_o <= leftOp_i & rightOp_i;
`PASS_L : rez_o <= leftOp_i;
`NEG_L : rez_o <= ~leftOp_i;
default : rez_o <= 8'b0;
endcase
end
2013, DanNICULA.ro - dan.nicula@unitbv.ro Curs HDL 52
(C) 2013 DanNICULA.ro
Curs HDL
27
Specificaii de iteraii (1)
forever
<specificatii_secventiale>
repeat (<expresie>)
<specificatii_secventiale>
while (<expresie>)
<specificatii_secventiale>
for (<atribuire_initiala>; <expresie>; <atribuire_pas>)
<specificatii_secventiale>
2013, DanNICULA.ro - dan.nicula@unitbv.ro Curs HDL 53
Specificaii de iteraii (2)
reg clk;
initial begin
clk <= 1'b0;
#5 forever // primul front la 5ns
#10 clk <= ~clk; // complementeaza la fiecare 10ns
end
2013, DanNICULA.ro - dan.nicula@unitbv.ro Curs HDL 54
(C) 2013 DanNICULA.ro
Curs HDL
28
Specificaii de control temporal
Controlul ntrzierii const din specificarea unui interval
de timp ntre momentul apariiei specificaiei i momentul
executrii efective a acesteia. O ntrziere a execuiei
specificaiei secveniale este marcat n cod prin
precedarea acesteia de simbolul # i de un numr ce
reprezint numrul de uniti de timp cu care va fi intrziat
execuia.
#<intarziere> <specificatie_secventiala>
initial begin
#5 semnal = 1; // specificatia 1
#6 semnal = 2; // specificatia 2
#2 semnal = 3; // specificatia 3
end
2013, DanNICULA.ro - dan.nicula@unitbv.ro Curs HDL 55
Specificaii de control temporal
Controlul evenimentelor const din specificarea unei
condiii bazate pe semnale care determin execuia
specificaiei asociate. Evenimentele pot fi controlate de
fronturi se semnale sau de nivele de semnale. Controlul
evenimentului asociat unei specificaii secveniale
determin ntrzierea execuiei specificaiei pn la
ndeplinirea condiiei impuse.
@ <eveniment> <specificatie_secventiala>
@(posegde clk) semnal <= semnal + 1;
@(posedge clk or negedge reset_n) semnal <= 8'b0;
@(semnalA or semnalB) semnal <= 'bz;
2013, DanNICULA.ro - dan.nicula@unitbv.ro Curs HDL 56
(C) 2013 DanNICULA.ro
Curs HDL
29
Directive de compilare (1)
Directivele de compilare nu descriu sisteme hardware ci
transmit simulatorului anumite informaii utilizate n
procesul de simulare.
La compilarea unei directive de compilare, efectul acesteia
rmne pn la terminarea procesului de compilare, care
poate conine chiar mai multe fiiere.
Directivele de compilare se identific n cod prin cuvintele
cheie rezervate precedate de caracterul `.
Efectul unor directive de compilare poate fi ntrerupt de
directive de compilare complementare.
2013, DanNICULA.ro - dan.nicula@unitbv.ro Curs HDL 57
Directive de compilare (2)
`define i `undefine: utilizate pentru
substituie de texte, similar cu utilizarea directivei C
#define. O substituie impus cu `define este
valabil pn la apariia directivei `undefine sau
pn la compilarea toturor fiierelor.
`ifdef, `ifndef, `else, `endif: utilizate
pentru compilri condiionate.
2013, DanNICULA.ro - dan.nicula@unitbv.ro Curs HDL 58
(C) 2013 DanNICULA.ro
Curs HDL
30
Directive de compilare (3)
`include: utilizat pentru includerea "in-line" a
textului dintr-un fiier n codul surs, n locul
apariiei directivei.
`resetall: utilizat pentru anularea tuturor
directivelor de compilare anterioare.
`timescale: utilizat pentru asocierea unei valori
absolute unitii de timp Verilog.
2013, DanNICULA.ro - dan.nicula@unitbv.ro Curs HDL 59
Modelarea circuitelor elementare
Circuite combinaionale
Circuite de multiplexare
Codificator/decodificator
Latch D
Bistabil D/RS/T/JK
Numrtoare sincrone
Automate secveniale sincrone
2013, DanNICULA.ro - dan.nicula@unitbv.ro Curs HDL 60
(C) 2013 DanNICULA.ro
Curs HDL
31
Modelarea circuitelor logice cu assign
wire A, B, C, D;
wire F; // iesirea se declara ca wire
assign F = ~(A&B | C&D); // se folosesc regulile de precedenta ale
// operatorilor
wire[7:0] aBus; // semnale de 8 biti
wire[7:0] bBus;
wire G, H, I, J, K;
assign G = (aBus == 8'h78); // 8 intrari, functia este 1 daca intrarea
// este egala cu 8'h78
assign H = (aBus == bBus); // 16 intrari, functia este 1 daca intrarea
// aBus (8 biti) este egala cu
// intrarea bBus (8 biti)
assign I = |(aBus); // 8 biti, OR pe biti, echivalent cu (aBus != 0)
assign J = (~(aBus ^ bBus)); // 16 biti, echivalent cu (aBus==bBus)
assign K = (aBus[0] & &bBus); // 7 biti, AND intre toti bitii semnalului bBus
// si bitul [0] al semnalului aBus,
// echivalent cu &{aBus[0], bBus}
2013, DanNICULA.ro - dan.nicula@unitbv.ro Curs HDL 61
Modelarea circuitelor logice cu always
wire A, B, C, D;
reg L; // iesirea se declara ca reg
always @(A or B or C or D) // cuvantul or este doar "liantul" pentru
// lista de senzitivitati (nu semnifica
// operatorul logic OR)
L <= ~(A&B | C&D);
wire[1:0] sel;
wire i0, i1, i2, i3;
reg mux;
always @(sel or i0 or i1 or i2 or i3)
case (sel)
2'b00: mux <= i0;
2'b01: mux <= i1;
2'b10: mux <= i2;
default: mux <= i3;
endcase
2013, DanNICULA.ro - dan.nicula@unitbv.ro Curs HDL 62
(C) 2013 DanNICULA.ro
Curs HDL
32
Circuite de multiplexare
wire mux
assign mux = sel ? i1 : i0;
reg mux;
always @(sel or i0 or i1)
if (~sel)
mux <= i0;
else
mux <= i1;
2013, DanNICULA.ro - dan.nicula@unitbv.ro Curs HDL 63
Codificator
always @(A)
casex(A)
8'b1xxx_xxxx: Y <= 3'b111; // 7
8'b01xx_xxxx: Y <= 3'b110; // 6
8'b001x_xxxx: Y <= 3'b101; // 5
8'b0001_xxxx: Y <= 3'b100; // 4
8'b0000_1xxx: Y <= 3'b011; // 3
8'b0000_01xx: Y <= 3'b010; // 2
8'b0000_001x: Y <= 3'b001; // 1
8'b0000_0001: Y <= 3'b000; // 0
default: Y <= 3'bx; // nici o intrare activa intrare
// activa
endcase
2013, DanNICULA.ro - dan.nicula@unitbv.ro Curs HDL 64
(C) 2013 DanNICULA.ro
Curs HDL
33
Decodificator
module decoder(
A_i, // intrarea decodificatorului
E_i, // validare intrare
Y_o // iesirea decodificatorului
);
input[2:0] A_i;
input E_i;
output[7:0] Y_o;
reg[7:0] Y_o;
reg E_o;
always @(A_i or E_i) // intrari codificator
if (E_i) Y_o <= (1'b1 << A_i); else
Y_o <= 8'b0; // circuit nevalidat la intrare
endmodule
2013, DanNICULA.ro - dan.nicula@unitbv.ro Curs HDL 65
Latch D
Dac semnalul de ceas este 1, atunci ieirea
copiaz intrarea. Altfel, ieirea nu este re-evaluat
i, n consecin, valoarea acesteia este pstrat.
// latch D
always @(clk or d)
if (clk)
q <= d;
2013, DanNICULA.ro - dan.nicula@unitbv.ro Curs HDL 66
(C) 2013 DanNICULA.ro
Curs HDL
34
Bistabil D
n momentele determinate de frontul pozitiv al
semnalului de ceas, bistabilul memoreaz intrarea.
// bistabil D
always @(posedge clk)
q <= d;
// bistabil D cu reset asincron activ high
always @(posedge clk or posedge reset)
if (reset) q <= 1'b0; else
q <= d;
2013, DanNICULA.ro - dan.nicula@unitbv.ro Curs HDL 67
Bistabil RS
// bistabil D cu set si reset sincron active low si reset asincron
activ low
// resetAsync_n clk setSync_n resetSync_n q+
// ----------------------------------------------
// 0 x x x 0
// 1 ^ 0 x 1
// 1 ^ 1 0 0
// 1 ^ 1 1 q (pastreaza starea)
always @(posedge clk or negedge resetAsync_n)
if (~resetAsync_n) q <= 1'b0; else // reset asincron
if (~setSync_n) q <= 1'b1; else // set prioritar
if (~resetSync_n) q <= 1'b0; // nu exista 'else',
// pastreaza starea
2013, DanNICULA.ro - dan.nicula@unitbv.ro Curs HDL 68
(C) 2013 DanNICULA.ro
Curs HDL
35
Bistabil T
// bistabil T cu reset asincron activ low
// reset_n clk t q+
// --------------------
// 0 x x 0
// 1 ^ 1 ~q
// 1 ^ 0 q // implicit
always @(posedge clk or negedge reset_n)
if (~reset_n) q <= 1'b0; else
if (t) q <= ~q;
2013, DanNICULA.ro - dan.nicula@unitbv.ro Curs HDL 69
Bistabil JK
// bistabil JK cu reset asincron activ low
// reset_n clk j k q+
// -----------------------
// 0 x x x 0
// 1 ^ 0 0 q // implicit
// 1 ^ 0 1 0
// 1 ^ 1 0 1
// 1 ^ 1 1 ~q
always @(posedge clk or negedge reset_n)
if (~reset_n)
q <= 1'b0;
else
case({j,k})
2'b01 : q <= 1'b0;
2'b10 : q <= 1'b1;
2'b11 : q <= ~q;
default: ; // nu atribuie nimic, pastreaza valoarea
endcase
2013, DanNICULA.ro - dan.nicula@unitbv.ro Curs HDL 70
(C) 2013 DanNICULA.ro
Curs HDL
36
Numrtoare sincrone (1)
reg[7:0] count;
always @(posedge clk or negedge reset_n)
if (~reset_n)
count <= 8'b0; // initializarea asincrona a numaratorului
else
count <= count + 1; // starea viitoare este (starea curenta + 1)
2013, DanNICULA.ro - dan.nicula@unitbv.ro Curs HDL 71
Numrtoare sincrone (2)
// numarator in sens crescator/descrescator si validare a numararii
// reset_n clk en up count+
// ----------------------------
// 0 x x x 0
// 1 ^ 0 x count (pastreaza starea)
// 1 ^ 1 1 count+1 (numara in sens crescator)
// 1 ^ 1 0 count-1 (numara in sens descrescator)
reg[7:0] count;
always @(posedge clk or negedge reset_n)
if (~reset_n) begin
count <= 8'b0; // initializarea asincrona a numaratorului
end
else begin
if (en) begin
if (up) begin
count <= count + 1; // starea viitoare este (starea curenta + 1)
end
else begin
count <= count - 1; // starea viitoare este (starea curenta - 1)
end
end // daca en=0, pastreaza starea
end
2013, DanNICULA.ro - dan.nicula@unitbv.ro Curs HDL 72
(C) 2013 DanNICULA.ro
Curs HDL
37
Automate secveniale sincrone (1)
//modelarea tranzitiilor
always @(posedge clk_i or negedge reset_ni)
if (~reset_ni) begin
stare_o <= s0_p; // stare initiala
end
else begin
case (stare_o)
s0_p: if (a_i) begin
stare_o <= s0_p;
end
else begin
stare_o <= s1_p;
end
s1_p: stare_o <= a_i ? s0_p : s2_p;
s2_p: stare_o <= s3_p;
s3_p: stare_o <= s0_p;
default: stare_o <= s0_p;
endcase
end
2013, DanNICULA.ro - dan.nicula@unitbv.ro Curs HDL 73
Automate secveniale sincrone (2)
2013, DanNICULA.ro - dan.nicula@unitbv.ro Curs HDL 74
(C) 2013 DanNICULA.ro
Curs HDL
38
Modelarea ieirilor automatelor
n funcie de cum sunt proiectate ieirile, automatele pot fi
clasificate n:
Mealy: ieirile depind de att de starea curent ct i de intrrile
automatului;
Moore: ieirile depind exclusiv de starea curent a automatului.
n funcie de latena ieirilor, automatele pot fi clasificate n:
Automate imediate: ieirile depind combinaional de starea
curent;
Automate cu ntrziere: ieirile depind cu o ntrziere de un ceas
fa de starea curent.
2013, DanNICULA.ro - dan.nicula@unitbv.ro Curs HDL 75
Modelarea ieirilor automatelor Mealy (1)
wire mealyImediat1_o;
reg mealyImediat2_o;
assign mealyImediat1_o = ((stare_o == s1_p) & a_i) |
((stare_o == s3_p) & ~a_i);
always @(stare_o or a_i)
case (stare_o)
s0_p: if (a_i) begin
mealyImediat2_o <= 1'b1;
end
else begin
mealyImediat2_o <= 1'b0;
end
s1_p: mealyImediat2_o <= 1'b0;
s2_p: mealyImediat2_o <= 1'b0;
s3_p: mealyImediat2_o <= ~a_i;
default: mealyImediat2_o <= 1'b0;
endcase
2013, DanNICULA.ro - dan.nicula@unitbv.ro Curs HDL 76
(C) 2013 DanNICULA.ro
Curs HDL
39
Modelarea ieirilor automatelor Mealy (2)
reg mealyIntarziere_o;
always @(posedge clk_i or negedge reset_ni)
if (~reset_ni) begin
mealyIntarziere_o <= 1'b0;
end
else begin
mealyIntarziere_o <= ((stare_o == s1_p) & a_i) |
((stare_o == s3_p) & ~a_i);
end
2013, DanNICULA.ro - dan.nicula@unitbv.ro Curs HDL 77
Modelarea ieirilor automatelor Moore
wire mooreImediat_o;
reg mooreIntarziere_o;
assign mooreImediat_o = (stare_o == s1_p)
(stare_o == s2_p)
(stare_o == s3_p);
always @(posedge clk_i or negedge reset_ni)
if (~reset_ni) begin
mooreIntarziere_o <= 1'b0;
end
else begin
mooreIntarziere_o <= (stare_o == s1_p)
(stare_o == s2_p)
(stare_o == s3_p);
end
2013, DanNICULA.ro - dan.nicula@unitbv.ro Curs HDL 78
(C) 2013 DanNICULA.ro
Curs HDL
40
Automat cu stri codificate "one-hot"
2013, DanNICULA.ro - dan.nicula@unitbv.ro Curs HDL 79
Noiuni avansate de Verilog
Task-uri i funcii
Modelarea memoriilor
Generarea structurilor hardware
Modelarea la nivel de poart logic
Modelarea la nivel de tranzistor
Task-uri i funcii de sistem
Primitive definite de utilizator
Blocuri specify
Accesarea semnalelor n ierarhie
Funcii PLI
Fiiere VCD
2013, DanNICULA.ro - dan.nicula@unitbv.ro Curs HDL 80
(C) 2013 DanNICULA.ro
Curs HDL
41
Task-uri i funcii de sistem
Task-uri de afiare: $display, $write, $strobe,
$monitor;
Task-uri de accesare a fiierelor: $fopen, $fdisplay,
$readmemb, $readmemh;
Task-uri pentru controlul simulrii: $stop, $finish;
Task-uri pentru verificri temporale: $setup, $hold,
$setuphold, $width, $period, $skew, $recovery;
Funcii referitoare la timpul simulrii: $time;
Funcii pentru generarea numerelor aleatorii: $random;
2013, DanNICULA.ro - dan.nicula@unitbv.ro Curs HDL 81

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