|
Chciałbym zapytać Szanowanych Kolegów Forumowiczów o sposób rozwiązania lub podanie ewentualnej koncepcji na buforowanie dowolnego kolorowego wyświetlacza LCD TFT (w moim wypadku 7" 800x480). Potrzebuję dynamicznie tworzyć złożone obiekty składające się na obraz (tą kwestie mam już rozwiązaną), jednak cykliczne przerysowywanie obrazu powoduje niesamowite mruganie. Chciałbym uzyskać częstotliwość odświeżania rzędu 10Hz, co przy ciągłym zamalowywaniu obrazu na biało i późniejszym dodawaniu obiektów wymaga ogromnych częstotliwości taktowania procesora: Przy transmisji równoległej 16-bitowej (głębia kolorów wyświetlacza) to blisko 3840000pps.
Niezbędne w takim razie staje się buforowanie. Dla przechowania jednej ramki obrazu potrzeba aż 0,5 MB pamięci. Zdecydowałem się więc na szybką pamięć zewnętrzną SRAM z interfejsem równoległym z 16-bitową linią danych. Używam układów Xmega, a więc jest tam sprzętowa obsługa pamięci zewnętrznej (EBI). Tyle tylko, że po zapisaniu tej pamięci potrzebuję przepisać jej zawartość do pamięci wyświetlacza (bezpośrednio na ekran) i tutaj właśnie zaczynają się schody. Mianowicie chcąc dokonać takiego przepisania musiałbym angażować rdzeń procesora w cały proces (DMA odpada ponieważ wymagane są odpowiednie zbocza na dodatkowej linii sygnałowej). W efekcie nie dość że uC musi generować ten obraz (uC->SRAM) to później musi go jeszcze "przerzucić" do wyświetlacza (SRAM->uC->LCD).
Wymyśliłem sobie w związku z tym taki sposób: uC komunikuje się z CPLD/FPGA, który emuluje pamięć zewnętrzną, a do którego podpięty jest SRAM i LCD. Dodatkową linią procesora wybierałbym czy chce pisać do pamięci, czy też przerysować wyświetlacz zawartością pamięci. Dodatkowy sygnał zapisu piksela do wyświetlacza realizowałbym w dość niecodzienny sposób, generując przez FPGA dowolne zbocze, które podawałbym na filtr górnoprzepustowy, a wygenerowaną "szpilkę" formowałbym poprzez szeregową diodę i bramkę Schmitta. Wydaje mi się, że w ten sposób uniezależniam się od ograniczeń zegara dla układu FPGA.
Wiem że ten sposób jest dość zawiły i przyznam iż wolałbym użyć samego uC i DMA, ale wydaje mi się to niemożliwe. Proszę o sugestie i porady jak można to zrobić prościej.
|