Verilog 4 zu 1 Multiplexer/Mux
Was ist ein Mux oder Multiplexer?
Ein Multiplexer oder mux kurz gesagt, ist ein digitales Element, das basierend auf dem Auswahlsignal Daten von einem der N Eingänge zum Ausgang überträgt. Der unten gezeigte Fall ist, wenn N gleich 4 ist. Zum Beispiel hätte ein 4-Bit-Multiplexer N Eingänge mit jeweils 4 Bits, wobei jeder Eingang durch die Verwendung eines Auswahlsignals zum Ausgang übertragen werden kann.
sel ist eine 2-Bit-Eingabe und kann vier Werte haben. Jeder Wert in der Auswahlzeile ermöglicht es, dass einer der Eingänge an den Ausgangspinout gesendet wird.
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 mehrere Arten implementiert werden, und hier sehen Sie zwei der häufigsten Arten:
- Mit einem
assign
Erklärung - Mit
case
Erklärung
Mit assign
Erklärung
module mux_4to1_assign ( input [3:0] a, // 4-bit input called a
input [3:0] b, // 4-bit input called b
input [3:0] c, // 4-bit input called c
input [3:0] d, // 4-bit input called d
input [1:0] sel, // input sel used to select between a,b,c,d
output [3:0] out); // 4-bit output based on input sel
// When sel[1] is 0, (sel[0]? b:a) is selected and when sel[1] is 1, (sel[0] ? d:c) is taken
// When sel[0] is 0, a is sent to output, else b and when sel[0] is 0, c is sent to output, else d
assign out = sel[1] ? (sel[0] ? d : c) : (sel[0] ? b : a);
endmodule
Das Modul namens mux_4x1_assign hat vier 4-Bit-Dateneingänge, einen 2-Bit-Auswahleingang und einen 4-Bit-Datenausgang. Der Multiplexer wählt entweder a , b, c oder d basierend auf dem Auswahlsignal sel unter Verwendung von assign
Erklärung.
Mit case
Erklärung
Beachten Sie, dass der Signalausgang als reg
deklariert ist Typ, weil er in einem Verfahren verwendet wird Block wie always
.
module mux_4to1_case ( input [3:0] a, // 4-bit input called a
input [3:0] b, // 4-bit input called b
input [3:0] c, // 4-bit input called c
input [3:0] d, // 4-bit input called d
input [1:0] sel, // input sel used to select between a,b,c,d
output reg [3:0] out); // 4-bit output based on input sel
// This always block gets executed whenever a/b/c/d/sel changes value
// When that happens, based on value in sel, output is assigned to either a/b/c/d
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 namens mux_4x1_case hat vier 4-Bit-Dateneingänge, einen 2-Bit-Auswahleingang und einen 4-Bit-Datenausgang. Der Multiplexer wählt entweder a , b, c oder d basierend auf dem Auswahlsignal sel unter Verwendung von case
Erklärung.
Hardware-Schema
Beide Arten von Multiplexer-Modellen werden in derselben Hardware synthetisiert, wie im Bild unten gezeigt.
Testbench
module tb_4to1_mux;
// Declare internal reg variables to drive design inputs
// Declare wire signals to collect design output
// Declare other internal variables used in testbench
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;
// Instantiate one of the designs, in this case, we have used the design with case statement
// Connect testbench variables declared above with those in the design
mux_4to1_case mux0 ( .a (a),
.b (b),
.c (c),
.d (d),
.sel (sel),
.out (out));
// This initial block is the stimulus
initial begin
// Launch a monitor in background to display values to log whenever a/b/c/d/sel/out changes
$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. At time 0, drive random values to a/b/c/d and keep sel = 0
sel <= 0;
a <= $random;
b <= $random;
c <= $random;
d <= $random;
// 2. Change the value of sel after every 5ns
for (i = 1; i < 4; i=i+1) begin
#5 sel <= i;
end
// 3. After Step2 is over, wait for 5ns and finish simulation
#5 $finish;
end
endmodule
Simulationsprotokoll 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