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

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

Отправлено Figaro 01 августа 2005 г. 13:21

нужно найти bmom0, bmom1, bmom2, bmom3, bmom4, bmom5

первый способ:

process (clk)
type tpsy is array (0 to 5) of STD_LOGIC_VECTOR(7 downto 0);
type ts is array (0 to 5) of STD_LOGIC_VECTOR(7 downto 0);
type tvbmom is array (0 to 5) of STD_LOGIC_VECTOR(7 downto 0);

variable psy : tpsy;
variable s : ts;
variable vbmom : tvbmom;

begin
if (clk'event and clk = '1') then

psy(0) := bmvpsy0;
psy(1) := bmvpsy1;
psy(2) := bmvpsy2;
psy(3) := bmvpsy3;
psy(4) := bmvpsy4;
psy(5) := bmvpsy5;
s(0):= bms0;
s(1):= bms1;
s(2):= bms2;
s(3):= bms3;
s(4):= bms4;
s(5):= bms5;

vbmom(0) := axb(bmvpsy0, bms0);
for nom in 1 to 5 loop

vbmom(nom) := "00000000";
for i in 0 to nom loop
vbmom(nom) :=vbmom(nom) xor axb(psy(i), s(nom - i));
end loop; --axb умножитель в поле Галуа
end loop;

bmom0 <= vbmom(0);
bmom1 <= vbmom(1);
bmom2 <= vbmom(2);
bmom3 <= vbmom(3);
bmom4 <= vbmom(4);
bmom5 <= vbmom(5);
end if;
end process;

Второй способ:

process (clk)
begin
if (clk'event and clk = '1') then

bmom0 <= omega0(bmvpsy0, bms0);
bmom1 <= omega1(bmvpsy0, bmvpsy1, bms0, bms1);
bmom2 <= omega2(bmvpsy0, bmvpsy1, bmvpsy2, bms0, bms1, bms2);
bmom3 <= omega3(bmvpsy0, bmvpsy1, bmvpsy2, bmvpsy3, bms0, bms1,
bms2, bms3);
bmom4 <= omega4(bmvpsy0, bmvpsy1, bmvpsy2, bmvpsy3, bmvpsy4, bms0,
bms1, bms2, bms3, bms4);
bmom5 <= omega5(bmvpsy0, bmvpsy1, bmvpsy2, bmvpsy3, bmvpsy4, bmvpsy5,
bms0, bms1, bms2, bms3, bms4, bms5);

end if;
end process;

пример функции omega5:

function omega5(psy0, psy1, psy2, psy3, psy4, psy5 : in STD_LOGIC_VECTOR(7 downto 0);
s0, s1, s2, s3, s4, s5 : in STD_LOGIC_VECTOR(7 downto 0)) return STD_LOGIC_VECTOR is

begin

omega5 := axb(psy0, s5) xor axb(psy1, s4) xor axb(psy2, s3)
xor axb(psy3, s2) xor axb(psy4, s1) xor axb(psy5, s0);
return omega5;
end omega5;

Так вот вопрос заключается в том что первый и второй метод занимают одинаковое количество ячеек (950 ячеек),
хотя как видно из первого метода я использую
vbmom(nom) xor axb(psy(i), s(nom - i)) и этот кусочек крутиться в циклах,
почему синтезатор просто тупо размножает этот кусок в зависимости от циклов,
а не использует его необходимое количество раз.
Это важно т.к. умножитель в поле Галуа занимает около 50 ячеек, соответственно
при размножении этого кусочка общий обьем очень сильно растет.
Можно ли как нибудь это исправить, или есть другие методы, или кто знает умножитель в поле Галуа менее объемный?

З.Ы. это все считается за один такт.

Спасибо что уделили немного своего времени(даже если просто прочитали)!!!

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

Ответы


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

Имя (обязательно): 
Пароль: 
E-mail: 
NoIX ключ Запомнить

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

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

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


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

E-mail: info@telesys.ru