Diferență între revizuiri ale paginii „CID aplicatii 7 : Circuite secventiale elementare”
Linia 218: | Linia 218: | ||
Realizați un modul de test care să respecte la generarea stimulilor forma de unda prezentată în secțiunea de introducere teoretică, la '''Bistabilul de tip D cu reset asincron'''. | Realizați un modul de test care să respecte la generarea stimulilor forma de unda prezentată în secțiunea de introducere teoretică, la '''Bistabilul de tip D cu reset asincron'''. | ||
− | '''Indicație''': Frontul căzător | + | '''Indicație''': Frontul căzător al semnalului ''reset'' va trebui să fie adăugat în lista de sensitivități a blocului always care determină modificarea lui ''data_out''. |
Versiunea de la data 17 februarie 2023 16:24
Hazardul combinațional
Hazardul apare atunci când modificarea unei intrări a unui circuit combinațional determină modificări nedorite ale ieșirii. Aceste variații apar datorită diferențelor de întârzieri pe diverse căi de la intrare către ieșire.
De unde aceste întârzieri? Fiecare poartă este, așa cum am văzut la începutul aplicațiilor, un circuit electronic format, de obicei, din tranzistoare MOS. Răspunsul acestor dispozitive nu este instantaneu, introducând întârzieri. Timpul scurs de la modificarea unei intrări a unei porți până la modificarea corespunzătoare a ieșirii se numește timp de propagare.
În figura următoare avem evidențiat timpul de propagare printr-o poartă SAU (Tp). Acesta este reprezentat de timpul scurs de la modificarea lui a până la modificarea ieșirii.
Avănd un circuit cu mai multe porți în cascadă, căile prin care anumite semnale ajung la intrările unei anumite porți pot diferi. Datorită timpilor de propagare diferiți care afectează aceste semnale până să ajungă la poarta curentă și a timpului de propagare efectiv al porții curente, pot apărea la ieșire tranziții nedorite ale semnalelor. Dacă la ieșire se așteaptă ca linia să rămană constant în 1, dar apare o scurtă tranziție prin 0, hazardul se numește 1 static. Dacă la ieșire se așteaptă ca linia să rămană constant în 0, dar apare o scurtă tranziție prin 1, hazardul se numește 0 static. Dacă se așteaptă o tranziție la ieșire, dar apare un regim tranzitoriu cu numeroase tranziții până la stabilizare, hazardul se numește dinamic.
Pentru a înțelege mai bine, să considerăm exemplul de mai jos:
Observăm că intrările porții P2 urmează căi diferite: semnalul c este ieșirea unei porți, având o întârziere cauzată de timpul de propagare al porții P1, pe când semnalul b vine direct de la intrare, propagarea prin fir fiind neglijabilă. Să considerăm cazul în care intrarea a rămane permanent în 0, iar intrarea b comută la un moment dat din 0 în 1. Inițial, semnalul c este 1, iar d este 1. După comutarea lui b, semnalul c va comuta din 1 in 0, iar d va rămane 1. Acesta este cazul ideal. În realitate, datorită timpilor de propagare ai porților logice P1 și P2, vom avea o scurtă tranziție prin 0:
Latch-ul
Latch-urile sunt dispozitive elementare de memorare, sensibile la nivelul semnalelor de intrare. Exemple de astfel de dispozitive sunt latch-urile de tip SR și latch-urile de tip D.
Latch-ul SR
Latch-ul de tip SR poate fi realizat cu două porți SI NU sau SAU NU și este un dispozitiv asincron controlat de stările semnalelor S (set) și R (reset). Tabelul de adevăr al acestui circuit este prezentat mai jos.
Atunci când S este 1 și R este 0, ieșirea Q va deveni 1, iar Qn va deveni 0. Atunci când R este 1 și S este 0, ieșirea Q se resetează (devine 0), iar Qn devine 1. Starea de memorare apare atunci când atât R cât și S sunt 0 în același timp. Cazul în care R și S sunt 1 în același timp duce la un comportament nedorit. (atât Q cât și Qn vor fi 0, ceea ce este incorect din punct de vedere al logicii dorite – Qn să fie negatul lui Q). În plus, dacă din aceasta stare se dorește trecerea în starea de memorare (R = 0, S = 0), poate apărea oscilația. În realitate, cele două porți nu vor avea același timp de propagare datorită variațiilor de producție și circuitul va ajunge în cele din urma într-o stare stabilă, nepredictibilă.
Latch-ul de tip D
Latch-ul de tip D elimină problema combinațiilor nedorite de la ieșire. Acesta modifică ieșire doar atunci când semnalul de enable (E) este 1. Altfel, atunci când E este 0, va memora starea anterioara (Qt-1).
Bistabilul de tip D
Bistabilul de tip D este un dispozitiv de memorare ce salvează valoarea intrării pe unul din fronturile ceasului (în mod uzual, frontul crescător). El poate fi obținut prin conectarea a două latch-uri de tip D, conform schemei de mai jos. De obicei, singura ieșire care ne interesează este Q.
Comportamentul bistabilului de tip D poate fi observat în forma de undă următoare. Modificările lui data_out sunt determinate de fronturile crescătoare ale semnalului clock. La apariția acestora, data_out va lua valoarea intrării data_in.
Bistabilul de tip D cu reset sincron
Resetarea unui bistabil înseamnă aducerea valorii memorate la 0 sau la o altă valoare de reset definită de cel care proiectează circuitul. Vom considera în exemplul nostru că semnalul de reset va fi activ în 0 și va face 0 valoarea memorată atunci când este activ. Un reset sincron înseamnă că acesta va acționa asupra valorii memoratedata_out pe frontul crescător al ceasului.
Bistabilul de tip D cu reset asincron
Un reset asincron înseamnă că acesta va acționa asincron, fără a ține cont de ceas. Acest lucru înseamnă că el va acționa asupra valorii memorate imediat ce devine activ. În exemplele noastre, vom considera semnalul de reset ca fiind activ în 0. Trecerea sa în 0 (frontul căzător) determină imediat resetarea circuitului. De asemenea, orice eveniment de front crescător de ceas ce apare cât timp reset-ul este activ, va duce la menținerea resetării circuitului.
Exemple
Exemplul 1: Evidențierea hazardului combinațional
Implementați circuitul cu porți logice prezentat în secțiunea de introducere teoretică și reproduceți în modulul de testare variațiile semnalelor a și b propuse, astfel încât să observăm pe ieșirea d hazardul.
Deoarece în simulare propagarea este ideală, va trebui să introducem un timp de propagare folosind #n. Acesta va avea efect doar în simulare și va fi ignorat la o eventuală sinteză.
Pentru modulul de test, va trebui să alegem un timp de modificare a valorilor semnalelor mai mare decât timpul de propagare ales. Aici, vom folosi 1ns timp de propagare și 5ns timp de variație a intrărilor in testbench.
Implementarea Verilog a circuitului
`timescale 1ns/1ps
module Circuit(
input a,
input b,
output c,
output d
);
assign #1 c = ~(a | b);
assign #1 d = ~(c & b);
endmodule
Implementarea unui modul de test care să evidențieze hazardul
`timescale 1ns/1ps
module Circuit_TB();
reg a_t, b_t;
wire c_t, d_t;
initial begin
a_t = 0;
b_t = 0;
#5 b_t = 1;
#5 $stop();
end
Circuit DUT(
.a(a_t),
.b(b_t),
.c(c_t),
.d(d_t)
);
endmodule
Exemplul 2: Descrierea comportamentală a latch-ului de tip D
Descrierea Verilog a modulului
module latch_D(
input D,
input E,
output Q
);
assign Q = (E == 1) ? D : Q;
endmodule
Modul de test pentru latch-ul D
`timescale 1ns/1ps
module latch_D_TB();
reg D_t, E_t;
wire Q_t;
initial begin
D_t = 0;
E_t = 1;
#1 D_t = 1;
#1 D_t = 0;
#1 E_t = 0;
#1 D_t = 1;
#1 D_t = 0;
#5 $stop();
end
latch_D DUT1(
.D(D_t),
.E(E_t),
.Q(Q_t)
);
endmodule
Exemplul 3: Descrierea comportamentală a bistabilului de tip D
Descrierea Verilog a modulului
module flipflop_D(
input data_in,
input clock,
output reg data_out
);
always@(posedge clock) begin
data_out <= data_in;
end
endmodule
Modulul de test pentru bistabilul de tip D
`timescale 1ns/1ps
module flipflop_D_TB();
reg data_in_t, clock_t;
wire data_out_t;
initial begin
data_in_t = 0;
#2 data_in_t = 1;
#4 data_in_t = 0;
#5 $stop();
end
initial begin
clock_t = 0;
forever #1 clock_t = ~ clock_t;
end
flipflop_D DUT(
.data_in(data_in_t),
.clock(clock_t),
.data_out(data_out_t)
);
endmodule
Observatie: Atunci cand avem un circuit secvential, se foloseste atribuirea non-blocanta ("<=”)
Exerciții
Exercițiul 1
Descrieți structural latch-ul de tip SR, conform schemei din secțiunea de introducere teoretică. Puteți simula întârzierile prin porți folosind #1.
Realizați un modul de test care să pună în evidență funcționarea. Respectați la generarea stimulilor următoarea variație (fiecare segment de timp durează 5ns).
Exercițiul 2
Modificați descrierea bistabilului de tip D prezentată în exemple, astfel încât acesta să permită resetarea sincronă. Semnalul de reset va fi activ în 0.
Realizați un modul de test care să respecte la generarea stimulilor forma de unda prezentată în secțiunea de introducere teoretică, la Bistabilul de tip D cu reset sincron.
Exercițiul 3
Modificați descrierea bistabilului de tip D prezentată în exemple, astfel încât acesta să permită resetarea asincronă. Semnalul de reset va fi activ în 0.
Realizați un modul de test care să respecte la generarea stimulilor forma de unda prezentată în secțiunea de introducere teoretică, la Bistabilul de tip D cu reset asincron.
Indicație: Frontul căzător al semnalului reset va trebui să fie adăugat în lista de sensitivități a blocului always care determină modificarea lui data_out.