Mieliśmy bardzo krótki kurs FPGA / Verilog na uniwersytecie (5 lat temu) i zawsze używaliśmy zegarów wszędzie.
Zaczynam ponownie od FPGA jako hobby i nie mogę przestać się zastanawiać nad tymi zegarami. Czy są absolutnie wymagane, czy też konstrukcja oparta na FPGA może być całkowicie asynchroniczna? Czy można zbudować złożoną wiązkę logiki i sprawić, by rzeczy przebiegały przez nią tak szybko, jak to możliwe?
Zdaję sobie sprawę, że jest z tym wiele problemów, takich jak wiedza, kiedy sygnał rozprzestrzenia się przez wszystkie części obwodu, a wyjście ustabilizowało się. Nie w tym rzecz. Nie chodzi o to, że chcę zbudować projekt całkowicie asynchroniczny, ale tylko po to, by lepiej zrozumieć moje możliwości.
Moim początkującym okiem wydaje się, że jedyną konstrukcją, która absolutnie wymaga zegara, jest reg
, i rozumiem, że typowa FPGA (powiedzmy, Cyclone II) będzie miała przerzutniki wstępnie podłączone do określonych sygnałów zegara. Czy to jest poprawne? Czy istnieją inne niejawne zegary takie jak ten i czy zazwyczaj mogą być ręcznie sterowane przez projekt?
Odpowiedzi:
Krótka odpowiedź brzmiałaby: tak; dłuższa odpowiedź brzmiałaby: nie warto poświęcać czasu.
Sam układ FPGA może działać całkowicie asynchronicznie bez problemu. Rezultat jest problemem, ponieważ czas przez FPGA nie jest bardzo przewidywalny. Większy problem polega na tym, że Twoje wyczucie czasu i wynikowy projekt prawie na pewno będą się różnić w różnych sesjach miejsca i trasy. Możesz nakładać ograniczenia na poszczególne ścieżki asynchroniczne, upewniając się, że nie trwają one zbyt długo, ale nie jestem pewien, czy możesz określić minimalne opóźnienie.
W końcu oznacza to, że Twój projekt będzie nieprzewidywalny i potencjalnie całkowicie zmienny, nawet przy niewielkiej zmianie projektu. Będziesz musiał przejrzeć cały raport czasowy za każdym razem, gdy cokolwiek zmienisz, aby upewnić się, że nadal będzie działał. Z drugiej strony, jeśli projekt jest zsynchronizowany, po prostu szukasz podania lub niepowodzenia na końcu miejsca i trasy (przy założeniu, że twoje ograniczenia są ustawione poprawnie, co wcale nie zajmuje dużo czasu).
W praktyce ludzie dążą do całkowicie zsynchronizowanych projektów, ale jeśli potrzebujesz po prostu buforować lub odwracać sygnał, nie musisz przechodzić przez flip-flop, o ile odpowiednio go ograniczasz.
Mam nadzieję, że to trochę wyjaśni.
źródło
„Czy można zbudować złożoną logikę i sprawić, by rzeczy przebiegały przez nią tak szybko, jak to możliwe?” Tak. Zbudowano całe procesory, które są całkowicie asynchroniczne - przynajmniej jeden z nich był najszybszym procesorem na świecie. http://en.wikipedia.org/wiki/Asynchronous_circuit#Asynchronous_CPU
Denerwuje mnie, że ludzie odrzucają techniki projektowania asynchronicznego, chociaż teoretycznie mają kilka zalet w stosunku do technik projektowania synchronicznego, tylko dlatego, że (jak powiedzieli inni tutaj) projekty asynchroniczne nie są tak dobrze obsługiwane przez dostępne narzędzia.
Dla mnie to jak zalecenie, aby wszystkie mosty były wykonane z drewna, ponieważ więcej osób ma narzędzia do obróbki drewna niż narzędzia do obróbki stali.
Na szczęście niektóre zalety projektowania asynchronicznego można uzyskać, stosując nadal głównie techniki projektowania synchronicznego, stosując globalny projekt asynchronicznej synchronizacji lokalnej (GALS) .
źródło
Jednym z niewymienionych jeszcze czynników jest metastabilność. Jeżeli obwód zatrzaskowy zostanie uderzony sekwencją wejścia / przejścia, tak że stan wynikowy będzie zależał od opóźnień propagacji lub innych nieprzewidzianych czynników, nie ma gwarancji, że stan wynikowy będzie czysty „wysoki” lub „niski”. Rozważmy na przykład przerzutnik uruchamiany zboczem, który obecnie generuje „niski”, a jego wejście zmienia się z niskiego na wysoki prawie w tym samym czasie, gdy pojawia się zbocze zegara. Jeśli krawędź zegara wydarzy się wystarczająco długo przed zmianą wejścia, wyjście po prostu pozostanie niskie do następnej krawędzi zegara. Jeśli krawędź zegara wydarzy się wystarczająco długo po zmianie wejścia, wyjście szybko przełączy się raz z niskiej na wysoką i pozostanie tam do następnej krawędzi zegara. Jeśli żaden z tych warunków nie ma zastosowania,. Może pozostać na niskim poziomie lub szybko przełączyć raz i pozostać na wysokim poziomie, ale może pozostać na niskim poziomie przez pewien czas, a następnie przełączyć się lub przełączyć, a następnie jakiś czas później przełączyć się z powrotem lub kilka razy w przód iw tył itp.
Jeśli konstrukcja jest w pełni zsynchronizowana, a wszystkie wejścia są podwójnie zsynchronizowane, jest bardzo mało prawdopodobne, aby impuls taktowania uderzył w pierwszą zatrzask synchronizatora w taki sposób, że spowodowałby przełączenie w idealnym momencie w celu pomylenia drugiego zatrzask. Ogólnie rzecz biorąc, takie rzeczy można uznać za „po prostu się nie wydarzy”. Jednak w przypadku projektowania asynchronicznego często znacznie trudniej jest uzasadnić takie rzeczy. Jeśli zostanie naruszone ograniczenie czasowe w obwodzie zatrzaskowym (nie tylko klapki, ale dowolna kombinacja logiki, która działałaby jak zatrzask), nie wiadomo, co zrobi wyjście, dopóki następnym razem nie będzie prawidłowego warunku wejściowego, który wymusi zatrzask do znanego stanu. Jest całkowicie możliwe, że opóźnione wyjścia spowodują naruszenie ograniczeń czasowych wejściowych danych wyjściowych, co prowadzi do nieoczekiwanych sytuacji,
Najbezpieczniejszym sposobem na modelowanie obwodu asynchronicznego byłoby, aby prawie każdy obwód wyjściowy wytwarzał wyjście „X” przez chwilę, gdy przełącza się między „0” a „1”. Niestety takie podejście często powoduje, że prawie wszystkie węzły pokazują „X”, nawet w przypadkach, które w rzeczywistości prawie na pewno doprowadziłyby do stabilnego zachowania. Jeśli system może działać, gdy symulowane jest, że wszystkie wyjścia stają się „X” natychmiast po zmianie danych wejściowych i pozostają „X”, dopóki sygnały wejściowe nie będą stabilne, to dobry znak, że obwód będzie działał, ale doprowadzi obwody asynchroniczne do pracy z takimi ograniczeniami jest często trudne.
źródło
Oczywiście, jeśli twoje wymagania projektowe są na tyle powolne, że wiele wewnętrznych opóźnień wciąż jest o rząd wielkości dłuższych niż czasy, na których ci zależy, to nie jest to problem, i możesz spojrzeć na raport czasowy, aby mieć to na uwadze, ale istnieje ograniczenie tego, co możesz zrobić bez informacji o stanie wewnętrznym. Jeśli chcesz zrobić coś w rodzaju multipleksera 100 wejściowego, to dobrze, pamiętaj tylko, że każde wejście będzie miało inne opóźnienie propagacji. W rzeczywistości możesz uzyskać ciekawe i chaotyczne efekty z dużą liczbą nieprzewidywalnych opóźnień oscylujących pętli sprzężenia zwrotnego - być może w pełni asynchroniczny syntezator oparty na FPGA może być następnym „analogiem”.
źródło
Tak, możesz. Możesz całkowicie zignorować klapki i zbudować je z LUT. I / lub możesz użyć elementów stanu większości układów FPGA Xilinx jako zatrzasków (wyzwalanych przez poziom) zamiast przerzutników (wyzwalanych przez krawędź).
źródło
X=(someComplexFormula)
iY=X & D
oraz jeśli kompilator podstawi tę formułę na X i stwierdzi, żeX & D
jest ona równoważnaA & D
, kompilator może zastąpić obliczenia Y pod względem A i D, a nie pod względem X, umożliwiając w ten sposób obliczenie Y postępować szybciej niż X. Takie podstawienia są ważne w logice kombinatorycznej, ale sieją spustoszenie w asynchronicznej logice sekwencyjnej.Jak zauważył @Andrey, nie warto poświęcać czasu. W szczególności narzędzia tego nie robią, więc byłbyś całkowicie sam. Ponadto, ponieważ mają one wbudowane rejestry, nie uratujesz niczego, nie używając ich.
źródło
Naprawdę istnieją TRZY rodzaje wzorów.
Ogólnie rzecz biorąc, podczas syntezy / optymalizacji logiki kombinatorycznej narzędzia przyjmą, że najważniejsze jest to, jaki jest ostateczny wynik i maksymalny czas potrzebny do osiągnięcia tego wyniku.
Możesz zbudować projekt, który będzie czysto kombinatoryczny i uzyska właściwy wynik. Wyjścia mogą się zmieniać w dowolnej kolejności i mogą zmieniać się kilka razy przed osiągnięciem ostatecznych wartości. Takie projekty są bardzo marnotrawstwem zasobów logicznych. Większość elementów logicznych spędza większość czasu bezczynnie, podczas gdy w systemie sekwencyjnym można było ponownie wykorzystać te elementy do przetwarzania wielu elementów danych.
W sekwencyjnym systemie synchronicznym liczy się tylko to, że wyjścia bloku kombinatorycznego ustabilizowały się do prawidłowego stanu, gdy są taktowane do następnego przerzutnika. Nie ma znaczenia, w jakiej kolejności się zmieniają, czy też są usterkami po drodze. Ponownie narzędzia mogą łatwo przekształcić to w logikę, która pod warunkiem, że zegar jest wystarczająco wolny, daje właściwą odpowiedź (i może powiedzieć, czy zegar, którego chcesz użyć, jest wystarczająco wolny).
W asynchronicznym systemie sekwencyjnym założenia te wychodzą z okna. Usterki mogą mieć znaczenie, kolejność zmian danych wyjściowych może mieć znaczenie. Zarówno narzędzia, jak i same układy FPGA zostały zaprojektowane do projektów synchronicznych. Odbyło się wiele dyskusji (Google asynchroniczny projekt FPGA, jeśli chcesz dowiedzieć się więcej) na temat możliwości implementacji systemów asynchrnalnych na standardowych FPGA lub specjalnie zaprojektowanych, ale wciąż nie jest to akceptowane przez główny nurt praktyki projektowej
źródło
Tak. Jeśli nie masz konstrukcji typu procesu, nie powinno to robić takich rzeczy jak wnioskowanie rejestrów. Będą takie rzeczy, jak pamięć wbudowana, która wymaga zegarów, chociaż jeśli naprawdę chcesz, prawdopodobnie możesz wygenerować je asynchronicznie.
źródło
FWIW Pomyślałem, że powinienem dodać, że jednym oczywistym celem w rozwiązaniach logiki asynchronicznej byłoby globalne zmniejszenie zużycia energii.
Te globalne zegary / PLL / bufory palą dużo dżuli.
Ponieważ rozwiązania FPGA wkraczają w areny zasilane bateryjnie (np. Lattice Icestick), ten aspekt zyska znacznie więcej uwagi.
źródło