ルックアヘッドキャリー加算器

vhdlで2bitのルックアヘッドキャリー加算器を書いてみた。

このくらいじゃ威力はないけど、桁が上がるにつれて強力になる回路。

ウィキがわかりやすい。

単純に普通の加算器のキャリー部分を別回路にしたもの。

x桁目から x+1 桁目にいく(小さい桁から数えて)キャリーをC_{x}とすると、

C_{1}=A_{1} and B_{1}

次の桁のキャリーは、感覚的に

C_{2}=(A_{2} and B_{2}) or (A_{2} and C_{1}) or (C_{1} and B_{2})

そのまた次のC_{3}

C_{3}=(A_{3} and B_{3}) or (A_{3} and  C_{2}) or (C_{2} and B_{3})

これを展開すれば良いという話になるんだと思う。そうすると、2段になる。

これを踏まえて2bitの加算器の普通のとルックアヘッド型のvhdlのコードを比較してみた。

以下コード

library IEEE;
use IEEE.std_logic_1164.all;


entity ADDER_2BIT is
        port (A,B: in std_logic_vector(1 downto 0);
        S: out std_logic_vector(1 downto 0);
        OVERFLOW: out std_logic);
end ADDER_2BIT;


architecture RTL of ADDER_2BIT is
        component HARF_ADDER
                port(A,B:in std_logic;
                S,CARRY:out std_logic);
        end component;
        component FULL_ADDER
                port(A,B,PRECARRY: in std_logic;
                S,CARRY: out std_logic);
        end component;
        signal TMP_CARRY: std_logic;


begin
        FIRST_ADDER: HARF_ADDER port map(A=>A(0),B=>B(0),S=>S(0),CARRY=>TMP_CARRY);
        SECOND_ADDER: FULL_ADDER port map(A=>A(1),B=>B(1),S=>S(1),PRECARRY=>TMP_CARRY,CARRY=>OVERFLOW);
end RTL;
library IEEE;
use IEEE.std_logic_1164.all;


entity LOOK_AHEAD_2BIT_ADDER is
        port(A,B: in  std_logic_vector(1 downto 0);
        S: out std_logic_vector(1 downto 0);
        OVERFLOW: out std_logic);
end LOOK_AHEAD_2BIT_ADDER;


architecture RTL of LOOK_AHEAD_2BIT_ADDER is
        component LOOK_AHEAD_HARF
                port(A,B: in std_logic;
                S: out std_logic);
        end component;
        component FULL_ADDER
                port(A,B,PRECARRY: in std_logic;
                S,CARRY: out std_logic);
        end component;
        signal TMP_CARRY: std_logic;
begin
        FIRST_ADDER: LOOK_AHEAD_HARF port map(A(0),B(0),S(0));
        SECOND_ADDER: FULL_ADDER port map(A(1),B(1),TMP_CARRY,S(1),OVERFLOW);
        TMP_CARRY <= A(0) and B(0);

end RTL;

で、テストベンチ。 実時間を計測できないからなんとも言えないけど、今回はとりあえず、同じ結果になればいいかなという軽いノリ。

f:id:b1u3:20181021044138p:plain f:id:b1u3:20181021044149p:plain

書いて見て、ルックアヘッド型の半加算器、全加算器が必要だってことがわかった。2bitだと、ルックアヘッド型の全加算器は必要ないけど、3bit以上になると使うはず。 ルックアップ型の加算器で使うのは、キャリーをただ省いただけのもの。だけど、普通のタイプを流用した場合、そのキャリーはどこにつなげるのという話になると思う。ここからは推測だけど、適当なところにつなぐんじゃないか。浮かせることは可能なんだろうか?ディスクリートのICを触ると、基本浮かせるのはよくないとされているので、つなぐんじゃないかなと思う。その際に使わないくせに電力を食うわけだし、やっぱ外すのがいいんだと思う。