Opdracht 2: Ripple carry adder

In deze opdracht moet je een 16 bit ripple-carry adder te maken. Indien je vergeten bent hoe een full adder en een half adder eruit zien, kan je kijken naar onderstaande schema’s. Bij een ripple-carry adder wordt de C out van de eerste adder doorgegeven aan de tweede adder. We werken in little endian.

Het is niet de bedoeling dat je de + operator gebruikt van “std_logic_unsigned” of “std_logic_signed”!

Half adder, met S = A ⊕ B

Full adder

Het is altijd een goed idee om eerst een tekening te maken voordat je begint met typen.

Opleveren

Om deze opdracht op te leveren moeten jullie volgende bestanden indienen via Toledo:

  • één of meerdere bestanden met het design
  • [OPTIONEEL] een markdown file met nodige uitleg

Merk op dat er GEEN testbench mee opgeladen dient te worden.

Testbench

Om een component declaratie te doen, kan je eenvoudig de entity kopiëren en de keywoorden entity vervangen door component.

Het omgekeerde kan uiteraard ook 😃

--------------------------------------------------------------------------------
-- KU Leuven - ESAT/COSIC - Emerging technologies, Systems & Security
--------------------------------------------------------------------------------
-- Module Name:     rca_tb - Behavioural
-- Project Name:    Digitale eletronische schakelingen
-- Description:     Testbench for rca
--
-- Revision     Date       Author     Comments
-- v0.1         20140119   VlJo       Initial version
--
--------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity rca_tb is
    generic(
        WIDTH_as_set_by_the_testbench : natural := 16
    );
end entity rca_tb;

architecture Behavioural of rca_tb is

    component rca is
        generic(
            WIDTH : natural := 8
        );
        port(
            A : IN STD_LOGIC_VECTOR(WIDTH-1 downto 0);
            B : IN STD_LOGIC_VECTOR(WIDTH-1 downto 0);
            S : OUT STD_LOGIC_VECTOR(WIDTH-1 downto 0);
            C : OUT STD_LOGIC
        );
    end component rca;

    signal A : STD_LOGIC_VECTOR(WIDTH_as_set_by_the_testbench-1 downto 0);
    signal B : STD_LOGIC_VECTOR(WIDTH_as_set_by_the_testbench-1 downto 0);
    signal S : STD_LOGIC_VECTOR(WIDTH_as_set_by_the_testbench-1 downto 0);
    signal C : STD_LOGIC;

begin

    -------------------------------------------------------------------------------
    -- STIMULI
    -------------------------------------------------------------------------------
    PSTIM: process
    begin
        A <= x"0000";
        B <= x"0000";
        wait for 3 ns;
        assert (S = x"0000") report "Error in sum" severity note;
        assert (C = '0') report "Error in carry" severity note;
        wait for 2 ns;

        A <= x"0003";
        B <= x"0027";
        wait for 3 ns;
        assert (S = x"002A") report "Error in sum" severity note;
        assert (C = '0') report "Error in carry" severity note;
        wait for 2 ns;

        A <= x"FFFF";
        B <= x"FFFF";
        wait for 3 ns;
        assert (S = x"FFFE") report "Error in sum" severity note;
        assert (C = '1') report "Error in carry" severity note;
        wait for 2 ns;

        wait;
    end process;

    -------------------------------------------------------------------------------
    -- DUT
    -------------------------------------------------------------------------------
    DUT: component rca generic map (WIDTH => WIDTH_as_set_by_the_testbench) port map(
        A => A,
        B => B,
        S => S,
        C => C
    );

end Behavioural;