<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ro">
	<id>http://wiki.dcae.pub.ro/index.php?action=history&amp;feed=atom&amp;title=CID_Aplicatii_7</id>
	<title>CID Aplicatii 7 - Revizia istoricului</title>
	<link rel="self" type="application/atom+xml" href="http://wiki.dcae.pub.ro/index.php?action=history&amp;feed=atom&amp;title=CID_Aplicatii_7"/>
	<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=CID_Aplicatii_7&amp;action=history"/>
	<updated>2026-06-04T15:06:19Z</updated>
	<subtitle>Istoricul versiunilor pentru această pagină din wiki</subtitle>
	<generator>MediaWiki 1.35.14</generator>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=CID_Aplicatii_7&amp;diff=6922&amp;oldid=prev</id>
		<title>Gvpopescu: Pagină nouă: ==1. 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 si latc...</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=CID_Aplicatii_7&amp;diff=6922&amp;oldid=prev"/>
		<updated>2021-04-11T05:00:22Z</updated>

		<summary type="html">&lt;p&gt;Pagină nouă: ==1. 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 si latc...&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Pagină nouă&lt;/b&gt;&lt;/p&gt;&lt;div&gt;==1. Latch-ul==&lt;br /&gt;
Latch-urile sunt dispozitive elementare de memorare, sensibile la nivelul semnalelor de intrare. Exemple de astfel de dispozitive sunt latch-urile de tip SR si latch-urile de tip D.&lt;br /&gt;
&lt;br /&gt;
===Latch-ul SR===&lt;br /&gt;
Latch-ul de tip SR poate fi realizat cu doua porti SI NU sau SAU NU si este un dispozitiv asincron controlat de starile semnalelor S (set) si R (reset). Tabelul de adevar al acestui circuit este prezentat mai jos. &lt;br /&gt;
&lt;br /&gt;
[[Fișier:Latch SR.png|400px]]&lt;br /&gt;
&lt;br /&gt;
Atunci cand &amp;#039;&amp;#039;S&amp;#039;&amp;#039; este 1 si &amp;#039;&amp;#039;R&amp;#039;&amp;#039; este 0, iesirea &amp;#039;&amp;#039;Q&amp;#039;&amp;#039; va deveni 1, iar &amp;#039;&amp;#039;Qn&amp;#039;&amp;#039; va deveni 0. Atunci cand &amp;#039;&amp;#039;R&amp;#039;&amp;#039; este 1 si &amp;#039;&amp;#039;S&amp;#039;&amp;#039; este 0, iesirea &amp;#039;&amp;#039;Q&amp;#039;&amp;#039; se resteaza (devine 0), iar &amp;#039;&amp;#039;Qn&amp;#039;&amp;#039; devine 1. Starea de memorare apare atunci cand atat &amp;#039;&amp;#039;R&amp;#039;&amp;#039; cat si &amp;#039;&amp;#039;S&amp;#039;&amp;#039; sunt 0 in acelasi timp. Cazul in care &amp;#039;&amp;#039;R&amp;#039;&amp;#039; si &amp;#039;&amp;#039;S&amp;#039;&amp;#039; sunt 1 in acelasi timp duce la un comportament nedorit. (atat &amp;#039;&amp;#039;Q&amp;#039;&amp;#039; cat si &amp;#039;&amp;#039;Qn&amp;#039;&amp;#039; vor fi 0, ceea ce este incorect din punct de vedere al logicii dorite – &amp;#039;&amp;#039;Qn&amp;#039;&amp;#039; sa fie negatul lui &amp;#039;&amp;#039;Q&amp;#039;&amp;#039;). In plus, daca din aceasta stare se doreste trecerea in starea de memorare (&amp;#039;&amp;#039;R&amp;#039;&amp;#039; = 0, &amp;#039;&amp;#039;S&amp;#039;&amp;#039; = 0), poate aparea oscilatia. In realitate, cele doua porti nu vor avea acelasi timp de propagare datorita variatiilor de productie si circuitul va ajunge in cele din urma intr-o stare stabila, nepredictibila.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Descrierea structurala a latch-ului SR&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
`timescale 1ns/1ps&lt;br /&gt;
module latch_SR(&lt;br /&gt;
    input R,&lt;br /&gt;
    input S,&lt;br /&gt;
    output Q,&lt;br /&gt;
    output Qn&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
assign #1 Q = ~(Qn | R);&lt;br /&gt;
assign #1 Qn = ~(Q | S);&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Modul de test pentru latch-ul SR&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
`timescale 1ns/1ps&lt;br /&gt;
&lt;br /&gt;
module latch_SR_TB();&lt;br /&gt;
&lt;br /&gt;
reg S_t, R_t;&lt;br /&gt;
wire Q_t, Qn_t;&lt;br /&gt;
&lt;br /&gt;
initial begin&lt;br /&gt;
       R_t = 1;&lt;br /&gt;
       S_t = 0;&lt;br /&gt;
    #5 R_t = 0;&lt;br /&gt;
    #5 S_t = 1;&lt;br /&gt;
    #5 S_t = 0;&lt;br /&gt;
    #5 R_t = 1;&lt;br /&gt;
       S_t = 1;&lt;br /&gt;
    #5 $stop();&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
