今度はFPGAで実際にキャリーの遅延する様子を見る。8ビット加算器で試す。1111 1111 + 0000 0000 + キャリーイン
という計算をして全桁にキャリーアウトが立つようにする。入力x
には1111 1111
を、入力y
には0000 0000
を最初から書き込んでおく。キャリーインc0
にはFGから定期的にパルスを入力する。
library ieee; use ieee.std_logic_1164.all; entity n_bits_adder_ripple is generic ( NUM_BITS: natural := 8 ); port ( c0: in std_logic; --x: in std_logic_vector(NUM_BITS-1 downto 0); --y: in std_logic_vector(NUM_BITS-1 downto 0); -- リップルの様子が見えるよう全桁を端子に出しておく。 cout: out std_logic_vector(NUM_BITS downto 1); s: out std_logic_vector(NUM_BITS-1 downto 0) ); end entity; architecture rtl of n_bits_adder_ripple is signal c_inside: std_logic_vector(NUM_BITS downto 0); -- 最適化されないようにする。 attribute keep: boolean; attribute keep of c_inside: signal is true; begin --u1: for i in s'range generate u1: for i in 0 to NUM_BITS-1 generate fa: entity work.full_adder port map ( cin => c_inside(i), --x => x(i), x => '1', --y => y(i), y => '0', cout => c_inside(i+1), s => s(i) ); end generate; c_inside(0) <= c0; cout <= c_inside(NUM_BITS downto 1); end architecture;
一番左の黄色がcout[1]、途中の薄い緑がcout[2..7]、一番右の濃い緑がcout[8]。わずかではあるが確かにキャリーに遅延が生じている。