FPGA: підраховувати чи відраховувати?


11

Я вчуся використовувати FPGA (Papilio development board, у якого є xilinx spartan3e, використовуючи vhdl).

Мені потрібно розділити вхідний імпульс на (жорстко закодоване) число.

Я бачу 3 варіанти - приблизно, як псевдокод (використовуючи 10 підрахунків як приклад):

  1. Ініціалізуйте до 0, при збільшенні вхідного краю збільшення на 1, порівняно з 10; якщо вони рівні, скиньте на 0 і запустіть вихідний імпульс
  2. Ініціалізуйте до 10, при зменшенні краю входу зменшити на 1, порівняти з 0; якщо вони рівні, скиньте на 10 і спрацюйте вихідний імпульс
  3. Ініціалізуйте до 9, але переконайтесь, що є принаймні 1 провідний біт "0", який є моїм вихідним бітом. На вході зростаюча грань зменшується на 1. На піднімаючий край вихідного біта скиньте.

Робочий цикл є неважливим.

Чи одна з них краща за інші? Чи є ще кращий метод, про який я не думав?

Чи існує "стандартний" спосіб, який дасть компілятору найкращі шанси на оптимізацію?


3
Це лише три варіанти :-) ... Але серйозно, це дійсно не так важливо у FPGA. Окремі логічні елементи є загальними, що потребує приблизно однакової кількості ресурсів і дає вам таку саму продуктивність, залежно від того, яким чином ви це зробите. Рішення зводиться до того, чи корисно в іншому місці дизайну мати підрахунок чисел вгору або вниз чи інший шаблон.
Дейв Твід

2
Четвертий варіант: 10-бітний реєстр кругового зсуву, завантажений "1000000000" і зміщений на висхідний край. Використовуйте один біт регістра зсуву як активу для того, що ви робите.
Лінкольн

1
Як зауваження - ваш інструмент для графічного інтерфейсу компілятора / монтажника після закінчення завдання повинен мати опцію, що показує фактичну схему, створену на різних рівнях абстракції, аж до воріт, тож ви зможете побачити, як інструмент підходив до вашої схеми та то ви можете внести відповідні зміни до джерела.
Анонім

Відповіді:


12

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

Сказавши це, я вважаю, що варіант 3 буде найкращим. У варіантах 1 і 2 встановлено порівняльний / АБО затвор між лічильниками, щоб він міг сигналізувати про досягнення цільового числа. Варіант 2 може бути трохи швидшим, ніж 1, оскільки все може бути прямим АБО разом без будь-яких інверторів, але знову ж таки ви стикаєтесь з невеликими технологічними розбіжностями, де це може бути швидше для AND або XOR.

Варіант 3 пропускає порівняння за низьку вартість одного зайвого біта в лічильнику. Це повинно бути варте того, якщо ви сильно не обмежуєтесь у триггерах.

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


+1, забороняючи тактові швидкості, що підштовхують обмеження технології, слід дозволити звіту про терміни керувати їх оптимізаціями часу. Переслідування сотень пікосекунд на Spartan 3e або будь-якій FPGA з цього приводу без причини, як правило, є марною тратою часу.
Джалаліпоп

4

Ще одним варіантом може бути ініціалізація лічильника до 6 (= 2 4 - 10), підрахунок та повторне скидання, коли активізується вихідний сигнал (тобто всі КВ - всі).

Перевагою цього є те, що він не потребує додаткового FF, і багато FGPA мають спеціальну логіку для прискорення роботи такого типу в ланцюзі лічильника або суматора.


3

Залежить. Наприклад: затримка розповсюдження тригера для 0 → 1 та 1 → 0 може бути різною, а значить, затримки переходу лічильника для 000 → 001 та 001 → 000 можуть бути дещо різними. Він може бути вищим або нижчим, залежно від технології cmos, що використовується в FPGA. Тож вам доведеться синтезувати та з’ясувати, хто з них має кращі показники часу.


3

З точки зору письменника-компілятора: якщо ви використовуєте integer, внутрішнє представництво не визначене, і компілятор вільний вибрати найбільш ефективну реалізацію.

Якщо змусити певне внутрішнє представлення, оптимізатор все ще намагатиметься його вдосконалити, але він почнеться з дещо гіршої точки зору.

N-1

Якщо ви не знаєте внутрішньої структури, ресурси, що виділяються на іншу логіку (багато FPGA мають виділену логіку з множинним додаванням з плаваючою точкою, яку ви також можете використовувати для впровадження лічильника, якщо у вас є одиниці, що залишилися), і повністю впевнені, що ви не будете перемикатися на іншу модель відповідь "не думай про це".

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.