Autor Wątek: Procesor  (Przeczytany 7783 razy)

Offline Krzysiek K.

  • Redaktor
    • DevKK.net

# Kwiecień 16, 2006, 16:31:25
Cytuj
Właśnie nie, bo jeśli nie modyfikujesz obrazu to niby jak chcesz robić ? Dodać trzecią pamięć ? Pamięć 2 portowa to IMO najlepsze rozwiązanie.
Jeżeli nie modyfikujesz obrazu, to nie przełączasz pamięci, a jeżeli coś modyfikujesz, to odrysowujesz całą scenę od początku, jak to się zwykle robi w grafice 3D od zawsze. Najczęściej kamera się i tak przesunie, więc poprzednia klatka nie jest już do niczego potrzebna. :)

Cytuj
Jak się uprzesz to i BGA zlutujesz gorącym powietrzem :) Tylko, że to już są za drogie zabawki na takie eksperymenty. Trzeba by dać schemat i projekt do jakiegoś zakładu, żeby oni zrobili płytkę i ją maszyna zlutowała. Wtedy można już wsadzić ze 2 takie układy i połączyć je ze sobą.
W sumie zrobienie płytki to jeszcze większy problem, bo przy takich ilościach wyprowadzeń pewnie już bez płytki wielowarstwowej się nie obejdzie. :)

Cytuj
BTW: stosując pamięć ram 2-portową, można dać tylko 1 FPGA mocniejszy, a generację obrazu zrobić na jakimś tanim CPLD albo nawet na najtańszych wersjach Spartana :)
Stosując dwie osobne pamięci też można dać tylko 1 FPGA. :)

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

agent_J

  • Gość
# Kwiecień 16, 2006, 16:48:30
Cytuj
Właśnie nie, bo jeśli nie modyfikujesz obrazu to niby jak chcesz robić ? Dodać trzecią pamięć ? Pamięć 2 portowa to IMO najlepsze rozwiązanie.
Jeżeli nie modyfikujesz obrazu, to nie przełączasz pamięci, a jeżeli coś modyfikujesz, to odrysowujesz całą scenę od początku, jak to się zwykle robi w grafice 3D od zawsze. Najczęściej kamera się i tak przesunie, więc poprzednia klatka nie jest już do niczego potrzebna. :)

Cytuj
Jak się uprzesz to i BGA zlutujesz gorącym powietrzem :) Tylko, że to już są za drogie zabawki na takie eksperymenty. Trzeba by dać schemat i projekt do jakiegoś zakładu, żeby oni zrobili płytkę i ją maszyna zlutowała. Wtedy można już wsadzić ze 2 takie układy i połączyć je ze sobą.
W sumie zrobienie płytki to jeszcze większy problem, bo przy takich ilościach wyprowadzeń pewnie już bez płytki wielowarstwowej się nie obejdzie. :)

Cytuj
BTW: stosując pamięć ram 2-portową, można dać tylko 1 FPGA mocniejszy, a generację obrazu zrobić na jakimś tanim CPLD albo nawet na najtańszych wersjach Spartana :)
Stosując dwie osobne pamięci też można dać tylko 1 FPGA. :)

A co jeśli chcesz zmienić tylko kawałek obrazu ? Np. dorysować kółko ? Nie trzeba dawać 2 FPGA, można wszystko podłączyć oczywiście do jednego :) Płytka 4 warstwowa to nie taki wielki wydatek - jedyne 100zł pewnie by kosztowała za sztukę :)




Offline Krzysiek K.

  • Redaktor
    • DevKK.net

# Kwiecień 16, 2006, 17:09:22
Cytuj
A co jeśli chcesz zmienić tylko kawałek obrazu ?
To rysujesz wszystko od nowa, albo bawisz się w kopiowanie, ale to jest dosyć nietypowe zastosowanie akceleracji. Jak już pisałem, page flipping stosuje się w grafice już od dawien dawna i jakoś to nikomu nie przeszkadza. :)

Cytuj
Płytka 4 warstwowa to nie taki wielki wydatek - jedyne 100zł pewnie by kosztowała za sztukę
Zawsze to dodatkowe koszta przy i tak już sporej cenie podzespołów. Ciekawe tylko, czy dało by się na przykład użyć płytki wielowarstwowej jedynie do wyprowadzenia portów na zewnątrz i połączyć je z innymi płytkami kablami (krótka wersja takiego od IDE powinna się nadać). Ciekawe tylko, czy dało by to radę wtedy pracować z maksymalną częstotliwością taktowania. :)

