Spójrzmy na algorytm w pytaniu:
[(a + b) + abs(b - a)]/2
Ma to etapy dodawania i odejmowania, które następnie wprowadza się do dodawania drugiego etapu. Podział na 2 jest trywialny pod względem sprzętowym, można tego dokonać poprzez usunięcie LSB. Jednak dwustopniowy pełny sumator / odejmator jest dość powolny i wymaga dużej ilości bramek, szczególnie jeśli kaskadujesz wiele znaków tak jak ty.
Opierając się na odpowiedzi Woutera van Ooijena, uogólniona struktura jest cyfrowym komparatorem zasilającym wybrany sygnał multipleksera:
symulacja tego obwodu - Schemat utworzony przy użyciu CircuitLab
Powyższy schemat dotyczy:
(A > B) ? A : B
zauważ jednak, że można go łatwo zmienić w celu dowolnego porównania między dwoma wejściami, tworząc różne logiczne połączenia między wyjściami komparatora a wyborem multipleksera.
Jeśli więc wiemy, jak sformułować trzy wyjścia z komparatora, możemy zaimplementować dowolne porównanie sprzętowe. Logika komparatora jest tutaj dobrze opisana . Aby zoptymalizować sprzęt, po prostu usunę logikę napędzającą nieużywane wyjścia komparatora.
Ale ostatecznie, jeśli chodzi o sprzęt, musi przejść syntezę. Dlatego nie powinieneś mieć obsesji na punkcie tego, który schemat poziomu bramki jest optymalny. Zamiast tego zoptymalizuj kod i algorytmy, aby przynajmniej nie zmuszać syntezatora do uzyskania nieefektywnego wyniku. „Przy odrobinie sprytnego trikowania sprawdzanie par bitów można połączyć z multiplekserem dla tej samej pary bitów”, a najłatwiejszym sposobem przeprowadzenia tej optymalizacji jest synteza.