본문 바로가기
verilog/실습

[Verilog] 조합회로(Combinational logic) : 멀티플렉서(Multiplexer)

by 씐 2025. 3. 3.
728x90

멀티플렉서란?

  • 멀티플렉서는 2^n개의 입력을 받아 그들 중 하나를 선택하여 출력으로 연결해주는 조합회로
  • 데이터 선택기라도고 하며 간단히 MUX라고 부름.
  • 한개의 입력을 받아서 2^n개의 출력 중 하나의 출력에 회로를 디멀티플래서 또는 DEMUX라고 함.
  • 멀티플렉서나 디멀티플렉서는 여러 개의 데이터 중에서 하나를 선택하기 위해 제어신호가 필요함.

회로(8비트 4-to-1 Multiplexer)

 

진리표(8비트 4-to-1 Multiplexer)

sel[1] sel[0] out
0 0 a
0 1 b
1 0 c
1 1 d

 

verilog 코드

// case문을 이용한 4x1 MUX 설계

module mux(a, b, c, d, sel, out);
  
  input [7:0] a, b, c, d;
  input [1:0] sel;
  output reg [7:0] out;
  
  always@(a or b or c or d or sel)
    case(sel)
      0 : out = a; // 2'b00
      1 : out = b; // 2'b01
      2 : out = c; // 2'b10
      3 : out = d; // 2'b11
    endcase
  
endmodule

 

 

테스트 벤치

// 4x1 MUX tb

module tb_mux;
  reg [7:0] a, b, c, d;
  reg [1:0] sel;
  wire [7:0] out;
  
  // name porting
  mux U0(.a(a), .b(b), .c(c), .d(d), .sel(sel), .out(out)); 
  
  initial begin
    // EDA playground waveform
    $dumpfile("dump.vcd");
    $dumpvars(0);
    
    a = 8'h00; b = 8'h01; c = 8'h02; d = 8'h03; sel = 2'b00; #100;
    a = 8'h00; b = 8'h01; c = 8'h02; d = 8'h03; sel = 2'b01; #100; 
    a = 8'h00; b = 8'h01; c = 8'h02; d = 8'h03; sel = 2'b10; #100; 
    a = 8'h00; b = 8'h01; c = 8'h02; d = 8'h03; sel = 2'b11; #100; 
  end
endmodule

 

Waveform

  • sel의 값이 2'b00일 때 a 값 선택(2'b00000000 = 8'h00)
  • sel의 값이 2'b01일 때 b 값 선택(2'b00000001 = 8'h01)
  • sel의 값이 2'b10일 때 c 값 선택(2'b00000010 = 8'h02)
  • sel의 값이 2'b11일 때 d 값 선택(2'b00000011 = 8'h03)