agent_J

  • Gość
# Kwiecień 16, 2006, 17:20:45
Cytuj
A co jeśli chcesz zmienić tylko kawałek obrazu ?
To rysujesz wszystko od nowa, albo bawisz się w kopiowanie, ale to jest dosyć nietypowe zastosowanie akceleracji. Jak już pisałem, page flipping stosuje się w grafice już od dawien dawna i jakoś to nikomu nie przeszkadza. :)

Cytuj
Płytka 4 warstwowa to nie taki wielki wydatek - jedyne 100zł pewnie by kosztowała za sztukę
Zawsze to dodatkowe koszta przy i tak już sporej cenie podzespołów. Ciekawe tylko, czy dało by się na przykład użyć płytki wielowarstwowej jedynie do wyprowadzenia portów na zewnątrz i połączyć je z innymi płytkami kablami (krótka wersja takiego od IDE powinna się nadać). Ciekawe tylko, czy dało by to radę wtedy pracować z maksymalną częstotliwością taktowania. :)

Oczywiście, że tak można. Wystarczyło by wpakować na 4 warstwową najpotrzebniejsze rzeczy, i połączyć układ z 2 płytką kablem. Tylko nie wiem czy to dobre rozwiązanie dla sygnałów wysokiej częstotliwości.
Prędkość pracy układu zależy prawdopodobnie od maksymalnej długości ścieżki przepływu sygnałów.
Page flipping to nie do końca to samo w realizacji sprzętowej - przełącza się tylko adres początku danych.
Spróbóję się pobawić dziś wieczorem w realizację bardzo prostej karty graficznej - 640x480x3bpp, taktowanie układu 50MHz, sygnał video generowany z częstotliwością 25MHz. Z "drugiej strony" spróbuję zrobić rysowanie np. pojedynczych pixeli albo kwadratów. Do tego kontroler dla pamięci 1 - portowej z trasferem 32bitów na raz na jeden cykl dostępu - 20ns, z 10ns będzie ciężko.

BTW: spax przykleił ten topic jako wzorowy :)

Offline Krzysiek K.

  • Redaktor
    • DevKK.net

# Kwiecień 16, 2006, 18:03:02
Cytuj
Oczywiście, że tak można. Wystarczyło by wpakować na 4 warstwową najpotrzebniejsze rzeczy, i połączyć układ z 2 płytką kablem. Tylko nie wiem czy to dobre rozwiązanie dla sygnałów wysokiej częstotliwości.
Dlatego wspomniałem o kablach od IDE, ktore mają dodatkową masę, czy jakieś inne bajery - skoro działa to w przypadku dysków z rozsądną szybkością przy dosyć długich kablach, to przy krótkich powinno dać radę także w tym przypadku. :)

Cytuj
Prędkość pracy układu zależy prawdopodobnie od maksymalnej długości ścieżki przepływu sygnałów.
Nie bezpośrednio. Prędkość pracy zależy od szyblości rozprzestrzeniania się sygnału i jego charakterystyki (np. stromość zboczy i poziomy), co zależy od pojemności i impedancji w układzie, oraz zakłóceń, co zależy między innymi od długości kabli.

Cytuj
Page flipping to nie do końca to samo w realizacji sprzętowej - przełącza się tylko adres początku danych.
Page flipping sprowadza się do tego, że przełączasz strony. Czy będziesz zmieniał adresy początku danych, czy zamieniał ze sobą bloki pamięci, na to samo wyjdzie. :)

Cytuj
Z "drugiej strony" spróbuję zrobić rysowanie np. pojedynczych pixeli albo kwadratów. Do tego kontroler dla pamięci 1 - portowej z trasferem 32bitów na raz na jeden cykl dostępu - 20ns, z 10ns będzie ciężko.
Z ciekawszych i w miarę prostych pomysłów możesz zrobić to, co robił blitter na Amidze:
* blitowanie - kopiowanie prostokątnych bloków pamięci z operacjami logicznymi na nich. W ten sposób były robione obiekty w większości gier amigowych - najpierw AND ekranu z maską, a potem OR z kolorem obiektu. :)
* rysowanie linii - rola blittera w tym przypadku sprowadzała się do dodawania liczby do rejestru. Blitter dostawał bezpośrednio, skąd ma zacząć rysować, w w którym z 8 oktantów jest linia (bezpośrednio się to przekłada na sposób przesuwania pikseli), oraz ile pikseli musi narysować. :)

