Sunteți pe pagina 1din 6

REGISTRE, MEMORII, NUMRTOARE

IMPLEMENTATE N VERILOG

1. Scopul lucrrii
Descrierea unor structuri de memorare realizate cu latch-uri sau bistabile
(registru, memoria static RAM), precum i descrierea automatelor bistabile (bistabilele
JK i T) i a structurilor de numrare realizate cu acestea. nelegerea funcionrii
acestor structuri prin testarea lor prin simulare cu ajutorul programului Veriwell.

2. Aparate necesare
- calculator compatibil Pentium
- sistem de operare Windows 95 sau superior
- programul VeriWell 2.0, produs de Wellspring Solutions, versiunea
freeware, disponibil pe Internet

3. Consideraii teoretice
Folosind descrierea comportamental a bistabilului de tip D, discutat data
trecut i disponibil n fiierul bistabil_D.v, s ncercm s realizm o descriere
structural a registrului paralel pe 4 bii, reprezentat n figura 3.1. Descrierea poate fi
urmtoarea:
module register_4(out, in, clock, reset);

input clock, reset;


input[3:0] in;

output[3:0] out;

D_flipflop bistabil3(out[3], q_negat, in[3], 0, reset, clock),


bistabil2(out[2], q_negat, in[2], 0, reset, clock),
bistabil1(out[1], q_negat, in[1], 0, reset, clock),
bistabil0(out[0], q_negat, in[0], 0, reset, clock);

endmodule

Se folosete modelul D_flipflop din fiierul bistabil_D.v, cu intrarea


asincron SET dezactivat, iar fiierul de testare poate fi urmtorul:
in[3] in[2] in[1] in[0]

in[3] in[2] in[1] in[0] D D D D


CLK RESET CLK R CLK R CLK R CLK R
Q Q Q Q
out[3] out[2] out[1] out[0] CLK
RESET

out[3] out[2] out[1] out[0]


Fig. 3.1 Reprezentarea registrului paralel de 4 bii i structura sa intern
module test_reg_4;

reg clock, reset;


reg[3:0] counter;

1
wire[3:0] out;

initial begin clock = 0;


counter = 0;
forever #5 clock = ~clock;
end

always @(negedge clock) counter = counter + 1;

initial begin reset = 0;


#42 reset = 1;
#48 reset = 0;
#12 reset = 1;
#30 reset = 0;
#100 $stop;
end

register_4 reg_under_test(out, counter, clock, reset);

initial $vw_dumpvars;

endmodule

Un circuit destinat memorrii unui volum mare de date n sistemele numerice


este memoria RAM (Random Access Memory). Circuitul stocheaz biii de date ntr-
o matrice de memorie, la fel ca memoria ROM. Diferena const n faptul c informaia
util memorat n RAM trebuie mai nti s fie scris acolo, nainte de a fi citit.
Termenul RAM se traduce prin memorie cu acces aleator, care sugereaz faptul c
timpul pentru citirea/scrierea unui bit nu depinde de poziia bitului n matricea de
memorie. Exist dou tipuri constructive de memorie RAM: RAM static sau SRAM, n
care biii de date, odat ce au fost nscrii, sunt memorai att timp ct circuitul integrat
este alimentat cu tensiune, fr aplicarea altor semnale periodice din exterior, i RAM
dinamic sau DRAM, n care datele memorate trebuie s fie mereu remprosptate prin
citirea i apoi rescrierea lor periodic n locaiile respective de memorie, n caz contrar
ele pierzndu-se definitiv.
Dac admitem c semnalul de scriere a datelor n memorie, WRITE, este activ
pe 1 logic, atunci configuraia simplificat a unei memorii SRAM de 8 cuvinte a cte 4
bii este reprezentat n figura 3.2. Modelul Verilog al unei memorii SRAM de 256
cuvinte a cte 16 bii este dat n continuare (8 linii de adres i 16 linii de date):
DIN3 DIN2 DIN1 DIN0

A2 LATCH
DIN D Q DOUT
MATRICE DE MEMORIE
A1 DCD
SEL
8 4 CL
A0 WR
WR

una din cele 32 locatii de memorie


WRITE
DOUT3 DOUT2 DOUT1 DOUT0
Fig. 3.2 Structura unei memorii SRAM de 8 cuvinte de 4 bii
module mem(dout, din, address, write);

