4:1 멀티플렉서란?
Multiplexer(Mux): 제어 입력 신호(Sel)에 의해서 입력 신호 중 하나를 선택하여 출력과 연결
4:1 MUX를 설계하는 방법으로 크게 2가지가 있다.
- 데이터플로우(디자인) 및 구조적(테스트벤치) 기술방법 설계
- 알고리즘 레벨(디자인) 및 구조적(테스트벤치) 기술방법 설계
테스트벤치 파일은 동일하며, 디자인 파일의 기술 방법만 다르게 하여 설계한다.
- 입력: i0, i1, i2, i3(데이터 입력), s1, s0(제어 입력)
- 출력: out (데이터 출력)
※ 참고
reg: always () 구문 / initial 구문(testbench에서만)
wire: assign 구문
(단, 구조적 기술 시에 다른 모듈의 출력과 연결했다면 assign을 사용한 것과 같은 취급)
* TestBench: 구조적 기술 방법 설계
`timescale 1ns/10ps
module tb_mux4_to_1;
// 내부 신호 정의
reg i0, i1, i2, i3;
reg s1, s0;
wire out;
// 모듈 객체화 (구조적 기술방법으로 설계)
mux4_to_1 U0_MUX41 ( out, i0, i1, i2, i3, s1, s0 );
// i0-i3의 initial 구문 (reg 신호 만들기)
initial begin
i0 = 1'b0;
i1 = 1'b1;
i2 = 1'b0;
i3 = 1'b1;
#(50);
i0 = 1'b0; // 신호 유지
i1 = 1'b1; // 신호 유지
i2 = 1'b1; // 신호 반전
i3 = 1'b0; // 신호 반전
end
// s1-s0의 initial 구문 (reg 신호 만들기)
initial begin
s1 = 1'b0; s0 = 1'b0;
#(25);
s1 = 1'b0; s0 = 1'b1;
#(25);
s1 = 1'b1; s0 = 1'b0;
#(25);
s1 = 1'b1; s0 = 1'b1;
#(25);
$finish;
end
endmodule
* RTL: 데이터플로우 기술방법 설계 (assign 사용)
module mux4_to_1 (out, i0, i1, i2, i3, s1, s0);
input i0, i1, i2, i3;
input s1, s0;
output out;
wire out; // assign 문을 사용하여 mux 회로를 만들겠다
assign out = ( {s1, s0} == 2'b00 ) ? i0 :
( {s1, s0} == 2'b01 ) ? i1 :
( {s1, s0} == 2'b10 ) ? i2 :
( {s1, s0} == 2'b11 ) ? i3 : 1'b0;
endmodule
?: 연산자 (삼항 연산자)
삼항 연산자는 다음과 같이 이루어진다.
(조건문) ? True : False;
조건문이 참일 때 True 연산식을 return하고, 조건문이 거짓일 때 False 연산식을 return한다.
삼항 연산자를 else if 문과 같이 활용하면 위의 코드와 같이 된다.
(조건문) ? True :
(위의 조건이 False일 때 조건문) ? True :
(위의 조건이 False일 때 조건문) ? True :
(위의 조건이 False일 때 조건문) ? True : False;
* RTL: 알고리즘 레벨 기술방법 설계 (always 사용) - (1)
module mux4_to_1 (out, i0, i1, i2, i3, s1, s0);
input i0, i1, i2, i3;
input s1, s0;
output out;
reg out; // always 문을 사용하여 mux 회로를 만들겠다
always @ ( s1, s0, i0, i1, i2, i3 ) begin
if ( {s1, s0} ==2'b00 )
out = i0;
else if ({s1, s0} ==2'b01)
out = i1;
else if ({s1, s0} ==2'b10)
out = i2;
else if ({s1, s0} ==2'b11)
out = i3;
else
out = 1'b0;
end
endmodule
always @ (sensitivity list)에서 sensitivity list 입력 방법
sensitivity list는 always 구문에서 사용하는 신호 이름을 모두 입력한다.
always 구문에서 사용하는 신호가 많아지는 경우, sensitivity list에 신호 이름을 깜박하는 실수가 발생할 수 있다.
이러한 실수를 미연에 방지하기 위해 * 을 사용한다.
sensitivity list에 신호 이름 대신 * 을 사용하면 always 구문에서 사용하는 신호를 자동으로 찾아서 입력한다.
* RTL: 알고리즘 레벨 기술방법 설계 (always 사용) - (2)
module mux4_to_1 (out, i0, i1, i2, i3, s1, s0);
input i0, i1, i2, i3;
input s1, s0;
output out;
reg out; // always 문을 사용하여 mux 회로를 만들겠다
always @ ( * ) begin
case ( {s1, s0} )
2'b00 : out = i0;
2'b01 : out = i1;
2'b10 : out = i2;
2'b11 : out = i3;
endcase
end
endmodule
실행 결과
실행 결과는 어떤 RTL 파일을 써도 다음과 같은 결과가 나온다.
- 참고 -
Verilog HDL 디지털 설계와 합성의 길잡이 (한국어판)
'Verilog HDL' 카테고리의 다른 글
순차회로와 FSM (0) | 2021.08.23 |
---|---|
[조합회로] 4비트 전가산기 설계하기 (0) | 2021.07.28 |
[ModelSim] Verilog 조합회로 설계 방법 (0) | 2021.07.28 |
[ModelSim] 컴파일 및 시뮬레이션 자동화 방법 (0) | 2021.07.27 |
[ModelSim] 프로젝트 생성 및 실행 방법 (0) | 2021.07.26 |