logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

OV7670+FPGA+VGA Kamera i obraz na monitorze z użyciem Spartan 3E

karol_abr 04 Wrz 2014 20:44 3387 9
REKLAMA
  • #1 13934528
    karol_abr
    Poziom 8  
    Witam!
    Moim zadaniem jest zrobić układ, który odczytuje dane z kamery OV7670 i wykorzystując podwójną pamięć DRAM do doublebufferingu, wyświetla obraz w czasie rzeczywistym na monitorze. Wszystko z wykorzystaniem układu FPGA.
    Przesył danych jest taktowany zegarem z kamery(25 MHz) w trybie RGB 5:5:6 lub 5:5:5, czyli każdy piexel odczytany jest po dwóch taktach zegara, a wyświetlany po jednym. Jak więc rozwiązać problem szybkiego "wyczyszczenia" pamięci? W dokumentacji znalazłem informację, o możliwości wyboru trybu, w jakim przesyłane są dane, jednak nie za bardzo wiem, jak odpowiednio ustawić dane rejestry (nie chodzi tu o to, jakiego protokołu użyć, bo wiem, że I2C). Jako, że gdzieś przewinął mi się podobny projekt, to wiem, że da się to rozwiązać, jednak nie za bardzo potrafię sobie z tym poradzić. Prosiłbym o jakieś cenne wskazówki.
    Dziękuję i pozdrawiam.
  • REKLAMA
  • #2 13934810
    And!
    Admin grupy Projektowanie
    Rozumiem że chodzi o swojego rodzaju konwerter formatu,
    oraz dane napływają wolniej niż powinny być wysyłane ?

    Może zgodnie z sugestią podwójnego buforowania wykorzystać dwa banki pamięci A i B.

    Utworzyć sygnał "valid" który 0: oznacza że dane w A są prawidłowe, 1: że dane B są prawidłowe.

    Struktura która czyta dane z kamery reformatuje je i pisze do banku oznaczonego jako "invalid".
    Struktura która wysyła dane na monitor, czyta dane z banku "valid".

    Banki przełączane są po:
    -zakończeniu czytania z kamery
    -zakończeniu odczytu banku valid
  • #3 13935394
    karol_abr
    Poziom 8  
    Tak zgadza się, jednak to nie rozwiązuje problemu. Prosty przykład obrazujący mój problem:
    2 banki pamięci: A i B, każdy ma 100 bajtów(oczywiście liczba tylko w celu prostego zobrazowania problemu). Zapełnienie banku A danymi z kamery zajmie 200 taktów zegara, ponieważ dane jednej komórki są odczytywane z dwóch bajtów. Po zapełnieniu banku A zaczynamy wyświetlać dane na ekran i wyczyszczenie pamięci nastąpi po 100 taktach zegara. W tym czasie bank B zapełni się do połowy. Przysiadam właśnie do dokumentacji, bo z pewnością można to sensownie rozwiązać, jednak gdyby ktoś miał pomysł, sugestię, to bardzo bym prosił o pomoc.
    Pozdrawiam
  • REKLAMA
  • #4 13935608
    Pawel2420
    Poziom 31  
    Do tego celu stosuje się tzw. pamięci FIFO dual port. Przez jeden port wpisujesz dane a przez drugi odczytujesz. Jeśli dobrze pamiętam to w telewizorach to tego celu był używany chyba układ SAA4955.
  • REKLAMA
  • #5 13935703
    karol_abr
    Poziom 8  
    Jednak to nadal nie rozwiązuje problemu częstszego odczytywanie niż zapisywania do pamięci.
  • #6 13935759
    Pawel2420
    Poziom 31  
    Jak nie rozwiązuje. Ta pamięć została w telewizorze użyta właśnie do tego celu.
  • #7 13935799
    karol_abr
    Poziom 8  
    Moim zdaniem nie rozwiązuje, ponieważ do pamięci dane zostają zapisane co drugi takt, a odczytywane z każdym. Dla mnie prosty rachunek:
    -Zapełnienie 200 taktów
    -Odczytanie 100 taktów i tym samym zapełnienie 50 rejestrów
    -Odczytanie 50 rejestrów i zapisanie 25
    -itd...
    Nie wiem, może to ze mną coś jest nie tak, ale matematyka chyba nie kłamie :)
    Dziękuję za odpowiedź mimo wszystko ;)
  • #8 13935823
    Pawel2420
    Poziom 31  
    W zależności co chcesz osiągnąć (opis nie jest jednoznaczny):
    1. Zapisujesz do pamięci jedną ramkę obrazu a odczytujesz dwie.
    2. Zapisujesz do pamięci co drugą ramkę szybko i wolno ją odczytujesz.
  • REKLAMA
  • #9 13935831
    And!
    Admin grupy Projektowanie
    karol_abr napisał:
    Tak zgadza się, jednak to nie rozwiązuje problemu. Prosty przykład obrazujący mój problem:
    2 banki pamięci: A i B, każdy ma 100 bajtów(oczywiście liczba tylko w celu prostego zobrazowania problemu). Zapełnienie banku A danymi z kamery zajmie 200 taktów zegara, ponieważ dane jednej komórki są odczytywane z dwóch bajtów. Po zapełnieniu banku A zaczynamy wyświetlać dane na ekran i wyczyszczenie pamięci nastąpi po 100 taktach zegara. W tym czasie bank B zapełni się do połowy. Przysiadam właśnie do dokumentacji, bo z pewnością można to sensownie rozwiązać, jednak gdyby ktoś miał pomysł, sugestię, to bardzo bym prosił o pomoc.
    Pozdrawiam


    No tak ale mamy FPGA i obie struktury (odczytu danych z kamery i wysyłania do monitora mogą działać niezależnie).

    Czyli automat rysujący dane na monitorze czyta w kółko dane z gotowego bloku (niech to będzie A) do momentu gdy B jest aktualny, wtedy kończy wysyłanie A i ustawia B jako aktualny i wysyła z niego dane w kółko na ekran.

    Automat odczytujący dane z kamery reformatuje i pisze dane do bloku "invalid" (niech to będzie B), gdy zakończy informuje że B jest aktualny i czeka na zwolnienie bloku A aby znów pisać tam zawartość z kamery.

    I tak w kółko.

    Czy w ten sposób ma to szansę działać ?
  • #10 13935833
    karol_abr
    Poziom 8  
    Może to troszkę pomoże, jeśli niejasno się wyraziłem:
    Maksymalna częstotliwość PCLK(zegar z kamery) to 24MHz, taka sama częstotliwość potrzebna jest do synchronizacji po VGA. OV7670+FPGA+VGA Kamera i obraz na monitorze z użyciem Spartan 3E

    Dodano po 7 [minuty]:

    And! napisał:
    karol_abr napisał:
    Tak zgadza się, jednak to nie rozwiązuje problemu. Prosty przykład obrazujący mój problem:
    2 banki pamięci: A i B, każdy ma 100 bajtów(oczywiście liczba tylko w celu prostego zobrazowania problemu). Zapełnienie banku A danymi z kamery zajmie 200 taktów zegara, ponieważ dane jednej komórki są odczytywane z dwóch bajtów. Po zapełnieniu banku A zaczynamy wyświetlać dane na ekran i wyczyszczenie pamięci nastąpi po 100 taktach zegara. W tym czasie bank B zapełni się do połowy. Przysiadam właśnie do dokumentacji, bo z pewnością można to sensownie rozwiązać, jednak gdyby ktoś miał pomysł, sugestię, to bardzo bym prosił o pomoc.
    Pozdrawiam


    No tak ale mamy FPGA i obie struktury (odczytu danych z kamery i wysyłania do monitora mogą działać niezależnie).

    Czyli automat rysujący dane na monitorze czyta w kółko dane z gotowego bloku (niech to będzie A) do momentu gdy B jest aktualny, wtedy kończy wysyłanie A i ustawia B jako aktualny i wysyła z niego dane w kółko na ekran.

    Automat odczytujący dane z kamery reformatuje i pisze dane do bloku "invalid" (niech to będzie B), gdy zakończy informuje że B jest aktualny i czeka na zwolnienie bloku A aby znów pisać tam zawartość z kamery.

    I tak w kółko.

    Czy w ten sposób ma to szansę działać ?


    Tak, zgadza się. Jest to rozwiązanie i chyba jedyne jakie mogę użyć. Z pewnością drobne opóźnienie nie będzie widoczne, jednak chciałem zrobić to niemalże idealnie, czyli bez pokrywania się dwóch obrazów(w oczekiwaniu na zapełnienie drugiej pamięci). Na chwilę obecną biorę się za realizację projektu zgodnie z tym pomysłem. Dam znać jak skończę. Dziękuję i pozdrawiam!
REKLAMA