거북이처럼 천천히

4 bit parallel adder / subtractor 본문

Verilog/Verilog 연습

4 bit parallel adder / subtractor

유로 청년 2024. 6. 30. 11:51

1. Structural Modeling of 4 bit parallel adder / subtractor

<Source>

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

// Behavioral Modeling of xor gate
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

// Behavioral Modeling of or age
module or_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 = 1;
        endcase
    end    
endmodule

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

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

// Structural Modeling of 4 bit parallel adder / Substructor
module Parallel_4bit_adder_subtractor_Structural_Modeling(
    input [3:0] a, b,
    input Cin,
    output [3:0] sum,
    output carry );
    
    wire [3:0] invert_b;
    
    xor_gate xor0 (Cin, b[0], invert_b[0]);
    xor_gate xor1 (Cin, b[1], invert_b[1]);
    xor_gate xor2 (Cin, b[2], invert_b[2]);
    xor_gate xor3 (Cin, b[3], invert_b[3]);
    
    wire [2:0] carry_full_adder;
    
    full_adder full_adder0 (a[0], invert_b[0], Cin, sum[0], carry_full_adder[0]);
    full_adder full_adder1 (a[1], invert_b[1], carry_full_adder[0], sum[1], carry_full_adder[1]);
    full_adder full_adder2 (a[2], invert_b[2], carry_full_adder[1], sum[2], carry_full_adder[2]);
    full_adder full_adder3 (a[3], invert_b[3], carry_full_adder[2], sum[3], carry);
    
endmodule

 

<Simulation>

 

<RTL Analysis>

 

 

<Synthesis>

 

 

 

 

 

 

 

2. Dataflow Modeling of 4 bit parallel adder / subtractor

<Source>

// Dataflow Modeling of 4bit parallel adder / subtractor.
module Parallel_4bit_adder_subtractor_Dataflow_Modeling(
    input [3:0] a, b,
    input Cin,
    output [3:0] sum,
    output carry  );
    
    wire[4:0] result = (Cin)? a - b : a + b;
    
    assign sum = result[3:0];
    assign carry = result[4];
   //  assign carry = (Cin)? ~result[4] : result[4];
    
endmodule

 

<Simulation>

 

<RTL Analysis>

 

<Synthesis>

 

 

 

 

 

 

 

3. Behavioral Modeling of 4 bit parallel adder / subtractor

  • 입력 데이터 : 4 bit 크기를 갖는 a, b와 1 bit 크기를 갖는 Cin
  • 따라서 모든 경우의 수를 따져보기 위해서는 총 2^9 = 512가지의 입력 값을 줘야 한다.
  • 그런데, 512가지의 입력에 대해서 출력을 정의하는 것은 힘들기 때문에 해당 설계 방식은 넘어간다.

 

 

 

 

 

 

 

4. 여담) Dataflow Modeling은 32bit 데이터 기준으로 연산하기 때문에 5번째 비트의 Carry 값이 다르다.

  • Dataflow Modeling에서도 5번찌 비트의 Carry 값을 Structural Modeling과 맞춰주기 위해서는 추가적인 작업이 필요하다.

4bit 데이터 기준에서 가감연산

 

32bit 데이터 기준에서 가감연산

  • 따라서 아래와 같이 코드를 수정한다면 5번째 비트의 값을 동일하게 맞춰줄 수 있다.

// Dataflow Modeling of 4bit parallel adder / subtractor.
module Parallel_4bit_adder_subtractor_Dataflow_Modeling(
    input [3:0] a, b,
    input Cin,
    output [3:0] sum,
    output carry  );
    
    wire[4:0] result = (Cin)? a - b : a + b;
    
    assign sum = result[3:0];
    assign carry = (Cin)? ~result[4] : result[4];
    
endmodule

 

 

 

 

 

 

 

5. Dataflow Modeling에서는 if 문을 사용할 수 없다. 

  • Dataflow Modeling 4bit parallel adder / subtractor를 설계하는 과정에서 if문을 사용했는데, if문을 포함하고 있는 명령문에서 문제가 발생했다.
// Dataflow Modeling of 4bit parallel adder / subtractor.
module Parallel_4bit_adder_subtractor_Dataflow_Modeling(
    input [3:0] a, b,
    input Cin,
    output [3:0] sum,
    output carry  );
    
    wire[4:0] result;
    
    if(Cin) assign result = a - b;
    else assign result = a + b;
    
endmodule

 

  • Dataflow Modeling에서 if문을 사용할 수 없는 이유는 다음과 같다.
    - Dataflow Modeling은 병렬적으로 처리한다. 즉, 입력값의 변화가 발생하면 모든 할당문을 병렬적으로 동시에 처리한다.
    - 그러나 if문은 위에서부터 순차적으로 처리한다.
    - 이는 병렬 처리를 하는 Dataflow Modeling의 특성과 맞지않기 때문에 Dataflow Modeling에서는 if문을 사용할 수 없고, 대신 삼항 연산자인 조건 연산자를 사용할 수 있다.
  • 따라서 조건 연산자로 다시 표현하면 다음과 같다.
// Dataflow Modeling of 4bit parallel adder / subtractor.
module Parallel_4bit_adder_subtractor_Dataflow_Modeling(
    input [3:0] a, b,
    input Cin,
    output [3:0] sum,
    output carry  );
    
    wire[4:0] result = (Cin)? a - b : a + b;
    
endmodule

 

 

'Verilog > Verilog 연습' 카테고리의 다른 글

4 bit Comparator / 32 bit Comparator  (0) 2024.06.30
1 bit Comparator  (0) 2024.06.30
4 bit parallel adder  (0) 2024.06.30
Full adder  (0) 2024.06.29
Half adder  (0) 2024.06.29