거북이처럼 천천히

Verilog RTL 설계 (6월 24일 - 1) 본문

Verilog/Verilog RTL 설계

Verilog RTL 설계 (6월 24일 - 1)

유로 청년 2024. 6. 24. 20:23

1. 인코더 (Encoder)

  • 2^n bit 크기를 갖는 2진 코드로 표현된 신호를 입력받아 Encoder를 거쳐 n bit 크기를 갖는 2진 코드로 표현된 코드를 출력으로 내보낸다.
  • 즉, 2^n bit 입력을 가지고 n bit 출력을 생성시키는 장치이다.
  • 주로 데이터를 압축하여 전송 효율을 높이거나, 다양한 센서 신호를 디지털 변환하여 처리할 때 사용

MUX를 통해 Encoder의 블록도 표현

 

2. 디코더 (Decoder)

  • n bit의 2진 코드를 입력으로 받아 Decoder를 통해 디코딩하여 2^n bit의 2진 코드 신호로 바꿔주는 조합논리회로 (Combinational Logic Circuit)
  • Encoder를 통해 전달 받은 n bit 데이터를 2^n bit 데이터로 변환한다.

 

Decoder의 기본 블록도

 

 

3. 2 X 4 Decoder 구현

  • 2 X 4 Decoder의 진리표와 게이트 회로 구성은 다음과 같다.

Truth Table, Gate Circuit of 2 X 4 Decoder

  • 2 bit 크기의 데이터(2진 코드)를 입력을 받은 뒤, 4bit 크기의 데이터(2진 코드)를 출력으로 내보낸다.
  • 2 X 4 Decoder의 Truth table를 통해 알 수 있듯이 출력 값은 4bit 중에서 단 1bit에서만 True이고, 나머지 bit는 False 값을 갖는다.
  • 즉, 4bit 중에서 동시에 여러 bit에서 True 일 수 없다. 

 

 

3.1. Behavioral Modeling of 2 X 4 Decoder (by using if - else)

<Source code>

