Я пытаюсь сделать 8 бит множителя массива в VHDL, я использую стандартную архитектуру множителя массива, чтобы сделать это, у меня есть файл BDF, получающий A (множитель) и B (множитель), и в этом файле BDF есть блок с именем «сумматор», который делает суммы из продуктов A и B. У меня возникают проблемы с суммарным выходом, что показывает гораздо меньшее число из правильного стоимость. 8 бит Множитель массивов VHDL (выход неправильный)
Изображение, приведенное выше, является моим основным BDF.
Изображение выше показывает де соединения от and_arrays на сумматор.
код Adder:
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;
И ARRAY КОД:
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;
Я сделал моделирования для этих двух блоков, то и блоки массива работают отлично, но появляется ошибка при моделировании сумматора , ниже Imagem от моделирования:
i'am имитирующие следующие входы:
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 выполняются бит-в-бит. Вероятно, ошибка в этом цикле или в переносе, но я пытался сделать это из многих форм и всегда ошибаюсь.
У кого-нибудь есть идея, как это исправить?
Ниже это главная цепь абстракция изображение:
Привлекательный вопрос, но [Некоторые вопросы по-прежнему не соответствуют теме, даже если они вписываются в одну из категорий, перечисленных выше) (http://stackoverflow.com/help/on-topic): 1. Вопросы, требующие отладки («почему этот код не работает?») должен включать в себя желаемое поведение, конкретную проблему или ошибку и кратчайший код, необходимый для воспроизведения в самом вопросе. Вопросы без четкого описания проблемы не полезны другим читателям. См. [Как создать минимальный, завершенный и проверяемый пример] (http://stackoverflow.com/help/mcve). – user1155120
Суммирование в процессе в вашем сумматоре, похоже, не соответствует слайду Фрэнка Вахида 63. – user1155120
Нет, слайд Vahid показывает 4-битный множитель с 3 сумматорами, что я пытаюсь сделать, это 8-разрядный множитель, использующий только 1 сумматор (абстрагирование всех остальных внутри этого), поэтому я думаю, что ошибка на сумрале, но я не нашел, где это. –