VHDL: Использование оператора '*' при реализации множителей в дизайне


10

Современные FPGA имеют встроенные блоки DSP, последние FPGA даже имеют встроенные модули с плавающей запятой, соответствующие IEEE-754.

Можно создать объект / модуль DSP с помощью графического интерфейса после выбора необходимых параметров в нем, а затем создать его экземпляр в проекте.

Когда нам нужно сделать такой микроменеджмент в проекте создания реальных блоков DSP, и когда мы просто вводим оператор '*' в коде и позволяем инструменту синтеза обрабатывать детали низкого уровня? Что лучше?

Существует много разных типов алгоритмов умножения, когда речь идет о двоичном умножении. С тех пор, как мы встроили блоки DSP на кремнии и даже встроили умножители с плавающей запятой, означает ли это, что все эти алгоритмы не устарели?


Какая FPGA имеет 754-совместимые FPU в структуре?
Мартин Томпсон

Ответы:


6

Я сделал это несколько раз сам.

Как правило, инструменты проектирования будут выбирать между реализацией структуры и срезом DSP на основе параметров синтеза.

Например, для Xilinx ISE в настройках процесса синтеза, Параметры HDL, есть параметр «-use_dsp48» с параметрами: Авто, АвтоМакс, Да, Нет. Как вы можете себе представить, это контролирует, как сильно инструменты пытаются разместить DSP ломтики. Однажды у меня возникла проблема, когда я умножил целое число на 3, что привело к выводу среза DSP - за исключением того, что я уже вручную выводил каждый срез DSP в чипе, поэтому синтезатор не удался! Я изменил настройку на Нет, потому что я уже использовал каждый срез dsp.

Это, вероятно, хорошее практическое правило (я только что придумал): если ваш дизайн работает на частоте менее 50 МГц и вы, вероятно, собираетесь использовать менее 50% срезов DSP в чипе, тогда просто используйте *, +, и - операторы. это выведет DSP-срезы без конвейерных регистров. Это действительно ограничивает максимальную скорость. (Я понятия не имею, что происходит, когда вы используете разделение)

Однако, если кажется, что вы собираетесь запускать срезы ближе к максимальной скорости среза DSP (333 МГц для нормального уровня скорости Spartan 6). Если вы собираетесь использовать все срезы, вы должны вывести их вручную ,

В этом случае у вас есть два варианта.

Вариант 1: вручную использовать необработанный шаблонный экземпляр DSP. Вариант 2: использовать IP-блок от Xilinx Core Generator. (Я бы использовал эту опцию. В то же время вы узнаете все о core gen, что поможет в будущем)

Перед тем, как сделать что-либо из этого, прочитайте первые пару страниц руководства пользователя среза DSP. В случае со спартанцем 6 (DSP48A1) это будет Xilinx doc UG389: http://www.xilinx.com/support/documentation/user_guides/ug389.pdf

Сначала рассмотрим опцию Core Generator. Я обычно создаю тестовый проект в Core Generator для той части, с которой я работаю, где я создаю любое количество блоков IP просто для изучения системы. Затем, когда я буду готов добавить один к своему дизайну в ISE, я щелкаю правой кнопкой мыши в Иерархии проектирования, нажимаю новый источник и выбираю «IP (CORE Generator & Architecture Wizard)», чтобы я мог редактировать и регенерировать блок напрямую. из моего проекта.

В Core gen взгляните на различные IP-блоки, которые вы можете выбрать - их несколько десятков, большинство из которых довольно крутые.

Ядро множителя - это то, на что вы должны смотреть в первую очередь. Проверьте каждую страницу и нажмите кнопку таблицы данных. Важными частями являются целочисленная битовая ширина, ступени конвейера (задержка) и любые управляющие сигналы. Это создает максимально простой блок, убирая все ненужные порты.

Когда в прошлом году я создавал БИХ-фильтр 5 на 3 порядка, мне приходилось использовать шаблон создания вручную, так как я создавал очень индивидуальную реализацию с двумя срезами DSP, синхронизированными в 4 раза быстрее, чем частота дискретизации. Это была полная боль.


13

Если вы просто хотите умножить два числа и они соответствуют блоку DSP, то *оператор должен вывести блок DSP. Если нет, отправьте инструмент синтеза обратно :)

Однако, чтобы воспользоваться преимуществами более сложных комбинаций функциональности DSP, часто требуется непосредственное создание экземпляра блока и настройка его параметров. Примеры вещей, которые могут плохо отображаться с помощью логического вывода (на примере Xilinx DSP48E1 ):

  • Использование предварительного сумматора
  • Использование почтового аккумулятора
  • Использование детектора
  • Использование логического блока