parameter word_dim = 16, // numarul de biti pe cuvant


add_dim = 8; // numarul de linii de adresa

input write;
input[word_dim - 1:0] din; // datele de intrare

2
input[add_dim - 1:0] address; // liniile de adresa

output[word_dim - 1:0] dout; // iesirea de date

reg[word_dim - 1:0] memory[0:(1'b1 << add_dim) - 1]; // memoria se


// defineste ca un sir de 256 registre pe 16 biti, iar inmultirea cu 2
// se face prin deplasare spre stanga

assign dout = memory[address];

always @(address or din or write)


if (write) memory[address] = din;

endmodule

Testarea funcionrii modulului de memorie se poate face cu urmtorul


program:
module test_mem;

parameter word_dim = 16,


add_dim = 8;

reg write;
reg[word_dim - 1:0] din;
reg[add_dim - 1:0] address;

wire[word_dim - 1:0] dout;

initial begin address = 0;


write = 0;
din = 16'b0100111110100001;
// memory_content.v este un fisier care contine datele memorate
$readmemb("memory_content.v", under_test_memory.memory);
#1 address = address + 1;
#1 address = address + 1;
#1 address = address + 1;
#1 address = address + 1;
#1 write = 1;
#1 write = 0;
#1 din = 16'b1111111110100001;
#1 write = 1;
#1 din = 16'b10100001;
#1 write = 0;
#4 $stop;
end

mem under_test_memory(dout, din, address, write);

initial $monitor("time=%0d add=%b din=%b write=%b dout=%b",


$time, address, din, write, under_test_memory.dout);

initial $vw_dumpvars;

endmodule

Bistabilul JK este cel mai complex bistabil i cel mai simplu automat cu stri
finite, numit i automatul finit elementar. Dac considerm reprezentarea din figura 3.3,
adic un circuit cu basculare pe front pozitiv, cu intrri asincrone de SET i RESET,
active pe 1 logic (cazul circuitului CMOS 4027), atunci un model Verilog al circuitului
este prezentat n continuare:

3
CLK J K S R Q Q
0 0 0 0 Q Q
S 0 1 0 0 0 1
J Q
1 0 0 0 1 0
CLK
1 1 0 0 Q Q
K Q x x
R x 1 0 1 0
x x x 0 1 0 1
x x x 1 1 1 1

Fig. 3.3 Bistabilul JK cu basculare pe front pozitiv i tabelul tranziiilor

module JK_flipflop(q, q_negat, j, k, set, reset, clock);

input j, k, set, reset, clock;


output q, q_negat;

reg q;

always @(posedge clock or posedge set or posedge reset)


if (set) #1 q = 1;
else if (reset) #1 q = 0;
else if(clock) case ({j,k})
2'b00: #2 q = q;
2'b01: #2 q = 0;
2'b10: #2 q = 1;
2'b11: #2 q = ~q;
endcase

assign #1 q_negat = ~q;

endmodule

n fiierul test_bistabil_JK.v s-a dat un exemplu de modul de testare a


funcionrii bistabilului JK. Cu acest circuit se pot construi diverse automate simple cu
funcie de numrtor. Un exemplu de numrtor asincron (sau divizor de frecven) cu
3 bistabile JK este prezentat n figura 3.4. Modelul circuitului este urmtorul:
module async_counter(q2, q1, q0, count, clock, reset);

input count, clock, reset;


output q2, q1, q0;

wire q1_negat, q0_negat;

JK_flipflop ff_2(q2, q2_negat, count, count, 0, reset, q1_negat),


ff_1(q1, q1_negat, count, count, 0, reset, q0_negat),
ff_0(q0, q0_negat, count, count, 0, reset, clock);

endmodule

count

0 1 2
S S S
J Q Q0 J Q Q1 J Q Q2
clock CLK CLK CLK
K Q K Q K Q
R R R

reset

Fig. 3.4 Numrtor asincron pe 3 bii realizat cu bistabile JK


Pentru testare se poate folosi urmtorul modul:

4
module test_async_counter;

reg count, clock, reset;

wire q2, q1, q0;

initial begin clock = 0;


forever #10 clock = ~clock;
end

initial begin count = 1;


reset = 1;
#35 reset = 0;
#200 count = 0;
#40 $stop;
end

async_counter our_counter(q2, q1, q0, count, clock, reset);

initial $vw_dumpvars;

endmodule

Schema unui numrtor sincron modulo 5 care numr cresctor este dat n
figura 3.5. Dac folosim din nou modelul bistabilului JK descris anterior, atunci
modelul Verilog al circuitului este urmtorul:
module sync_counter(q4, q2, q1, clock, reset);

input clock, reset;


output q4, q2, q1;
wire w1, q4_negat;

and #1 poarta_SI(w1, q1, q2);

JK_flipflop ff_4(q4, q4_negat, w1, 1, 0, reset, clock),


ff_2(q2, q2_negat, q1, q1, 0, reset, clock),
ff_1(q1, q1_negat, q4_negat, 1, 0, reset, clock);

endmodule

iar modulul de testare care verific funcionarea circuitului poate fi urmtorul:


module test_sync_counter;

reg clock, reset;

initial begin clock = 0;


forever #10 clock = ~clock;
end

4 2 1
S S S
J Q Q4 J Q Q2 J Q Q1
clock CLK CLK CLK
1 K Q K Q 1 K Q
R R R

reset

Fig. 3.5 Numrtor sincron modulo 5, realizat cu bistabile JK


initial begin
reset = 0;

5
#15 reset = 1;
#10 reset = 0;
#140 $stop;
end

sync_counter our_counter(q4, q2, q1, clock, reset);

initial $vw_dumpvars;

endmodule

4. Modul de lucru
4.1. Se lanseaz n execuie VeriWell 2.0 i se vizualizeaz fiierele
bistabil_D.v i registru_4biti.v. Se vizualizeaz i fiierul test_registru_4biti.v,
care este fiierul de generare a testului pentru registrul paralel de 4 bii. Se deschide un
proiect care conine cele 3 fiiere i se ruleaz, verificnd c nu exist erori de
compilare. Vizualizai formele de und i explicai funcionarea circuitului. Realizai
modelul unui registru serie de 4 bii i verificai funcionarea circuitului. Reconstruii
modelul registrului paralel, introducnd o intrare suplimentar (ENABLE), care s
permit memorarea datelor n registru, numai atunci cnd este activat pe 1 logic.
Verificai funcionarea circuitului.

4.2. Se vizualizeaz fiierele memorie_SRAM.v i test_memorie_SRAM.v


i se deschide proiectul care conine cele dou fiiere. Facei simularea circuitului i
verificai funcionarea corect a circuitului urmrind formele de und. Observai c nu
exist fiierul memory_content.v care conine date din memorie. n aceast situaie,
datele memorate au implicit valoarea necunoscut (X) pn cnd capt prin atribuire
noi valori n cadrul programului.

4.3. Vizualizai fiierele bistabil_JK.v i test_bistabil_JK.v i deschidei


proiectul care conine cele dou fiiere. Facei simularea circuitului i verificai
funcionarea corect a circuitului urmrind formele de und. Modificai modelul
bistabilului de tip JK, introducnd i posibilitatea ca ambele intrri asincrone de set i
reset s fie activate simultan, caz n care ieirile bistabilului se poziioneaz pe 1 logic.
Modificai i fiierul test_bistabil_JK.v pentru a pune n eviden acest eveniment i
repetai simularea circuitului, n toate situaiile posibile. Concepei i un model de
bistabil T i verificai funcionarea lui cu ajutorul unui modul de test.

4.4. Vizualizai cele dou fiiere numarator_asincron.v i


test_numarator_asincron.v i deschidei proiectul corespunztor, care conine nc
un fiier suplimentar care descrie bistabilul folosit: bistabil_JK.v. Facei simularea
circuitului i verificai funcionarea corect a circuitului urmrind formele de und.
Observai c resetarea numrtorului (sau resetarea bistabilelor din structur) se face
de la nceput, altfel starea lui iniial ar fi necunoscut (X).

4.5. Vizualizai cele dou fiiere numarator_sincron.v i


test_numarator_sincron.v i deschidei proiectul corespunztor. Facei simularea
circuitului i verificai funcionarea lui corect urmrind formele de und. Refacei
sinteza circuitului, folosind bistabile de tip T n locul bistabilelor JK. Construii modelul
unui numrtor sincron cu ncrcare paralel a datelor de intrare.

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