반응형
  • 숨쉬는 공부방
    • Security
      • SHA
    • Hardware Security
    • Verilog HDL
    • ─── ✿ ───
      • IT
      • 이것저것

블로그 메뉴

  • 홈
  • 모든 글
  • 방명록

인기 글

최근 글

태그

  • 설계
  • Modelsim
  • FSM
  • KISA
  • 순차회로
  • SHA-256
  • C코드
  • 조합회로
  • Verilog
  • SHA256

hELLO · Designed By 정상우.
숨.

후하후하

[조합회로] 4:1 멀티플렉서 설계하기
Verilog HDL

[조합회로] 4:1 멀티플렉서 설계하기

2021. 7. 28. 10:42

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
    'Verilog HDL' 카테고리의 다른 글
    • 순차회로와 FSM
    • [조합회로] 4비트 전가산기 설계하기
    • [ModelSim] Verilog 조합회로 설계 방법
    • [ModelSim] 컴파일 및 시뮬레이션 자동화 방법
    숨.
    숨.

    티스토리툴바