반응형
여러 개의 신호 중에 하나를 선택하여 출력으로 내보낸다. 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값에 따라 원하는 출력이 들어갔다.
반응형
댓글