8-битный умножитель массива VHDL (неправильный вывод)

Я пытаюсь создать 8-битный множитель массива в VHDL, для этого я использую стандартную архитектуру множителя массива, у меня есть файл BDF, получающий A (множитель) и B (множитель), и в этом файле BDF есть блок с именем «сумматор», который суммирует произведения A и B. У меня проблемы с выводом суммы, он показывает гораздо меньшее число от правильного значения. введите здесь описание изображения

Изображение выше — мой основной BDF.

введите здесь описание изображения

На изображении выше показаны соединения от and_arrays к сумматору.

Код сумматора:

LIBRARY IEEE;
USE IEEE.std_logic_1164.ALL;
USE IEEE.std_logic_unsigned.ALL;
use IEEE.std_logic_arith.ALL;
use IEEE.numeric_std.ALL;

ENTITY adder IS
  PORT (i_IN0   : IN  STD_LOGIC_VECTOR(7 downto 0);-- data input
        i_IN1   : IN  STD_LOGIC_VECTOR(7 downto 0);-- data input
        i_IN2   : IN  STD_LOGIC_VECTOR(7 downto 0);-- data input
        i_IN3   : IN  STD_LOGIC_VECTOR(7 downto 0);-- data input
        i_IN4   : IN  STD_LOGIC_VECTOR(7 downto 0);-- data input
        i_IN5   : IN  STD_LOGIC_VECTOR(7 downto 0);-- data input
        i_IN6   : IN  STD_LOGIC_VECTOR(7 downto 0);-- data input
        i_IN7   : IN  STD_LOGIC_VECTOR(7 downto 0);-- data input
        o_Q     : OUT STD_LOGIC_VECTOR(15 DOWNTO 0);
        o_COUT  : OUT STD_LOGIC);-- data output  
END adder;

architecture arch1 of adder is 
begin 
    process(i_IN0, i_IN1, i_IN2, i_IN3, i_IN4, i_IN5, i_IN6, i_IN7)
      variable soma:std_logic_vector(14 downto 0);
      variable aux0:std_logic_vector(14 downto 0);
      variable aux1:std_logic_vector(14 downto 0);
      variable aux2:std_logic_vector(14 downto 0);
      variable aux3:std_logic_vector(14 downto 0);
      variable aux4:std_logic_vector(14 downto 0);
      variable aux5:std_logic_vector(14 downto 0);
      variable aux6:std_logic_vector(14 downto 0);
      variable aux7:std_logic_vector(14 downto 0);
      variable c:std_logic; -- carry in
      BEGIN
         aux0(7 downto 0) := i_IN0; aux0(14 downto 8) := "0000000"; -- here i'm trying to shift the 8 nbit input value
         aux1(0) := '0'; aux1(8 downto 1) := i_IN1; aux1(14 downto 9) := "000000"; -- to a 15 bit value to the sums
         aux2(1 downto 0) := "00";aux2(9 downto 2) := i_IN2; aux2(14 downto 10) := "00000"; -- looking to the array multiplier
         aux3(2 downto 0) := "000";aux3(10 downto 3) := i_IN3; aux3(14 downto 11) := "0000"; -- architecture, it seem to be
         aux4(3 downto 0) := "0000";aux4(11 downto 4) := i_IN4; aux4(14 downto 12) := "000"; -- correct
         aux5(4 downto 0) := "00000";aux5(12 downto 5) := i_IN5; aux5(14 downto 13) := "00";
         aux6(5 downto 0) := "000000"; aux6(13 downto 6) := i_IN6; aux6(14) := '0';
         aux7(6 downto 0) := "0000000"; aux7(14 downto 7) := i_IN7;
    -- below the loop that make the sums bit-in-bit, i've addapted this code from a 8 bit adder
         c := '0';
            for i in 0 to 14 loop
                soma(i) := aux0(1) xor aux1(i) xor aux2(i) xor aux3(i) xor aux4(i) xor aux5(i) xor aux6(i) xor aux7(i) xor c;
                c := (aux0(i) and aux1(i) and aux2(i) and aux3(i) and aux4(i) and aux5(i) and aux6(i) and aux7(i)) or ((aux0(i) xor aux1(i) xor aux2(i) xor aux3(i) xor aux4(i) xor aux5(i) xor aux6(i) xor aux7(i)) and c);
            end loop;
            o_COUT <= c; 
            o_Q(15) <= c; -- carry out atribuition to the last bit of the vector
            o_Q(14 downto 0) <= soma;
    end process;
end arch1;

И КОД МАССИВА:

LIBRARY IEEE;
USE IEEE.std_logic_1164.ALL;
USE IEEE.std_logic_unsigned.ALL;
use IEEE.std_logic_arith.ALL;

ENTITY and_array IS
  PORT (i_MULTIPLICANDO   : IN  STD_LOGIC_VECTOR(7 downto 0);-- data input
        i_MULTIPLICADOR   : IN  STD_LOGIC;-- data input
        o_Q   : OUT STD_LOGIC_VECTOR(7 DOWNTO 0));-- data output
END and_array;

ARCHITECTURE arch_1 OF and_array IS
    BEGIN
        GEN_REG: 
        FOR i IN 0 TO 7 GENERATE
            o_Q(i) <= i_MULTIPLICADOR and i_MULTIPLICANDO(i); 
        END GENERATE GEN_REG;
END arch_1;

