Design a Full Adder Using 4 1 Mux

What is a mux or multiplexer ?

A multiplexer or mux in short, is a digital element that transfers data from one of the N inputs to the output based on the select signal. The case shown below is when N equals 4. For example, a 4 bit multiplexer would have N inputs each of 4 bits where each input can be transferred to the output by the use of a select signal.

4x1 Mux

sel is a 2-bit input and can have four values. Each value on the select line will allow one of the inputs to be sent to output pin out.

          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        

A 4x1 multiplexer can be implemented in multiple ways and here you'll see two of the most common ways:

  • Using an assign statement
  • Using a case statement

Using assign statement

                      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                  

The module called mux_4x1_assign has four 4-bit data inputs, one 2-bit select input and one 4-bit data output. The multiplexer will select either a , b, c, or d based on the select signal sel using the assign statement.

4 to 1 multiplexer waveform

Using case statement

Note that the signal out is declared as a reg type because it is used in a procedural block like 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                  

The module called mux_4x1_case has four 4-bit data inputs, one 2-bit select input and one 4-bit data output. The multiplexer will select either a , b, c, or d based on the select signal sel using the case statement.

Hardware Schematic

Both types of multiplexer models get synthesized into the same hardware as shown in the image below.

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                  

Simulation 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        

4 to 1 multiplexer waveform

Design a Full Adder Using 4 1 Mux

Source: https://www.chipverify.com/verilog/verilog-4to1-mux

0 Response to "Design a Full Adder Using 4 1 Mux"

Post a Comment

Iklan Atas Artikel

Iklan Tengah Artikel 1

Iklan Tengah Artikel 2

Iklan Bawah Artikel