May 21st, 2019

Мучаем 5576ХС4Т - часть 'h34 - ускоренные перемножители

Часть 0 - покупаем, паяем, ставим драйвера и софт
Часть 1 - что это вообще за зверь?
Часть 2 - наша первая схема!
Часть 3 - кнопочки и лампочки
Часть 4 - делитель частоты
Часть 5 - подавление дребезга кнопки
Часть 6 - заканчиваем кнопочки и лампочки
Часть 7 - счетчики и жаба
Часть 8 - передатчик UART
Часть 9 - Hello, wolf!
Часть 'hA - приёмник UART
Часть 'hB - UART и жаба
Часть 'hC - полудуплексный UART.
Часть 'hD - МКО (МКИО, Mil-Std 1553) для бедных, введение.
Часть 'hE - приёмопередатчик МКО "из подручных материалов" (в процессе)
Часть 'hF - модуль передатчика МКО
Часть 'h10 - передатчик сообщений МКО
Часть 'h20 - работа с АЦП ADC124s051
Часть 'h21 - преобразование двоичного кода в двоично-десятичный (BCD)
Часть 'h22 - Bin2Bcd с последовательной выдачей данных
Часть 'h23 - перемножитель беззнаковых чисел с округлением
Часть 'h24 - перемножитель беззнаковых чисел, реализация
Часть 'h25 - передаём показания АЦП на компьютер
Часть 'h26 - работа над ошибками (быстрый UART)
Часть 'h27 - PNG и коды коррекции ошибок CRC32
Часть 'h28 - передатчик изображения PNG
Часть 'h29 - принимаем с ПЛИС изображение PNG
Часть 'h2A - ZLIB и коды коррекции ошибок Adler32
Часть 'h2B - ускоряем Adler32
Часть 'h2C - формирователь потока Zlib
Часть 'h2D - передаём сгенерированное PNG-изображение
Часть 'h2E - делим отрезок на равные части
Часть 'h2F - знаковые умножители, тысячи их!
Часть 'h30 - вычислитель множества Мандельброта
Часть 'h31 - ускоренные сумматоры
Часть 'h32 - ускоренные счётчики (делаем часы)
Часть 'h33 - ускоряем ВСЁ
Часть 'h34 - ускоренные перемножители
Часть 'h35 - умножители совсем просто
Часть 'h36 - уравновешенный четверичный умножитель


В части 'h31 мы разобрались, что делать, если обычная запись
assign C = A + B;


вызывает critical warning - timing requirements not met, при использовании довольно "длинных" (32 бит) чисел на медленных (speed grade "-3") кристаллах, если при всём при том мы надеемся работать на относительно высоких частотах.

А именно, мы предложили применить Carry Select Adder (сумматор с выбором переноса) - довольно уродское решение, но единственное из всех "ускоренных схем", которое действительно даёт выигрыш на ПЛИС.

Когда мы попытались реализовать умножитель, основанный на данном сумматоре (часть 'h33), обнаружилось, что даже 32-битный аккумулятор не получается, и нам приходится уменьшить его ширину до 28 бит. Кроме того, пришлось сделать вход сброса асинхронным, что немножко нервирует. И можно было забыть о входе синхронной загрузки, который позволил бы превратить умножитель в умножитель-накопитель (MAC, Multiply-ACcumulate).

Совсем всё плохо стало при реализации "генератора множества Мандельброта", где два умножителя-накопителя должны стоять "рядышком", а вслед за ними стоят два сумматора, вычисляющие X+Y и X-Y (см. часть 'h30). как оказалось, когда в ограниченном объёме (чтобы не удлинять пути) нужно разместить 8 сумматоров по 16 бит каждый, компоновщик (Place&Route) начинает сходить с ума - иногда ему вообще не удаётся разместить схему (no fit), и даже если удаётся - её временнЫе характеристики оказываются ужасными...

На самом деле, "ускоренные" (способные работать на высокой тактовой частоте) перемножители реализуются гораздо проще - практически "бесплатно", т.е за повышенную тактовую частоту нам не нужно расплачиваться ни увеличенным количеством ЛЭ, ни увеличенным количеством тактов! (разве что совсем чуть-чуть)



Просто не нужно зацикливаться на осуществлении сложения ЗА ОДИН ТАКТ - и внезапно всё получится.
Collapse )

Подобным образом можно реализовать и знаковые умножители.

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