Error message

User warning: The following modules is missing from the file system: bbb. For information about how to fix this, see the documentation page. in _drupal_trigger_error_with_delayed_logging() (line 1156 of /home/c/cl69836/mainsite/public_html/includes/bootstrap.inc).

FPGA (ПЛИС) Timing и Особенности разработки)))

Сегодня я кратко расскажу об учёте задержек в FPGA. Как и ранее советую книгу: Сергиенко А. М. "VHDL для проектирования вычислительных устройств".
Для понимания этого поста необходимо иметь базовые знания VHDL и иметь представление об проектировании на ПЛИС (FPGA).


I

(первое - не губите рекам русло)

Сейчас и далее я буду придерживаться синхронной логики, требующей в своей работе тактовый сигнал. Для асинхронной многое будет справедливо. Но. Так как ПЛИС более пригодны для синхронной логики нужно для начала рассказать кое-что о тактовом сигнале. FPGA сделаны так, чтобы тактовый сигнал поданный к специальным ножкам одновременно доходил до всех логических блоков. Эта оптимизация очень важна. В ASIC оптимизировать работу тактового сигнала приходится самим разработчикам, в FPGA нам об этом заботиться не нужно, НО! Следует понимать что если совершить операцию над тактовым сигналом, скажем такую:

clk <= clk + '1';

Данная операция добавит сумматор, который сделает ответвление от основной оптимизированной ветки и появятся задержки в тактовом сигнале. Так же в секции port map нельзя присваивать преобразованный сигнал, просто присваиваем тактовый сигнал а дальше в блоке преобразуем как надо. Нужно это учитывать для построения иерархических проектов.


II

(второе - железно)

Мыслите железом))) Представляйте как будет реализована ваша логика. Дело в том, что наибольшие задержки при современных технологиях изготовления FPGA приходятся не на ведтили, а на соединения, так что старайтесь чтобы ваш дизайн требовал как можно меньше соединений. Тоесть, когда мы создаём процесс, то мы задая список чувствительности создаём пространство логики между двумя D триггерами, обычно в списке чувствительности тактовый сигнал, так что наша логика должна успевать выполняться да того как придёт следующий тактовый сигнал.
VHDL оптимизация 1
Так что для того чтобы логика успевала, нужно использовать всю силу параллельных вычислений. Стараться по возможности проектировать не в глубь а в ширину.


III

(третий пункт ;) ( _игрь) (о скобками_ )

Советую экспериментировать и рассуждать. В дополнение к железоприкреплённой мысли. К примеру приёмы вида: (a+b)+(c+d) - это намного оптимальнее чем a+b+c+d. Так как в первом случае глубина логики меньше, а во втором больше. (смотри рисунок 2: первый случай слева, второй справа. Прямоугольники - сумматоры)
оптимизация VHDL 2


IV

(в четвёртых - не шей велосипед)

Не нужно делать много вложенных выражений IF, лучше распараллельте или используйте case, так как последний это всего один мультиплексор, выгодно правда? А ещё иногда полезно использовать state машины (конечные автоматы). А ещё, используйте конвейеризацию - это значительно повышает максимальную тактовую частоту для сложных дизайнов.


V

(пятое - то что он не знал)

Вот пятым обозначу мелочь, но она очень сильно влияет на производительность. Это минимизация количество тригерров-защёлок (защёлка). Как я понял это особый триггер памяти адреса, но это не важно. Суть в том, что если вы используете выражение if без else, то будет обрабатываться тот случай если условие выполняется, а если не выполняется то будет синтезирована защёлка. Чтобы эта защёлка пропала нужно обязательно по возможности использовать else, в крайнем случае в else можно выполнить оператор null, который ничего не делает. Также и в case, нужно обработать и другие варианты, помимо нужных, чтобы не образовывать защёлки. ДЛя этого используется простой оператор others:

case state is
when One => ......... ;
when Two => ........; -- делаем полезные действия
when others => null; -- исключаем защёлку сказав компилятору что остальные
-- варианты не обрабатываются

end case;


Итак, я вроде все основные точки обозначил. И это далеко не всё. Надеюсь кто-нибудь найдёт ещё больше тонкостей разработки логики для FPGA и добавит в комментариях или отдельным постом.

Хорошего утра, дня и вечера.

humanmashine's picture

Добавил очень важный пятый пункт. Кстати старание "обрезания" альтернатив ненужных - это хорошая манера не только для VHDL но для языков программирования. Так как это повышает наглядность кода и ещё, если бы я делал систему адаптирующую однопоточные приложения для исполнения на многоядерных системах, я бы использовал предсказание альтернатив (ветвления) а тут желательно использовать возможности else.

На счет 5 не знал. Полезная инфа.

humanmashine's picture

Для меня и 3-й пункт не очевиден. Я был удивлён когда его узнал.

3-й пункт нам Савинков рассказывал на одной из пар. Про то, как добавив лишнее действие увеличить производительность.

humanmashine's picture

Эмм.... там никакие лишние действия не добавляется, изменялся только порядок действий - скобками)))) За счёт расспараллеливания вычислений за счёт особенностей проектирования интегральных схем на VHDL.