Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Оптимизация AHDL в MAX+ PLUS II
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Работаем с ПЛИС, области применения, выбор
prottoss
Привет всем!



Только начинаю осваивать ПЛИС. Написал на AHDL код вот такого лог. элемента.

Код
subdesign sstv_decoder
( XI[7..0]:  input = gnd;
YI[10..0]:   input = gnd;
sync_pulse:  output;
clear_pulse: output;
count_reset:  output;
)

variable
level_sync:  node;
frame_sync:  node;
row_sync:  node;
clear_node:  node;

begin

if((XI[] > 216) and (XI[] < 255)) then
  level_sync = vcc;
else
  level_sync = gnd;
end if;

if((XI[] > 17) and (XI[] < 255)) then
  frame_sync = vcc;
else
  frame_sync = gnd;
end if;

if((XI[] > 11) and (XI[] < 47)) then
  clear_node = vcc;
else
  clear_node = gnd;
end if;

if(((YI[0],XI[]) > 36) and ((YI[0],XI[]) < 511)) then
  row_sync = vcc;
else
  row_sync = gnd;
end if;

--count_reset section
if(YI[] < 1250) then
  count_reset = vcc;
else
  count_reset = gnd;
end if;  

--level and frame sync pulse section

if((YI[] < 10) or ((YI[] > 619) and (YI[] < 634)) or (YI[] > 1243)) then
  
  clear_pulse = gnd;

  if((YI[] < 5) or ((YI[] > 624) and (YI[] < 630))) then
   sync_pulse = frame_sync;
  else
   sync_pulse = level_sync;
  end if;
else
  sync_pulse = row_sync;
  clear_pulse = clear_node;
end if;

end;




Ко входам IX и IY подключается 19-и разрядный счетчик, причем IX - младшие разряды счетчика. Старшие разряды ( от YI ) сбрасываются выходом count_reset.



Вобщем то пока вся схема. Анализирую выходы sync_pulse и clear_pulse.



После компиляции получилось задействованных 35 lcells, при чем 20 непосредственно в схеме. Для остальных компилятор применил термин shareable. Я так понимаю, что забрал у них входную логику а сами триггеры еще как то можно будет использовать в последствии.



Так вот собственно вопрос. Есть ли какие то методы оптимизации кода, в частности, приведенного выше, или может быть есть какие то методы-приемы уменьшения расхода входной логики ячеек.
bve
1. По моему невеликому опыту - необходимо учитывать структуру макроячеек той серии ПЛИС,
для которой пишете. Например: где-то есть CASCADE, а где-то - нет,
где-то можно пименить EXP, а где-то - пустой звук, и т.д..
2. Мне кажется, что для многих сравнений нельзя надеяться на великий ум фиттера,
т.к. сравниваете с константами, то можно было-бы ограничиться меньшим
количеством разрядов ( ну, например, когда Вы проверяете на "больше, чем 216, то взять XI7 AND XI6
как флаг разрешения и сравнивать меньшее количество оставшихся разрядов ).
3. Где-то можно проинвертировать сравнение - например, там где >17.
4. Во многих местах встречается <255, поэтому, выделив отдельное сравнение на равенство всех
разрядов 1 ( это можно сделать по "И" ), можно сделать общую границу для нескольких других
сравнений.

Мне такая "ручная" оптимизация частенько помогала, правда, такие мои потуги могут быть вызваны и плохим знанием MaxPLUS'а.
Gate
По моему скромному мнению, здесь надо оптимизировать не локально - операторы языка, а глобально - способ проектирования:
1. Забыть ahdl и изучать verilog или vhdl
2. Изучить норм. симулятор и синтезатор, а в синтезаторе изучить, как задаются constrains и что такое critical path и как его оптимизировать
3. Квартус использовать только как place&route
А вот когда Вы все это изучите, то можно уже заниматься грошовыми оптимизациями - экономить ячейки. Правда тогда Вам это не будет казаться таким важным. А если надо будет добиваться экстремального быстродействия - то изучать методы физического синтеза, управлять расположением блоков на кристалле и ручным расставлением логических ячеек.
prottoss
Цитата(Gate @ Apr 2 2006, 20:44) *
По моему скромному мнению, здесь надо оптимизировать не локально - операторы языка, а глобально - способ проектирования:
1. Забыть ahdl и изучать verilog или vhdl
2. Изучить норм. симулятор и синтезатор, а в синтезаторе изучить, как задаются constrains и что такое critical path и как его оптимизировать
3. Квартус использовать только как place&route
А вот когда Вы все это изучите, то можно уже заниматься грошовыми оптимизациями - экономить ячейки. Правда тогда Вам это не будет казаться таким важным. А если надо будет добиваться экстремального быстродействия - то изучать методы физического синтеза, управлять расположением блоков на кристалле и ручным расставлением логических ячеек.




Спасибо за советы. Но для всего насоветованного надо много времени, как мне кажется. AHDL мне забывать не надо, я его и не знал, а программу написал по примерам, разобраться в простом (сдесь же только логика) не сложно. VHDL изучать, конечно, буду но параллельно.



В любом случае, всем спасибо, кто откликнулся, все советы полезные!
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.