거북이처럼 천천히

Verilog RTL 설계 (6월 13일 - 2) 본문

Verilog/Verilog RTL 설계

Verilog RTL 설계 (6월 13일 - 2)

유로 청년 2024. 6. 14. 12:36

1. 4bit Parallel-adder 

- 4bit 병렬 가산기는 다음과 같은 구조를 갖는다.

- 4bit 병렬 가산기는 아래와 그림과 같이 4bit 데이터 A, B를 가산기에 대입하면 전가산 수행 후, 결과 값이 출력된다.

4Bit Parallel adder

 

- 위 그림에서 알 수 있듯이 4bit parallel-adder는 4개의 Full-adder를 병렬로 연결함으로서 만들 수 있다.

- 4bit parallel adder에 대해서 Structural modeling, Dataflow modeling으로 구현해보겠다.

- Q) 왜 4bit parallel adder의 Behavior modeling 을 구현하지 않는가?
  A) 입력 값으로 4bit 크기를 갖는 A, B 와 1bit 크기를 갖는 Sign 데이터가 들어오는 데, 모든 경우의 수는 
       몇 개가 나오는가? 입력 값으로 가능한 경우의 수는 총 2^9 = 512개가 나온다.
       그런데, Behavioral modeling 으로 설계한다는 것은 "모든 입력 경우의 수에 대해서 출력을 하나하나
       지정해주는 설계 방식"이기 때문에 비효율적이고, 복잡하기 때문에 구현하지 않는다.

- 주의) 4bit parallel adder는 결과값을 4bit로 출력하기 때문에 최대 15까지만 출력이 가능하며, 이를 넘으
  면 Overflow가 발생하여 0으로 돌아간다.

 

2. 4bit Parallel-adder (Structural Modeling)

 

< Source >

// and_gate dataflow Modeling
module and_gate (
    input a, b,
    output out);
    
    wire result_value;
    
    assign result_value = a * b;
    assign out = result_value;
    
endmodule

// xor_gate Behavioral Modeling
module xor_gate (
    input a, b, 
    output reg out);
    
   always @(a, b) begin
        case({a, b}) 
            2'b00 : out = 0;
            2'b01 : out = 1;
            2'b10 : out = 1;
            2'b11 : out = 0;
         endcase   
   end
    
endmodule

// half_adder Structural Modeling
module half_adder (
    input a, b,
    output sum, carry );
    
    and_gate and0 (a, b, carry);
    xor_gate xor0 (a, b, sum);
    
 endmodule

// full_adder Structural Modeling
module full_adder (
    input a, b, Cin,
    output sum, carry );
    
    wire carry_0, sum_0, carry_1;
    
    half_adder half0 (a, b, sum_0, carry_0);
    half_adder half1 (sum_0, Cin, sum, carry_1);
    
    xor_gate xor0 (carry_0, carry_1, carry);
    
endmodule

// 
module Parallel_4bit_adder_Structural_Modeling(
    input [3:0] a, b,
    input sign,
    output [3:0] sum,
    output carry); 
    
    wire[3:0] sum;
    wire[2:0] carry_line;
    
    full_adder full_adder0 (a[0], b[0], sign, sum[0], carry_line[0]);
    full_adder full_adder1 (a[1], b[1], carry_line[0], sum[1], carry_line[1]);
    full_adder full_adder2 (a[2], b[2], carry_line[1], sum[2], carry_line[2]);
    full_adder full_adder3 (a[3], b[3], carry_line[2], sum[3], carry);
    
endmodule

 

 

< Simulation >

Simulation of Structural modeling of 4bit parallel adder

 

- 덧셈 연산 값이 15을 넘으면 Overflow가 발생하며, 0으로 돌아가 잘못된 출력이 발생한다는 점도 유념해야한다.

 

 

 

3. 4bit Parallel-adder (Dataflow Modeling)

< source >

module Parallel_4bit_adder_Dataflow_Modeling(
    input [3:0] a, b,
    input sign,
    output [3:0] sum,
    output carry );
    
    wire[4:0] result_value = a + b + sign;
    
    assign sum = result_value[3:0];
    assign carry = result_value[4];
    
endmodule

 

< Simulation >

Simulation of dataflow modeling of 4bit parallel adder

 

  • 덧셈 연산 값이 15을 넘으면 Overflow가 발생하며, 0으로 돌아가 잘못된 출력이 발생한다는 점도 유념해야한다.
  • Dataflow modeling으로 설계할 경우, 각각의 Full adder간에 공유되는 carry 값을 저장하는 변수가 없기 때문에 하나씩 계산을 통해 간접적으로 확인할 수 있지만, 이를 시뮬레이션에서 변수를 통해 직접적으로 확인할 수 없다.