agent_J

  • Gość
# Kwiecień 16, 2006, 18:06:32
Dobra, zrobiłem już odpowiednie obliczenia dla 640x480x3bpp.

taktowanie FPGA: 50MHz
wysyłanie danych: 25MHz

Na wysłanie jednej linii potrzeba 25.6us, więc jest to 40ns na jeden piksel. Zakładając, że używamy 3bpp (inaczej się nie da, bo tak jest płytka zrobiona) - robimy 4bpp (MSB nie będzie używany). Za jednym razem mogę przesłać 32 bity (co 20ns). W 32 bitach się mieści 8 pikseli (2 piksele na bajt), co daje 7*40=280ns wolnego czasu między dostępem do RAMu.
Napiszę sobie do tego celu kolejkę FIFO, bo tak IMO będzie najłatwiej. Zaraz przed rozpoczęciem wysłania pierwszego piksela linii rozpocznie się wypełnanie kolejki FIFO - nie wiem jeszcze jaka będzie jej max. długość, ale pewnie 32 bity (odczyt 4 bit za jednym pobraniem pixela).
Idąc dalej - czytanie 8 piskeli na raz zwalnia RAM na 280ns czyli 14 wolnych cykli pracy dla rasterizera.
Muszę dokładnie jeszcze raz wszystko policzyć i rozpisać odpowiednie przebiegi - sygnałem zegarowym bramkowanym flagą zajętości prawdopodobnie można by było w ogóle taktować blok rasterizera.



agent_J

  • Gość
# Kwiecień 17, 2006, 18:25:50
Następny problem: 50MHz to za mało, żeby uzyskać czytanie z pamięci z dostępem 10ns i jednocześnie 640x480 - na jednoczesny dostęp nie wystarczy przepustowości - bo kontroler generacji obrazu zabierze większość przepustowości, a konwersja 2 bajtów na 4bpp wymagała by zastosowania FIFO, nie chce mi się tego pisać :)  . IMO najlepiej będzie.
Znalazłem amatorski projekt karty graficznej, to oni tam używają co najmniej 200MHz do taktowania samego układu oraz szyny pomiędzy pamięcią a kontrolerem pamięci.
W sumie zrobię tak jak mówiłeś, żeby przełączać się między pamięciami jeśli zakończone zostało rysowanie klatki w bloku niewidocznym :)

Offline Krzysiek K.

  • Redaktor
    • DevKK.net

# Kwiecień 17, 2006, 22:36:54
Cytuj
Następny problem: 50MHz to za mało, żeby uzyskać czytanie z pamięci z dostępem 10ns
Domyślam się, że 50MHz to ograniczenie płytki edukacyjnej?

Cytuj
konwersja 2 bajtów na 4bpp wymagała by zastosowania FIFO, nie chce mi się tego pisać
Typowy problem chyba większości programistów, ale jedynym rozwiązaniem jest się po prostu zabrać. Chociaż swoją drogą, potrzeba matką wynalazków, a lenistwo ojcem, więc jak się nie chce pisać, to można pomyśleć nad czyms lepszym. :)

Cytuj
Znalazłem amatorski projekt karty graficznej, to oni tam używają co najmniej 200MHz do taktowania samego układu oraz szyny pomiędzy pamięcią a kontrolerem pamięci.
Może jakiś link? :)

Cytuj
W sumie zrobię tak jak mówiłeś, żeby przełączać się między pamięciami jeśli zakończone zostało rysowanie klatki w bloku niewidocznym
Jak już mówiłem, rozwiązanie nie jest złe, bo przy okazji pozwala na uzyskanie 2x większej przepustowości. Z tego, co wiem, obecnie karty graficzne korzystają zazwyczaj z 4 zupełnie niezależnych bloków pamięci komunikując się z każdym z nich po 64-bitowej szynie danych (stąd wychodzi właśnie 256-bitowa transmisja). Oprócz zapewnienia większej przepustowości pozwala to na większą swobodę w adresowaniu. :)

