Documente Academic
Documente Profesional
Documente Cultură
Laborator 12
1. Operatorul de atribuire blocking vs non-blocking
module b_vs_nb;
integer nba,nbb,nbc;
integer ba,bb,bc;
initial begin
ba = 4;
bb = 5;
bc = 6;
#1 ba = 2;
bb = ba;
bc = bb;
ba = bc;
#1;
end
initial begin
nba <= 4;
nbb <= 5;
nbc <= 6;
#2 nba <= 2;
nbb <= nba;
nbc <= nbb;
nba <= nbc;
#1;
end
endmodule
Un bloc initial sau always poate conține fie doar atribuiri blocking, fie doar
atribuiri non-blocking, nu un mix al celor două.
http://www.asic-world.com/tidbits/blocking.html
Fundamentele Calculatoarelor 2018 - 2019 Laborator 12
2. Flip-flop-uri în Verilog
2.1. D flip-flop
module d_ff(
input d,clk,rst_b,
output reg q
);
// Always secvential care se executa
// la aparitia unui front crescator
// al clock-ului activ la 1
// sau la aparitia unui front descrescator
// al reset-ului activ la 0
always @ (posedge clk, negedge rst_b ) begin
if (!rst_b) begin
// Daca avem reset activ, adica !rst_b==1
// q este resetat, adica ia valoarea 0
q <= 1'd0;
module d_ff_tb;
// Declarare variabile
reg d,clk,rst_b;
wire q;
// Instantiere DUT
d_ff ff(
.d(d),
.clk(clk),
.rst_b(rst_b),
.q(q)
);
// Clock-ul se genereaza folosind
// structuri repetitive
initial begin
clk = 1'b0;
repeat (12) begin
// Utilizam un clock
// cu perioada de 20
// unitati de timp
#10 clk = ~clk;
end
end
// Pentru claritate, fiecare semnal
// de intrare are blocul sau
// "initial" de generare de stimuli
initial begin
rst_b = 1'b0;
#5 rst_b = 1'b1;
//#30 rst_b = 1'b1;
//#1 rst_b = 1'b0;
//#2 rst_b = 1'b1;
end
// Se dau valori aleatoare lui d
initial begin
d = 1'b0;
#25 d = 1'b1;
#25 d = 1'b0;
#25 d = 1'b1;
#1 d = 1'b0;
#1 d = 1'b1;
end
endmodule
3. Registre
Registrele nu sunt altceva decât mai multe flip-flop-uri de același tip puse
împreună. Registrele sunt de 4 tipuri general vorbind:
• PIPO - Paralel Input Paralel Output
• PISO - Paralel Input Serial Output
• SIPO - Serial Input Paralel Output
• SISO - Serial Input Serial Output
initial begin
clk = 1'b1;
repeat (12) begin
#10 clk = ~clk;
end
end
initial begin
rst_b = 0;
#5 rst_b = 1;
end
initial begin
d = 'hAB;
#25 d = 'hEF;
#25 d = 'hCD;
#23 d = 'hBA;
#7 d = 'hBE;
#12 d = 'hCF;
end
a) Registrul cu intrare serială și ieșire serială este utilizat pentru a face deplasări
(shiftări) la stânga sau la dreapta, în funcție de necesități. Implementați folosind
descriere comportamentală un registru de deplasare la dreapta cu numele
siso_plus. Hint: Datele seriale intră în partea stângă și ies pe partea dreaptă,
direcția deplasării fiind de la stânga la dreapta.
initial begin
clk = 1'b1;
repeat (36) begin
#5 clk = ~clk;
end
end
initial begin
rst_b = 0;
#2 rst_b = 1;
end
initial begin
d_ser = 1;
#22 d_ser = 0;
#24 d_ser = 1;
#23 d_ser = 0;
#30;
end
c) După ce simulați testbench-ul anterior creat, în fereastra Sim dați click pe butonul
+ de la siso_plus_tb și apoi dați click pe numele instanței DUT-ului ( în cazul
nostru, instanța se numește SISO). În fereastra Objects apar semnalele din
instanță. Adăugați în fereastra Wave semnalul data din DUT selectându-l în
fereastra Objects și apăsând combinația de taste Ctrl+W sau dând click dreapta
și alegând opțiunea Add Wave .
Dați click pe butonul + din dreptul vectorului data adăugat în fereastra Wave
pentru a vedea fiecare componentă a vectorului ca mai jos.
d) Selectați toate semnalele din fereastra Wave și dați click dreapta pe ele și mergeți
la opțiunea Radix → Binary . Mutați semnalul q_ser sub vectorul data și
explicați ce se întâmplă cu valorile din fiecare flip-flop din registru. A se observa
cum se deplasează în interiorul vectorului data informația primită în mod serial
și după cât timp ajunge la ieșirea q_ser.