Custom floating point format on FPGA

Всім привіт!

У даній статті мова піде про числа у форматі з плаваючою точкою і зокрема про реалізацію спеціалізованого формату FP23 на програмованих логічних інтегральних схемах (ПЛІС). В рамках конкретного проекту у мене народилася думка реалізувати оптимальний для певних потреб формат даних з плаваючою точкою. У підсумку ця думка переросла в реальний проект, який згодом знайшов застосування в деяких цікавих задачах цифрової обробки сигналів. У статті розглянуто основні складності при реалізації формату даних floating point на ПЛІС Xilinx, розглянуто базові математичні операції в форматі FP23. Також в кінці статті ви можете знайти вихідний код проекту, якій можна вільно використовувати в своїх завданнях або на його основі реалізувати схожі формати даних.




Формат даних

Числа з плаваючою точкою активно використовуються в сучасних сигнальних процесорах, відеокартах і навіть в ПЛІС. У відповідності зі стандартом IEEE 754, вони представляються у вигляді сукупності експоненти (показника ступеня), мантиси і знака. Числа в стандарті IEEE 754 мають 32 біта (float). Для однозначності запису числа у float записуються в нормальній формі або приводяться до нормалізованої увазі після математичних операцій і перетворень над числами. Діапазон можливих значень залежить від кількості біт мантиси й експоненти. Для float характерна фіксована відносна точність і мінлива абсолютна точність. Основні переваги і недоліки чисел у форматі float:
  • + Забезпечується дуже широкий діапазон можливих значень;
  • + Досягається висока точність обчислень;
  • – Округлення дуже великих чисел до можливих з сітки значень;
  • – Втрата точності при додаванні чисел, відмінних один від одного у багато разів;
  • – Складність реалізації і застосування на ПЛІС.
Для сучасних мікросхем ПЛІС реалізація чисел у форматі з плаваючою точкою не становить великої праці. Для провідних виробників – Xilinx та Altera існують готові SOFT IP-ядра, що реалізують float за стандартом. Для Altera в останніх колекціях представлені HARD IP-ядра, що реалізують формат IEEE 754 на DSP-блоках.

Цифрова частина

Основна елементна база для виконання математичних операцій і задач цифрової обробки сигналів – передові сімейства ПЛІС. Робота проводиться на ПЛІС фірми Xilinx, які містять блоки векторів конфігурованих осередків. В першу чергу це універсальні блоки цифрової обробки і математики – DSP48E1 (для ПЛІС серії Virtex-6 і 7 сімейства) і DSP48E2 (для ПЛІС сімейства UltraScale). Ці блоки дозволяють виконувати функції додавання і віднімання, зсуву та перенесення, швидкодіючого множення, множення з накопиченням (MACC), пошуку контрольної суми і т. д. На осередках DSP48 в сучасних ПЛІС виконується безліч завдань – розробка СІС і FIR фільтрів, швидкісне обчислення FFT/IFFT, реалізація цифрових синтезаторів частоти (DDS і CORDIC), створення різних форматів представлення даних і набору операцій для них.

Другим базовим компонентом ПЛІС є блокова пам'ять. Для ПЛІС Xilinx це осередку RAMB36E1 (або RAMB18E1). Це елементи двухпортовой пам'яті, реалізовані всередині кристалів у вигляді стовпців ідентичних блоків. Кількість стовпців вбудованої пам'яті залежить від об'єму кристала. Максимальний об'єм блоку пам'яті становить 36Кбит, при цьому він може бути налаштований як два незалежних блоку за 18Кбит кожен. Пам'ять може бути використана з шириною даних від 1 до 72 розрядів. При відсутності вільних ресурсів блокової пам'яті ПЛІС, можна задіяти розподілену пам'ять в спеціальних комірках SLICEM. Для ПЛІС Ultrascale такий обсяг пам'яті до 512х1, з можливістю зміни глибини і розрядності шини.

Постановка завдання

З урахуванням перерахованих особливостей для реалізації аналогової і цифрової частини, завдання формується наступним чином. Нехай розрядність даних, що надходять в кристал ПЛІС з мікросхем АЦП дорівнює 16 біт. Як ПЛІС обрана найменша мікросхема Kintex-7. Завдання полягає в переведенні 16-розрядного знакового цілого числа FIX16 в спеціалізований формат з плаваючою точкою FP23 і назад, забезпечуючи при цьому максимальну швидкість обробки ПЛІС при мінімальних витратах ресурсів кристала. Крім того, необхідно визначити і реалізувати набір базових математичних операцій – додавання, віднімання та множення.

