[an error occurred while processing this directive]
Помогите сделать умножение на VHDL
(«Телесистемы»: Конференция «Языки описания аппаратуры (VHDL и др.))

миниатюрный аудио-видеорекордер mAVR

Отправлено kodlan 03 декабря 2004 г. 08:06

Проблема в том что можно использовать только лог. операции и +, -. И только тип 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 поданых на вход. Почему так? И второе - мои вычисления вообще ничего не дают! Никакие сигнали не меняют свое знаение.

У кого есть какие-то идеи как сделать - ПОМОГИТЕ ПЛЗ!!!


Составить ответ  |||  Конференция  |||  Архив

Ответы


Отправка ответа

Имя (обязательно): 
Пароль: 
E-mail: 

Тема (обязательно):
Сообщение:

Ссылка на URL: 
Название ссылки: 

URL изображения: 


Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru