Documente Academic
Documente Profesional
Documente Cultură
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
Evaluare:
Colocviu
Bibliografie Curs
Bibliografie Laborator
n curs de apariie...
<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>
endmodule
Aspectul temporal
Concurena evenimentelor
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.]
Comparaie Verilog-VHDL
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
end and2;
architecture basic2 of
and2 is
begin
y <= a and b; assign y = a & b;
end basic2; endmodule
Setul de valori
Numere reale
iruri
parameter nrChar = 4;
reg[nrChar*8-1:0] mesaj;
...
mesaj <= "WAIT";
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
Operatori aritmetici
Operatori relaionali
Operatori de egalitate
== egalitate logic;
!= inegalitate logic;
=== egalitate cu selecie;
!== inegalitate cu selecie.
Operatori logici
Operatori de reducere
Operatori de deplasare
Operatori condiionali
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).
<atribuire_continua>
::= assign <tarie_driver>? <intarziere>?
<lista_de_atribuiri>
<specificatie_initial>
::=initial <specificatie_secventiala>
<specificatie_always>
::=always <specificatie_secventiala>
Specificaii secveniale
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
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
Specificaii condiionale
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
forever
<specificatii_secventiale>
repeat (<expresie>)
<specificatii_secventiale>
while (<expresie>)
<specificatii_secventiale>
reg clk;
initial begin
clk <= 1'b0;
#5 forever // primul front la 5ns
#10 clk <= ~clk; // complementeaza la fiecare 10ns
end
initial begin
#5 semnal = 1; // specificatia 1
#6 semnal = 2; // specificatia 2
#2 semnal = 3; // specificatia 3
end
Circuite combinaionale
Circuite de multiplexare
Codificator/decodificator
Latch D
Bistabil D/RS/T/JK
Numrtoare sincrone
Automate secveniale sincrone
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 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
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;
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
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
Latch D
// latch D
always @(clk or d)
if (clk)
q <= d;
Bistabil D
Bistabil RS
Bistabil T
Bistabil JK
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)
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