Pamięci typu FIFO
O znaczeniu pamięci typu RAM nie trzeba nikogo przekonywać. Występuje ona powszechnie w każdym systemie mikroprocesorowym. Ale oprócz niej, w ofercie komponentów elektronicznych znajdziemy całą gamę innych rodzajów, między innymi pamięci FIFO. Do czego służą i jak ich używać?
Pamięci RAM
Pamięci o dostępie swobodnym typu RAM (ang. Random-Access Memory) są podstawowym typem pamięci występujących w systemach mikroprocesorowych/mikrokontrolerowych. Do przechowywania informacji są wykorzystywane różne rozwiązania technologiczne. W małych systemach mikroprocesorowych powszechnie stosuje się pamięci statyczne S-RAM (ang. Static Random-Access Memory), natomiast komputery (jak przykładowo PC) wcześniej bazowały na asynchronicznych pamięciach dynamicznych typu DRAM (ang. Dynamic Random-Access Memory), a obecnie na synchronicznych pamięciach dynamicznych SDRAM (ang. Synchronous Dynamic Random-Access Memory). Zaletą pamięci statycznych jest to, że mają prosty sposób obsługi, natomiast „wadą” – stosunkowo mała pojemność (do kilku megabitów w jednym układzie). Odmiennie sprawa przedstawia się w pamięciach dynamicznych. Osiągają one duże pojemności (rzędu gigabitów w jednym układzie), ale jest to okupione bardziej złożoną obsługą, wynikającą z ich „ulotności” (zapisane dane powoli zanikają, toteż niezbędne są cykle jej odświeżania). Tej wady nie mają pamięci statyczne, dane raz zapisane są przechowywane tak długo, jak długo pamięć ma zasilanie.
Cechą charakterystyczną wszelkich pamięci typu RAM jest to, że posiadają szynę danych, szynę adresową oraz sygnały sterujące pozwalające na określenie realizowanej operacji (zapis/odczyt). Po wystawieniu informacji na szynie adresowej i szynie danych można dane zapisać. Odczyt wymaga określenia adresu (szyna adresowa) i „zgarnięciu” zawartości zapisanej w pamięci z szyny danych.
Pamięci FIFO
Odmiennie wygląda budowa, obsługa i działanie pamięci typu FIFO (od ang. First In First Out – pierwsze weszło pierwsze wyszło). Przede wszystkim te pamięci nie mają szyny adresowej (a dokładniej – mają, lecz nie jest ona dostępna na pinach układu) i w gruncie rzeczy są pamięciami dwuportowymi (jest możliwy jednoczesny dostęp do komórek pamięci z dwóch niezależnych źródeł). Czasami w stosunku do tych układów stosuje się określenie: kolejki FIFO. To określenie chyba najwierniej odzwierciedla ich funkcję. Sam układ stanowi rodzaj bufora, kolejki przechowującej elementy zbudowanej na bazie pamięci typu RAM.
Działanie pamięci typu FIFO
Działanie tego typu komponentów wynika z ich budowy. Jak wcześniej wspomniałem, układy te nie mają jawnej szyny adresowej, jednak musi być jakiś mechanizm pozwalający na identyfikację komórki, w stosunku do której realizowana jest operacja. Jej działanie najlepiej jest wyjaśnić przez analogię do rozwiązań stosowanych w oprogramowaniu mikroprocesorów/komputerów. Stosowane jest tam coś, co oprócz określenia kolejka FIFO, nazywane jest buforem cyklicznym. Wyobraźmy sobie strukturę danych opisanych następująco (język C, listing 1):
W „piśmie rysunkowym” powyższą strukturę pokazuje rysunek 1. Mamy (w tym przykładzie) czteroelementowy obszar buforowy oraz wskaźnik zapisu i odczytu (pełniące rolę indeksową do obszaru buforowego). Zapis danych do kolejki sprowadza się do wpisu danych do obszaru buforowego w miejscu wskazanym przez indeks zapisu oraz zwiększenia jego o jeden (by zawsze wskazywał wolne miejsce do zapisu).
Odczyt danych z kolejki FIFO sprowadza się do pobrania danych z obszaru buforowego z miejsca wskazanego przez indeks odczytu oraz zwiększenia tego wskaźnika o jeden (by zawsze wskazywał miejsce do odczytu). Oczywiście po pewnym czasie ciągle zwiększając odpowiedni wskaźnik „wyjdzie on poza obszar buforowy”, więc w takiej chwili należy go „zawrócić” na pozycję pierwszą (co w przypadku języka programowania C oznacza, że należy wskaźnik wyzerować, gdyż tablice zawsze są indeksowane od zera). Kolejka FIFO jest pusta (nie zawiera żadnych danych do odczytu) jeżeli oba wskaźniki mają tą samą wartość (wskazują na te same położenie w obszarze buforowym). Podobnie można określić, że kolejka jest pełna, jeżeli następnikiem wskaźnika zapisu będzie wskaźnik odczytu (rysunek 2).
Operacja pobrania elementu może być dokonana pod warunkiem, że w kolejce znajduje się minimum jeden element, czyli że kolejka nie jest pusta. Sprawdzenie, czy jest ona pusta polega na porównaniu obu wskaźników (odczytu oraz zapisu). Jeżeli oba wskaźniki pokazują to samo miejsce (mają identyczną zawartość) to kolejka jest pusta. W przeciwnym wypadku zawiera ona elementy. Jednocześnie z tego wynika sposób wstępnego zainicjowania całej struktury.
(…)
——– ciach! ——–
To jest tylko fragment artykułu, którego pełna wersja ukazała się w numerze marcowym czasopisma Zrozumieć Elektronikę (ZE 3/2024). Pełną wersję czasopisma znajdziesz pod tym linkiem. Natomiast niepełna, okrojona wersja, pozwalająca zapoznać się z zawartością numeru ZE 3/2024 znajduje się tutaj.
Andrzej Pawluczuk
apawluczuk@vp.pl
Uwaga! Osoby, które nie są (jeszcze) stałymi Patronami ZE, mogą nabyć PDF-y z pełną wersję tego numeru oraz wszystkich innych numerów czasopisma wydanych od stycznia 2023, „stawiając kawę” (10 złotych za jeden numer czasopisma w postaci pliku PDF).
W tym celu należy kliknąć link (https://buycoffee.to/piotr-gorecki), lub poniższy obrazek
Następnie wybrać:
– jeśli jeden numer ZE – 10 zł,
– jeśli kilka numerów ZE – WSPIERAM ZA. I tu wpisać kwotę zależną od liczby zamawianych numerów – wydań (N x 10 zł),
Wpisać imię nazwisko.
Podać adres e-mail.
Koniecznie zaznaczyć: „Chcę dołączyć wiadomość dla Twórcy” i tu wpisać, który numer lub numery mamy wysłać na podany adres e-mailowy.