ルックアヘッドキャリー加算器
vhdlで2bitのルックアヘッドキャリー加算器を書いてみた。
このくらいじゃ威力はないけど、桁が上がるにつれて強力になる回路。
ウィキがわかりやすい。
単純に普通の加算器のキャリー部分を別回路にしたもの。
x桁目から x+1 桁目にいく(小さい桁から数えて)キャリーをとすると、
次の桁のキャリーは、感覚的に
そのまた次のは
これを展開すれば良いという話になるんだと思う。そうすると、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;
で、テストベンチ。 実時間を計測できないからなんとも言えないけど、今回はとりあえず、同じ結果になればいいかなという軽いノリ。
書いて見て、ルックアヘッド型の半加算器、全加算器が必要だってことがわかった。2bitだと、ルックアヘッド型の全加算器は必要ないけど、3bit以上になると使うはず。 ルックアップ型の加算器で使うのは、キャリーをただ省いただけのもの。だけど、普通のタイプを流用した場合、そのキャリーはどこにつなげるのという話になると思う。ここからは推測だけど、適当なところにつなぐんじゃないか。浮かせることは可能なんだろうか?ディスクリートのICを触ると、基本浮かせるのはよくないとされているので、つなぐんじゃないかなと思う。その際に使わないくせに電力を食うわけだし、やっぱ外すのがいいんだと思う。