Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Industrial programming >> Verilog

D-Latches meistern: Design, Funktionsweise und wesentliche Unterschiede

Ein Flipflop erfasst Daten an seinem Eingang an der positiven oder negativen Flanke eines Taktsignals. Wichtig zu beachten ist: Was auch immer mit den Daten nach der Taktflanke bis zur nächsten Taktflanke geschieht, wird nicht im Ausgang widergespiegelt. Ein Latch hingegen erfasst nicht an der Taktflanke, sondern der Ausgang folgt dem Eingang, solange der Enable-Pin aktiviert ist.

Design

In diesem Beispiel bauen wir ein Latch mit drei Eingängen und einem Ausgang. Der Eingang d steht für Daten (0 oder 1), rstn für Active-Low-Reset und en für Enable, das bewirkt, dass die Eingangsdaten an den Ausgang durchgereicht werden. Active-Low-Reset bedeutet, dass das Designelement zurückgesetzt wird, wenn dieser Eingang auf 0 geht – der Reset ist also aktiv, wenn sein Wert niedrig ist. Der Wert des Ausgangs q wird durch die Eingänge d, en und rstn bestimmt.

module d_latch (
  input d,      // 1-Bit Dateneingang
  input en,     // 1-Bit Enable-Eingang
  input rstn,   // 1-Bit Active-Low-Reset
  output reg q  // 1-Bit Datenausgang
);
  // Dieser always-Block wird "immer" getriggert, wann immer en/rstn/d sich ändert
  // Wenn Reset aktiviert ist, wird Ausgang 0
  // Solange Enable high ist, folgt Ausgang q Eingang d
  always @ (en or rstn or d)
    if (!rstn) q <= 0;
    else if (en) q <= d;
endmodule

Beachten Sie, dass die Empfindlichkeitsliste des always-Blocks alle Signale enthält, die zur Aktualisierung des Ausgangs erforderlich sind. Dieser Block wird ausgelöst, wann immer sich eines der Signale in der Empfindlichkeitsliste ändert. Zudem erhält q den Wert von d nur dann, wenn en high ist – es handelt sich also um ein positives Latch.

Schaltplan

Testbench

module tb_latch;
  // Variablen deklarieren, die Werte zum Design treiben
  reg d;
  reg en;
  reg rstn;
  reg [2:0] delay;
  reg [1:0] delay2;
  integer i;
  wire q;
  
  // Design instanziieren und Design-Ports mit TB-Signalen verbinden
  d_latch dl0 (
    .d(d),
    .en(en),
    .rstn(rstn),
    .q(q)
  );
  
  // Dieser initial-Block bildet den Stimulus zum Testen des Designs
  initial begin
    $monitor("[%0t] en=%0b d=%0b q=%0b", $time, en, d, q);
    
    // 1. Testbench-Variablen initialisieren
    d <= 0; en <= 0; rstn <= 0;
    
    // 2. Reset freigeben
    #10 rstn <= 1;
    
    // 3. d und Enable zufällig ändern
    for (i = 0; i < 5; i = i+1) begin
      delay = $random;
      delay2 = $random;
      #(delay2) en <= ~en;
      #(delay) d <= i;
    end
  end
endmodule

Um unseren Testbench Signale in einer zufälligeren Weise zu setzen und zurückzusetzen, haben wir eine reg-Variable namens delay der Größe 3 Bits deklariert, sodass sie Werte von 0 bis 7 annehmen kann. Dann wird die delay-Variable verwendet, um die Zuweisung von d und en zu verzögern und so in jeder Schleife unterschiedliche Muster zu erhalten.

Ausgabe

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

Klicken Sie auf das Bild, um es zu vergrößern.

Verilog

  1. Gegentaktverstärker (Common-Emitter): Design, Messung und Gegenkopplungstechniken
  2. Hochverstärkender Differenzverstärker als Operationsverstärker (Op-Amp) aufbauen
  3. Präzisions-Spannungsfolger: Op-Amp-Rückkopplung für exaktes Signal-Tracking meistern
  4. C# Grundlagen: Eingabe und Ausgabe Essentials
  5. C++-Eingabe und Ausgabe meistern: Ein praktischer Leitfaden
  6. C Eingabe und Ausgabe (I/O) meistern: scanf() und printf() erklärt
  7. Python I/O & Modul-Importe meistern: Praxisleitfaden
  8. Java Ein- und Ausgabe meistern: Drucken, Lesen und Formatieren Ihrer Daten
  9. C++ Streams meistern: cout, cin, cerr, clog – Praktischer Guide
  10. Eingabe und Ausgabe in C meistern: scanf, printf & Co.