Sunteți pe pagina 1din 41

Curs HDL

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 1


Curs HDL

Bibliografie Curs

2013, DanNICULA.ro - dan.nicula@unitbv.ro Curs HDL 3

Bibliografie Laborator

2013, DanNICULA.ro - dan.nicula@unitbv.ro Curs HDL 4

(C) 2013 DanNICULA.ro 2


Curs HDL

n curs de apariie...

2013, DanNICULA.ro - dan.nicula@unitbv.ro Curs HDL 5

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 3


Curs HDL

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 4


Curs HDL

Modul vot majoritar


module votMajoritar3Df ( module votMajoritar3Gl (
i1, // intrare de vot 1 i1, // intrare de vot 1
i2, // intrare de vot 2 i2, // intrare de vot 2
i3, // intrare de vot 3 i3, // intrare de vot 3
decizie // decizie in urma votului
decizie // decizie in urma votului
);
);
input i1, i2, i3;
input i1, i2, i3;
output decizie;
output decizie;
wire vot12;
wire vot12; wire vot13;
wire vot13; wire vot23;
wire vot23;
and (vot12, i1, i2);
assign vot12 = (i1 & i2); and (vot13, i1, i3);
assign vot13 = (i1 & i3); and (vot23, i2, i3);
assign vot23 = (i2 & i3); or (decizie, vot12, vot13, vot23);
endmodule

assign 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 5


Curs HDL

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 6


Curs HDL

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 7


Curs HDL

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 8


Curs HDL

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 9


Curs HDL

Comparaie Verilog-VHDL: bistabil D

entity dff is module dff (d, clk, q);


port (d, clk: in bit; q: input d, clk;
out bit); output q;
end dff;

architecture basic of dff is

begin
process (clk) always @(posedge clk)
begin
if (rising_edge(clk))
then
q <= d;
q <= d;
end if;
endmodule
end process;
end basic;
2013, DanNICULA.ro - dan.nicula@unitbv.ro Curs HDL 19

Comparaie Verilog-VHDL: poarta AND

entity and2 is module and2 (a, b, y);


input a, b;
port (a, b: in bit; y:
out bit); output y;

end and2;

architecture basic2 of
and2 is
begin
y <= a and b; assign y = a & b;
end basic2; endmodule

2013, DanNICULA.ro - dan.nicula@unitbv.ro Curs HDL 20

(C) 2013 DanNICULA.ro 10


Curs HDL

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 11


Curs HDL

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 12


Curs HDL

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 13


Curs HDL

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 14


Curs HDL

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 15


Curs HDL

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 16


Curs HDL

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 17


Curs HDL

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 18


Curs HDL

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 19


Curs HDL

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 20


Curs HDL

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 21


Curs HDL

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 22


Curs HDL

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 (); initial
reg a, b, c, d, e, f; begin
initial // valori initiale
begin d <= 1'b0;
// valori initiale e <= 1'b0;
a = 1'b0; f <= 1'b0;
b = 1'b0; // modificari ale valorilor cu
c = 1'b0; // atribuiri neblocante
// modificari ale valorilor cu d <= #10 1'b1;
// atribuiri blocante e <= #2 1'b1;
a = #10 1'b1; f <= #4 1'b1;
b = #2 1'b1; #50
c = #4 1'b1; d <= #10 1'b0;
#50 e <= #2 1'b0;
a = #10 1'b0; f <= #4 1'b0;
b = #2 1'b0; end
c = #4 1'b0;
end

2013, DanNICULA.ro - dan.nicula@unitbv.ro Curs HDL 46

(C) 2013 DanNICULA.ro 23


Curs HDL

Atribuiri secveniale blocante


// valori initiale a = #10 1'b1;
a = 1'b0; b = #2 1'b1;
b = 1'b0; c = #4 1'b1;
c = 1'b0; #50
// modificari ale valorilor cu a = #10 1'b0;
// atribuiri blocante b = #2 1'b0;
c = #4 1'b0;

2013, DanNICULA.ro - dan.nicula@unitbv.ro Curs HDL 47

Atribuiri secveniale neblocante


// valori initiale d <= #10 1'b1;
d <= 1'b0; e <= #2 1'b1;
e <= 1'b0; f <= #4 1'b1;
f <= 1'b0; #50
// modificari ale valorilor cu d <= #10 1'b0;
// atribuiri neblocante e <= #2 1'b0;
f <= #4 1'b0;

2013, DanNICULA.ro - dan.nicula@unitbv.ro Curs HDL 48

(C) 2013 DanNICULA.ro 24


Curs HDL

Specificaii condiionale
if (<conditie>) begin if (a_i && b_i) begin
<specificatii_secventiale1> // selectia este AND intre doua intrari
y_o <= c_i ^ d_i;
end
end
[else begin
else begin
<specificatii_secventiale0> y_o <= e_i | f_i;
end] 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 else begin // linia nr. 67
end if (sh_i) begin
else begin if (left_i) begin
if (count_i) begin registru_o <= registru_o << 1; // linia nr. 6
end
if (up_i) begin // linia nr. 45
else begin
registru_o <= registru_o + 1; // linia nr. 4 registru_o <= registru_o >> 1; // linia nr. 7
end end
else begin end // linia nr. 8 ("if (sh_i)" nu are "else")
registru_o <= registru_o - 1; // linia nr. 5 end
end 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 25


Curs HDL

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 26


Curs HDL

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 27


Curs HDL

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 28


Curs HDL

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 29


Curs HDL

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 30


Curs HDL

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 31


Curs HDL

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 32


Curs HDL

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 33


Curs HDL

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 34


Curs HDL

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 35


Curs HDL

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 36


Curs HDL

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 37


Curs HDL

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 38


Curs HDL

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 39


Curs HDL

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 40


Curs HDL

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

(C) 2013 DanNICULA.ro 41

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