// Behavioral Modeling of 2X4 Decoder (if - else문)
module Decoder_2X4_Behavioral_Modeling_if_else(
    input [1:0] code,
    output reg [3:0] signal );
    
    always @(code) begin
        if(code == 2'b00) signal = 4'b0001;
        else if(code == 2'b01) signal = 4'b0010;
        else if(code == 2'b10) signal = 4'b0100;
        else if(code == 2'b11) signal = 4'b1000;
    end
endmodule

 

<Simulation>

Simulation of 2X4 Decoder (if-else문)

 

<Analysis>

  • 소스 코드에 대해서 분석을 하면 다음과 같다.
    - Behavioral modeling은 if - else, case 문을 통해 표현할 수 있으며, 위 코드는 if - else문으로 구현
    - code 값에 따라 출력 값인 signal 값 변화한다.
    - always 블록 내에서 signal 값이 l-value로 사용되기 때문에 자료형이 wire형이 아닌 reg형이여야 한다.
  • 시뮬레이션 결과, 위 2X4 Decoder의 진리표 대로 출력값이 나오는 것을 확인할 수 있다.
  • 출력 값은 4bit으로 이루어져 있지만, 동시 2개의 비트에서 True일 수 없다.
    ( 수업 시간에 예시로 들었던 "왜구가 처들어왔다 + 왜구가 후퇴했다."를 생각하자.)

 

 

 

3.2. Behavioral Modeling of 2 X 4 Decoder (by case)

<Source code>

module Decoder_2X4_Behavioral_Modeling_case(
    input [1:0] code,
    output reg [3:0] signal );  
    
    always @(code) begin
        case(code)
            2'b00 : signal = 4'b0001;
            2'b01 : signal = 4'b0010;
            2'b10 : signal = 4'b0100;
            2'b11 : signal = 4'b1000;
        endcase 
    end
endmodule

 

<Simulation>

Simulation of 2X4 Decoder (case 문)

<Analysis>

  • 소스 코드에 대해서 분석을 하면 다음과 같다.
    - Behavioral modeling은 if - else, case 문을 통해 표현할 수 있으며, 위 코드는 case문으로 구현
    - always 블록 내에서 signal 값이 l-value로 사용되기 때문에 자료형이 wire형이 아닌 reg형이여야 한다.
  • 나머지 시뮬레이션 결과는 if-case문으로 구현했을 때와 동일한 출력 값을 얻는다.

 

 

3.3. Behavioral modeling으로 구현 시, 주의사항

  • 위 Behavioral modeling 구현은 모든 입력에 대해서 출력을 정의했기 때문에 예상에서 벗어난 출력 값이 발생하는 상황은 발생하지 않는다.
  • 만약, 모든 입력 값에 대해서 출력 값을 정의하지 않는다면 이를 대비하기 위해서 if - else문에서는 else, case 문에서는 default 를 정의해야한다.
  • 하지만, if - else문에서는 else, case 문에서는 default 를 통해 명시적으로 정의하지 않는다면 Verilog는 이러한 상황을 어떻게 처리할지를 결정해야 하는데, 이 때 일반적으로 D Latch가 생성한다.
  • 하지만, 이렇게 생성된 D Latch는 예기치 못한 문제를 발생시킬 수 있는데, 이에 대한 내용은 Latch와 Flip-Flop을 정리하면서 같이 정리하겠다.
  • 여기서는 "최대한 if - else문에서는 else, case문에서는 default를 작성하도록 하자"로 기억하자.
  • 따라서 위 코드를 다시 수정하면 다음과 같다.

 

< Behavioral Modeling of 2 X 4 Decoder (by using if - else) >

// Behavioral Modeling of 2X4 Decoder (if - else문)
module Decoder_2X4_Behavioral_Modeling_if_else(
    input [1:0] code,
    output reg [3:0] signal );
    
    always @(code) begin
        if(code == 2'b00) signal = 4'b0001;
        else if(code == 2'b01) signal = 4'b0010;
        else if(code == 2'b10) signal = 4'b0100;
        else if(code == 2'b11) signal = 4'b1000;
        else signal = signal;
    end
endmodule

 

< Behavioral Modeling of 2 X 4 Decoder (by case) >

module Decoder_2X4_Behavioral_Modeling_case(
    input [1:0] code,
    output reg [3:0] signal );  
    
    always @(code) begin
        case(code)
            2'b00 : signal = 4'b0001;
            2'b01 : signal = 4'b0010;
            2'b10 : signal = 4'b0100;
            2'b11 : signal = 4'b1000;
            default : signal = signal;
        endcase 
    end
endmodule

 

- 위 소스 코드들은 예외의 입력이 들어오면 이전 출력 값을 그대로 출력시키도록 설계

 

 

3.4. Dataflow Modeling of 2 X 4 Decoder

<Source code>

module Decoder_2X4_Dataflow_Modeling(
    input [1:0] code, 
    output [3:0] signal);
    
    assign signal = (code == 2'b00)? 4'b0001 : 
                        ((code == 2'b01)? 4'b0010 :
                        ((code == 2'b10)? 4'b0100 :
                        ((code == 2'b11)? 4'b1000 : 4'b0000))); 
                        
endmodule

<Simulation>

Simulation of 2X4 Decoder (Dataflow modeling)

<Analysis>

  • 소스 코드에 대해서 분석을 하면 다음과 같다.
    - code 값에 따라 출력 값인 signal 을 정의하기 위해 조건 연산자를 사용했다.
    - 그러나 병렬 형태(?)로 조건 연산자를 사용해도 되지만, 조건 연산자의 False 영역에 또 다른 조건 연산자를 정의함으로서 조건 연산자의 조건문에 False 영역에 있는 조건 연산자가 실행되도록 설계
    - 이는 마치 if - else if - else문과 유사하다.
    - 그리고, 예기치 못한 입력이 들어올 경우를 대비하여 그러한 입력 값이 들어오면 4'b0000 값이 출력되도록 설계
  • 시뮬레이션 결과는 Behavioral modeling과 동일하다.

 

 

 

 

 

 

 

4. 4 X 2 Encoder 구현

  • 4 X 2 Encoder의 Truth table은 다음과 같다.
  • 아래 진리표에서 볼 수 있듯이 4bit 입력 데이터에서 동시에 2bit 이상에서 True인 경우는 없다.

4 X 2 Encoder의 진리표

 

 

 

4.1. Behavioral Modeling of 2 X 4 Encoder ( if - else 문)

<Source code>

module Encoder_4X2_Behavioral_Modeling_if_else(
    input [3:0] signal,
    output reg [1:0] code );
    
    always @(signal) begin
       if(signal == 4'b0001) code = 2'b00;
       else if(signal == 4'b0010) code = 2'b01;
       else if(signal == 4'b0100) code = 2'b10;
       else if(signal == 4'b1000) code = 2'b11;
       else code = 2'b00;
    end
    
endmodule

 

<Simulation>

Behavioral Modeling of 2 X 4 Encoder ( if - else 문)

<Analysis>

  • 소스 코드에 대해서 분석을 하면 다음과 같다.
    - 4bit 입력 데이터가 들어오면 진리표에 의해 2bit 출력 데이터를 출력한다.
    - 입력 데이터는 4bit이기 때문에 이를 통해 구현할 수 있는 경우의 수는 총 16가지이다.
    - 하지만, 우리가 입력 - 출력으로 정의한 경우의 수는 총 4가지 이기 때문에 12가지 입력이 들어올 경우에 대해서도 대비를 해야한다.
    - 이를 위해 else 문을 통해 12가지 입력이 들어오면 2'b00이 출력 되도록 설계 했다.
    - always문에서 code 변수는 l-value로 활용되기 때문에 wire형이 아닌 reg형으로 자료형 변환했다.
  • 시뮬레이션에 대한 분석은 다음과 같다.
    - 진리표 대로 입력 값에 대한 출력이 발생하는 것을 확인했다.
    - 또한 예기치 못한 입력 (4'b1111)에 대해서 2'b00 이 출력되도록 설계했는데, 이론대로 출력되는것을 확인했다.

 

 

 

 

4.2. Behavioral Modeling of 2 X 4 Encoder ( case 문)

<Source code>

module Encoder_4X2_Behavioral_Modeling_case(
    input [3:0] signal,
    output reg [1:0] code );
    
    always @(signal) begin
        case (signal)
            4'b0001 : code = 2'b00;
            4'b0010 : code = 2'b01;
            4'b0100 : code = 2'b10;
            4'b1000 : code = 2'b11;
            default code = 2'b00;
        endcase
    end
endmodule

 

<Simulation>

Behavioral Modeling of 2 X 4 Encoder ( case 문)

<Analysis>

  • 소스 코드에 대해서 분석을 하면 다음과 같다.
    - 입력 데이터는 4bit이기 때문에 이를 통해 구현할 수 있는 경우의 수는 총 16가지이다.
    - 하지만, 우리가 입력 - 출력으로 정의한 경우의 수는 총 4가지 이기 때문에 12가지 입력이 들어올 경우에 대해서도 대비를 해야한다.
    - 이를 위해 default 문을 통해 12가지 입력이 들어오면 2'b00이 출력 되도록 설계 했다.
    - always문에서 code 변수는 l-value로 활용되기 때문에 wire형이 아닌 reg형으로 자료형 변환했다.
  • 시뮬레이션에 대한 분석은 다음과 같다.
    - 예기치 못한 입력 (4'b1100)에 대해서 출력 (2'b00)이 되는 것을 확인함으로서 이론되도록 동작한다는 것을 확인

 

4.3. Dataflow Modeling of 2 X 4 Encoder

<Source code>

module Encoder_4X2_DataFlow_Modeling(
    input [3:0] signal,
    output [1:0] code );
    
    assign code = (signal == 4'b0001)? 2'b00 : 
                        ((signal == 4'b0010)? 2'b01 :
                        ((signal == 4'b0100)? 2'b10 :
                        ((signal == 4'b1000)? 2'b11 : 2'b00)));
    
endmodule

 

<Simulation>

Dataflow Modeling of 2 X 4 Encoder

<Analysis>

  • 소스 코드에 대해서 분석을 하면 다음과 같다.
    - Dataflow modeling 으로 설계하였다.
    - 예외 입력 12가지에 대해서 대비하기 위해서 마지막에 2'b00이 출력되도록 설계했다.
    - 조건 연산자의 False문안에 조건 연산자를 설계함으로서 if - else if - else 문과 유사하게 설계했다.
  • 시뮬레이션에 대한 분석은 다음과 같다.
    - 예기치 못한 입력 (4'b1010)에 대해서 출력 (2'b00)이 되는 것을 확인함으로서 이론되도록 동작한다는 것을 확인