16-битный сумматор, использующий 2-битный сумматор в качестве компонента

Я пытаюсь создать 16-битный сумматор, используя 2-битные сумматоры в качестве компонентов (которые сами используют 1-битный сумматор в качестве компонента). Однако мой код не компилируется в Quartus II. Может кто-то мне помочь, пожалуйста? Большое спасибо!

Мой проект состоит из 3 файлов: bit_adder.vhd, add2.vhd и add16.vhd. Ошибка возникает в add16.vhd:

--- bit_adder.vhd
-- description of 1 bit adder
LIBRARY IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity BIT_ADDER is
        port( a, b, cin         : in  STD_LOGIC;
              sum, cout         : out STD_LOGIC );
end BIT_ADDER;

architecture BHV of BIT_ADDER is
begin

        sum <=  (not a and not b and cin) or
                        (not a and b and not cin) or
                        (a and not b and not cin) or
                        (a and b and cin);

        cout <= (not a and b and cin) or
                        (a and not b and cin) or
                        (a and b and not cin) or
                        (a and b and cin);
end BHV;

-- ниже add2.vhd, 2-битный сумматор. складывает два 2-битных числа вместе, используя два 1-битных сумматора

LIBRARY IEEE;
use IEEE.STD_LOGIC_1164.ALL;


entity add2 is
    port( a, b      : in    STD_LOGIC_VECTOR(1 downto 0);
          ans       : out   STD_LOGIC_VECTOR(1 downto 0);
          cout      : out   STD_LOGIC       );
end add2;

architecture STRUCTURE of add2 is

-- Component: two 1-bit adders

component BIT_ADDER
    port( a, b, cin     : in  STD_LOGIC;
          sum, cout     : out STD_LOGIC );
end component;

signal c0, c1 : STD_LOGIC;
begin

c0 <= '0';
b_adder0: BIT_ADDER port map (a(0), b(0), c0, ans(0), c1);
b_adder1: BIT_ADDER port map (a(1), b(1), c1, ans(1), cout);

END STRUCTURE;

-- add16.vhd -- установить как объект верхнего уровня

LIBRARY IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity add16 is
    port (a, b : in std_logic_vector(15 downto 0);
            sum1 : out std_logic_vector(15 downto 0);
            cout : out std_logic_VECTOR(1 downto 0)); --_vector);
end add16;

architecture arch16 of add16 is
    component BIT_ADDER 
        port( a, b, cin         : in  STD_LOGIC;
              sum, cout         : out STD_LOGIC );
    end component;

    component add2
        port (a, b      : in    STD_LOGIC_VECTOR(1 downto 0);
          ans       : out   STD_LOGIC_VECTOR(1 downto 0);
          cout      : out   STD_LOGIC       );
    end component;

    signal c0, c1, c2, c3, c4, c5, c6, c7  : std_LOGIC_VECTOR(1 downto 0);
    begin
    c0 <='00'; --Error (10500): VHDL syntax error at add16.vhd(26) near text "'";  expecting "(", or an identifier, or  unary operator

    D_adder0: add2 port map (a(0), b(0), c0, sum1(0), c1);
    D_adder1: add2 port map (a(1), b(1), c0, sum1(1), c2);
    D_adder2: add2 port map (a(2), b(2), c0, sum1(2), c3);
    D_adder3: add2 port map (a(3), b(3), c0, sum1(3), c4);
    D_adder4: add2 port map (a(4), b(4), c0, sum1(4), c5);
    D_adder5: add2 port map (a(5), b(5), c0, sum1(5), c6);
    D_adder6: add2 port map (a(6), b(6), c0, sum1(6), c7);
    D_adder7: add2 port map (a(7), b(7), c0, sum1(7), cout);
    end arch16;

person elChino    schedule 06.03.2015    source источник
comment
Спасибо @eugene-sh, но в add16.vhd есть еще 3 ошибки. Это находится в разделе карты портов: Ошибка (10381): ошибка несоответствия типа VHDL в add16.vhd(28): индексированное имя возвращает значение, тип которого не соответствует std_logic_vector, типу целевого выражения.   -  person elChino    schedule 07.03.2015


Ответы (2)


1) Модули add2 и add16 должны иметь порт cin, почему бы вам не добавить его в свой дизайн? Если вы хотите получить правильный результат, все модули должны иметь «перенос». Вы использовали метод Carry Ripple Adder, тогда в add16 каждый блок (экземпляр) должен иметь порт cin, предоставленный из предыдущего блока.

