Kraklog

[Vivado] Adder (Half, 1bit Full, 4bit Full, 8bit Full) 본문

Study/VerilogHDL

[Vivado] Adder (Half, 1bit Full, 4bit Full, 8bit Full)

Krakens 2023. 8. 2. 06:46
728x90

사용프로그램 : Vivado

사용보드 : BASYS 3 

-BASYS3 보드를 선택하기위해서 VIVADO에서 보드 정보를 INSTALL해주면 되지만, 간혹 INSTALL 버튼이 없을 경우 직접 설치하면 되는데 C:\Xilinx\Vivado\(해당버전)\data\boards path에 보드 파일(링크)을 넣어주면 된다. 
 

1. Half Adder 

- Layout 및 시뮬레이션 (링크)

식 : 

 

- Schematic

input으로 A,B를 선언해주고, Sum을 처리하기 위해 A xor B를 할당해주고, Carry 를 처리하기 위해 A and B를 할당해준다.
출력 값으로 Sum과 Carry를 선언해주면 완료.
 

- Code

`timescale 1ns/1ps

module HalfAdder (
    input i_a,
    input i_b,
    output o_Sum,
    output o_Crry
);
    assign o_Sum = i_a ^ i_b; //A xor B
    assign o_Crry = i_a & i_b; // A and B
endmodule

-검증

RTL

 

2. Full Adder (1bit Full Adder)

- Layout 및 시뮬레이션 (링크)

- Schematic

input으로 A,B,C_in을 선언해준다, Diagram에서 확인 가능하듯이 자릿수가 반영되므로 Cin이 할당이 되며,
wire 선언을 통해서 Half Adder 사이에 값을 입력시키면 될 것이며, Sum 값을 출력해주고,
Carry를 출력하기 위해서 OR 연산을 해주어 출력 값을 할당해준다.

- Code

`timescale 1ns / 1ps

module FullAdder_1bit(
    input i_a,
    input i_b,
    input i_Cin,
    output o_Sum,
    output o_Crry
    );

    wire w_sum0,w_carry0,w_carry1;

    HalfAdder U_HA0 (  //HalfAdder를 불러와 HA0 모듈로 지칭
    .i_a(i_a),
    .i_b(i_b),
    .o_Sum(w_sum0),
    .o_Crry(w_carry0)
);
    HalfAdder U_HA1 (
    .i_a(w_sum0),
    .i_b(i_Cin),
    .o_Sum(o_Sum),
    .o_Crry(w_carry1)
);

assign o_Crry = w_carry0 | w_carry1;

endmodule

-검증

모듈 이름을 FA에서 HA로 변경

3. Full Adder (4bit Full Adder)

- Layout 및 시뮬레이션 (링크)

    - Schematic

순서는 위 사진과는 다르겠지만 다음과 같이 구현하기위해서 wire를 통해 연결을 해주고,
할당해주면 출력이 나올것으로 보인다.
그러기 위해서 input 값을 [3:0]의 값으로 a,b에 할당해주고, 

- Code

`timescale 1ns / 1ps

module FullAdder_4bit(
    input [3:0] i_a,i_b,
    input i_Cin,
    output [3:0] o_Sum,
    output o_Crry
    );

    wire w_carry0,w_carry1,w_carry2;

    FullAdder_1bit U_FA0(
        .i_a(i_a[0]),
        .i_b(i_b[0]),
        .i_Cin(i_Cin),
        .o_Crry(w_carry0),
        .o_Sum(o_Sum[0])
    );

    FullAdder_1bit U_FA1(
        .i_a(i_a[1]),
        .i_b(i_b[1]),
        .i_Cin(w_carry0),
        .o_Crry(w_carry1),
        .o_Sum(o_Sum[1])
    );

    FullAdder_1bit U_FA2(
        .i_a(i_a[2]),
        .i_b(i_b[2]),
        .i_Cin(w_carry1),
        .o_Crry(w_carry2),
        .o_Sum(o_Sum[2])
    );

    FullAdder_1bit U_FA3(
        .i_a(i_a[3]),
        .i_b(i_b[3]),
        .i_Cin(w_carry2),
        .o_Crry(o_Crry),
        .o_Sum(o_Sum[3])
    );
endmodule

- 검증

4. Full Adder (8bit Full Adder)

- Layout 및 시뮬레이션 (링크)

    - Schematic

 
8bit Full Adder는 1bit Full Adder를 8개로 만들어 사용하거나, 만들어진 4bit Full Adder를 사용하는 방법이 있다.
결국 같은 방법이지만, 코드의 직관성과 편의성을 위해 4bit Full Adder를 2개를 사용할 예정이며,
이 때 wire 선언을 통해 Carry 값을 다음 4bit Full Adder에 연결을 통해 출력값을 받아낼 예정이다.
이렇게 하는 경우, 1bit로만 구성을 하면 4bit 처럼 .i_a[0] ~ i_a [7] 식으로 부여해주면 되겠지만, 
4bit로만 구성하는 경우 위 사진과 같이 i_a[3:0] , i_a[7:4]로 구분해줄 필요가 있다.
 

- Code

`timescale 1ns / 1ps

module FullAdder_8bit(
    input [7:0] i_a,i_b,
    input i_Cin, //bitsream시에는 할당 핀 부족으로 0으로 값을 주었다.
    output [7:0] o_Sum,
    output o_Crry
    );

    wire w_carry0;

    FullAdder_4bit U_FA40(
    .i_a(i_a[3:0]),
    .i_b(i_b[3:0]),
    .i_Cin(i_Cin),
    .o_Sum(o_Sum[3:0]),
    .o_Crry(w_carry0)
    );

    FullAdder_4bit U_FA41(
    .i_a(i_a[7:4]),
    .i_b(i_b[7:4]),
    .i_Cin(w_carry0),
    .o_Sum(o_Sum[7:4]),
    .o_Crry(o_Crry)
    );    
endmodule

- 검증

https://www.realdigital.org/img/b23a2f493e5acb84fa4d8179ad24ec68.svg

 진리표에 나뉘어진 블럭별로 검증을 해보았다.
가장 우측 스위치부터
A⁰~A³ , B⁰~B³   , A⁴~A⁷,B⁴~B⁷ 로 할당한 상태이고
LED는 우측부터 Sum⁰~Sum⁷이 할당되어 있고, Carry의 출력을 8번째 LED에 할당해 놓았다.

 
 

 
 
 

728x90