멀티플렉서 또는 줄여서 mux는 선택 신호에 따라 N개의 입력 중 하나의 데이터를 출력으로 전달하는 디지털 소자입니다. 아래 사례는 N이 4인 경우입니다. 예를 들어 4비트 멀티플렉서는 각각 4비트인 N개의 입력을 가지며, 선택 신호를 사용하여 각 입력을 출력 핀 out으로 보낼 수 있습니다.
sel은 2비트 입력으로 네 가지 값을 가질 수 있습니다. 선택 라인의 각 값은 입력 중 하나가 출력 핀 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
4x1 멀티플렉서는 여러 방식으로 구현할 수 있으며 여기서는 가장 일반적인 두 가지 방법을 보여줍니다:
assign 문 사용
case 문 사용
assign 문 사용
module mux_4to1_assign (
input [3:0] a, // 4비트 입력 a
input [3:0] b, // 4비트 입력 b
input [3:0] c, // 4비트 입력 c
input [3:0] d, // 4비트 입력 d
input [1:0] sel, // a,b,c,d 중 선택용 입력 sel
output [3:0] out // 입력 sel에 기반한 4비트 출력
);
// sel[1]이 0이면 (sel[0]? b:a) 선택, 1이면 (sel[0] ? d:c) 선택
// sel[0]이 0이면 a를 출력, 아니면 b이고, sel[0]이 0이면 c를 출력, 아니면 d
assign out = sel[1] ? (sel[0] ? d : c) : (sel[0] ? b : a);
endmodule
mux_4x1_assign 모듈은 네 개의 4비트 데이터 입력, 하나의 2비트 선택 입력, 하나의 4비트 데이터 출력을 가집니다. 멀티플렉서는 assign 문을 사용하여 선택 신호 sel에 따라 a, b, c, d 중 하나를 선택합니다.
case 문 사용
case 문에서 사용되므로 out 신호는 reg 타입으로 선언되어야 합니다.
module mux_4to1_case (
input [3:0] a, // 4비트 입력 a
input [3:0] b, // 4비트 입력 b
input [3:0] c, // 4비트 입력 c
input [3:0] d, // 4비트 입력 d
input [1:0] sel, // a,b,c,d 중 선택용 입력 sel
output reg [3:0] out // 입력 sel에 기반한 4비트 출력
);
// 이 always 블록은 a/b/c/d/sel 값이 변경될 때마다 실행됨
// 그때 sel의 값에 따라 출력이 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
mux_4x1_case 모듈은 네 개의 4비트 데이터 입력, 하나의 2비트 선택 입력, 하나의 4비트 데이터 출력을 가집니다. 멀티플렉서는 case 문을 사용하여 선택 신호 sel에 따라 a, b, c, d 중 하나를 선택합니다.
하드웨어 회로도
두 유형의 멀티플렉서 모델 모두 아래 이미지와 같이 동일한 하드웨어로 합성됩니다.
테스트벤치
module tb_4to1_mux;
// 설계 입력을 구동할 내부 reg 변수 선언
// 설계 출력을 수집할 wire 신호 선언
// 테스트벤치에서 사용할 기타 내부 변수 선언
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;
// 설계 중 하나 인스턴스화, 여기서는 case 문 설계 사용
// 위에서 선언한 테스트벤치 변수들을 설계의 것과 연결
mux_4to1_case mux0 (
.a (a),
.b (b),
.c (c),
.d (d),
.sel (sel),
.out (out)
);
// 이 initial 블록은 자극부
initial begin
// 백그라운드에서 모니터 실행하여 a/b/c/d/sel/out 변경 시 로그에 값 표시
$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. 시간 0에 a/b/c/d에 랜덤 값 구동, sel = 0 유지
sel <= 0;
a <= $random;
b <= $random;
c <= $random;
d <= $random;
// 2. 5ns마다 sel 값 변경
for (i = 1; i < 4; i = i + 1) begin
#5 sel <= i;
end
// 3. 2단계 완료 후 5ns 대기하고 시뮬레이션 종료
#5 $finish;
end
endmodule
시뮬레이션 로그
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