에서 가산기를 구현한다는 것 - 3항 가산

13125 단어 FPGAAltera가산기
htps : // 이 m / srmf 씨 /
계속.

다양한 추가의 구현



여기까지 개설한 ALM의 기본 구조를 전제로 다양한 가산기의 구현을 생각해 봅시다.

※여기에서는, Altera(Intel)의 FPGA를 전제로 하고 있습니다만, Xilinx나 Lattice의 FPGA도 기본적으로는 같은 구성이므로, 대체로 적용 가능하지 않을까 생각합니다.

3항 가산



공유 연산 모드를 사용하면 3항의 가산을 고밀도로(그러나 가장 빠르지는 않지만) 구현할 수 있습니다.
이 때문에, 다입력의 가산기의 파이프라인을 실장하는 경우에는, 3항으로 1단으로 하면 편리한 경우가 많습니다.

32bit 8 입력의 가산의 구현 예를 4개 나타냅니다.
  • adder8
  • 8 입력을 한 번에 더합니다.

  • adder8_binary
  • 1 단으로 2 항의 가산을하는 바이너리 트리 모양의 회로입니다
  • 3단 파이프라인

  • adder8_ternary
  • 1 단으로 3 항을 가산합니다
  • 2 단 파이프 라인입니다

  • adder8_quatenary
  • 1 단으로 4 항을 가산합니다
  • 2 단 파이프 라인입니다


  • 회로도로서 다음과 같습니다.





    Verilog-HDL의 설명은 다음과 같습니다.
    module adder8 #(
        parameter   W   = 32
    ) (
        input wire                  clk,
        input wire  [7:0][W-1:0]    d,
        output reg  [W-1:0]         sum
    );
    
        always_ff @(posedge clk) begin
            sum <= d[0] + d[1] + d[2] + d[3] + d[4] + d[5] + d[6] + d[7];
        end
    
    endmodule
    
    module adder8_binary #(
        parameter   W   = 32
    ) (
        input wire                  clk,
        input wire  [7:0][W-1:0]    d,
        output reg  [W-1:0]         sum
    );
    
        logic [3:0][W-1:0] sum1;
        logic [1:0][W-1:0] sum2;
    
        always_ff @(posedge clk) begin
            sum1[0] <= d[0] + d[1];
            sum1[1] <= d[2] + d[3];
            sum1[2] <= d[4] + d[5];
            sum1[3] <= d[6] + d[7];
    
            sum2[0] <= sum1[0] + sum1[1];
            sum2[1] <= sum1[2] + sum1[3];
    
            sum <= sum2[0] + sum2[1];
        end
    
    endmodule
    
    module adder8_ternary #(
        parameter   W   = 32
    ) (
        input wire                  clk,
        input wire  [7:0][W-1:0]    d,
        output reg  [W-1:0]         sum
    );
    
        logic [2:0][W-1:0] sum1;
    
        always_ff @(posedge clk) begin
            sum1[0] <= d[0] + d[1] + d[2];
            sum1[1] <= d[3] + d[4] + d[5];
            sum1[2] <= d[6] + d[7];
    
            sum <= sum1[0] + sum1[1] + sum1[2];
        end
    
    endmodule
    
    module adder8_quatenary #(
        parameter   W   = 32
    ) (
        input wire                  clk,
        input wire  [7:0][W-1:0]    d,
        output reg  [W-1:0]         sum
    );
    
        logic [1:0][W-1:0] sum1;
    
        always_ff @(posedge clk) begin
            sum1[0] <= d[0] + d[1] + d[2] + d[3];
            sum1[1] <= d[4] + d[5] + d[6] + d[7];
    
            sum <= sum1[0] + sum1[1];
        end
    
    endmodule
    
    

    Quartus의 합성 결과를 나타냅니다.
  • Cyclone V 5CSEMA4U23C6
  • 17.0.0 Build 595 04/25/2017 SJ Lite Edition
  • Virtual Pin에 의한 임시 합성
  • 클럭은 300MHz로 제한



  • module
    Latency
    fMax
    ALMs
    FFs
    ALUTs


    adder8
    1clk
    171MHz
    47.5
    32
    128

    adder8_binary
    3clk
    327MHz
    111.0
    224
    224

    adder8_ternary
    2clk
    317MHz
    63.8
    128
    128

    adder8_quatenary
    2clk
    226MHz
    67.1
    160
    96


    adder8이 가장 회로 규모가 작습니다. 그러나 fMax는 가장 느린 회로입니다.

    adder8_binary가 가장 fMax가 높지만 회로 규모는 adder8_ternary에 비해 약 두 배입니다. Latency는 3clk에서 가장 느린 회로입니다.

    adder8_quaternary는 adder8_ternary와 거의 유사한 회로 규모입니다 (ALM 수는 동등하고 FF 수 LUT 수는 작음). 그러나 fMax는 binary, ternary에 비해 100MHz도 느려지고 있습니다.

    위의 예에서는 3입력마다 가산을 정리하는 것이 가장 균형이 좋다고 할 수 있습니다.

    수정 내역


  • 가독성을 위해 샘플 코드를 packed array 형식으로 작성했습니다.
  • 블록 다이어그램을 추가하고 설명을 수정했습니다.
  • 좋은 웹페이지 즐겨찾기