Современные FPGA имеют встроенные блоки DSP, последние FPGA даже имеют встроенные модули с плавающей запятой, соответствующие IEEE-754.
Можно создать объект / модуль DSP с помощью графического интерфейса после выбора необходимых параметров в нем, а затем создать его экземпляр в проекте.
Когда нам нужно сделать такой микроменеджмент в проекте создания реальных блоков DSP, и когда мы просто вводим оператор '*' в коде и позволяем инструменту синтеза обрабатывать детали низкого уровня? Что лучше?
Существует много разных типов алгоритмов умножения, когда речь идет о двоичном умножении. С тех пор, как мы встроили блоки DSP на кремнии и даже встроили умножители с плавающей запятой, означает ли это, что все эти алгоритмы не устарели?
Ответы:
Я сделал это несколько раз сам.
Как правило, инструменты проектирования будут выбирать между реализацией структуры и срезом 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 раза быстрее, чем частота дискретизации. Это была полная боль.
источник
Если вы просто хотите умножить два числа и они соответствуют блоку DSP, то
*
оператор должен вывести блок DSP. Если нет, отправьте инструмент синтеза обратно :)Однако, чтобы воспользоваться преимуществами более сложных комбинаций функциональности DSP, часто требуется непосредственное создание экземпляра блока и настройка его параметров. Примеры вещей, которые могут плохо отображаться с помощью логического вывода (на примере Xilinx DSP48E1 ):
И особенно сочетания вышеперечисленного.
Инструменты синтеза еще не достаточно хороши, чтобы отображать совершенно произвольные комбинации логики и арифметики так эффективно, как вы могли бы надеяться.
источник
Если присутствуют блоки DSP, вы должны использовать их, если можете, потому что это будет более эффективно, чем использование LUT для того же. Если вам не нужно высокопроизводительное умножение, в этом случае вы должны реализовать, скажем, конвейерный сумматор и сдвиговый регистр для экономии места.
Тем не менее, я хотел бы взглянуть на вывод блоков DSP, прежде чем перейти к инструментам с графическим интерфейсом. В руководстве Xilinx XST есть HDL-«рецепты» о том, как создавать экземпляры блоков DSP с чистым verilog / VHDL. По сути, если вы добавите достаточное количество регистров до и / или после множителей, XST будет использовать блок DSP для автоматической реализации операции. Вы можете проверить в журналах синтеза, чтобы увидеть, правильно ли он выводит блоки DSP. Я предполагаю, что у Altera есть нечто подобное.
Кстати, я просто обдумывал это несколько минут назад, так как сейчас я работаю над реализацией твистера Мерсенна, которая использует только множитель для начального начального числа. Моя реализация первого прохода не соответствует времени, но функциональность верна. XST также помещает операцию умножения в блоки DSP, однако она не оптимизирована, поэтому она работает примерно вдвое быстрее, чем хотелось бы. Скорее всего, я буду переопределять умножение с использованием метода сдвига и сложения, который займет 32-кратное количество тактов, но больше не потребует аппаратного умножителя.
источник
Это зависит от того, сколько оптимизации вам нужно и насколько портативным должен быть ваш дизайн. Это немного похоже на программное обеспечение, оптимизирующее использование небольшого количества сборок или позволяющее компилятору выбирать инструкции. У вас также могут быть некоторые компромиссы размера / скорости, чтобы вы не могли позволить себе комбинаторный множитель двойной точности.
Я не знал там, где в FPGA были встроены множители FP.
Фактический оператор умножения, совместимый с IEEE P754, подходящий для ЦП, включает в себя больше, чем большой множитель: вам нужно добавить экспоненты, сдвинуть денормалы, управлять бесконечными значениями и несколько в основном бесполезных флагов (неточно, недопустимо ...)
источник
Я прочитал этот документ http://www2.warwick.ac.uk/fac/sci/eng/staff/saf/papers/fpl2014-ronak.pdf :
Хотел бы я найти источник их инструментов, чтобы проверить их выводы.
источник