Сегодня я кратко расскажу об учёте задержек в FPGA. Как и ранее советую книгу: Сергиенко А. М. "VHDL для проектирования вычислительных устройств".
Для понимания этого поста необходимо иметь базовые знания VHDL и иметь представление об проектировании на ПЛИС (FPGA).
I
(первое - не губите рекам русло)
Сейчас и далее я буду придерживаться синхронной логики, требующей в своей работе тактовый сигнал. Для асинхронной многое будет справедливо. Но. Так как ПЛИС более пригодны для синхронной логики нужно для начала рассказать кое-что о тактовом сигнале. FPGA сделаны так, чтобы тактовый сигнал поданный к специальным ножкам одновременно доходил до всех логических блоков. Эта оптимизация очень важна. В ASIC оптимизировать работу тактового сигнала приходится самим разработчикам, в FPGA нам об этом заботиться не нужно, НО! Следует понимать что если совершить операцию над тактовым сигналом, скажем такую:
clk <= clk + '1';
Данная операция добавит сумматор, который сделает ответвление от основной оптимизированной ветки и появятся задержки в тактовом сигнале. Так же в секции port map нельзя присваивать преобразованный сигнал, просто присваиваем тактовый сигнал а дальше в блоке преобразуем как надо. Нужно это учитывать для построения иерархических проектов.
II
(второе - железно)
Мыслите железом))) Представляйте как будет реализована ваша логика. Дело в том, что наибольшие задержки при современных технологиях изготовления FPGA приходятся не на ведтили, а на соединения, так что старайтесь чтобы ваш дизайн требовал как можно меньше соединений. Тоесть, когда мы создаём процесс, то мы задая список чувствительности создаём пространство логики между двумя D триггерами, обычно в списке чувствительности тактовый сигнал, так что наша логика должна успевать выполняться да того как придёт следующий тактовый сигнал.
Так что для того чтобы логика успевала, нужно использовать всю силу параллельных вычислений. Стараться по возможности проектировать не в глубь а в ширину.
III
(третий пункт ;) ( _игрь) (о скобками_ )
Советую экспериментировать и рассуждать. В дополнение к железоприкреплённой мысли. К примеру приёмы вида: (a+b)+(c+d) - это намного оптимальнее чем a+b+c+d. Так как в первом случае глубина логики меньше, а во втором больше. (смотри рисунок 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
Tue, 08/28/2012 - 14:06
Permalink
Добавил очень важный пятый
Добавил очень важный пятый пункт. Кстати старание "обрезания" альтернатив ненужных - это хорошая манера не только для VHDL но для языков программирования. Так как это повышает наглядность кода и ещё, если бы я делал систему адаптирующую однопоточные приложения для исполнения на многоядерных системах, я бы использовал предсказание альтернатив (ветвления) а тут желательно использовать возможности else.
the_best_genius
Tue, 08/28/2012 - 14:45
Permalink
На счет 5 не знал. Полезная
На счет 5 не знал. Полезная инфа.
humanmashine
Tue, 08/28/2012 - 17:33
Permalink
Для меня и 3-й пункт не
Для меня и 3-й пункт не очевиден. Я был удивлён когда его узнал.
the_best_genius
Wed, 08/29/2012 - 18:50
Permalink
3-й пункт нам Савинков
3-й пункт нам Савинков рассказывал на одной из пар. Про то, как добавив лишнее действие увеличить производительность.
humanmashine
Thu, 08/30/2012 - 15:02
Permalink
Эмм.... там никакие лишние
Эмм.... там никакие лишние действия не добавляется, изменялся только порядок действий - скобками)))) За счёт расспараллеливания вычислений за счёт особенностей проектирования интегральных схем на VHDL.