.. _w04-clock: ========================== WykĹad 4: SygnaĹy zegarowe ========================== Data: 24.10.2018 .. toctree:: .. contents:: Generatory sygnaĹĂłw zegarowych ============================== Istnieje wiele sposobĂłw na wygenerowanie sygnaĹu zegarowego. WspomnÄ tutaj o trzech: - oscylator pierĹcieniowy (ring oscillator) - oscylator LC - oscylator kwarcowy Naprostszym typem oscylatora jest oscylator pierĹcieniowy -- jest to po prostu nieparzysta liczba bramek logicznych NOT poĹÄ czona w pierĹcieĹ. Jego czÄstotliwoĹÄ to 1 / (suma opóźnieĹ bramek i poĹÄ czeĹ miÄdzy nimi). Jest to bardzo niedokĹadny oscylator (rzÄdu Âą30%) i nie powinien byÄ stosowany w jakiejkolwiek sytuacji wymagajÄ cej konkretnej czÄstotliwoĹci pracy, ale bywa uĹźywany gdy potrzebny jest po prostu *jakiĹ* zegar. PrzykĹadem oscylatora pierĹcieniowego jest wewnÄtrzny zegar konfiguracyjny ukĹadu FPGA (jeĹli zostaĹ wybrany tryb konfiguracji w ktĂłrym to FPGA generuje sygnaĹ zegarowy). .. warning:: Nie naleĹźy prĂłbowaÄ tworzyÄ wĹasnego oscylatora pierĹcieniowego uĹźywajÄ c programowalnej logiki -- nie mamy wystarczajÄ cej kontroli nad uĹoĹźeniem i poĹÄ czeniem ukĹadu, by sensownie kontrolowaÄ czÄstotliwoĹÄ. TrochÄ bardziej skomplikowanym (bo wymagajÄ cym zewnÄtrznych komponentĂłw) generatorem jest generator LC, w ktĂłrym uĹźywamy rezonansu ukĹadu zĹóşonego z kondensatora i cewki do wygenerowania zegara. CzÄstotliwoĹciÄ takiego zegara jest ``1/(tau * sqrt(L*C))``. Takim zegarem jest na przykĹad ``MCLK`` na naszej pĹytce. WciÄ Ĺź, jest to zegar nieco niedokĹadny (ma wahania rzÄdu Âą1%) -- moĹźna to Ĺatwo zobaczyÄ, prĂłbujÄ c uĹźyÄ go do generowania sygnaĹu VGA i podĹÄ czajÄ c monitor... Do generowania sensownie dokĹadnych (Âą0.001%) zegarĂłw w elektronice uĹźywa siÄ oscylatorĂłw kwarcowych, ktĂłre uĹźywajÄ wibracji krysztaĹu kwarcowego do generowania sygnaĹu zegarowego. DziÄki elektronicznym ukĹadom przeksztaĹcajÄ cym sygnaĹy zegarowe (PLL), wystarcza jeden krysztaĹ (zazwyczaj o czÄstotliwoĹci rzÄdu 10MHz) do wygenerowania dowolnej liczby sygnaĹĂłw zegarowych o dowolnych wartoĹciach. Dystrybucja i przeĹÄ czanie sygnaĹĂłw zegarowych ============================================== W ukĹadach cyfrowych bardzo poĹźÄ dane jest, by zbocza sygnaĹu zegarowego dochodziĹy jednoczeĹnie do wszystkich przerzutnikĂłw, ktĂłrymi sterujÄ . Róşnica w czasie przyjĹcia zbocza do róşnych miejsc nazywa siÄ clock skew i powoduje szereg problemĂłw: - jeĹli suma clock skew i czasu hold jest wiÄksza niĹź czas propagacji miÄdzy wyjĹciem jednego przerzutnika a wejĹciem drugiego, mamy naruszenie czasu hold - clock skew efektywnie dodaje siÄ do wielu czasĂłw propagacji, zmniejszajÄ c maksymalnÄ moĹźliwÄ czÄstotliwoĹÄ zegara Aby zminimalizowaÄ clock skew, w ukĹadach FPGA istniejÄ specjalne sieci dystrybucji sygnaĹĂłw zegarowych, zaprojektowane tak, by dĹugoĹÄ ĹcieĹźki od ĹşrĂłdĹa sygnaĹu do przerzutnikĂłw byĹa mniej-wiÄcej staĹa. W ukĹadach Spartan 3E mamy 32 bufory globalne, bÄdÄ ce ĹşrĂłdĹami takich sieci. NarzÄdzia do syntezy same wywnioskujÄ , ktĂłre z naszych sygnaĹĂłw powinny uĹźywaÄ buforĂłw globalnych, ale jeĹli chcemy, moĹźemy poprosiÄ o to jawnie:: // clk_in jest ĹşrĂłdĹem sygnaĹu zegarowego, clk_out uĹźywamy w przerzutnikach. BUFG moj_bufor_globalny(.I(clk_in), .O(clk_out)); PrzeĹÄ czanie sygnaĹĂłw zegarowych -------------------------------- MoĹźe siÄ zdarzyÄ, Ĺźe bÄdziemy projektowaÄ ukĹad, ktĂłrego czÄstotliwoĹÄ powinna siÄ zmieniaÄ w czasie dziaĹania (tryb turbo, interfejsy sprzÄtowe majÄ ce wolne/szybkie wersje, róşne rozdzielczoĹci VGA, itp). Bufory globalne pozwalajÄ nam bezpiecznie przeĹÄ czyÄ siÄ miÄdzy dwoma sygnaĹami zegarowymi w trakcie pracy -- aby uĹźyÄ tej funkcjonalnoĹci, naleĹźy uĹźyÄ bloku ``BUFGMUX``:: // S wybiera, ktĂłry z sygnaĹĂłw zegarowych bÄdzie przesĹany na wyjĹcie. BUFGMUX moj_bufor_globalny(.I0(clk_in_a), .I1(clk_in_b), .S(ktory), .O(clk_out)); WejĹcie S powinno byÄ zsynchronizowane do zegara ``clk_out``, Ĺźeby uniknÄ Ä problemĂłw z metastabilnoĹciÄ . ``BUFGMUX`` zapewni bezpieczne przeĹÄ czenie miÄdzy zegarami -- po zmianie stanu ``S``, czeka aĹź stary zegar bÄdzie w stanie niskim, po czym utrzymuje stan niski na wyjĹciu aĹź do wystÄ pienia opadajÄ cego zbocza na nowym zegarze -- zapewnia to, Ĺźe okres zegara wyjĹciowego jest co najmniej tak dĹugi, jak krĂłtszy z okresĂłw wejĹciowych. WyĹÄ czanie sygnaĹĂłw zegarowych ------------------------------ CzÄsto przydaje siÄ moĹźliwoĹÄ tymczasowego wyĹÄ czenia danego sygnaĹu zegarowego (poniewaĹź dany ukĹad akurat powinien pracowaÄ tylko czÄĹÄ czasu, bÄ dĹş dla zaoszczÄdzenia prÄ du). Bufory globalne udostÄpniajÄ rĂłwnieĹź takÄ moĹźliwoĹÄ:: // BÄdzie przekazywaÄ na clk_out tylko te okresy clk_in, dla ktĂłrych enable == 1. // PozostaĹe okresy bÄdÄ miaĹy stan niski przez caĹy czas trwania. BUFGCE moj_bufor_globalny(.I(clk_in), .O(clk_out), .CE(enable)); Jest to rĂłwnowaĹźne ``BUFGMUX``, w ktĂłrym jeden z sygnaĹĂłw wejĹciowych jest zatrzymany i rĂłwny 0. DLL -- niwelacja opóźnienia sygnaĹĂłw zegarowych =============================================== [XXX] PLL -- zmiana czÄstotliwoĹci sygnaĹĂłw zegarowych ================================================ [XXX] Komunikacja miÄdzy domenami zegarowymi ====================================== MajÄ c w ukĹadzie synchronicznym wiele domen zegarowych napotykamy na problem przekazywania danych miÄdzy nimi. Dla pojedynczego sygnaĹu (np. linii przerwania) wystarczy synchronizator, ale przekazanie wiÄkszej iloĹci danych wymaga bardziej skomplikowanych ukĹadĂłw. Kod Graya --------- ZaĹóşmy, Ĺźe chcemy przekazaÄ miÄdzy dwiema domenami jakÄ Ĺ liczbÄ, ktĂłra moĹźe zmieniÄ siÄ co najwyĹźej o 1 (w gĂłrÄ bÄ dĹş w dĂłĹ) w kolejnych cyklach zegara. Przekazanie jej bezpoĹrednio przez tablicÄ synchronizatorĂłw nie zadziaĹa -- przy zmianie, zmiany róşnych bitĂłw mogÄ dojĹc w róşnych cyklach do nowej domeny zegarowej. Istnieje jednak kodowanie liczb, ktĂłre rozwiÄ zuje ten problem -- zapewnia, Ĺźe kaĹźde kolejne liczby sÄ kodowane do wektorĂłw bitowych róşniÄ cych siÄ w dokĹadnie jednej pozycji. Jest to kod Graya. Dla przykĹadu, kod 4-bitowy: - 0: 0000 - 1: 0001 - 2: 0011 - 3: 0010 - 4: 0110 - 5: 0111 - 6: 0101 - 7: 0100 - 8: 1100 - 9: 1101 - 10: 1111 - 11: 1110 - 12: 1010 - 13: 1011 - 14: 1001 - 15: 1000 Aby zakodowaÄ liczbÄ ``x`` do kodu graya, wystarczy policzyÄ ``x ^ (x >> 1)``. Dekodowanie jest trochÄ bardziej skomplikowane, ale doĹc efektywnie realizowalne w sprzÄcie. FIFO ---- Do przekazania duĹźej iloĹci danych miÄdzy domenami zegarowymi najczÄĹciej uĹźywa siÄ kolejek FIFO zrealizowanych za pomocÄ blokĂłw RAMu uĹźywanych jako buforĂłw cyklicznych: - jeden port dziaĹa tylko w trybie zapisu w domenie ĹşrĂłdĹowej - drugi port dziaĹa tylko w trybie odczytu w domenie docelowej - wskaĹşniki odczytu i zapisu sÄ przekazywane miÄdzy domenami zegarowymi w kodzie Graya MetastabilnoĹÄ ============== Niestety, w prawdziwym Ĺwiecie nie istniejÄ ukĹady w peĹni cyfrowe -- kaĹźdy ukĹad jest tak naprawdÄ ukĹadem analogowym i moĹźna wprowadziÄ go w stany poĹrednie (gdzieĹ pomiÄdzy 0 i 1). ZapisujÄ c taki stan (szczegĂłlnie stan bliski 0.5) do zatrzasku lub przerzutnika, moĹźemy go wprowadziÄ w stan rĂłwnowagi niestabilnej -- dowolne zaburzenie spowoduje, Ĺźe spadnie w stan 0 lub stan 1, lecz moĹźe to zajÄ Ä duĹźo wiÄcej czasu niĹź normalny parametr T_CKO. Takie zjawisko nazywa siÄ metastabilnoĹciÄ . MetastabilnoĹÄ jest zjawiskiem niebezpiecznym, gdyĹź dany stan moĹźe byÄ róşnie zinterpretowany przez podĹÄ czone wejĹcia róşnych bramek logicznych, powodujÄ c w naszym ukĹadzie synchronicznym przejĹcia niespĂłjne zarĂłwno ze stanem logicznym 0 jak i stanem logicznym 1. ByĹoby bardzo niedobrze, gdyby np. róşne czÄĹci skĹadowe procesora nie zgadzaĹy siÄ na temat tego, czy w danym cyklu procesor rozpoczyna obsĹugÄ przerwania. MetastabilnoĹÄ moĹźe powstaÄ na dwa sposoby: 1. Dajemy ukĹadowi synchronicznemu stan poĹredni jako wejĹcie (naleĹźy tego nie robiÄ). 2. Nie przestrzegamy czasu setup bÄ dĹş czasu hold. MetastabilnoĹÄ jest zjawiskiem nieuniknionym, gdy dany ukĹad synchroniczny ma wejĹcia asynchroniczne (a praktycznie kaĹźdy ma) -- prÄdzej czy później, wejĹcie zmieni siÄ odpowiednio blisko zbocza sygnaĹu zegarowego, powodujÄ c naruszenie czasu setup bÄ dĹş hold. Musimy wiÄc sobie jakoĹ z tym poradziÄ. Z drugiej strony, stany metastabilne trwajÄ bardzo krĂłtko -- praktycznie zawsze rozwiÄ zujÄ siÄ w ciÄ gu jednego, ewentualnie dwĂłch cykli zegara. Z tego powodu, na sygnaĹach asynchronicznych uĹźywa siÄ tzw. synchronizatorĂłw -- ĹaĹcuchĂłw dwĂłch lub trzech przerzutnikĂłw:: wire async_in; reg tmp1, tmp2; reg out; always @(posedge clk) tmp1 <= async_in; tmp2 <= tmp1; out <= tmp2; end JeĹli przerzutnik ``tmp1 <= async_in`` zĹapie wejĹcie w momencie zmiany stanu i wejdzie w stan metastabilny, z bardzo duĹźym prawdopodobieĹstwem stan ten rozpadnie siÄ do stanu 0 bÄ dĹş 1 zanim jego wyjĹcie zostanie uĹźyte przez kolejny przerzutnik (ma na to caĹy cykl zegara). JeĹli nawet to siÄ nie uda, na przerzutniku ``tmp2 <= tmp1`` mamy kolejnÄ szansÄ. Na wyjĹciu ``out`` z bardzo duĹźym prawdopodobieĹstwem dostajemy juĹź czyste wyjĹcie bez metastabilnoĹci. Zapobieganie metastabilnoĹci ma charakter probabilistyczny, a odpornoĹÄ ukĹadu na metastabilnoĹÄ podaje siÄ jako MTBF (mean time between failures) -- szacowany Ĺredni czas bezawaryjnej pracy. JeĹli osiÄ gniemy MTBF rzÄdu setek tysiÄcy lat, moĹźemy go uwaĹźaÄ za odporny na metastabilnoĹÄ. MTBF zaleĹźy od: - CzÄstotliwoĹci zegara. WiÄksza czÄstotliwoĹÄ to: - wiÄcej szans, Ĺźe coĹ pĂłjdzie nie tak - krĂłtszy okres czasu w synchronizatorze na rozpad stanu metastabilnego - Technologii wykonania (nowsze ukĹady FPGA majÄ dedykowane bloki synchronizacyjne z przerzutnikami wykonanymi w specjalnej technologii zoptymalizowanej na zapobieganie metastabilnoĹci) - Liczby przerzutnikĂłw w synchronizatorze (MTBF roĹnie wykĹadniczo z liczbÄ przerzutnikĂłw). Dwa przerzutniki to absolutne minimum, dla bezpieczeĹstwa zaleca siÄ trzy. SynchronizatorĂłw naleĹźy uĹźywaÄ *zawsze* na asynchronicznych wejĹciach. W przypadku wejĹÄ z ukĹadĂłw synchronicznych pracujÄ cych z innÄ czÄstotliwoĹciÄ zegara, naleĹźy zapewniÄ jeszcze jeden przerzutnik na poczÄ tku, uĹźywajÄ cy sygnaĹu zegarowego ukĹadu ĹşrĂłdĹowego -- zapobiega to wydostawaniu siÄ stanĂłw poĹrednich z logiki kombinacyjnej. Jedyny przypadek, w ktĂłrym wolno pominÄ Ä synchronizator na wejĹciu to wejĹcie z innego ukĹadu synchronicznego pracujÄ cego na ĹciĹle zwiÄ zanym sygnale zegarowym (np. naszym sygnale zegarowym podzielonym bÄ dĹş pomnoĹźonym przez staĹÄ przez ukĹad generowania zegara) -- w tym wypadku naleĹźy dobrze opisaÄ wzajemnÄ relacjÄ tych zegarĂłw, by narzÄdzia analizy czasowej mogĹy sprawdziÄ zachowanie czasĂłw setup i hold. Zjawisko metastabilnoĹci wystÄpuje zawsze, gdy dwie konfliktujÄ ce zmiany stanĂłw mogÄ siÄ zdarzyÄ blisko siebie -- w szczegĂłlnoĹci moĹźe teĹź dotyczyÄ asynchronicznych sygnaĹĂłw reset, bÄ dĹş wejĹcia do zatrzasku (gdy zmienia siÄ jednoczeĹnie ze zmianÄ 1 na 0 na wejĹciu E).