Celem projektu było zbudowanie odtwarzacza MP3/WAV, używając jedynie układu FPGA, pamięci RAM i przetwornika stereo DAC. Układ wykorzystuje 32-bitowe jądro procesora programowego pracujące przy taktowaniu poniżej 60MHz, które odpowiada za dekodowanie MP3 bez wsparcia sprzętowego - poza wykorzystaniem jednocyklowych operacji na mnożniku.
Część sprzętowa:
Układ składa się z układu Xilinx Spartan 6 wraz z elementami pomocniczymi (2 regulatory napięcia i pamięć SPI-PROM), ansynchronicznej pamięci SRAM 512 KB, 24-bitowego przetwornika stereo DAC i gniazda kart MicroSD.
Dodatkowe elementy mogą być przyłączane do złącza "UEXT". Układ FPGA może obsługiwać magistralę UART, SPI oraz uniwersalne porty we/wy przez wzmiankowane złącze. Może być ono użyte do podłączenia w przyszłości płytki do kontroli odtwarzacza, wyposażonej w wyświetlacz, przyciski i odbiornik IR. Celem było również jak najszersze zaimplementowanie różnych funkcjonalności w układ FPGA.
W układzie FPGA zaimplementowano następujące bloki:
"MPX" to 32-bitowy procesor programowy, opisany językiem VHDL - i obecnie także w Verilogu. Jest to procesor strumieniowy o architekturze RISC wykorzystujący cechy architektury MIPS, poza opatentowanymi instrukcjami zapisu i przechowywania, a także sprzętowym mnożnikiem i dzielnikiem (instrukcje mult, multu, div i divu). Dzięki nieuwzględnieniu tych instrukcji jądro procesora jest mniejsze, a strumieniowanie uproszczone. Mnożenie i dzielenie realizowane jest za pomocą bibliotek języka C (instrukcje mulsi3, divsi3 itp.) Kompilator GCC został zmodyfikowany, aby zablokować obsługę wyżej wymienionych instrukcji oraz dostęp do nieprzypisanej pamięci. Osobny, jednocyklowy mnożnik jest osobnym blokiem służącym do mapowania pamięci, co zapewnia szybkie operacje mnożenia wymagane przez algorytm dekodujący MP3.
Na płytce urządzenia zamontowano rezonator 8,192MHz, który taktuje bezpośrednio przetwornik DAC i którego częstotliwość mnożona jest w bloku DCM układu FPGA do wartości 57,34MHz - taką częstotliwością taktowane są pozostałe bloki układu. Wykorzystanie takiego rezonatora powoduje jednak o 3% wolniejsze odtwarzanie nagrań o próbkowaniu 44,1KHz. Nie jest to jednak wyraźnie zauważalny efekt.
Rdzeń MPX:
32-bitowy procesor programowy nosi nazwę MPX. Procesor może wykonać każdą instrukcję w jednym cyklu zegarowym, poza instrukcjami dostępu do pamięci, których wykonanie zajmuje 2 cykle. Obsługuje on również opóźnienie ładowania instrukcji oraz szczelinę opóźnienia rozkazu. Przy wykonywaniu instrukcji jednocyklowych z wewnętrznej pamięci, procesor może osiągnąć wydajność 65,57 DMIPS (test Dhrystone 1.1) przy 57 MHz. Procesor zaimplementowano wraz z 4-stopniowym potokowaniem. Ponieważ w architekturze wykorzystano szczelinę opóźnienia rozkazu, możliwe jest także zaplanowane opóźnianie instrukcji, bez konieczności unieważniania jej. MPX jest oparty na potokowej architekturze von Neumanna (współdzielona szyna danych i instrukcji) z obsługą zewnętrznej pamięci RAM (pamięci jednoportowej) lub innych pamięci.
Zaletą byłaby możliwość wykorzystania architektury harwardzkiej i współbieżnego dostępu do pamięci (np. zewnętrznej ansynchronicznej pamięci SRAM) oraz do innych peryferiów (np. wykonywanie instrukcji z zewnętrznej pamięci i jednoczesny dostęp do pamięci wewnętrznej).
Ze względu na wykorzystywanie architektury von Neumanna, instrukcje dostępu do pamięci wymagają zapisania pustej (bubble) instrukcji do potoku. Przerwania są także źródłem pustych instrukcji w potoku. Inne konflikty danych w potoku są rozwiązywane z wykorzystaniem forwardingu. Zatrzymanie pamięci instrukcji czy danych (lub nieznalezienie danych w buforze) skutkuje wstrzymywaniem kolejki. Wykorzystana implementacja MPX nie używa pamięci podręcznej, pamięć wewnętrzna może zostać lepiej wykorzystana jako pamięć audio FIFO albo bufor DMA dla karty SD. Algorytm dekodowania MP3 także został zoptymalizowany, więc zastosowanie pamięci podręcznej nie poprawiłoby jego działania.
Oprogramowanie:
Urządzenie umożliwia odtwarzanie plików MP3 i WAV. Odtwarzanie plików MP3 o przepływności 320 Kbps i nieskompresowanych plików WAV przebiega bez zakłóceń. Pliki MP3 o przepływności 320 Kbps (stereo) zużywają 96% czasu procesora, pozostały czas poświęcany jest na dekodowanie. Dane umieszczane są w kolejce bufora audio, aby mogły zostać zapisane w pamięci FIFO (2Kb) przez sterownik I2S. Dla porównania, plik MP3 o przepływności 64 Kbps (mono) angażuje 55% czasu procesora. Pliki WAV nie podlegają dekodowaniu, dane są ładowane od razu do pamięci FIFO, która oczekuje zapisu 16-bitowego formatu PCM stereo. Dekodowanie MP3 możliwe jest dzięki otwartej bibliotece dekodera MP3 Helix. Dodatkowe biblioteki w języku C pozwalają na dekodowanie plików MP3 zgodnie ze standardem MPEG, biblioteki wykorzystują obliczenia stałoprzecinkowe zoptymalizowane pod procesory ARM. System mikroprocesorowy jest na tyle szybki, że nie było konieczne przepisywanie jakiejkolwiek instrukcji w assemblerze.
Urządzenie wykorzystuje mnożnik potokowy 32x32 stworzony za pomocą modułu Coregen oprogramowania ISE. Mnożnik dostarcza 64-bitowego wyniku w jednym cyklu zegara, wykorzystując bloki DSP48 układu Spartan 6. Mnożnik umożliwia odtwarzanie plików MP3 o dużej przepływności w czasie rzeczywistym, ze względu na dużą liczbę obliczeń wykonywaną w czasie realizacji algorytmu dekodowania. W czasie symulacji odtwarzanie 1 sekundy pliku MP3 o przepływności 128 Kbps poskutkowało wykonaniem 290 304 operacji pomnóż-i-dodaj (MADD64) i 46 080 operacji pomnóż-i-przesuń (MULSHIFT32).
Odczyt plików z karty mikroSD z systemem FAT32/16 jest realizowany za pomocą opracowanej wcześniej przez autora biblioteki "FAT file I/O library". Dane z kary odczytywane są za pomocą SPI, a następnie ładowane z wykorzystaniem DMA do dwuportowej pamięci RAM. Po załadowaniu danych generowane jest przerwanie i oprogramowanie może przejść do czynności ważniejszych, niż odpytywanie o ukończenie przesyłania danych przez magistralę SPI. Blok dwuportowej pamięci RAM jest mapowany, więc procesor może dokonywać szybkiego dostępu i manipulacji danymi w niej zapisanymi.
RTOS został napisany głównie w języku C i jest przenośny, niewielka ilość instrukcji napisana jest również w assemblerze. Kod może zostać przeniesiony na procesory ARM ARM7TDMI, ARM Cortex M3, MSP430 i Atmel AVR. RTOS obsługuje wywłaszczanie. RTOS został zaimplementowany do obsługi w osobnych wątkach odczytu i dekodowania plików MP3 oraz odtwarzania dźwięku. Odtwarzanie dźwięku jest zadaniem o wysokim priorytecie, sterowanym przez przerwania z bloku pamięci audio FIFO. Dostęp do karty SD również wykorzystuje przerwania, nie ma więc konieczności odpytywania.
Na stronie źródłowej dostępny jest komplet plików projektu.
Fajne? Ranking DIY