agent_J

  • Gość
# Kwiecień 18, 2006, 01:33:17
Cytuj
Następny problem: 50MHz to za mało, żeby uzyskać czytanie z pamięci z dostępem 10ns
Domyślam się, że 50MHz to ograniczenie płytki edukacyjnej?

No właśnie to jest ograniczenie płytki :) 50MHz i 2 układy pamięci 10ns z wspólną szyną adresową 18bit, oddzielnymi szynami danych 16bit.

Cytuj
Cytuj
konwersja 2 bajtów na 4bpp wymagała by zastosowania FIFO, nie chce mi się tego pisać
Typowy problem chyba większości programistów, ale jedynym rozwiązaniem jest się po prostu zabrać. Chociaż swoją drogą, potrzeba matką wynalazków, a lenistwo ojcem, więc jak się nie chce pisać, to można pomyśleć nad czyms lepszym. :)

W kartach graficznych używa się kolejek FIFO, np. do podłączania szybszych układów do wolniejszych. Kolejkę FIFO mam już zaimplementowaną.

Cytuj
Cytuj
Znalazłem amatorski projekt karty graficznej, to oni tam używają co najmniej 200MHz do taktowania samego układu oraz szyny pomiędzy pamięcią a kontrolerem pamięci.
Może jakiś link? :)

Jest na http://www.opencores.org.
http://www.opencores.org/projects.cgi/web/vga_lcd/overview

Cytuj
Cytuj
W sumie zrobię tak jak mówiłeś, żeby przełączać się między pamięciami jeśli zakończone zostało rysowanie klatki w bloku niewidocznym
Jak już mówiłem, rozwiązanie nie jest złe, bo przy okazji pozwala na uzyskanie 2x większej przepustowości. Z tego, co wiem, obecnie karty graficzne korzystają zazwyczaj z 4 zupełnie niezależnych bloków pamięci komunikując się z każdym z nich po 64-bitowej szynie danych (stąd wychodzi właśnie 256-bitowa transmisja). Oprócz zapewnienia większej przepustowości pozwala to na większą swobodę w adresowaniu. :)

Teraz mam inny pomysł: można użyć pamięci jednoportowej, do której układ generujący obraz z RAMu będzie miał dostęp z większym priorytetem, a do dostępu z zewnątrz użyć transakcyjnego dostępu poprzez intefejs oparty na specyfikacji WISHBONE.

Offline Krzysiek K.

  • Redaktor
    • DevKK.net

# Kwiecień 18, 2006, 02:45:38
Cytuj
No właśnie to jest ograniczenie płytki :) 50MHz i 2 układy pamięci 10ns z wspólną szyną adresową 18bit, oddzielnymi szynami danych 16bit.
W takim razie widzę, że przed rozpoczęciem zabawy będę musiał pobawić się w projektowanie płytki. Zresztą, kiedy ja wogóle na to wszystko znajdę czas. :)

Cytuj
Teraz mam inny pomysł: można użyć pamięci jednoportowej, do której układ generujący obraz z RAMu będzie miał dostęp z większym priorytetem, a do dostępu z zewnątrz użyć transakcyjnego dostępu poprzez intefejs oparty na specyfikacji WISHBONE.
Brzmi to na dosyć zakręcone. :)

agent_J

  • Gość
# Kwiecień 18, 2006, 10:08:21
Cytuj
No właśnie to jest ograniczenie płytki :) 50MHz i 2 układy pamięci 10ns z wspólną szyną adresową 18bit, oddzielnymi szynami danych 16bit.
W takim razie widzę, że przed rozpoczęciem zabawy będę musiał pobawić się w projektowanie płytki. Zresztą, kiedy ja wogóle na to wszystko znajdę czas. :)

Jak chcesz to ci zeskanuję i wyślę schematy płytki i kabla JTAG. Z resztą, żeby robić taki projekt musiałbyś rzucić "normalne" programowanie, bo to zajmuje dużo czasu : zaprojektowanie płytki w Protelu to trochę zabawy :)

http://www.xilinx.com/xlnx/xebiz/designResources/ip_product_details.jsp?key=HW-SPAR3E-SK-US

