Możemy mieć wiele warstw logiki na cykl zegara, ale istnieje limit, dokładnie to, ile warstw logiki możemy mieć, jak złożone mogą być te warstwy, będzie zależeć od naszej szybkości zegara i naszego procesu półprzewodnikowego.
Istnieje jednak wiele różnych algorytmów mnożenia i nie mam pojęcia, który z nich może być wykorzystany przez mikrokontrolery
Afaict większość mnożenia na komputerach używa wariantu binarnego długiego mnożenia. Binarne długie mnożenie obejmuje
- Przesuwanie jednego operandu o różne kwoty
- Maskowanie przesuniętych liczb na podstawie drugiego operandu
- Dodanie wyników maskowania razem.
Przyjrzyjmy się więc implementacji tego w sprzęcie.
- Zmiana biegów to tylko kwestia tego, jak załatwić sprawy, więc przychodzi za darmo.
- Maskowanie wymaga ORAZ bramek. Oznacza to jedną warstwę logiki, więc z punktu widzenia czasu jest tania.
- Dodawanie jest stosunkowo drogie ze względu na potrzebę łańcucha nośnego. Na szczęście istnieje sztuczka, której możemy użyć. W przypadku większości etapów dodawania zamiast dodawania dwóch liczb w celu uzyskania jednej, możemy dodać trzy liczby w celu uzyskania dwóch.
Pozwala więc na sprawdzenie, ile etapów logicznych potrzebujemy dla mnożnika 8x8 z 16-bitowymi wynikami. Dla uproszczenia załóżmy, że nie próbujemy optymalizować tego, że nie wszystkie wyniki pośrednie mają bity we wszystkich pozycjach.
Załóżmy, że pełny sumator jest implementowany w dwóch „etapach bramki”.
- 1 do maskowania w celu uzyskania 8 wyników pośrednich.
- 2, aby dodać grupy trzech liczb w celu zmniejszenia 8 wyników pośrednich do 6
- 2, aby dodać grupy trzech liczb w celu zmniejszenia 6 wyników pośrednich do 4
- 2, aby dodać grupę trzech liczb w celu zmniejszenia 4 wyników pośrednich do 3
- 2, aby dodać grupę trzech liczb w celu zmniejszenia 3 wyników pośrednich do 2
- 32, aby dodać ostatnie dwa wyniki.
Łącznie około 46 etapów logicznych. Większość z nich wydaje się na zsumowanie dwóch ostatnich wyników pośrednich.
Można to jeszcze bardziej ulepszyć, wykorzystując fakt, że nie wszystkie wyniki pośrednie mają wszystkie bity obecne (to jest w zasadzie to, co robi mnożnik dada), poprzez użycie sumatora przeniesienia wyprzedzającego dla ostatniego etapu. Dodając 7 liczb, otrzymujemy 3 zamiast trzech, aby wyprodukować dwa (zmniejszenie liczby etapów w cenie większej liczby bram i szerszych bram) itp.
To wszystko drobne szczegóły, ważne jest to, że liczba etapów potrzebnych do pomnożenia dwóch liczb n bitów i uzyskania wyniku 2n bitowego jest w przybliżeniu proporcjonalna do n.
Z drugiej strony, jeśli spojrzymy na algorytmy podziału, stwierdzimy, że wszystkie one mają iteracyjny proces gdzie.
- To, co zostanie zrobione podczas jednej iteracji, zależy w dużej mierze od wyników poprzedniej iteracji.
- liczba etapów logicznych wymaganych do wykonania iteracji jest w przybliżeniu proporcjonalna do n (odejmowanie i porównywanie są bardzo podobne pod względem złożoności do dodawania)
- liczba iteracji jest również w przybliżeniu proporcjonalna do n.
Zatem liczba etapów logicznych wymaganych do wdrożenia podziału jest w przybliżeniu proporcjonalna do n do kwadratu.