Diferență între revizuiri ale paginii „CID aplicatii 7 : Circuite secventiale elementare”

De la WikiLabs
Jump to navigationJump to search
Linia 161: Linia 161:
  
 
always@(posedge clock) begin
 
always@(posedge clock) begin
     data_out <= data_in;
+
     data_out <= data_in; // atribuire non-blocanta
 
end
 
end
  
Linia 198: Linia 198:
  
 
'''Observatie:''' Atunci cand avem un circuit secvential, se foloseste atribuirea non-blocanta ("<=”)
 
'''Observatie:''' Atunci cand avem un circuit secvential, se foloseste atribuirea non-blocanta ("<=”)
 
  
 
==Exerciții==
 
==Exerciții==

Versiunea de la data 17 februarie 2023 16:26

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.

Comutare poarta SAU.png

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:

Circuit comb hazard.png

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:

Circuit comb hazard propagare.png

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.

Latch SR.png

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).

Latch D.png


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.

Bistabil D.png

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.

Forma unda bistabil.png

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.

Forma unda bistabil reset sincron.png

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.

Forma unda bistabil reset asincron.png


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; // atribuire non-blocanta
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).

Forma unda latchSR.png

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.