2014-12-15 2 views
0

Я работаю над проектом, и я пытаюсь построить множитель для моей оценки psd, и у меня есть некоторые помощь и модификация трубопровода здесь. Кажется, что это сделано, но я не знаю, что не работает. Может ли кто-нибудь помочь? В случае необходимости, я также опубликую оригинал.Я пытаюсь конвейер умножить множитель 8x8 2s, и я не знаю, почему он не работает

library IEEE; 
use IEEE.std_logic_1164.all; 
use IEEE.std_logic_arith.all; 
use IEEE.std_logic_unsigned.all; 
use ieee.numeric_std.all; 
use ieee.std_logic_textio.all; 
use IEEE.STD_LOGIC_1164.ALL; 


    entity mult_secv is 
     generic(
     Na : integer := 8; 
     Nb : integer := 8; 
     Nscnt : integer := 4 
     ); 
     port(
     iCLK : in std_logic; 
     iRST : in std_logic; 
     iDV : in std_logic; 

     ia  : in std_logic_vector(Na-1 downto 0); 
     ib  : in std_logic_vector(Nb-1 downto 0); 

     oDV  : out std_logic; 
     oDATA : out std_logic_vector(Na+Nb-2 downto 0) 
     ); 
    end mult_secv; 

    architecture produs of mult_secv is 
     type my_array1 is array(1 to 8)of std_logic_vector(Na+Nb-2 downto 0); 
     type my_array2 is array(1 to 8) of std_logic_vector(Nb-1 downto 0); 
     type my_array3 is array(1 to 8) of std_logic; 
    --8 stagii pentru a se calcula tot produsul 
     signal sa, srez : my_array1; 
     signal sb : my_array2; 
     signal dv : my_array3; 
     constant scntmax : integer:=8 ; 

    begin 
     -- for each pipeline stage 
    generarestagii : for scnt in 1 to scntmax generate ---> CAUTA SINTAXA PENTRU GENERARE DE COMPONENTE IDENTICE 

    process(iCLK,iRST) 
    begin 
     if iRST= '1' then 
     sa <= (others => (others => '0')); 
     elsif rising_edge(iCLK) then 
     -- first stage 
     if (scnt = 1) then 
      sa(scnt) <= (Na+Nb-2 downto Na => ia(Na-1)) & ia; ---se bordeaza cu bitul de semn daca e negativ 
      --sa(scnt) <= std_logic_vector(resize(signed(ia),Na+Nb-2)); 
     -- other stages 
     else 
      sa(scnt) <= sa(scnt-1)(Na+Nb-3 downto 0) & '0'; --altfel se shifteaza sa 
     end if; 
     end if; 
    end process; 


    process(iCLK,iRST) 
    begin 
     if iRST='1' then 
     sb <= (others => (others => '0')); 
     elsif rising_edge(iCLK) then 
     if (scnt = 1) then 
      sb(scnt) <= ib; 
     else 
      sb(scnt) <= '0' & sb(scnt-1)(Nb-1 downto 1); --se shifteaza sb 
     end if; 
     end if; 
    end process; 

    process(iCLK,iRST) 
    begin 
     if iRST='1' then 
     srez <= (others => (others => '0')); 
     elsif rising_edge(iCLK) then 
     if (scnt = 1) then 
      if ib(Nb-1)='1' then 
     srez(scnt) <= not (ia & (Nb-2 downto 0 => '0')) + '1'; --daca este negativ 
      else 
      srez(scnt) <= (others => '0'); --in primul stadiu 
      end if; 
     elsif sb(scnt-1)(0)='1' then   
      srez(scnt) <= srez(scnt-1)+sa(scnt-1); 
     else  
      srez(scnt) <= srez(scnt-1); 
     end if; 
     end if; 
    end process;  

    process(iCLK,iRST) 
    begin 
     if iRST='1' then 
     dv <= (others => '0'); 
     elsif rising_edge(iCLK) then 
     if (scnt = 1) then 
      dv(scnt) <= iDV; 
     else 
      dv(scnt) <= dv(scnt-1); 
     end if; 
     end if; 
    end process; 

    end generate generarestagii; 

    oDATA <= srez(scntmax); 
    oDv <= dv(scntmax); 

    end; 
+0

Вы получаете сообщение об ошибке или компилируется нормально, но алгоритм не работает? Можете ли вы охарактеризовать проблему лучше (сообщения об ошибках, результаты тестов и т. Д.)? – fru1tbat

+0

Программа компилируется в порядке, но когда я пытаюсь имитировать программу для 11101111 и 11111101, она не работает. (Где проблема?). Обратите внимание, что в моей первой модели не-конвейерного множителя симуляция отлично подходит для этих номера. Вот код для моего оригинального: http://stackoverflow.com/questions/27379811/how-to-pipeline-my-2s-complement-multiplier –

+0

Мне нужно дополнительное мнение об этом коде, потому что это хорошо для меня, но я не понимаю, почему это не работает –

ответ

1

Есть несколько улучшений, которые могут быть внесены в код, но единственной реальной проблемой является sa <= (others => (others => '0')); (и подобные) в коде сброса для всех процессов. Вы находитесь внутри цикла генерации, и когда он разворачивается, вы заканчиваете каждый процесс реплицированным n раз, поэтому вы создали несколько драйверов на одних и тех же сигналах. Вы должны изменить его на sa(scnt) <= (others => '0') (и тому подобное).

+0

Спасибо, что решил одну из проблем. Теперь, когда я запускаю симуляцию, sa и sb сдвигаются правильно, но srez не сохраняет результат. –

+0

Вы делали ту же самую поправку в 'srez' (и' dv')? Что вместо этого хранится 'srez'? – fru1tbat

+0

Отлично! Я заставил его работать. Спасибо! Кроме того, у меня есть еще один вопрос. Является ли этот код действительно конвейерным? (Он уважает дизайн трубопровода?) –