Я сделал симуляцию для этих двух блоков, блоки и массивы работают отлично, но ошибка появляется в симуляции сумматора под изображением из симуляции:

введите здесь описание изображения

Я моделирую следующие входы:

        Multiplicand = 1 1 1 1 0 1 0 1 (245 dec)
        Multiplier   = 1 0 1 0 1 1 1 1 (175 dec)

Правильное значение для этого продукта 42785, в моем моделировании получается 24899.

Я использую следующую логику для сумм в сумматоре:

                   1 1 1 1 0 1 0 1
                   1 0 1 0 1 1 1 1
                   -----------------
      x x x x x x x 1 1 1 1 0 1 0 1     p1
      x x x x x x 1 1 1 1 0 1 0 1 x     p2
      x x x x x 1 1 1 1 0 1 0 1 x x     p3
      x x x x 1 1 1 1 0 1 0 1 x x x     p4 
      x x x 0 0 0 0 0 0 0 0 x x x x     p5
      x x 1 1 1 1 0 1 0 1 x x x x x     p6
      x 0 0 0 0 0 0 0 0 x x x x x x     p7
      1 0 1 0 1 1 1 1 x x x x x x x     p8
_________________________________________

В блоке сумматора я заменил все «X» на 0 на сумму (например, сдвиг). В цикле блока сумматора суммы от p1 до p8 выполняются поразрядно. Вероятно, ошибка в этом цикле или в переносе, но я пытался сделать это из многих форм и всегда ошибался.

Кто-нибудь знает, как это исправить?

Ниже показано изображение абстракции основной схемы:

введите здесь описание изображения


person Community    schedule 02.06.2016    source источник
comment
Привлекательный вопрос, но Некоторые вопросы по-прежнему не относятся к теме, даже если они подпадают под одну из перечисленных выше категорий: 1. Вопросы, требующие помощи в отладке (почему этот код не работает?), должны включать желаемое поведение, конкретную проблему или ошибку и кратчайший код, необходимый для их воспроизведения, в самом вопросе. Вопросы без четкой формулировки проблемы бесполезны для других читателей. См. раздел Как создать минимальный, полный и проверяемый пример.   -  person    schedule 03.06.2016
comment
Суммирование в вашем сумматоре не соответствует слайду 63 Фрэнка Вахида.   -  person    schedule 03.06.2016
comment
Нет, на слайде Вахида показан 4-битный множитель с 3 сумматорами, то, что я пытаюсь сделать, это 8-битный множитель, использующий только 1 сумматор (абстрагируя все остальные внутри этого), поэтому я думаю, что ошибка связана с сумматором, но я не нашел где это.   -  person    schedule 03.06.2016
comment
Для этого продукта должно быть значение 42875. Вы неправильно вычисляете перенос в столбце битов продукта, где сумма столбца представляет собой Вес Хэмминга для количества единиц (поп-количество). Вес Хэмминга можно смоделировать с помощью операторов цикла, в то время как синтезированный результат будет намного медленнее и больше, чем 7 сложений для 8-битных операндов, подразумеваемых Вахидом, требующих 14 различных размеров сети взвешивания.   -  person    schedule 04.06.2016
comment
Я заметил, что перенос неправильный, мое решение для этого было использовать 1 половинный сумматор и 6 полных сумматоров одним продуктом, всего было использовано 8 половинных сумматоров и 48 полных сумматоров для решения моей проблемы!   -  person    schedule 05.06.2016


Ответы (2)


Решением этой проблемы было использование половинных сумматоров и полных сумматоров вместо сумматора, показанного выше в вопросе.

Была использована следующая логика:

введите здесь описание изображения

Всего было использовано:

64 И ворота; 8 половинных гадюк; 48 полных сумматоров.

person Community    schedule 05.06.2016

Я думаю, что основная проблема заключается в побитовом коде, предназначенном для суммирования:

        for i in 0 to 14 loop
            soma(i) := aux0(1) xor aux1(i) xor aux2(i) xor aux3(i) xor aux4(i) xor aux5(i) xor aux6(i) xor aux7(i) xor c;
            c := (aux0(i) and aux1(i) and aux2(i) and aux3(i) and aux4(i) and aux5(i) and aux6(i) and aux7(i)) or ((aux0(i) xor aux1(i) xor aux2(i) xor aux3(i) xor aux4(i) xor aux5(i) xor aux6(i) xor aux7(i)) and c);
        end loop;

c здесь всего один бит, что довольно неадекватно в качестве переноса для девяти терминов (восемь вспомогательных битов и перенос, так что это возвращается для создания большего количества терминов, когда мы достаточно расширяем перенос). Если бы мы предположили, что этих девяти битов достаточно, вы все равно получили бы значения до 9, что требует четырех битов в двоичном виде, то есть как минимум трех переносов. Это происходит, как только у вас есть более трех сроков; полный сумматор суммирует от 1+1+1 до 2+1 (один бит имеет больший вес), используя все значения своего выхода. Поскольку это сокращение, они могут быть объединены в слои, но более крупный сумматор должен использовать больше выходных битов (например, сумматор с 5 входами может производить 2+2+1, а сумматор с 7 битами может производить 4+2+1). ); мы увидим это, если подсчитаем линии переноса между столбцами в вашей схеме множителя массива. В среднем столбце столько переносов, сколько битов в множителях.

person Yann Vernier    schedule 06.06.2016