У нас може бути кілька шарів логіки на тактовий цикл, але існує обмеження, скільки саме шарів логіки ми можемо мати, наскільки складними можуть бути ці шари, буде залежати від нашої тактової швидкості та нашого процесу напівпровідників.
Однак існує багато різних алгоритмів множення, і я не маю поняття, який може використовуватися мікроконтролерами
У більшості випадків множення в комп'ютерах використовується варіант двійкового довгого множення. Двійкове довге множення передбачає
- Зміщення одного операнда різними різними сумами
- Маскування зміщених чисел на основі другого операнда
- Додавання результатів маскування разом.
Тож давайте подивимось на реалізацію цього в апаратному забезпеченні.
- Зміна - це лише питання про те, як ми передаватимемо речі, тому це відбувається безкоштовно.
- Для маскування потрібні І ворота. Це означає один шар логіки, тому з точки зору часу це дешево.
- Доповнення відносно дороге через потребу в ланцюжку для перевезення. На щастя, є хитрість, яку ми можемо використати. Для більшості етапів додавання, а не додавання двох чисел для отримання одного, ми можемо додати три числа для отримання двох.
Тож давайте балпарк, скільки логічних етапів нам потрібно для множника 8x8 з результатами 16 біт. Для простоти припустимо, що ми не намагаємось оптимізувати той факт, що не всі проміжні результати мають біти у всіх позиціях.
Давайте припустимо, що повний суматор реалізований у два "етапи затвора".
- 1 для маскування для отримання 8 проміжних результатів.
- 2 додати групи з трьох чисел, щоб зменшити 8 проміжних результатів до 6
- 2 додати групи з трьох чисел, щоб зменшити 6 проміжних результатів до 4
- 2 додати групу з трьох чисел, щоб зменшити 4 проміжні результати до 3
- 2 додати групу з трьох чисел, щоб зменшити 3 проміжні результати до 2
- 32, щоб скласти два останні результати.
Отже, загалом близько 46 логічних етапів. Більшість з них витрачаються на складання останніх двох проміжних результатів.
Це можна було б покращити, скориставшись тим фактом, що не у всіх проміжних результатах є всі біти (тобто в основному те, що робить множник Dada), використовуючи суматор несучого пошуку для останнього кроку. Додавши 7 чисел для отримання 3 замість трьох для отримання двох (зменшення кількості ступенів за ціною більше воріт та ширших воріт) тощо.
Це все незначні деталі, але важливим моментом є те, що кількість етапів, необхідних для множення двох n бітних чисел та отримання результату 2n біт, приблизно пропорційне n.
З іншого боку, якщо ми подивимось на алгоритми поділу, ми виявимо, що всі вони мають ітераційний процес, де.
- Що робиться за одну ітерацію, сильно залежить від результатів попередньої ітерації.
- кількість логічних етапів, необхідних для здійснення ітерації, приблизно пропорційна n (віднімання та порівняння дуже схожі за складністю на додавання)
- кількість ітерацій також приблизно пропорційна n.
Отже, кількість логічних етапів, необхідних для здійснення поділу, приблизно пропорційна n квадрату.