Menguasai D Latch: Desain, Operasi, dan Perbedaan Utama
Sebuah flip-flop menangkap data pada input-nya pada tepi positif atau negatif jam. Hal yang penting untuk diperhatikan adalah bahwa apa pun yang terjadi dengan data setelah tepi jam hingga tepi jam berikutnya tidak akan tercermin dalam output. Sebaliknya, latch tidak menangkap pada tepi jam, melainkan output mengikuti input selama pin enable diaktifkan.
Desain
Dalam contoh ini, kita akan membangun latch yang memiliki tiga input dan satu output. Input d adalah data yang dapat bernilai 0 atau 1, rstn adalah reset aktif-rendah, dan en adalah enable yang digunakan untuk membuat input data tertangkap ke output. Reset aktif-rendah berarti elemen desain akan direset ketika input ini bernilai 0, atau kata lainnya, reset aktif ketika nilainya rendah. Nilai output q ditentukan oleh input d, en, dan rstn.
module d_latch ( input d, // 1-bit input pin for data input en, // 1-bit input pin for enabling the latch input rstn, // 1-bit input pin for active-low reset output reg q); // 1-bit output pin for data output // This always block is "always" triggered whenever en/rstn/d changes // If reset is asserted then output will be zero // Else as long as enable is high, output q follows input d always @ (en or rstn or d) if (!rstn) q <= 0; else if (en) q <= d; endmodule
Perhatikan bahwa daftar sensitivitas pada blok always berisi semua sinyal yang diperlukan untuk memperbarui output. Blok ini akan terpicu setiap kali salah satu sinyal dalam daftar sensitivitas mengubah nilainya. Selain itu, q hanya akan mendapatkan nilai d ketika en tinggi, sehingga ini adalah latch positif.
Skematik
Testbench
module tb_latch; // Declare variables that can be used to drive values to the design reg d; reg en; reg rstn; reg [2:0] delay; reg [1:0] delay2; integer i; // Instantiate design and connect design ports with TB signals d_latch dl0 ( .d (d), .en (en), .rstn (rstn), .q (q)); // This initial block forms the stimulus to test the design initial begin $monitor ("[%0t] en=%0b d=%0b q=%0b", $time, en, d, q); // 1. Initialize testbench variables d <= 0; en <= 0; rstn <= 0; // 2. Release reset #10 rstn <= 1; // 3. Randomly change d and enable for (i = 0; i < 5; i=i+1) begin delay = $random; delay2 = $random; #(delay2) en <= ~en; #(delay) d <= i; end end endmodule
Untuk membuat testbench kita menyatakan dan meniadakan sinyal dengan cara yang lebih acak, kami mendeklarasikan variabel reg bernama delay dengan ukuran 3 bit sehingga dapat mengambil nilai dari 0 hingga 7. Kemudian variabel delay digunakan untuk menunda penugasan d dan en untuk mendapatkan pola yang berbeda di setiap loop.