Проектирование КИХ-фильтра на умножителе методом правого сдвига и сложения в базисе ПЛИС
Общие сведения по программным умножителям
В ПЛИС для повышения их функциональных возможностей встраивают (например, для серии Cyclone III фирмы Altera) аппаратные умножители, которые могут быть сконфигурированы в виде одного умножителя 18×18 либо в виде двух умножителей 9×9. Так, ПЛИС EP3CLS200 содержит 396 аппаратных умножителей 18×18, а на оставшихся ресурсах может быть реализован 891 программный умножитель 16×16. В итоге суммарное число умножителей составляет 1287 без какого-либо значительного использования логических ресурсов.
Для устройств цифровой обработки сигналов хорошо себя зарекомендовали софт-умножители (программные умножители), которые не требуют ресурсов аппаратных умножителей, встроенных в базис ПЛИС. Повысить производительность устройств цифровой обработки сигналов позволяет также использование параллельного векторного умножителя и безумножительные схемы умножения на основе распределенной арифметики [1].
Рассмотрим параллельные программные умножители, способные вычислять произведение за один такт синхроимпульса, что обеспечивает наивысшую производительность устройств цифровой обработки сигналов. Программные умножители БИС программируемой логики (БИС ПЛ) фирмы Actel серий Fusion, IGLOO и ProASIC3 реализуются на блочной памяти меньшей размерности, чем у ПЛИС фирмы Altera, и их можно рассматривать как 8‑входовые LUT или таблицы произведений [2, 3]. Таблица произведений множимого, записанная во фрагмент блочной памяти, называется LUT.
В таблице 1 приведен умножитель размерностью 3×3, реализованный с помощью 6‑входовой LUT.
|
Множимое |
||||||||
000 |
001 |
010 |
011 |
100 |
101 |
110 |
111 |
||
Множитель |
000 |
000000 |
000000 |
000000 |
000000 |
000000 |
000000 |
000000 |
000000 |
001 |
000000 |
000001 |
000010 |
000011 |
000100 |
000101 |
000110 |
000111 |
|
010 |
000000 |
000010 |
000100 |
000110 |
001000 |
001010 |
001100 |
001110 |
|
011 |
000000 |
000011 |
000110 |
001001 |
001100 |
001111 |
010010 |
010101 |
|
100 |
000000 |
000100 |
001000 |
001100 |
010000 |
010100 |
011000 |
011100 |
|
101 |
000000 |
000101 |
001010 |
001111 |
010100 |
011001 |
011110 |
100011 |
|
110 |
000000 |
000110 |
001100 |
010010 |
011000 |
011110 |
100100 |
101010 |
|
111 |
000000 |
000111 |
001110 |
010101 |
011100 |
100011 |
101010 |
110001 |
Например, в ПЛИС фирмы Actel используется ОЗУ емкостью 256 слов × 8 бит (256 8‑разрядных слов), а в ПЛИС фирмы Altera — память M4K, которая может быть сконфигурирована как 128 слов × 36 бит или 256 слов × 18 бит для серии Cyclone II. Такие умножители получили название RAM-LUT умножители, или LUT-based умножители.
На рис. 1 показан умножитель 4×4 на базе синхронного ОЗУ емкостью 256 8‑разрядных слов. Множимое (младшие четыре разряда адресной шины) и множитель (старшие четыре разряда адресной шины), представленные 4‑разрядным двоичным кодом, объединяются в 8‑разрядную адресную шину, адресуя своим уникальным кодом содержимое конкретной строки ОЗУ (операнды), являющееся 8‑разрядным произведением.
Недостатком такого умножителя является резкое возрастание требуемого объема блочной памяти в случае увеличения его разрядности. Для умножителя размерностью 8×8 требуется 65 536 16‑разрядных слов. Поэтому, чтобы предотвратить рост требуемой памяти, на практике используется умножитель на суммировании частичных произведений в соответствии со своим весом (partial product multipliers).
На рис. 2 показан пример умножения десятичного числа 24 на 43. Например, произведению 2 на 4 приписывается вес 100, что равносильно сдвигу на две позиции в десятичной системе. В этом случае необходим умножитель размерностью 8×8. Однако согласно принципу умножения с использованием частичных произведений требуется четыре умножителя размерностью 4×4 для формирования четырех частичных произведений и три сумматора: (4×3+((2×3)×10))++((4×4)+((2×4)×10)×10) = 1032. На рис. 3 приведена структурная схема такого умножителя [2].
Также для сдвига на одну и две десятичные позиции потребуется три сдвиговых регистра на четыре разряда влево и дополнительные блоки, выполняющие операции расширения знака со значением старшего разряда.
Программные умножители на константу
Одна из наиболее распространенных операций цифровой обработки сигналов — умножение числа на константу. Для перемножения двух чисел достаточно иметь таблицу произведений множимого (константы) на весь ранг возможных цифр множителя (табл. 2) и осуществить корректное суммирование полученных частичных произведений (рис. 2в).
Входы |
X[3] |
|||
X[2] |
X[1] |
X[0] |
0 |
1 |
000 |
0 |
192 |
||
001 |
24 |
216 |
||
010 |
48 |
240 |
||
011 |
72 |
264 |
||
100 |
96 |
288 |
||
101 |
120 |
312 |
||
110 |
144 |
336 |
||
111 |
168 |
360 |
Программные умножители фирмы Actel реализуются на 8‑входовых LUT. Множимое (константа) предопределено. В этом случае необходимо два блока памяти емкостью 256 8‑разрядных слов, позволяющих организовать массив памяти 256 16‑разрядных слов из двух блоков емкостью 256 8‑разрядных слов, выходная шина которого и есть 16‑разрядный результат умножения двух 8‑разрядных чисел (рис. 4).
Что же касается программных умножителей Altera, то встроенная блочная память TriMatrix в ПЛИС этой фирмы, например типа M9K, используемой в качестве LUT, в которых хранятся частичные произведения, позволяет реализовывать параллельные умножители, экономя при этом не только аппаратные умножители, но и ресурсы логических блоков. Наличие программных и аппаратных умножителей приводит в целом к увеличению общего числа возможных умножителей.
Использовать программные и аппаратные умножители в проекте можно через мегафункции. Например, мегафункции lpm_mult, altmult_add и altmult_accum позволяют использовать аппаратные умножители. Рассмотрим мегафункцию ALTMEMMULT — программный умножитель. С помощью этой мегафункции можно осуществлять процесс умножения числа на константу C, при этом константа может храниться в блочной памяти ПЛИС либо загружаться с внешнего порта.
Для ПЛИС серии Cyclone II есть возможность использовать только память M4K (128×36 бит) или режим Avto. Например, ПЛИС EP2C70 содержит 250 блоков M4K. На рис. 5 показан принцип умножения числа на константу. В целом он не отличается от ранее рассмотренного. При этом число и константа могут быть как со знаком, так и без него. А на рис. 6 показан принцип построения программного умножителя 16‑разрядного числа на 10‑разрядную константу (обозначена буквой C) с использованием блоков памяти типа M4K большего размера, чем у БИС ПЛ фирмы Actel, для случая, когда константы хранятся в блочной памяти, то есть отсутствует возможность их загрузки извне (отсутствуют адресные порты для загрузки коэффициентов).
Входной 16‑разрядный сигнал разделяется на два 8‑разрядных сигнала с именами LSB (младший значащий разряд) и MSB (старший значащий разряд) [3]. Сигнал LSB адресуется к блоку памяти M4K с одноименным названием LSB, а сигнал MSB адресуется к блоку памяти M4K с одноименным названием MSB. В блочной памяти LSB хранятся 256 предварительно вычисленных частичных произведений с именем «LSB Частичное произведение [17..0]» (младшее частичное произведение) разрядностью 18 бит с диапазоном от 0 до 255xC, а в памяти MSB с диапазоном от 0 до (-1)xC хранятся 256 предварительно вычисленных частичных произведений с именем «MSB Частичное произведение [25..8]» (старшее частичное произведение). Далее старшее частичное произведение необходимо сдвинуть на восемь разрядов влево, а затем осуществить сквозное суммирование.
Умножение фактически осуществляется за один такт синхроимпульса, который необходим для загрузки входных значений сигналов LSB и MSB в адресные порты блоков памяти. Еще два такта требуются для конвейеризации задержки вычислений, так как выходные значения блоков памяти, представляющие собой частичные произведения, должны быть еще просуммированы с соответствующими весами для получения 26‑разрядного результата умножения.
В качестве примера на рис. 7 показаны настройки мегафункции ALTMEMMULT для умножения 4‑разрядного числа, представленного дополнительным кодом, и 4‑разрядной константы, загружаемой из внешнего порта. В этом случае требуется 20LUT логических блоков плюс один блок памяти типа M4K и 20 триггеров (20LUT+1M4K+20reg). При загрузке константы из блочной памяти нужен всего лишь один M4K.
Принцип построения, представленный на рис. 5, не раскрывает все тонкости такого умножителя. В частности, не показана операция расширения знака числа.
На рис. 8 приведен принцип построения программного умножителя на константу размерностью 8×8 с использованием двух 4‑входовых LUT ПЛИС серии XC4000 [4]. На рис. 8 обозначено: V — входной 8‑разрядный сигнал; P1 и P2 — младшее и старшее частичные произведения; C — константа. В частности, здесь показано, как на практике осуществляется сдвиг на четыре разряда влево. Для умножителя требуется 25 конфигурируемых логических блоков (КЛБ). Объединяя такие умножители в секции (одна секция на отвод фильтра), можно построить высокопроизводительный параллельный КИХ-фильтр, работающий на частоте 50–70 МГц.
Проектирование КИХ-фильтра с использованием умножителя методом правого сдвига и сложения
Рассмотрим уравнение КИХ-фильтра (нерекурсивного цифрового фильтра с конечно-импульсной характеристикой), которое представляется как арифметическая сумма произведений:
где y — отклик цепи; xk — k‑ая входная переменная; ck — весовой коэффициент k‑ой входной переменной, который является постоянным для всех n; K — число отводов фильтра.
На рис. 9 показана тестовая схема КИХ-фильтра на четыре отвода y = C0x0 + C1x1 + C2x2 + C3x3 в САПР ПЛИС Quartus II для реализации в базисе ПЛИС серии Cyclone II. Эта схема состоит из линии задержки, четырех умножителей и дерева многоразрядных сумматоров. Предположим, что коэффициенты фильтра — целочисленные, со знаком, они известны и равны C0 = –2, C1 = –1, C2 = 7, C3 = 6.
Числа (входные отсчеты) поступают с выходов линии задержки на регистрах reg_tap на входы data_in[3..0] мегафункции ALTMEMMULT. Константы C0, C1, C2, C3, в которых хранятся значения коэффициентов в дополнительном коде (14D, 15D, 7D и 6D), подключены к входам coeff_in[3..0]. В каждой из четырех мегафункций ALTMEMMULT в блочной памяти ПЛИС типа M9K хранятся нулевые коэффициенты (они могут быть и не нулевыми). Режим загрузки с внешнего порта или из блочной памяти определяется опцией create ports to allow loading coefficients. Латентность мегафункции — два такта синхроcигнала. Смоделируем прохождение дельта-функции по структуре фильтра. Для этого на вход линии задержки фильтра X0[3..0] в дополнительном коде подадим единичный импульс «лог. 1». На выходе фильтра Mem_mult[7..0] видим коэффициенты фильтра (импульсную характеристику) (рис. 10).
Подадим на вход КИХ-фильтра входные отсчеты –5, 3, 1 и 0 (рис. 11). Правильные значения на выходе фильтра: 10, –1, –40, –10, 25, 6 и т. д., то есть согласно формуле (1).
Рассмотрим КИХ-фильтр на четыре отвода на умножителях (MAC-блоках) с использованием метода правого сдвига и сложения. Дополнительную информацию о разработанном MAC-блоке можно получить в работе [5].
На рис. 12 показана линия задержки на двухтактных триггерах с использованием мегафункции LPM_FF. На рис. 13 приведены умножители (mac_scal_acc) с константами и дерево сумматоров, а на рис. 14 — доработанная схема умножителя с учетом работы в составе КИХ-фильтра. Модификация в MAC-блоках выделена красным цветом. На рис. 15 показаны временные диаграммы работы КИХ-фильтра. Требуемые значения на выходе фильтра 10, –1, –40, –10, 25, 6 выделены красным цветом.
В таблице 3 представлены технические характеристики КИХ-фильтра на четыре отвода, реализованного в базисе ПЛИС EP2C5F256C6 (4608 логических элементов, 119 808 бит встроенной памяти, 26 аппаратных умножителей 9×9) с использованием разработанного MAC-блока и программных умножителей на мегафункции ALTMEMMULT.
Технические |
Разработанный MAC-блок |
Программный умножитель |
|
Коэффициенты загружаются |
Коэффициенты загружаются |
||
Частота в наихудшем случае, Fmax |
240 |
210 |
260 |
Выводы
Смена данных на выходе КИХ-фильтра при использовании MAC-блока в качестве умножителя и умножителя на мегафункции ALTMEMMULT при загрузке коэффициентов из внешнего порта приблизительно одинакова (22 MAC и 21 ALTMEMMULT такта синхроимпульса). Для сравнения в работе [6] показано, что мегафункция ALTMULT_ADD также позволяет построить параллельный КИХ-фильтр на четыре отвода за счет использования встроенных четырех аппаратных перемножителей с размерностью операндов 18×18. Рабочая частота в наихудшем случае для ПЛИС серии Stratix III составила 400 МГц.
Повысить производительность КИХ-фильтра с помощью программного умножителя на мегафункции ALTMEMMULT позволяет вариант загрузки коэффициентов из блочной памяти ПЛИС (260 МГц).
Разработанный в [4] MAC-блок на основе метода правого сдвига и сложения может быть использован для проектирования высокопроизводительных и компактных КИХ-фильтров небольшой разрядности. При этом на его реализацию в базисе ПЛИС потребуются незначительные логические ресурсы (менее 1%), что позволяет сэкономить аппаратные и программные умножители. Недостатком такого MAC-блока является трудоемкость его разработки и наличие своего интерфейса в отличие от унифицированных интерфейсов мегафункции ALTMEMMULT, что может затруднить его использование.
- Строгонов А. КИХ-фильтры на параллельной распределенной арифметике // Компоненты и технологии. 2013. № 5.
- Application Note AC222. Using Fusion, IGLOO, and ProASIC3 RAM as Multipliers — actel.com.
- AN‑306-3.0. Application Note 306. July 2004, ver.3.0. Implementing Multipliers in FPGA Devices.
- Newgard B. Seminar. Signal processing with Xilinx FPGAs. June 9, 1996. xdsp.ppt. Xilinx Hardware Digital Signal Processing.
- Строгонов А., Винокуров А., Джиоти А. Проектирование умножителя целых чисел со знаком методом правого сдвига и сложения в базисе ПЛИС // Компоненты и технологии. 2014. № 1.
- Строгонов А., Быстрицкий А. Проектирование параллельных КИХ-фильтров в базисе ПЛИС // Компоненты и технологии. 2013. № 6.