VHDLで4ビット加算器を作る / ビット0だけ半加算器にする

pp.111-114
今度は、前回作った全加算器を連結して4ビット加算器を作ってみる。ビット0だけはキャリーインが不要なので半加算器にする。

7LEを消費した。

library IEEE;
use IEEE.std_logic_1164.all;

-- 4ビット加算器の入出力を宣言する。
entity adder_4bit is
    port(
        AIN : in  std_logic_vector(3 downto 0); -- バスは~_vector(MSB downto LSB)で指定する。
        BIN : in  std_logic_vector(3 downto 0);
        SUM : out std_logic_vector(4 downto 0)  -- キャリーアウトするので5ビット幅
    );
end adder_4bit;


-- 4ビット加算器の回路を記述する。
architecture RTL of adder_4bit is

-- 半加算器をコンポーネントとして宣言する。
component half_adder
    port(
        A  : in  std_logic;
        B  : in  std_logic;
        S  : out std_logic;
        CO : out std_logic
    );
end component;

-- 全加算器をコンポーネントとして宣言する。
component full_adder
    port(
        A  : in  std_logic;
        B  : in  std_logic;
        CI : in  std_logic;
        S  : out std_logic;
        CO : out std_logic
    );
end component;

-- 内部信号を定義する。
signal CO_TMP0 : std_logic;
signal CO_TMP1 : std_logic;
signal CO_TMP2 : std_logic;

begin
   -- 半加算器を1つ実体化して、
   --「半加算器の入出力」=>「4ビット加算器の入出力または内部信号」という形で接続する。
    C1 : half_adder
        port map(
            A  => AIN(0), -- インデックスは[]ではなく()
            B  => BIN(0),
            S  => SUM(0),
            CO => CO_TMP0
        );

   -- 全加算器を3つ実体化して、
   --「全加算器の入出力」=>「4ビット加算器の入出力または内部信号」という形で接続する。
   -- 宣言したのと同じ順番に記述するのであれば「4ビット加算器の入出力または内部信号」だけを記述するのでもよい。
    C2 : full_adder port map(AIN(1), BIN(1), CO_TMP0, SUM(1), CO_TMP1);
    C3 : full_adder port map(AIN(2), BIN(2), CO_TMP1, SUM(2), CO_TMP2);
    C4 : full_adder port map(AIN(3), BIN(3), CO_TMP2, SUM(3), SUM(4) );

    
end RTL;

今、0xA + 9 = 0b1 0011を計算している。
f:id:ti-nspire:20201220093331j:plain:h300 f:id:ti-nspire:20201220093309p:plain:h300