И особенно сочетания вышеперечисленного.

Инструменты синтеза еще не достаточно хороши, чтобы отображать совершенно произвольные комбинации логики и арифметики так эффективно, как вы могли бы надеяться.


4

Если присутствуют блоки DSP, вы должны использовать их, если можете, потому что это будет более эффективно, чем использование LUT для того же. Если вам не нужно высокопроизводительное умножение, в этом случае вы должны реализовать, скажем, конвейерный сумматор и сдвиговый регистр для экономии места.

Тем не менее, я хотел бы взглянуть на вывод блоков DSP, прежде чем перейти к инструментам с графическим интерфейсом. В руководстве Xilinx XST есть HDL-«рецепты» о том, как создавать экземпляры блоков DSP с чистым verilog / VHDL. По сути, если вы добавите достаточное количество регистров до и / или после множителей, XST будет использовать блок DSP для автоматической реализации операции. Вы можете проверить в журналах синтеза, чтобы увидеть, правильно ли он выводит блоки DSP. Я предполагаю, что у Altera есть нечто подобное.

Кстати, я просто обдумывал это несколько минут назад, так как сейчас я работаю над реализацией твистера Мерсенна, которая использует только множитель для начального начального числа. Моя реализация первого прохода не соответствует времени, но функциональность верна. XST также помещает операцию умножения в блоки DSP, однако она не оптимизирована, поэтому она работает примерно вдвое быстрее, чем хотелось бы. Скорее всего, я буду переопределять умножение с использованием метода сдвига и сложения, который займет 32-кратное количество тактов, но больше не потребует аппаратного умножителя.


Почему он не должен синхронизироваться при использовании аппаратного множителя?
квант231

По-видимому, 32-разрядное непротекаемое умножение на 32 бита занимает более 8 нс.
alex.forencich

хм вижу, не учел это. Таким образом, блоки DSP не конвейерны. Интересно, как именно они реализуют умножение. Это действительно жесткий параллельный множитель?
Quant231

Я думаю, что он может быть настроен для работы несколькими различными способами. Согласно руководству по XST, добавление достаточного количества регистров на вход и выход позволит XST использовать конвейерный множитель в срезе DSP48. В моем случае был только один выходной регистр и никаких входных регистров, поэтому он не смог этим воспользоваться. Поскольку это было только для инициализации (заполнения PRNG), я заменил параллельное умножение на битовый последовательный множитель, чтобы сэкономить на использовании ресурсов.
alex.forencich

2

Это зависит от того, сколько оптимизации вам нужно и насколько портативным должен быть ваш дизайн. Это немного похоже на программное обеспечение, оптимизирующее использование небольшого количества сборок или позволяющее компилятору выбирать инструкции. У вас также могут быть некоторые компромиссы размера / скорости, чтобы вы не могли позволить себе комбинаторный множитель двойной точности.

Я не знал там, где в FPGA были встроены множители FP.

Фактический оператор умножения, совместимый с IEEE P754, подходящий для ЦП, включает в себя больше, чем большой множитель: вам нужно добавить экспоненты, сдвинуть денормалы, управлять бесконечными значениями и несколько в основном бесполезных флагов (неточно, недопустимо ...)


FPGA последнего поколения, такие как серия Altera 10, имеют IEEE-754-совместимые умножители с плавающей запятой на самом оборудовании! Я не имел возможности использовать их сам, хотя.
квант231

Если мы встроили блоки DSP, то FPGA должна использовать их вместо комбинаторного умножителя или использовать какой-то другой алгоритм, который, например, использует блок памяти, верно?
квант231

2

Я прочитал этот документ http://www2.warwick.ac.uk/fac/sci/eng/staff/saf/papers/fpl2014-ronak.pdf :

Хотя функции, которые помещаются в один блок DSP, можно эффективно синтезировать из конвейерного кода RTL, мы обнаружили, что более сложные функции, требующие нескольких блоков DSP, страдают от более низкой производительности. Стандартное RTL-описание математической функции может быть сильно конвейеризовано, например, после каждой операции, однако, так как эта конвейерная обработка может не учитывать структуру и внутренние этапы блока DSP, результирующий синтезированный дизайн может демонстрировать нестандартные характеристики, так как блоки DSP объединены таким образом, что не позволяют им работать на полной скорости.

Хотел бы я найти источник их инструментов, чтобы проверить их выводы.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.