nビット加算器 / リップルキャリーアダー / キャリーの遅延する様子を見る

nビット加算器 / リップルキャリーアダー -の続き

今度は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]。わずかではあるが確かにキャリーに遅延が生じている。