Я работаю над проектом, и я пытаюсь построить множитель для моей оценки 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;
Вы получаете сообщение об ошибке или компилируется нормально, но алгоритм не работает? Можете ли вы охарактеризовать проблему лучше (сообщения об ошибках, результаты тестов и т. Д.)? – fru1tbat
Программа компилируется в порядке, но когда я пытаюсь имитировать программу для 11101111 и 11111101, она не работает. (Где проблема?). Обратите внимание, что в моей первой модели не-конвейерного множителя симуляция отлично подходит для этих номера. Вот код для моего оригинального: http://stackoverflow.com/questions/27379811/how-to-pipeline-my-2s-complement-multiplier –
Мне нужно дополнительное мнение об этом коде, потому что это хорошо для меня, но я не понимаю, почему это не работает –