latch_SR DUT(&lt;br /&gt;
    .S(S_t),&lt;br /&gt;
    .R(R_t),&lt;br /&gt;
    .Q(Q_t),&lt;br /&gt;
    .Qn(Qn_t)&lt;br /&gt;
);&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Latch-ul de tip D===&lt;br /&gt;
Latch-ul de tip D elimina problema combinatiilor nedorite de la iesire. Acesta modifica iesire doar atunci cand semnalul de enable (&amp;#039;&amp;#039;E&amp;#039;&amp;#039;) este 1. Altfel, atunci cand &amp;#039;&amp;#039;E&amp;#039;&amp;#039; este 0, va memora starea anterioara (&amp;#039;&amp;#039;Qt-1&amp;#039;&amp;#039;).&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Latch D.png|500px]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Descrierea comportamentala a latch-ului D&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module latch_D(&lt;br /&gt;
    input D,&lt;br /&gt;
    input E,&lt;br /&gt;
    output Q&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
assign Q = (E == 1) ? D : Q;&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Modul de test pentru latch-ul D&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
`timescale 1ns/1ps&lt;br /&gt;
&lt;br /&gt;
module latch_D_TB();&lt;br /&gt;
&lt;br /&gt;
reg D_t, E_t;&lt;br /&gt;
wire Q_t;&lt;br /&gt;
&lt;br /&gt;
initial begin&lt;br /&gt;
       D_t = 0;&lt;br /&gt;
       E_t = 1;&lt;br /&gt;
    #1 D_t = 1;&lt;br /&gt;
    #1 D_t = 0;&lt;br /&gt;
    #1 E_t = 0;&lt;br /&gt;
    #1 D_t = 1;&lt;br /&gt;
    #1 D_t = 0;&lt;br /&gt;
    #5 $stop();&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
latch_D DUT1(&lt;br /&gt;
    .D(D_t),&lt;br /&gt;
    .E(E_t),&lt;br /&gt;
    .Q(Q_t)&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==2. Bistabilul de tip D==&lt;br /&gt;
Bistabilul de tip D este un dispozitiv de memorare ce salveaza valoarea intrarii pe unul din fronturile ceasului (in mod uzual, frontul crescator). El poate fi obtinut prin conectarea a doua latch-uri de tip D, conform schemei de mai jos. De obicei, singura iesire care ne intereseaza este &amp;#039;&amp;#039;Q&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Bistabil D.png|300px]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Descrierea comportamentala a bistabilului D&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module flipflop_D(&lt;br /&gt;
    input data_in,&lt;br /&gt;
    input clock,&lt;br /&gt;
    output reg data_out&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
always@(posedge clock) begin&lt;br /&gt;
    data_out &amp;lt;= data_in;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Modulul de test pentru bistabilul de tip D&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
`timescale 1ns/1ps&lt;br /&gt;
&lt;br /&gt;
module flipflop_D_TB();&lt;br /&gt;
&lt;br /&gt;
reg data_in_t, clock_t;&lt;br /&gt;
wire data_out_t;&lt;br /&gt;
&lt;br /&gt;
initial begin&lt;br /&gt;
       data_in_t = 0;&lt;br /&gt;
    #2 data_in_t = 1;&lt;br /&gt;
    #4 data_in_t = 0;&lt;br /&gt;
    #5 $stop();&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
initial begin&lt;br /&gt;
    clock_t = 0;&lt;br /&gt;
    forever #1 clock_t = ~ clock_t;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
flipflop_D DUT(&lt;br /&gt;
    .data_in(data_in_t),&lt;br /&gt;
    .clock(clock_t),&lt;br /&gt;
    .data_out(data_out_t)&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Observatie:&amp;#039;&amp;#039;&amp;#039; Atunci cand avem un circuit secvential, se foloseste atribuirea non-blocanta (&amp;quot;&amp;lt;=”)&lt;br /&gt;
&lt;br /&gt;
===Bistabilul de tip D cu reset sincron===&lt;br /&gt;
Resetarea unui bistabil inseamna aducerea valorii memorate la 0 sau la o alta valoare de reset definita de cel care proiecteaza circuitul. Vom considera in exemplul nostru ca resetarea va face 0 valoarea memorata. Un reset sincron inseamna ca acesta va actiona pe frontul crescator al ceasului. Asta inseamna ca reset-ul nu va fi prezent in lista de sensitivitati a circuitului, dar valoarea sa va fi interogata la fiecare front crescator de ceas si, daca acesta este activ, bistabilul va fi resetat. Vom considera ca activ palierul de 0 al semnalului de reset.&lt;br /&gt;
&lt;br /&gt;
[[Fișier:FFD Reset Sincron.svg]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Descrierea comportamentala a bistabilului D cu reset sincron&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module flipflop_D(&lt;br /&gt;
    input data_in,&lt;br /&gt;
    input reset,&lt;br /&gt;
    input clock,&lt;br /&gt;
    output reg data_out&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
always@(posedge clock) begin&lt;br /&gt;
    if(reset == 0)&lt;br /&gt;
        data_out &amp;lt;= 0;&lt;br /&gt;
    else&lt;br /&gt;
        data_out &amp;lt;= data_in;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Modulul de test pentru bistabilul de tip D cu reset&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
`timescale 1ns/1ps&lt;br /&gt;
&lt;br /&gt;
module flipflop_D_TB();&lt;br /&gt;
&lt;br /&gt;
reg data_in_t;&lt;br /&gt;
reg reset_t;&lt;br /&gt;
reg clock_t;&lt;br /&gt;
wire data_out_t;&lt;br /&gt;
&lt;br /&gt;
initial begin&lt;br /&gt;
data_in_t = 1;&lt;br /&gt;
       reset_t = 1;&lt;br /&gt;
    #2 reset_t = 0;&lt;br /&gt;
    #2 reset_t = 1;&lt;br /&gt;
    #2 data_in_t = 0;&lt;br /&gt;
    #4 data_in_t = 1;&lt;br /&gt;
    #5 $stop();&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
initial begin&lt;br /&gt;
    clock_t = 0;&lt;br /&gt;
    forever #1 clock_t = ~ clock_t;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
flipflop_D DUT(&lt;br /&gt;
    .data_in(data_in_t),&lt;br /&gt;
    .reset(reset_t),&lt;br /&gt;
    .clock(clock_t),&lt;br /&gt;
    .data_out(data_out_t)&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Bistabilul de tip D cu reset asincron===&lt;br /&gt;
Un reset asincron inseamna ca acesta va actiona asincron, fara a tine cont de ceas. Asta inseamna ca reset-ul va fi prezent in lista de sensitivitati a circuitului, trecerea sa in 0 (frontul cazator) cauzand imediat resetarea circuitului. De asemenea, orice eveniment de front crescator de ceas ce apare cat timp reset-ul este activ, va duce la mentinerea resetarii circuitului. Vom considera ca activ palierul de&lt;br /&gt;
0 al semnalului de reset si frontul cazator al acestuia ca declansator al resetarii asincrone.&lt;br /&gt;
&lt;br /&gt;
[[Fișier:FFD Reset Asincron.svg]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Descrierea comportamentala a bistabilului D cu reset asincron&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module flipflop_D(&lt;br /&gt;
    input data_in,&lt;br /&gt;
    input reset,&lt;br /&gt;
    input clock,&lt;br /&gt;
    output reg data_out&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
always@(posedge clock or negedge reset) begin&lt;br /&gt;
    if(reset == 0)&lt;br /&gt;
        data_out &amp;lt;= 0;&lt;br /&gt;
    else&lt;br /&gt;
        data_out &amp;lt;= data_in;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==3. Eliminarea hazardului folosind bistabile==&lt;br /&gt;
Vom considera circuitul din ora anterioara de aplicatii si vom exemplifica eliminarea hazardului folosind elementele de sincronizare.&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Eliminare hazard.png|400px]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Implementarea circuitului cu iesiri sincronizate&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
`timescale 1ns/1ps&lt;br /&gt;
&lt;br /&gt;
module Circuit(&lt;br /&gt;
    input a,&lt;br /&gt;
    input b,&lt;br /&gt;
    input clock,&lt;br /&gt;
    output c_sinc,&lt;br /&gt;
    output d_sinc&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
wire c, d;&lt;br /&gt;
&lt;br /&gt;
assign #1 c = ~(a | b);&lt;br /&gt;
assign #1 d = ~(c &amp;amp; b);&lt;br /&gt;
&lt;br /&gt;
always@(posedge clock) begin&lt;br /&gt;
    c_sinc &amp;lt;= c;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
always@(posedge clock) begin&lt;br /&gt;
    d_sinc &amp;lt;= d;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Modulul de test pentru circuitul cu iesiri sincronizate&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
`timescale 1ns/1ps&lt;br /&gt;
&lt;br /&gt;
module Circuit_TB();&lt;br /&gt;
&lt;br /&gt;
reg a_t, b_t, clock_t;&lt;br /&gt;
wire c_sinc_t, d_sinc_t;&lt;br /&gt;
&lt;br /&gt;
initial begin&lt;br /&gt;
       a_t = 0;&lt;br /&gt;
       b_t = 0;&lt;br /&gt;
    #5 b_t = 1;&lt;br /&gt;
    #30 $stop();&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
initial begin&lt;br /&gt;
    clock_t = 0;&lt;br /&gt;
    forever #5 clock_t = ~ clock_t;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
Circuit DUT(&lt;br /&gt;
    .a(a_t),&lt;br /&gt;
    .b(b_t),&lt;br /&gt;
    .clock(clock_t),&lt;br /&gt;
    .c_sinc(c_sinc_t),&lt;br /&gt;
    .d_sinc(d_sinc_t)&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Gvpopescu</name></author>
	</entry>
</feed>