Реалізація формату FP

FP23 – це особливий формат представлення чисел з плаваючою точкою. На відміну від стандарту IEEE 754, довжина слова у форматі FP23 не 32 біта, а всього 23 біта. Наступна формула в спрощеному виді відображає уявлення числа «A» у форматі FP:


Мантиса (mantissa) у форматі FP23 – це 17-бітне позитивне число. Вона завжди відображається в нормалізованому вигляді в результаті всіх перетворень, тобто самий старший біт мантиси завжди дорівнює «1». Для економії ресурсів кристала і спрощення запису 17-й біт мантиси ніколи не відображається в упакованому виводі 23-бітному слові (див. малюнок). Тому при обчисленні математичних операцій і переведенні з одного формату в іншій, необхідно пам'ятати, що нормалізована мантиса, і до 16-розрядному ненулевому числа необхідно додати значення 216. Експонента або показник (exponent) у форматі FP23 – це 6-бітове позитивне число, що визначає, на скільки множиться мантиса. Під знак (sign) виділено залишився один біт, причому нульове значення біта відповідає позитивним числом, а одиничне значення визначає від'ємні числа. Таким чином, число A у форматі FP23 описується трьома бітовими полями: «експонентою» (EXP(A)), «знаком»(SIGN(A)) і «мантиссой» (MAN(A)).


У таблиці 1 наведено розрядність даних, діапазон можливих значень мантиси і експоненти і т. д.


Отже, перший етап при розробці формату даних з плаваючою точкою на ПЛІС полягає в перекладі знакового цілого числа фіксованої розрядності у формат з плаваючою точкою FP23, забезпечуючи при цьому максимальну швидкість обробки всередині ПЛІС. Другий етап полягає у зворотному перетворення чисел з формату FP23 у формат з фіксованою точкою з можливістю масштабування вихідних даних під певний коефіцієнт ділення. І, нарешті, на третьому етапі для повноцінного використання всієї потужності формату FP23 необхідно реалізувати математичні операції – додавання, віднімання та множення.

Перед описом модулів FP23 належить відповісти на закономірне питання: «Чому розрядність даних у форматі саме 23 біта?» Відповідь складається з декількох складових. По-перше, один біт використовується для знака і 15 залишилися бітів для цілої частини, тому мантиса знак займають як мінімум 16 бітів. Для експоненти з урахуванням зміщення у формулі необхідно мінімум 5 бітів. Чим більше біт відводиться під експоненту, тим більше результат (розширюється діапазон можливих значень). Нехай експонента має 6 розрядів, а мантиса представлена як 16-розрядне число, на знак відводиться 1 розряд. Тоді для представлення чисел в форматі FP23 використовується саме 23 біта. Якщо використовувати прихований біт мантиси, який дорівнює 1 при ненульових значеннях і дорівнює 0 при нульових значеннях двійкового числа, то розрядність дорівнює 24.

Крім того, значення «23» вибрано не випадково, оскільки в подальшому для зберігання вектора комплексних значень потрібно пам'ять ПЛІС. Пара значень без відображення прихованого біта має сумарну розрядність, рівну 46, з прихованим бітом – 48, що по ширині даних укладається рівно в три блоки пам'яті RAMB18E1. Також для пари значень можна використовувати додаткові функції блоку DSP48E1 – швидке порівняння двох чисел, перевірка на парність і швидке підсумовування в режимі SIMD.

Перетворення FIX16-to-FP23

Для перетворення даних з цілочисельного знакового типу FIX16 у формат FP23 необхідно використовувати логіку кристала ПЛІС і вбудовані перемножители DSP48E1. На малюнку зображена структурна схема перетворення даних у формат FP23.


Максимальна розрядність множників блоків DSP48E1 – 25 і 18 відповідно, де старший біт – знаковий. Для множення чисел без урахування знака в модулі DSP48E1 ефективна розрядність вхідних даних знижується на 1 біт. Блокову пам'ять RAMB18E1 перетворювач не використовує.
Відповідно, щоб знайти знак числа, необхідно взяти старший (знаковий) біт вхідних даних. Алгоритм пошуку мантиси MAN(A) на базі примітивів ПЛІС наступний:
  • взяти модуль вхідного числа (операція «виключаюче АБО»),
  • провести пошук старшого значущого біта (MSB SEEKER),
  • за старшому значущому биту сформувати величину зсуву мантиси,
  • перемножити модуль числа та значення зсуву, отримавши нормалізовану мантиссу (FRAC SHIFTER).
