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

Verilog 4-zu-1 Multiplexer: Design und Implementierung

Was ist ein Mux oder Multiplexer?

Ein Multiplexer (kurz Mux) ist ein digitales Element, das Daten von einem der N Eingänge basierend auf dem Selekt-Signal an den Ausgang weiterleitet. Der unten gezeigte Fall ist für N=4. Ein 4-Bit-Multiplexer hätte N Eingänge à 4 Bits, wobei jeder Eingang über das Selekt-Signal an den Ausgang geschaltet werden kann.

sel ist ein 2-Bit-Eingang und kann vier Werte annehmen. Jeder Wert auf der Selekt-Leitung lässt einen der Eingänge an den Ausgangspin out durch.

sel a b c d out
0  3 7 1 9 3
1  3 7 1 9 7
2  3 7 1 9 1
3  3 7 1 9 9

Ein 4x1-Multiplexer kann auf verschiedene Arten implementiert werden. Hier sehen Sie zwei der gängigsten:

Mit assign-Statement

module mux_4to1_assign (
  input [3:0] a,  // 4-Bit Eingang a
  input [3:0] b,  // 4-Bit Eingang b
  input [3:0] c,  // 4-Bit Eingang c
  input [3:0] d,  // 4-Bit Eingang d
  input [1:0] sel, // Selekt-Signal
  output [3:0] out // 4-Bit Ausgang basierend auf sel
);
  // Wenn sel[1] 0 ist, wird (sel[0]? b:a) gewählt,
  // wenn sel[1] 1 ist, wird (sel[0]? d:c) gewählt
  // Wenn sel[0] 0, geht a zum Ausgang, sonst b;
  // wenn sel[0] 0, geht c zum Ausgang, sonst d
  assign out = sel[1] ? (sel[0] ? d : c) : (sel[0] ? b : a);
endmodule

Das Modul mux_4x1_assign hat vier 4-Bit-Dateneingänge, einen 2-Bit-Selekt-Eingang und einen 4-Bit-Datenausgang. Der Multiplexer wählt basierend auf dem Selekt-Signal sel mittels assign-Statement entweder a, b, c oder d aus.

Mit case-Statement

Beachten Sie, dass das Signal out als reg deklariert ist, da es in einem prozeduralen Block wie always verwendet wird.

module mux_4to1_case (
  input [3:0] a,
  input [3:0] b,
  input [3:0] c,
  input [3:0] d,
  input [1:0] sel,
  output reg [3:0] out
);
  // Dieser always-Block wird ausgeführt, wann immer a/b/c/d/sel sich ändert
  // Basierend auf dem Wert in sel wird out a/b/c/d zugewiesen
  always @ (a or b or c or d or sel) begin
    case (sel)
      2'b00 : out <= a;
      2'b01 : out <= b;
      2'b10 : out <= c;
      2'b11 : out <= d;
    endcase
  end
endmodule

Das Modul mux_4x1_case hat vier 4-Bit-Dateneingänge, einen 2-Bit-Selekt-Eingang und einen 4-Bit-Datenausgang. Der Multiplexer wählt basierend auf dem Selekt-Signal sel mittels case-Statement entweder a, b, c oder d aus.

Hardware-Schaltplan

Beide Multiplexer-Modellierungen synthetisieren in die gleiche Hardware, wie im Bild unten gezeigt.

Testbench

module tb_4to1_mux;
  reg [3:0] a; reg [3:0] b; reg [3:0] c; reg [3:0] d;
  wire [3:0] out;
  reg [1:0] sel;
  integer i;
  
  // Design mit case-Statement instanziieren
  mux_4to1_case mux0 (
    .a(a), .b(b), .c(c), .d(d), .sel(sel), .out(out)
  );
  
  // Stimulus
  initial begin
    // Monitor im Hintergrund für Log-Ausgabe bei Änderungen
    $monitor("[%0t] sel=0x%0h a=0x%0h b=0x%0h c=0x%0h d=0x%0h out=0x%0h", $time, sel, a, b, c, d, out);
    
    // 1. Zum Zeitpunkt 0: Zufallswerte für a/b/c/d, sel = 0
    sel <= 0; a <= $random; b <= $random; c <= $random; d <= $random;
    
    // 2. sel alle 5ns ändern
    for (i = 1; i < 4; i = i+1) begin
      #5 sel <= i;
    end
    
    // 3. Nach Schritt 2: 5ns warten und Simulation beenden
    #5 $finish;
  end
endmodule

Simulations-Log:

ncsim> run
[0] sel=0x0 a=0x4 b=0x1 c=0x9 d=0x3 out=0x4
[5] sel=0x1 a=0x4 b=0x1 c=0x9 d=0x3 out=0x1
[10] sel=0x2 a=0x4 b=0x1 c=0x9 d=0x3 out=0x9
[15] sel=0x3 a=0x4 b=0x1 c=0x9 d=0x3 out=0x3
Simulation complete via $finish(1) at time 20 NS + 0

Verilog

  1. Verilog meistern: Komplettes Tutorial für digitales Schaltungsdesign
  2. Verilog Concatenation meistern: Praktischer Leitfaden
  3. Verilog Assignments verstehen: Typen, Syntax und Best Practices
  4. Verilog Blocking vs. Non-Blocking: Wichtige Unterschiede erklärt
  5. Verilog Functions meistern für effizientes RTL-Design
  6. Verilog Tasks verstehen: Functions vs. Tasks, Syntax und Verwendung
  7. Verilog Clock Generator: Design & Implementierungsleitfaden
  8. Verilog Math Functions meistern für effizientes Hardware-Design
  9. Verilog $timeformat meistern: Präzision und Anzeigesteuerung
  10. Verilog Timescales an jedem Scope verstehen und ausgeben