개발 Tools/Verilog HDL

Verilog HDL Multiplexor (멀티플렉서, mux, 예제)

전컴반 2022. 2. 16. 13:23

여러 개의 신호 중에 하나를 선택하여 출력으로 내보낸다. sel 신호는 4개의 입력 중에 하나를 선택하여 보낸다.

아래 예시의 경우 sel [1:0] == 2'b01 이면 y = b가 된다.

 

 

verilog로 구현해보자, 회로만 보고 코드를 짜는 연습을 하면 좋은 거 같다. 

 

module mux(a, b, c, d, sel, y);
    input [15:0] a, b, c, d;
    input [1:0]sel;
    output [15:0]y;
    
    reg [15:0]y;
    
    always @(*) 
    case(sel)
    2'b00 : y = a;
    2'b01 : y = b;
    2'b10 : y = c;
    2'b11 : y = d;
    endcase
endmodule

 

입력은 a, b, c, d, sel이고 출력은 y값으로 정해져 있다. always구문을 사용하기 때문에 reg로 선언했다. 

*의 의미는 모든 입력에 대해서 동작한다는 의미다.

test bench를 보자

 

module tb_mux;
    wire [15:0] y;
    reg [15:0] a, b, c, d;
    reg [2:0] sel; // for문을 이용하기 위해
    
    mux u0 (.a(a), .b(b), .c(c), .d(d), .y(y), .sel(sel));
    
    initial begin
    a = 111;
    b = 222; 
    c = 333; 
    d = 444;
    for (sel = 3'b000 ; sel < 3'b011 ; sel = sel+1)
    #10; 
    end
    
endmodule

 

출력은 wire로 선언하고 입력은 reg로 선언한다. 이때 sel은 DUT에선 [1:0]인데 test bench에선 왜 [2:0]이냐면 for문을 돌려야 하기 때문에 1bit를 더 줬다. 만약 그대로 사용하면 2'b11 이 입력으로 가할 수 없다.

 

wave 폼을 보면 잘 들어간 걸 볼 수 있다. sel값에 따라 원하는 출력이 들어갔다.

 

반응형