Для пошуку експоненти EXP(A) необхідно:
  • взяти модуль вхідного числа (операція «виключаюче АБО»),
  • провести пошук старшого значущого біта (MSB SEEKER),
  • відняти з числа «32» інвертований індекс значущого біта,
  • додати 1 до отриманого результату з урахуванням логіки пошуку ненульового значення вхідного (LUT ZERO FORMER).
Оскільки мантиса виходить шляхом множення модуля дійсного числа на деяку «маску», від якої залежить зсув вхідного числа без знака, то для її пошуку необхідний блок DSP48E1. Процедура пошуку і формування мантиси відбувається у вузлі FRAC SHIFTER і відображена на рисунку.


Як видно, мантиса формується у два етапи. На першій стадії за допомогою логічних ресурсів LUT з вхідного числа створюється множник 216-MSB. На другій стадії вхідні дані множаться на величину зсуву у вузлі DSP48E1. На виході помножувача утворюється нормалізована мантиса. Відповідно до опису, для множення чисел без знаку максимальна розрядність одного з множників блоку DSP48E1 дорівнює 17, отже, мантиса і формується зрушення не можуть мати велику розрядність. Це обмеження ще раз обумовлює той факт, що мантиса чисел у форматі FP23 має розрядність 17. Старший біт мантиси для ненульових чисел дорівнює 1, зарезервований і застосовується в операції пошуку результуючої мантиси, але не відображається в вихідному представленні числа нормалізованого вигляду. Цей біт можна вивести і використовувати в загальному уявленні слова, тоді розрядність вихідного слова дорівнює 24 біт.

Для зменшення обсягу займаних ресурсів кристала, блок DSP48E1 можна виключити. Тоді вузол пошуку мантиси перетворюється у швидкий сдвиговый регістр (Barrel shifter). Для деяких кристалів ПЛІС кількість DSP48E1 невелика, і зайві витрати ресурсів критичні, тому при використанні блоків FP23 є можливість вибрати той чи інший варіант. Крім того, для варіанту з використанням швидкого зсуву сумарна затримка на повне виконання операції перетворення зменшується на один такт.

Вузли підсумовування для пошуку експоненти зроблені у вигляді повних двійкових суматорів, для реалізації яких застосовуються логічні компоненти MUXCY, XORCY і CARRY CHAIN, що входять до базові осередки SLICEL і SLICEM. Детальний опис можна знайти в будь-якій літературі, присвяченій програмованою логікою.

Приклад часових діаграмПеретворення даних з FIX в FLOAT FP23:

DIN — вхідні дані, 16 біт. DOUT — число у форматі FP23, розбитий на три поля: {EXP, SIGN, MANT}.

Перетворення FP23-to-FIX16

Перетворення даних з формату FP23 в FIX16 проводиться в чотири етапи.


Алгоритм двійкового пошуку знакового числа A складається з декількох послідовних дій:
  • з експоненти EXP(A) вирахувати значення SCALE (масштабування вихідних даних),
  • сформувати зсувних маску 2(EXP(A)-SCALE),
  • до мантиссе додати прихований біт IMPL(A) і помножити результат на величину зсуву,
  • врахувати знак числа SIGN(A) шляхом взяття операції «виключає АБО».
Як і для вузла прямого перетворення у формат FP23, в цій схемі для економії ресурсів ПЛІС блок DSP48E1 можна замінити швидким зсувними регістром, виконаним на осередках SLICEM.

Множення

Множення чисел у форматі FP23 – одна з найбільш простих і логічних операцій. Апаратно алгоритм множення реалізований наступним чином (див. рис).
  • множення мантисс у вузлі DSP48E1,
  • нормалізація мантиси (взяття в якості розрядів мантиси [32...17] або [31...16], в залежності від значення старшого значущого біта),
  • додавання експонент,
  • віднімання із суми експонент числа 16,
  • якщо 33-й біт твори мантисс дорівнює «0», то експоненти результату віднімається ще 1,
  • визначення знаку добутку за допомогою операції «виключає АБО».


У схемі не відображена логіка множення на нульове число, але алгоритмічно вона зводиться до того, що якщо експонента будь-якого вхідного числа дорівнює нулю, то результат на виході також дорівнює нулю. На ПЛІС пошук нуля організований з допомогою логічних функцій AND та OR на базових блоках LUT.

Число 16 вираховується із суми експонент для обліку прихованих бітів у мантиссах вхідних чисел, які дають надбавку до експонентам. Суматори і вычитатели у вузлі множення чисел з плаваючою точки також реалізовані за схемою повного двійкового суматора.

