Проблема в том что можно использовать только лог. операции и +, -. И только тип std_logic или std_logic_vector. Пробовал писать сам но что-то оно у меня вообще не работает. Выглядит моя писаниня примерно так:
entity F is
port(
RST: in std_logic;
CLK: in std_logic;
CX: in std_logic;
CY: in std_logic;
EZ: in std_logic;
DIO: inout std_logic_vector (7 downto 0);
RDY: out std_logic
);
end entity F;
СХ и СУ - сигналы позволения записи значения DIO в регистры соответственно RGX и RGY. Как раз эти значения и нужно умножить.
Далее вычисления я делаю так:
process (CLK)
begin
if rising_edge(CLK) then
-- write data to registers
if CX = '0' and calc = '0' then
RGX <= DIO;
elsif CY = '0' and calc = '0' then
RGY <= DIO;
end if;
-- do calculations if register is updated
if CX = '0' or CY = '0' or calc = '1' then
calc <= '1';
-- multiply X*Y using addition
-- check if counter == Y
if not count = RGY then
-- XY = XY + X
for i in 0 to 7 loop
if (XY(i)='0' and RGX(i)='0' and p(i)='1') or
(XY(i)='0' and RGX(i)='1' and p(i)='0') or
(XY(i)='1' and RGX(i)='0' and p(i)='0') or
(XY(i)='1' and RGX(i)='1' and p(i)='1')
then
XY(i) <= '1';
else
XY(i) <= '0';
end if;
if (XY(i)='0' and RGX(i)='1' and p(i)='1') or
(XY(i)='1' and RGX(i)='0' and p(i)='1') or
(XY(i)='1' and RGX(i)='1' and p(i)='0') or
(XY(i)='1' and RGX(i)='1' and p(i)='1')
then
p(i+1) <= '1';
else
p(i+1) <= '0';
end if;
end loop;
-- counter ++
-- add 1 to counter
for i in 0 to 7 loop
if (count(i)='0' and inc(i)='0' and cp(i)='1') or
(count(i)='0' and inc(i)='1' and cp(i)='0') or
(count(i)='1' and inc(i)='0' and cp(i)='0') or
(count(i)='1' and inc(i)='1' and cp(i)='1')
then
count(i) <= '1';
else
count(i) <= '0';
end if;
if (count(i)='0' and inc(i)='1' and cp(i)='1') or
(count(i)='1' and inc(i)='0' and cp(i)='1') or
(count(i)='1' and inc(i)='1' and cp(i)='0') or
(count(i)='1' and inc(i)='1' and cp(i)='1')
then
cp(i+1) <= '1';
else
cp(i+1) <= '0';
end if;
end loop;
else
RDY <= '1';
calc <= '0';
end if;
end if;
Вычисления я деляю за таким алгоритмом. Каждый такт я увиличиваю count на "00000001" тосле чего сравниваю с значением У. Если равны - не нужно продолжать. Если не равны считаю суму ХУ = ХУ + Х. И так далее.
Но тут возникает проблема. Я никак не могу записать значение в регистры - туда записываеться значение с Х вместо 1 поданых на вход. Почему так? И второе - мои вычисления вообще ничего не дают! Никакие сигнали не меняют свое знаение.
У кого есть какие-то идеи как сделать - ПОМОГИТЕ ПЛЗ!!!