Сегодня я кратко расскажу об учёте задержек в FPGA. Как и ранее советую книгу: Сергиенко А. М. "VHDL для проектирования вычислительных устройств".
Для понимания этого поста необходимо иметь базовые знания VHDL и иметь представление об проектировании на ПЛИС (FPGA).
I
(первое - не губите рекам русло)
Сейчас и далее я буду придерживаться синхронной логики, требующей в своей работе тактовый сигнал. Для асинхронной многое будет справедливо. Но. Так как ПЛИС более пригодны для синхронной логики нужно для начала рассказать кое-что о тактовом сигнале. FPGA сделаны так, чтобы тактовый сигнал поданный к специальным ножкам одновременно доходил до всех логических блоков. Эта оптимизация очень важна. В ASIC оптимизировать работу тактового сигнала приходится самим разработчикам, в FPGA нам об этом заботиться не нужно, НО! Следует понимать что если совершить операцию над тактовым сигналом, скажем такую:
clk <= clk + '1';
Данная операция добавит сумматор, который сделает ответвление от основной оптимизированной ветки и появятся задержки в тактовом сигнале. Так же в секции port map нельзя присваивать преобразованный сигнал, просто присваиваем тактовый сигнал а дальше в блоке преобразуем как надо. Нужно это учитывать для построения иерархических проектов.
II
(второе - железно)
Мыслите железом))) Представляйте как будет реализована ваша логика. Дело в том, что наибольшие задержки при современных технологиях изготовления FPGA приходятся не на ведтили, а на соединения, так что старайтесь чтобы ваш дизайн требовал как можно меньше соединений. Тоесть, когда мы создаём процесс, то мы задая список чувствительности создаём пространство логики между двумя D триггерами, обычно в списке чувствительности тактовый сигнал, так что наша логика должна успевать выполняться да того как придёт следующий тактовый сигнал.
![VHDL оптимизация 1](http://dl.dropbox.com/u/67594981/logic.png)
Так что для того чтобы логика успевала, нужно использовать всю силу параллельных вычислений. Стараться по возможности проектировать не в глубь а в ширину.
III
(третий пункт ;) ( _игрь) (о скобками_ )
Советую экспериментировать и рассуждать. В дополнение к железоприкреплённой мысли. К примеру приёмы вида: (a+b)+(c+d) - это намного оптимальнее чем a+b+c+d. Так как в первом случае глубина логики меньше, а во втором больше. (смотри рисунок 2: первый случай слева, второй справа. Прямоугольники - сумматоры)
![оптимизация VHDL 2](http://dl.dropbox.com/u/67594981/inin.png)
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.