Додавання і віднімання

Додавання і віднімання чисел у форматі FP23 – найвитратніша ресурсів операція (див. рис). Додавання чисел в форматі FP23 складається з наступних фундаментальних стадій:
  • приведення операндів до однієї експоненті (вирівнювання),
  • додавання мантисс,
  • нормалізація результату (підбір такої експоненти, щоб 16 біт мантиси був дорівнює «1»).


Апаратно алгоритм складання реалізований наступним чином:
  • операнди «A» і «B» порівнюються по модулю, якщо |А|<|B|, числа міняються місцями,
  • обчислюється різниця експонент операндів, а результат визначає, на скільки розрядів потрібно зрушити мантиссу числа «B» вправо, щоб привести числа до однієї експоненті,
  • за різниці експонент формується число, на яке множиться мантиса числа «В»,
  • результат множення складається з мантиссой числа «A»,
  • в отриманому числі визначається номер старшого значущого біта MSB, формується число ,
  • нормалізація мантиси шляхом множення суми мантисс на число ,
  • експонента числа EXP© = EXP(A) – MSB + 1.
Віднімання реалізовано аналогічно складанню. Відмінність тільки в тому, що у вычитаемого операнда інвертується знак SIGN(B). Блоки DSP48E1 також можна замінити на швидкий сдвиговый регістр.

Ресурси

Результати синтезу і затримка поширення на виконання операції для кожного вузла зведені в таблицю 2. З таблиці видно, що найбільш простою і швидкою операцією є множення двох чисел у форматі FP23.


Обсяг займаних ресурсів після синтезу для всіх вузлів наведено в загальному лог-файлі. Приклад результатів синтезу для помножувача fp23:

Top Level Output File Name : fp23_mult_m1.ngc
Primitive and Black Box Usage:
------------------------------
# BELS : 106
# GND : 15
# INV : 1
# LUT2 : 25
# LUT3 : 16
# LUT4 : 6
# LUT6 : 14
# MUXCY : 14
# VCC : 1
# XORCY : 14
# FlipFlops/Latches : 75
# Shift Registers : 8
# SRLC16E : 8
# DSPs : 1
# DSP48E1 : 1


Вихідний код

Всі вузли формату FP23 написані на мові VHDL. Для зручності і перевірки на С++ написана невелика програма, яка містить функції реалізуються операцій у плаваючою точки на ПЛІС. З її допомогою можна проводити відладку і реалізацію інших форматів з плаваючою точкою з іншими розмірності експоненти і мантиси.

Для зручності читання даних на VHDL створений тип, визначає числа у форматі з плаваючою точкою. Всі компоненти і типи FP23 зібрані у файлі fp_m1_pkg.vhd
type fp23_data record is
exp : std_logic_vector(5 downto 0); 
sig : std_logic;
man : std_logic_vector(15 downto 0);
end record;

Вихідний код RTL-описів, програма тестування та результати синтезу можна знайти за посиланням на github.

Тестовий приклад

Для тестування всіх розроблених вузлів я придумав невелику схему. Це комплексний помножувач, на вході і виході якого дані представлені в цілочисловою формою, а проміжні результати плаваючою точки. Тобто входые дані перетворюються у формат FP23. У цьому форматі реалізується комплексний множення, а результат перекладається тому FP23 у фіксовану крапку. Структурна схема RTL-Viewer виглядає наступним чином:


У PlanAhead розміщення комплексного помножувача представлено на рисунку. ПЛІС Kintex-7, XC7K70TFBG484-1C.


Видно, що в результаті повної трасування проекту досягається частота опрацювання порядку ~300МГц. На практиці ця цифра на ~30%.

У FPGA Editor блок звичайного помножувача в форматі FP23 виглядає ось так:


Висновок

В результаті роботи розроблено спеціалізований формат даних для плаваючою точки FP23 на ПЛІС. Він відрізняється від традиційного формату IEEE 754 і заточений під обробку на ПЛІС на максимальних швидкостях. На відміну від стандартних рішень від Xilinx та Altera, вузли в форматі FP23 займають значно менше ресурсів кристала. Операції додавання і множення в FP23 знайшли застосування для реалізації КІХ-фільтрів і вузла ШПФ/ОБПФ на ПЛІС.

При бажанні ви можете створити власний формат даних "FP_X" для конкретних завдань з будь-якою розрядністю мантиси й експоненти. При цьому необхідно враховувати особливості і структуру конкретних ПЛІС.

Література

Дякую за увагу! Продовження слідує...

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.