Multiplexeur/Mux Verilog 4 à 1
Qu'est-ce qu'un mux ou multiplexeur ?
Un multiplexeur ou mux en bref, est un élément numérique qui transfère les données de l'une des N entrées à la sortie en fonction du signal de sélection. Le cas illustré ci-dessous est lorsque N est égal à 4. Par exemple, un multiplexeur 4 bits aurait N entrées chacune de 4 bits où chaque entrée peut être transférée à la sortie à l'aide d'un signal de sélection.
sel est une entrée 2 bits et peut avoir quatre valeurs. Chaque valeur sur la ligne de sélection permettra à l'une des entrées d'être envoyée à la broche de sortie.
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
Un multiplexeur 4x1 peut être implémenté de plusieurs manières et ici vous verrez deux des manières les plus courantes :
- Utiliser un
assign
déclaration - Utiliser un
case
déclaration
Utiliser assign
déclaration
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
Le module appelé mux_4x1_assign possède quatre entrées de données 4 bits, une entrée de sélection 2 bits et une sortie de données 4 bits. Le multiplexeur sélectionnera a , b, c ou d en fonction du signal de sélection sel en utilisant le assign
déclaration.
Utiliser case
déclaration
Notez que le signal de sortie est déclaré comme un reg
type car il est utilisé dans une procédurale bloquer comme 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
Le module appelé mux_4x1_case possède quatre entrées de données 4 bits, une entrée de sélection 2 bits et une sortie de données 4 bits. Le multiplexeur sélectionnera a , b, c ou d en fonction du signal de sélection sel en utilisant le case
déclaration.
Schéma du matériel
Les deux types de modèles de multiplexeurs sont synthétisés dans le même matériel, comme indiqué dans l'image ci-dessous.
Banc de test
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
Journal de simulation 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