Takie coś kosztuje 150$. Matoły dali to akurat po tym jak sobie kupiłem tę płytkę za 100$ :/

Cytuj
Cytuj
Teraz mam inny pomysł: można użyć pamięci jednoportowej, do której układ generujący obraz z RAMu będzie miał dostęp z większym priorytetem, a do dostępu z zewnątrz użyć transakcyjnego dostępu poprzez intefejs oparty na specyfikacji WISHBONE.
Brzmi to na dosyć zakręcone. :)

Hehehe :) WISHBONE to jakby standard Public Domain w łączeniu układów SoC (System on a Chip) - oparty na komunikacji MASTER-SLAVE (może być wiele masterów i wiele slave, łączonych przez jakiś tam przełącznik krzyżowy - muszę jeszcze doczytać do końca specyfikację), obsługa transferów blokowych, odczytu, zapisu, Read-Modify-Write oraz sygnałów error i retry. Jeśli chcemy, żeby moduł był "pasywny", tzn. żeby odpowiadał tylko na sygnały z innych układów to robimy mu moduł SLAVE. Są już nawet gotowe moduły mostka WISHBONE<->PCI :)
IMO najlepiej by było użyć transferów blokowych do przesyłania dużych porcji obrazu na raz.

A co do tej kolejki FIFO, to można postawić 4 kolejki po 4 bit i głębokości 2 i przełączać się po kolei z każdą, a sygnał inicjalizujący wczytanie następnej danej ma być generowany gdy co najmniej 2 kolejki FIFO są puste.

Przydała by się karta na PCI z Virtex 4, ale to już są ceny rzędu 2500$ :)
http://www.xilinx.com/xlnx/xebiz/designResources/ip_product_details.jsp?sGlobalNavPick=PRODUCTS&sSecondaryNavPick=Intellectual+Property&key=DO-DI-DSP-DK4
« Ostatnia zmiana: Kwiecień 18, 2006, 10:19:48 wysłana przez agent_J »

Offline Krzysiek K.

  • Redaktor
    • DevKK.net

# Kwiecień 18, 2006, 16:42:05
Cytuj
zaprojektowanie płytki w Protelu to trochę zabawy
Wiem, ze trzy już zaprojektowałem kiedyś, ale akurat w Autotraxie. :)

Cytuj
http://www.xilinx.com/xlnx/xebiz/designResources/ip_product_details.jsp?key=HW-SPAR3E-SK-US

Takie coś kosztuje 150$. Matoły dali to akurat po tym jak sobie kupiłem tę płytkę za 100$ :/
Hmm, ciekawe, tylko nadal ten zegar. Fajnie by było, gdyby było dostępnych kilka częstotliwości (np. dwa kwarce plus dzielnik), to można by już poszaleć.

agent_J

  • Gość
# Kwiecień 18, 2006, 16:58:17
Cytuj
zaprojektowanie płytki w Protelu to trochę zabawy
Wiem, ze trzy już zaprojektowałem kiedyś, ale akurat w Autotraxie. :)

Cytuj
http://www.xilinx.com/xlnx/xebiz/designResources/ip_product_details.jsp?key=HW-SPAR3E-SK-US

Takie coś kosztuje 150$. Matoły dali to akurat po tym jak sobie kupiłem tę płytkę za 100$ :/
Hmm, ciekawe, tylko nadal ten zegar. Fajnie by było, gdyby było dostępnych kilka częstotliwości (np. dwa kwarce plus dzielnik), to można by już poszaleć.

Niższa cena - niższy zegar :) O ile pamiętam Virtexy 4 dochodzą do 500MHz, to już można ostro poszaleć :)
Z resztą płytkę pod FPGA taki raczej ciężko będzie zrobić "domowym" sposobem - mocniejsze układy są niestety w obudowach BGA.

A teraz na poważnie: wydaje mi się, że żeby się za takie coś zabierać, trzeba by to zrobić na poważnie: zainwestować w sprzęt (nawet same układy FPGA i zrobienie płytek testowych) oraz software - czyli min. 1000zł zrzuty na osobę :P
Goście co robią te rdzenie na www.opencores.org na 100% pracują w jakichś firmach co się tym zajmują, a te rdzenie tworzą w czasie wolnym na firmowym sprzęcie za tysiące $.