День добрый, уважаемые форумчане. Я новенький в VHDL, и первое задание мое было это восьмиразрядный тактовый умножитель . Причем не банальным способом где a*b, а иным. Немного поискав информации в интернете я нашел способ, получил умножитель в виде счетчика с регистром сдвига. В общем вот код.
Код:
library IEEE;
use IEEE.STD_LOGIC_1164.all;
use IEEE.STD_LOGIC_unsigned.all;
entity test is
port(
clk, r: in std_logic;
a : in std_logic_vector(7 downto 0);
b : in std_logic_vector(7 downto 0);
p : out std_logic_vector(15 downto 0)
);
end test;
--}} End of automatically maintained section
architecture test of test is
begin
process(clk,r,a,b)
variable pv,bp: std_logic_vector(15 downto 0);
begin
pv:= "0000000000000000";
bp:= "00000000" & b;
if r='1' then
pv:="0000000000000000";
p<=pv;
else
if clk'event and clk = '1' then
for i in 0 to 7 loop
if a(i) = '1' then
pv:= pv+bp;
p<=pv;
end if;
bp:= bp(14 downto 0) & '0';
end loop;
end if;
end if;http://radiokot.ru:5050/elecir/
end process;
end test;
а вот результат моделирования.
Как видите все работает. Но возникает вопрос. Почему он выдает результат сразу за 1 такт, а не за 8 тактов как должно быть? ведь каждое начало цикла должно входить в 1 такт. а тут сразу весь цикл в такт входит. Но мне нужен тактовый умножитель, чтобы за каждый такт он делал сложение pv с bp и последующим сдвигом влево. Подскажите как сделать так чтобы результат умножения был за 8 тактов а не за 1. Если есть возможность, желательно подскажите на примере, так как я начинающий в этом деле на словах могу не понять. Спасибо.