2013-11-12 2 views
-2

Моя проблема заключается в том, что я не знаю, правилен или не прав.
Мой другой вопрос: где я должен поставить суффикс сущности, в том же модуле, что и сущность mult? Или я должен создать другой модуль?Умножение в VHDL

heres - мой код: код умножения на два номера 5бит в VHDL. Я не знаю, вот проблема: библиотека, сайт объявления сигналов или переменных, ..?

`library IEEE; 
use IEEE.STD_LOGIC_1164.ALL; 
use IEEE.STD_LOGIC_ARITH.ALL; 
use IEEE.NUMERIC_STD.ALL; 
use UNISIM.VComponents.all; 

entity mult is 
    port (op1 : in std_logic_vector(4 downto 0);--a 
    op2 : in std_logic_vector(4 downto 0);--x 
    out : out std_logic_vector(9 downto 0)); --pp 
end mult; 

architecture Behavioral of mult is 
type t_matrix is array (0 to 5, 10 downto 0) of std_logic; 
signal c, sum, mul : t_matrix ; 
signal sum_ini : std_logic_vector(9 downto 0) ; 



begin 
    rows : for i in 0 to 3 generate 
     columns : for j in 0 to 9 generate 
      i_u : adder port map(a => sum_ini(j), 
           b =>c(i,j), 
           cin => mul(i, j), 
           sum => sum(i+1, j), 
           cout => c(i+1, j+1)); 
     end generate columns; 
    end generate rows; 

    p_multiplications : process (a, b) 
    --variable v_producto : t_pp := ((others => (others => ’0’))); 
    begin -- process multiplications 
    for i in 0 to 4 loop 
     for j in 0 to 4 loop 
      if i = 0 then 
      sum_ini(j) <= a(0) and b(j); 
     else 
      mul(i-1, j+i) <= a(i) and b(j); 
     end if; 
     end loop; -- j 
    end loop; -- i 
    end process p_multiplications; 

end Behavioral;´ 

--I have another module my entity adder , but I don´t know where is the problem. 
`entity adder is 
port ( a : in std_logic_vector (9 downto 0)); 
end adder; 

architecture Behavioral of adder is 
type t_matrix is array (0 to 5, 10 downto 0) of std_logic; 
signal cout, b, cin, sum : t_matrix ; 
begin 
sum <= (a xor cin) xor b; 
cout <= (a and b)or(cin and a)or(cin and b); 
end Behavioral;´ 
+1

Я понятия не имею, каков ваш вопрос. – Ross

+1

У вас есть зарезервированное слово, используемое в качестве имени сигнала в объявлении сущности mult. Вы не показываете, где определены операторы для типа t_matrix в сумматоре (xor, и). – user1155120

+0

Моя проблема заключается в том, что я не знаю, правильнее или неправильно. Мой другой вопрос: где я должен поместить сумматор сущности в том же модуле, что и сущность mult? или я должен создать еще один модуль. Извините за мой английский! – user2985159

ответ

0

Чтобы получить "XOR" и "и" операторы, поставить эти строки в верхней части модуля

library IEEE; 
use IEEE.STD_LOGIC_1164.ALL; 

Другой проблема в том, что вы не можете получить 10-битный сумматор, взяв логику для одного бита сумматор и просто делают сигналы более широкими. Вы должны организовать все так, чтобы CIN для бит 1 является соиЬ бит 0 и т.д.

cin(9 downto 1) <= cout(8 downto 0); 

Вам нужно добавить б, carry_in, carry_out деклараций портов для объекта сумматора.

+0

Спасибо, Дэвид, спасибо B .. – user2985159

0

Без изменения ширины в сгенерированных вызывающих экземплярах сумматора становится видимым сумматором, являющимся одноразрядным сумматором.

Я изменил ваш код и нашел, что сигналы a и b, используемые процессом в mult, были неучтенны и, кажется, поступают из порта на mult., Я переименовал op1 и op2 a и b соответственно, где вы показываете их в комментарии как a и x. Я переименовал результат pp, соответствующий вашему комментарию, но не вижу, откуда должен выводиться вывод, не анализируя, что вы делаете.

В любом случае измененный код анализ:

library ieee; 
use ieee.std_logic_1164.all; 

entity adder is 
    port ( 
     a:  in  std_logic; 
     b:  in  std_logic; 
     cin: in  std_logic; 
     sum: out  std_logic; 
     cout: out  std_logic 
    );  
end adder; 

architecture Behavioral of adder is 
begin 
    sum <= (a xor cin) xor b; 
    cout <= (a and b) or (cin and a) or (cin and b); 
end Behavioral; 

library IEEE; 
use IEEE.STD_LOGIC_1164.ALL; 
-- use IEEE.STD_LOGIC_ARITH.ALL; 
-- use IEEE.NUMERIC_STD.ALL; 
-- use UNISIM.VComponents.all; 

entity mult is 
    port (
    --  op1: in std_logic_vector(4 downto 0);--a 
    --  op2: in std_logic_vector(4 downto 0);--x 
    --  out: out std_logic_vector(9 downto 0) --pp 
     a: in std_logic_vector(4 downto 0); 
     b: in std_logic_vector(4 downto 0); 
     pp: out std_logic_vector(9 downto 0) -- not apparrent 
    ); 
end mult; 

architecture Behavioral of mult is 
    type t_matrix is array (0 to 5, 10 downto 0) of std_logic; 
    signal c, sum, mul : t_matrix ; 
    signal sum_ini : std_logic_vector(9 downto 0) ; 

    component adder is 
     port ( 
      a:  in  std_logic; 
      b:  in  std_logic; 
      cin: in  std_logic; 
      sum: out  std_logic; 
      cout: out  std_logic 
     );  
    end component; 


begin 
    rows : for i in 0 to 3 generate 
     columns : for j in 0 to 9 generate 
      i_u : adder port map(
          a => sum_ini(j), 
          b => c(i,j), 
          cin => mul(i, j), 
          sum => sum(i+1, j), 
          cout => c(i+1, j+1) 
        ); 
     end generate columns; 
    end generate rows; 

    p_multiplications : process (a, b) 
    --variable v_producto : t_pp := ((others => (others => '0'))); 
    begin -- process multiplications 
    for i in 0 to 4 loop 
     for j in 0 to 4 loop 
      if i = 0 then 
      sum_ini(j) <= a(0) and b(j); 
     else 
      mul(i-1, j+i) <= a(i) and b(j); 
     end if; 
     end loop; -- j 
    end loop; -- i 
    end process p_multiplications; 

end Behavioral; 

С немного больше ковыряться с испытательным стендовым моделированием вы обнаружите, что некоторое количество ваших 2D элементов массива не инициализируется, но используется. Вы захотите преследовать этих людей и застраховать их либо сбросом, либо по умолчанию известным значением (если вы не планируете синтез).

быстрое и грязное излечение обеспечить Mult сигналов значения «0» по умолчанию в декларативной области архитектуры:

-- signal c, sum, mul : t_matrix ; 
-- signal sum_ini : std_logic_vector(9 downto 0) ; 
signal c:  t_matrix :=(others =>(others => '0')); 
signal sum:  t_matrix :=(others =>(others => '0')); 
signal mul:  t_matrix :=(others =>(others => '0')); 
signal sum_ini: std_logic_vector(9 downto 0) := (others => '0'); 

Я нашел это демпинг массива значений для отображения сигнала. У меня не хватило времени и еще не выяснили, где взять ваш продукт, чтобы убедиться, что это правильно.