이전글 : 멀티플렉서 (MUX)
디멀티플렉서(Demultiplexer : 역다중화기, 디먹스)
디먹스는 먹스와 반대되는 기능을 한다.
한 개의 선으로 들어오는 입력을 n비트의 선택 입력에 따라 2ⁿ개의 선 중 하나로 출력한다.
1-to-4 디먹스로 예를 들어보면,
선택입력이 00일 때 0번 출력선으로 출력,
선택입력이 01일 때 1번 출력선으로 출력,
선택입력이 10일 때 2번 출력선으로 출력,
선택입력이 11일 때 3번 출력선으로 출력하는 것이다.
□ 1to4 디먹스의 논리식(불대수식)
4to1먹스와는 반대로 출력이 4개이므로 논리식도 4개로 써 볼 수 있다.
데이터입력 d와 선택입력 s0, s1 그리고 출력 x0, x1, x2, x3이 있으면
각각의 출력에 대한 논리식은
x0 = s1's0'd
x1 = s1's0d
x2 = s1s0'd
x3 = s1s0d
이렇게 나오는데, d를 제외한 부분을 보면 선택입력에 대한 디코더와 같은 논리가 있다는 것을 알 수 있다.
s1's0'은 선택입력이00일 때만 참이 되고,
s1's0은 선택입력이 01일 때만 참이 되고..
이런식으로 선택입력에 따라 x0~x3중 하나만 참이 되어서 데이터입력인 d값이 그곳으로 출력되는것이다.
□ 1to4 디먹스의 블록도
□ 먹스와 디먹스의 연결
먹스의 출력을 디먹스의 입력으로 넣고 동일한 sel(선택입력)을 주면
먹스와 디먹스가 서로 반대되는 역할을 하기 때문에 먹스쪽의 입력이 디먹스쪽의 출력으로 그대로 나오게 된다.
그러나 정확히 말하면 먹스쪽 데이터입력이 하이임피던스상태여도 디먹스쪽 출력은 0이 나오기 때문에 완전히 그대로 나오는 것은 아니다...
□ Verilog로 디먹스 구성하기
베릴로그로 디먹스를 구현해보자.
디먹스의 논리식을 참고하여 블록도대로 그대로 작성해보면
일단 아래와 같이 구성할 수 있다.(더 아래쪽에서 간단한 코드가 나옵니다)
module demux4(data, sel0, sel1, out0, out1, out2, out3);
input data;
input sel0 ,sel1;
output out0, out1, out2, out3;
wire w0, w1, w2, w3;
and(w0, ~sel0, ~sel1);
and(w1, sel0, ~sel1);
and(w2, ~sel0, sel1);
and(w3, sel0, sel1);
and(out0, w0, data);
and(out1, w1, data);
and(out2, w2, data);
and(out3, w3, data);
endmodule
선택입력과 출력을 리스트로 묶고 동작적 모델링을 사용하여 코드를 더 간단히 해 보면,
module demux4(data, sel, out);
input data;
input[1:0] sel;
output[3:0] out;
wire data;
wire[1:0] sel;
reg[3:0] out;
always @(data or sel) begin
out[sel] = data;
end
endmodule
여기서 4개의 출력선 중 출력이 없는 선은 하이임피던스 상태가 나오는데,
위의 코드에서 reg[3:0] out = 0; 이렇게 초기값으로 0을 인가하면 출력이 없는 선도 0값을 나오게 할 수 있다.
관련글 : 멀티플렉서(MUX)
관련글목록 : 블로그 '전자' 카테고리