2) В модуле add16 почему сигналы c1, c2, ... 2 битные? Каждому блоку нужен порт cin, который равен 1 биту. Также вам не нужен сигналc0, т.к. в модуле add16, c0 это одно и то же cin.

3) В модуле add16 почему порты каждого экземпляра (a,b,sum1) 1 бит. Должно быть 2 бита.

4) В модуле add16 компонент BIT_ADDER не нужен. Вы можете удалить его.

Я отредактировал ваш код с указанными выше изменениями. Я смоделировал это и смог получить правильный результат в Modelsim. (модуль BIT_ADDER не менял) :

------------------------------- add2 ---------------------------------
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;


ENTITY add2 IS
    PORT( a, b  : IN  STD_LOGIC_VECTOR(1 DOWNTO 0);
          cin   : IN  STD_LOGIC;
          ans   : OUT STD_LOGIC_VECTOR(1 DOWNTO 0);
          cout  : OUT STD_LOGIC
    );
END add2;

ARCHITECTURE STRUCTURE OF add2 IS

    COMPONENT BIT_ADDER
        PORT( a, b, cin  : IN  STD_LOGIC;
                sum, cout  : OUT STD_LOGIC
        );
    END COMPONENT;

    SIGNAL c1 : STD_LOGIC;

BEGIN

    b_adder0: BIT_ADDER PORT MAP (a(0), b(0), cin, ans(0), c1);
    b_adder1: BIT_ADDER PORT MAP (a(1), b(1), c1, ans(1), cout);

END STRUCTURE;



------------------------------- add16 ---------------------------------
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;

ENTITY add16 is
    PORT (  a, b : IN  std_logic_vector(15 DOWNTO 0);
            cin  : IN  STD_LOGIC;
            sum1 : OUT std_logic_vector(15 DOWNTO 0);
            cout : OUT std_logic);
END add16;

ARCHITECTURE arch16 OF add16 IS

    COMPONENT add2
        PORT(  a, b      : IN    STD_LOGIC_VECTOR(1 DOWNTO 0);
               cin       : IN    STD_LOGIC;
               ans       : OUT   STD_LOGIC_VECTOR(1 DOWNTO 0);
               cout      : OUT   STD_LOGIC);
    END COMPONENT;

    SIGNAL c1, c2, c3, c4, c5, c6, c7  : std_LOGIC;

BEGIN

    D_adder0: add2 PORT MAP ( a(1  DOWNTO 0)  , b(1 DOWNTO 0)  , cin, sum1(1 DOWNTO 0)   , c1  );
    D_adder1: add2 PORT MAP ( a(3  DOWNTO 2)  , b(3 DOWNTO 2)  , c1 , sum1(3 DOWNTO 2)   , c2  );
    D_adder2: add2 PORT MAP ( a(5  DOWNTO 4)  , b(5 DOWNTO 4)  , c2 , sum1(5 DOWNTO 4)   , c3  );
    D_adder3: add2 PORT MAP ( a(7  DOWNTO 6)  , b(7 DOWNTO 6)  , c3 , sum1(7 DOWNTO 6)   , c4  );
    D_adder4: add2 PORT MAP ( a(9  DOWNTO 8)  , b(9 DOWNTO 8)  , c4 , sum1(9 DOWNTO 8)   , c5  );
    D_adder5: add2 PORT MAP ( a(11 DOWNTO 10) , b(11 DOWNTO 10), c5 , sum1(11 DOWNTO 10) , c6  );
    D_adder6: add2 PORT MAP ( a(13 DOWNTO 12) , b(13 DOWNTO 12), c6 , sum1(13 DOWNTO 12) , c7  );
    D_adder7: add2 PORT MAP ( a(15 DOWNTO 14) , b(15 DOWNTO 14), c7 , sum1(15 DOWNTO 14) , cout);

END arch16;
person Amir    schedule 06.03.2015

Векторные литералы в VHDL заключаются в двойные кавычки, то есть "00", а не '00'

Обновление: в разделе port map вы назначаете однобитовые сигналы двухбитным входам:

 D_adder0: add2 port map (a(0), b(0), c0, sum1(0), c1);

Здесь, например, a(0) является младшим битом a. Но ваш компонент add2 ожидает сигнал ширины 2:

 component add2
        port (a, b : in    STD_LOGIC_VECTOR(1 downto 0); -- <-- 2bits wide
        ans       : out   STD_LOGIC_VECTOR(1 downto 0);
        cout      : out   STD_LOGIC       );
    end component;
person Eugene Sh.    schedule 06.03.2015