D Latches Onder de Knie: Ontwerp, Werking en Belangrijke Verschillen
Een flip-flop vangt data op zijn input op de positieve of negatieve flank van een klok. Het belangrike is dat wat er met de data gebeurt na de klokflank tot de volgende klokflank, niet weerspiegeld wordt in de output. Een latch daarentegen, vangt niet op de flank van een klok, maar de output volgt de input zolang de enable pin geassert is.
Ontwerp
In dit voorbeeld bouwen we een latch met drie inputs en één output. De input d staat voor data (0 of 1), rstn voor actieve-lage reset en en voor enable waarmee de input data naar de output gelatcht wordt. Reset actief-laag betekent dat het ontwerverelement gereset wordt wanneer deze input 0 wordt. De waarde van output q wordt bepaald door inputs d, en en rstn.
Blokdiagram van de D latch
module d_latch (
input d, // 1-bit input voor data
input en, // 1-bit input voor enable
input rstn, // 1-bit input voor actieve-lage reset
output reg q // 1-bit output voor data
);
// Dit always blok wordt getriggerd wanneer en/rstn/d verandert
// Als reset geassert is, wordt output 0
// Anders, zolang enable hoog is, volgt output q input d
always @ (en or rstn or d)
if (!rstn) q <= 0;
else if (en) q <= d;
endmodule
Let op dat de gevoeligheidslijst van het always blok alle signalen bevat die nodig zijn om de output bij te werken. Dit blok wordt getriggerd wanneer een van de signalen in de lijst zijn waarde verandert. Ook krijgt q alleen de waarde van d wanneer en hoog is, en is dus een positieve latch.
Schema
Schema van de D latch
Testbench
Testbench schema
module tb_latch;
// Variabelen om waarden naar het ontwerp te sturen
reg d;
reg en;
reg rstn;
reg [2:0] delay;
reg [1:0] delay2;
integer i;
// Instantieer ontwerp en verbind poorten met TB signalen
d_latch dl0 (
.d (d),
.en (en),
.rstn (rstn),
.q (q)
);
// Stimulus voor het testen van het ontwerp
initial begin
$monitor ("[%0t] en=%0b d=%0b q=%0b", $time, en, d, q);
// 1. Initialiseer testbench variabelen
d <= 0; en <= 0; rstn <= 0;
// 2. De-assert reset
#10 rstn <= 1;
// 3. Willekeurig d en enable veranderen
for (i = 0; i < 5; i = i+1) begin
delay = $random;
delay2 = $random;
#(delay2) en <= ~en;
#(delay) d <= i;
end
end
endmodule
Om onze testbench signalen meer willekeurig te asserten en de-asserten, hebben we een reg variabele delay van 3 bits gedeclareerd die waarden van 0 tot 7 kan aannemen. Deze variabele wordt gebruikt om de toewijzing van d en en te vertragen voor verschillende patronen in elke lus.
Output
Simulatie Log:
ncsim> run [0] en=0 d=0 q=0 [11] en=1 d=0 q=0 [18] en=0 d=0 q=0 [19] en=0 d=1 q=0 [20] en=1 d=1 q=1 [25] en=1 d=0 q=0 [27] en=0 d=0 q=0 [32] en=0 d=1 q=0 [33] en=1 d=1 q=1 [34] en=1 d=0 q=0 ncsim: *W,RNQUIE: Simulation is complete.
Golfformaat van de D latch simulatie
Verilog
- Common‑Emitter Versterker: Ontwerp, Meting, en TerugkoppelingsTechnieken
- Een Hoog‑Versterking Differentiele Versterker Bouwen Die Werkt als Op‑Amp
- Precisie Spanningvolger: Op-amp Terugkoppeling Onder de Loep voor Accuraat Signaalvolgen
- Niet-Inverterende Versterker: Bouwen, Testen en Beheersen van Op-amp Versterkingscontrole
- C# Fundamentals: Invoer en Uitvoer Basis
- C++ input en output: een praktische gids
- C Input en Output (I/O) Beheersen: scanf() en printf() Uitgelegd
- C++ Streams Beheersen: cout, cin, cerr, clog – Praktische Handleiding
- Invoer en uitvoer in C programmeren: Volledige gids
- Python I/O en Module Imports onder de knie krijgen: Een praktische gids
- Java Input & Output beheersen: printen, lezen en formatteren