산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Industrial programming >> verilog

Verilog 4:1 멀티플렉서: 설계 및 구현

멀티플렉서(mux)란?

멀티플렉서 또는 줄여서 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 문 사용

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

verilog

  1. 버릴로그(Verilog) 입문: 디지털 회로 설계를 위한 하드웨어 기술 언어
  2. Verilog 결합(Concatenation) & 복제(Replication) 연산자 실전 가이드
  3. Verilog 할당문 이해: 유형, 문법, 모범 사례
  4. Verilog 차단 vs 비차단 할당: 핵심 차이점 완벽 이해
  5. Verilog 함수 마스터하기: 효율적인 RTL 설계를 위한 활용법
  6. Verilog 태스크 이해: 함수와의 차이점, 문법, 활용법
  7. Verilog 클럭 생성기: 설계 및 구현 가이드
  8. Verilog 수학 함수 마스터하기: 효율적인 하드웨어 설계를 위한 활용
  9. Verilog $timeformat 마스터하기: 정밀도 및 표시 제어
  10. 모든 범위에서 Verilog Timescale 이해 및 출력하기