Ta strona używa ciasteczek (plików cookies), dzięki którym może działać lepiej. Dowiedz się więcejRozumiem i akceptuję
30% rabatu »Setki ebooków o elektronice i programowaniu - kod: SANTAFORBOT. Sprawdź polecane bestsellery »

Kurs FPGA – #7 – symulacja działania układu

Programowanie 23.11.2017 Adam, Damian

Za nami kilka ćwiczeń praktycznch, wiemy już, że FPGA działa poprawnie i możemy tworzyć na jego podstawie przeróżne układy cyfrowe.

Podczas analizy bardziej złożonych projektów przydaje się możliwość symulowania tworzonego układu. Dzięki wykorzystaniu nowej funkcji ISE, otrzymamy wykresy (przebiegi czasowe), które pozwolą ocenić czy układ działa poprawnie.

Nawigacja serii artykułów:
« poprzednia część

Kup zestaw elementów i zacznij naukę w praktyce! Przejdź do strony dystrybutora »

Na tym etapie nauki VHDLa korzystanie z symulacji nie jest konieczne. Warto jednak wykonać ćwiczenia z tej części kursu FPGA, aby poznać możliwości naszego środowiska.

Symulacja działania układu FPGA z ISim

Symulacja „to potężne narzędzie”, które pozwala na tworzenie jeszcze lepszych układów. Jest to ważny etap podczas przygotowywania większych projektów. Symulacja pozwala odpowiedzieć na pytanie „Czy układ działa poprawnie?” przed wgraniem konfiguracji do rzeczywistego układu.

Może to uchronić nas przed błędami, a nawet przed uszkodzeniem sprzętu!

Zacznijmy od programu, na którym będziemy trenować. Najlepiej wrócić do prostego przykładu z poprzednich lekcji. Poniżej widoczny jest kod VHDL bramki AND z piątej części kursu FPGA.

Oraz zawartość niezbędnego pliku UCF:

Warto wgrać program dla testu i sprawdzić, czy wszystko działa poprawnie!

Poprawne działanie bramki AND w praktyce.

Normalnie kolejność powinna być odwrotna (najpierw symulacja). Podczas nauki korzystania z symulatora warto jednak unikać dodatkowych problemów stąd wcześniej upewniliśmy się jak układ działa w praktyce.

Zestaw do kursu FPGA

Gwarancja pomocy na forum dla osób, które kupią poniższy zestaw!

Zestaw uruchomieniowy Elbert v2 - Spartan 3A z wszystkimi niezbędnymi peryferiami do wykonania ćwiczeń z kursu FPGA!


Kup w Botland.com.pl »

Przygotowanie do symulacji

Wiemy, że program działa, przejdźmy więc do symulacji. Na czym ma ona polegać? Chcemy, aby program przetestował działanie całego układu. W przypadku bramki AND najlepiej będzie jeśli sprawdzimy jak zachowuje się „wyjście układu” w zależności o wszystkich możliwych stanów na wejściach (00, 01, 10, 11).

Inaczej mówiąc chcemy przetestować wszystkie warianty występujące w tabeli prawdy dla AND:

Krok 1. W projekcie dotyczącym bramek logicznych klikamy prawym przyciskiem myszy (PPM) w drzewie projektu na pliku/module VHDL i wybieramy New Source:

Dodajemy nowy plik…

Krok 2. Z listy typów plików wybieramy VHDL Test Bench. Jako nazwę podajemy „test_bramek”. Warto się upewnić, że opcja Add to project jest zaznaczona. Na koniec klikamy Next.

Kurs_FPGA_4_2

Tworzenie pliku TestBench.

Krok 3. Pojawi się pole wyboru modułu VHDL, dla którego ma być stworzony testbench. Mamy do wyboru jeden moduł więc nie musimy się nad tym więcej zastanawiać. Klikamy Next.

Testbench to, w tym wypadku, nazwa pliku zawierającego opis symulacji!

Krok 4. Pojawi się okno podsumowania, w którym klikamy tylko Finish.

Ostatni etap przed wprowadzeniem zmian.

Krok 5. Teraz przełączamy widok środowiska na Simulation. Odpowiednie pole do zaznaczenia znajduje się po lewej stronie ISE (nad drzewkiem projektu).

Do wyboru jest tam Implementation oraz Simulation:

Kurs_FPGA_4_3

Zmiana widoku na „Simulation”.

Po przełączeniu widzimy nowy widok hierarchii projektu. Plik test_bramek to opis symulacji. Po rozwinięciu widoku pojawi się plik uut – podstawowe_bramki. Jest to moduł VHDL z naszym kodem, który będzie poddany symulacji.

Warto zwrócić uwagę, że hierarchia jest zorganizowana w taki sposób, że plik z symulacją jest położony „nad” testowanym modułem VHDL!

Rozwinięty widok symulacji.

Wróćmy do pliku z opisem symulacji, czyli test_bramek. Poniżej widoczny jest wygenerowany przez ISE kod. Usunięte zostały jedynie zbędne fragmenty, jak np. długie wstępne komentarze:

Na pierwszy rzut oka kod symulacji jest podobny do kodu aplikacji w VHDL, są jednak pewne różnice. Kod rozpoczyna się standardowo od dołączenia bibliotek:

Następnie umieszczony jest pusty blok entity.

Niżej zaczyna się blok architecture. Na początku następuje zdefiniowanie komponentów. Tutaj są wszystkie sygnały, które w module VHDL były deklarowane wewnątrz „Port” w sekcji „entity”. Blok ten został wypełniony automatycznie:

Niżej znajduje się deklaracja sygnałów lokalnych pliku z symulacją:

W pliku symulacji istnieje również możliwość zadeklarowania stałych, które będą używane w opisie procesu symulacji:

Tworzenie instancji (podczepienie sygnałów testujących do modułu VHDL):

Niżej znajduje się najciekawsza część, czyli miejsce na kod naszej symulacji:

W przypadku naszej bramki (zgodnie z wcześniejszym opisem) chcemy zasymulować działanie układu we wszystkich możliwych konfiguracjach wejść. Gotowy kod będzie więc wyglądał tak:

Mamy tutaj blok „process”, który poznaliśmy przy tworzeniu rejestru przesuwnego. To co jest nowe, to instrukcje zawarte wewnątrz tego bloku. Znajdują się tam komendy wait for, a zaraz po nich wpisany jest okres oczekiwania. Jako okres należy podać stałą zadeklarowaną wcześniej (jak to zrobiliśmy ze zmienną period) lub podać liczbę wraz z odpowiednim przyrostkiem:

Między liczbą, a przyrostkiem musi znaleźć się spacja!

Powyższy program pozwoli na sprawdzenie działania układu dla kolejnych kombinacji wejść AND. Zaczynając od 00, przez 10, 01, do 11. Po każdej zmianie wejść będziemy czekać przez czas ustalony w stałej period.

Cały program testujący dostępny jest poniżej:

Uruchomienie procesu symulacji

Krok 1. Tym razem skorzystamy z symulatora ISim, więc należy się upewnić, że jest on wybrany w ustawieniach projektu. Klikamy PPM w hierarchii projektu na b_bramki_logiczne i wybieramy opcję „Design Properties”. Następnie w pozycji Simulator wybieramy wyżej wspomniany ISim:

Wybór odpowiedniego symulatora.

Po zatwierdzeniu wyboru symulatora upewniamy się, że plik z symulacją jest zapisany. Następnie zaznaczamy go w hierarchii projektu. W poniższym menu klikamy PPM na Behavioral Check Syntax i dalej na Run.

Bardzo ważne, aby w hierarchii projektu zaznaczony był plik z symulacją!

Przeprowadzanie poprawności symulacji

Przeprowadzanie poprawności symulacji.

Gdy sprawdzanie symulacji zakończy się poprawnie pokaże się zielona ikona, tak jak miało to miejsce w procesie syntezy pliku VHDL.

Krok 2. Przed uruchomieniem symulacji należy zdefiniować jak długa ma trwać symulacja. W tym celu klikamy PPM na Simulate Behavioural Model i wybieramy Process Properties.

Czas trwania symulacji.

Ustawienie czasu trwania symulacji.

W polu Simulation Run Time określamy czas trwania symulacji. W przypadku testowania bramki AND wystarczy 100 ns.

Ustawienie czasu trwania symulacji cd.

Krok 3. Teraz możemy uruchomić test! Zaznaczamy plik z symulacją w hierarchii projektu. Dalej klikamy PPM na Simulate Behavioural Model i wybieramy Run.

Krok 4. Po chwili powinno się pojawić nowe okno* programu-symulatora ISim. Dla łatwiejszej analizy przebiegów warto kliknąć wtedy ikonkę Zoom to Full View.

*Jeśli program się nie uruchomił, to wystarczy usunąć poniższy plik i zrestartować środowisko.

Podczas pierwszego startu symulatora może również pojawić się problem z antywirusem. Avast bierze ten plik np. w „kwarantannę” i otwiera go w sposób bezpieczny. Po chwili pokazuje się komunikat, że plik nie jest groźny. Należy wtedy kliknąć opcję Kontynuuj wykonywanie:

Komunikat z programu antywirusowego.

Jeśli po chwili nie pojawi się program symulatora lub będzie się ciągle ładował, to wystarczy zrobić restart środowiska. Od tej pory wszystko powinno działać poprawnie, bez konieczności usuwania plików itd.

Krok 5. Analiza wyników. Gdy mamy włączone okno symulatora, to warto „poklikać” i sprawdzić jakie funkcje ułatwiające analizowanie wyników tam wbudowano. Szczególnie ważne jest dobre ustawienie przybliżenia (zoom).

Wynik naszej symulacji widoczny jest na poniższym zrzucie ekranu:

Otrzymana symulacja.

Na powyższym zrzucie ekranu widać trzy wykresy, które reprezentują:

  • stan wejścia nr 1,
  • stan wejścia nr 2,
  • stan wyjścia układu.

Teraz można sprawdzić czy otrzymane przebiegi zgadzają się z przewidywanym działaniem układu. Jak widać, jeśli na wejściu mamy 00, to na wyjściu jest 1. Przy innych kombinacjach na wyjściu mamy 0. Nasz program został wcześniej zmodyfikowany w taki sposób, aby działał poprawnie przy „odwrotnej logice” przycisków. Stąd odwrotny wynik naszej symulacji. Należy pamiętać o tej zamianie podczas analizy wyników lub zanegować przyciski podczas symulacji!

Wynik symulacji przy zanegowanych przyciskach w testbenchu wygląda następująco:

Wynik symulacji przy zanegowanych wejściach układu.

Reasumując, cały proces tworzenia symulacji przebiega następująco:

  • Najpierw deklarujemy wejścia i wyjścia dla obiektu, który ma być testowany (wewnątrz bloku „Component”). Są takie same, jak w bloku „port” w „entity” testowanego modułu.
  • Następnie deklarujemy sygnały analogiczne do tych z bloku „Component”, jednak tutaj są one sygnałami lokalnymi dla „architecture” danego testu.
  • Za „BEGIN” następuje przypisanie/tworzenie instancji sygnałów lokalnych danego testu z tym co ma być testowane wewnątrz bloku „component”.
  • Otrzymane wyniki mówią o reakcji wyjść – tutaj już sami musimy ocenić, czy układ działa zgodnie z oczekiwaniami.

Podsumowanie

Oczywiście w tym przypadku zdecydowanie łatwiej było sprawdzić działanie programu w praktyce (wgrywając konfigurację do FPGA). Przy bardziej rozbudowanych projektach warto jednak mieć na uwadze możliwość przeprowadzenia szczegółowej symulacji. Podejrzenie tego, co dzieje się „wewnątrz naszego FPGA” okazuje się bardzo pomocne np. podczas wyszukiwania błędów.

Kup zestaw elementów i zacznij naukę w praktyce! Przejdź do strony dystrybutora »

Autor kursu: Adam Bemski
Redakcja: Damian Szymański
Ilustracje, testy: Piotr Adamczyk

O autorze: Adam Bemski

Autorem kursu jest Adam Bemski, specjalista od systemow wbudowanych. Pracuje w obszarze automatycznego testowania urządzeń z funkcjonalnością IoT. Adam dodatkowo prowadzi zajęcia z techniki mikroprocesorowej na wyższej uczelni DHBW Stuttgart. Więcej szczegółów o Adamie na blogu adambemski.com.

Powiadomienia o nowych, darmowych artykułach!

Komentarze

FlyingDutch

11:48, 25.11.2017

#1

Cześć,

kurs solidnie wykonany - podoba mi się. Sam jakiś czas temu uczyłem się podstaw FPGA na tym zestawie: Elbert v.2. Jeśli jednak zakończy się na dotychczas przedstawionym materiale, to jego wartość praktyczna nie będzie wielka. Aby miał znaczenie praktyczne dodałbym następujące zagadnienia:

1) Ze dwie lekcje dot. maszyn stanów i ich implementacji w FPGA, oraz zastosowań

2) Komunikacja poprzez SPI i IC2 pomiędzy FPGA a mikro-kontrolerem (np. Arduino)

3) komunikacja UART FPGA - mikrokontroler (łatwo można zagadnienie rozszerzyć o komunikację po RS485 za pomocą shields do Arduino UART-RS485 za kilkanaście PLN)

4) Podłączenie najprostszego wyświetlacza LCD (interfejs równoległy) do FPGA

5) Podłączanie peryferiów dodatkowych np. ADC po SPI/IC2

6) Jedna lekcja dot. soft-CPU np. PicoBlaze/Microblaze i IP Core ogólnie)

7) Podanie literatury/linków do nauki składni VHDL/Verilog i dalszych ćwiczeń oraz zasobów firmy Xilinx/intel, a także stron WWW z darmowymi IP cores

Pozdrawiam

[ Dodano: 25-11-2017, 14:35 ]

Cześć,

odnośnie tej części kursu wspomniałbym także o jednej z możliwych wersji instrukcji wait, mianowicie o postaci "wait on (sygnal)", która często może uprościć pisanie testów układu (a także skrócić czas symulacji w niektórych przypadkach).

Trzy postacie instrukcji wait:

1) wait for odcinek_czasu

2) wait on nazwa_sygnalu (lub kilku sygnałów)

3) wait until warunek-logiczny

np.

wait on (R,C); -- czekaj na zmianę sygnałów R,C

Trzeba pamiętać, że instrukcję wait można używać tylko w procesach lub procedurach.

Do rozszerzenia wiedzy o składni VHDL polecam książkę nieżyjącego już profesora Józefa Kalisza (WAT) o tytule "Kurs języka VHDL" - mnie ta pozycja dała bardzo dużo na wstrepnym etapie nauki VHDL.

Pozdrawiam

Elvis

15:02, 25.11.2017

#2

FlyingDutch, patrząc na spis treści kursu łatwo się domyślić, że obejmuje on tylko podstawy. Z drugiej strony jeśli masz jakieś doświadczenia z płytką Elbert, dlaczego nie podzielić się z innymi użytkownikami forum? Możesz niezależnie od kursu napisać kilka artykułów o nieco bardziej zaawansowanej tematyce - ja chętnie pocztam :)

Również mam pewien niedosyt po przerobieniu podstaw, więc może warto pociągnąć kurs dalej, nie czekając aż ktoś to zrobi za nas.

FlyingDutch

8:17, 26.11.2017

#3

Elvis napisał/a:

FlyingDutch, patrząc na spis treści kursu łatwo się domyślić, że obejmuje on tylko podstawy. Z drugiej strony jeśli masz jakieś doświadczenia z płytką Elbert, dlaczego nie podzielić się z innymi użytkownikami forum? Możesz niezależnie od kursu napisać kilka artykułów o nieco bardziej zaawansowanej tematyce - ja chętnie pocztam :)

Również mam pewien niedosyt po przerobieniu podstaw, więc może warto pociągnąć kurs dalej, nie czekając aż ktoś to zrobi za nas.

Napisałem po prostu, jakie podstawowe tematy były mi potrzebne, aby zacząć praktyczną pracę z układami programowalnymi. Niestety temat jest bardzo obszerny i trudno osiągnąć minimalny poziom wiedzy pozwalający zacząć pracę z układami FPGA. Z chęcią napiszę jakiś artykuł (myślę, że na temat komunikacji poprzez UART pomiędzy FPGA a mikro-kontrolerem), niestety obawiam się, że nie będzie on tak dobrze wykonany jak ten kurs (to wymaga sporego nakładu pracy - szczególnie opracowanie strony wizualnej).

Pozdrawiam

Elvis

8:44, 26.11.2017

#4

Nie traktuj mojego wpisu jako atak, czy krytykę. Chodziło mi o to, że może fajnie byłoby własnymi siłami założyć coś jak kącik fanów FPGA :) Też bawiłem się Elbert-em napisałem kilka programów, ale jakoś straciłem zapał. Może takie dzielenie się "osiągnięciami" i dyskusja co można zrobić lepiej dałaby wszystkim okazję do rozwijania. Nie chodziło mi o pisanie artykułów w takiej formie jak artykuły na blogu - po prostu założyć wątek i opisać co nauczyliśmy się o FPGA i Elbercie.

FlyingDutch

9:27, 26.11.2017

#5

[quote="Elvis"]Nie traktuj mojego wpisu jako atak, czy krytykę. Chodziło mi o to, że może fajnie byłoby własnymi siłami założyć coś jak kącik fanów FPGA :) Też bawiłem się Elbert-em napisałem kilka programów, ale jakoś straciłem zapał.

Hej Elvis, absolutnie nie potraktowałem twojego wpisu jako krytyki ;)

To o czym piszesz (utrata zapału), to właśnie przejaw problemu o którym mówię - aby zrobić coś ciekawego na FPGA/CPLD potrzebny jest bardzo szeroki zakres wiedzy, co po pierwszych prostych układach prowadzi do zniechęcenia tematem. Nie oszukujmy się - temat układów programowalnych jest bardzo trudny (to niestety nie są mikro-kontrolery), poza tym trzeba mieć 'background" w postaci znajomości układów cyfrowych. Elbert to bardzo fajny zestaw dla początkujących jednak nie nadaje się do trudniejszych tematów z powodu za małej ilości zasobów (ilość LUT na poziomie 1400 to za mało aby używać ciekawszych IP corów, czy soft CPU). Aktualnie przesiadłem się na "Digilent Cmod A7-35T Moduł uruchomieniowy z FPGA Artix-7" i ćwiczę "MicroBlaze" a docelowo przymierzam się do zestawu:

Digilent ZYBO Z7-10 z Voucherem Zynq SDSoC (471-014)

z (AP SoC) ZYNQ XC7Z020-1CLG400C

czyli połączenie dwu-rdzeniowgo ARM Cortex-A9 z dużym układem FPGA i 1 GB RAM DDR3

Jest to trochę połączenie 'wody z ogniem" czyli lepiej znanego świata mikro-kontrolerów z układem FPGA. Docelowo chciałbym wykonać "proof of concept" dla "koparki" kryptowaluty Etherum pobierającej dużo mniej energii niż koparki oparte na GPU (algorytm Ethash dla tej waluty wymaga dużo RAM dlatego jest trudny do zaimplementowania na układach FPGA czy ASIC).

Zakończenie kursu FPGA Forbot na planowanych lekcjach to jak: nauczyć kogoś czytać a nie dać mu dostępu do biblioteki. Oczywiście można napisać artykuły na kilka tematów, ale nie będą one na takim poziomie jak ten kurs (chociażby z powodu ograniczeń czasowych autora takich artykułów) :-)

Pozdrawiam

Elvis

9:38, 26.11.2017

#6

Bez przesady, nic nie jest trudne - tylko najpierw się trzeba tego nauczyć :)

Jak dla mnie Elbert jest właśnie fajny bo mały. Wygenerowanie programu zajmuje znośny czas i nie trzeba łączyć gotowych IP-corów żeby cokolwiek działało. Do nauki moim zdaniem idealny :)

Na zybo kilka rzeczy próbowałem zrobić, ale czas generowania projektu mnie zniechęcił. Fajny układ, szczególnie z linux-em na pokładzie, tylko zupełnie nie dla początkujących. Teraz FPGA + CortexA9 ma też Altera, ale to inna sprawa.

Co do zniechęcenia to u mnie nie wynikało ono z poziomu trudności, lubię wyzwania. To raczej tak - robimy pierwszy, drugi trzeci przykład, a później zaczyna się nudzić... Dlatego podzielenie się wiedzą z innymi i uczenie niejako razem to moim zdaniem fajny pomysł. Na szybko wkleiłem jeden z pierwszych programików: https://www.forbot.pl/forum/topics51/kurs-fpga-wlasne-programy-vt14886.htm#121369

Mam jeszcze trochę liczników wykorzystujących wyświetacz segmentowy Elbert-a, komunikację po SPI i generowanie obrazu na VGA. Później niestety straciłem zapał :(

FlyingDutch

9:52, 26.11.2017

#7

Elvis napisał/a:

Bez przesady, nic nie jest trudne - tylko najpierw się trzeba tego nauczyć :)

Co do zniechęcenia to u mnie nie wynikało ono z poziomu trudności, lubię wyzwania. To raczej tak - robimy pierwszy, drugi trzeci przykład, a później zaczyna się nudzić... Dlatego podzielenie się wiedzą z innymi i uczenie niejako razem to moim zdaniem fajny pomysł. Na szybko wkleiłem jeden z pierwszych programików: https://www.forbot.pl/forum/topics51/kurs-fpga-wlasne-programy-vt14886.htm#121369

Mam jeszcze trochę liczników wykorzystujących wyświetacz segmentowy Elbert-a, k

komunikację po SPI i generowanie obrazu na VGA. Później niestety straciłem zapał :(

Elvis, zajrzyj na grupę HDL na Goldenline.pl - wiem Goldenline jest w większości martwe ale na tej grupie jest aktywny bardzo fajny człowiek Jakub Tyburski (doktorant WAT z wydziału elektroniki). Ma bardzo dużą wiedzę dot. układów programowalnych i chętnie się nią dzieli (ja bardzo dużo się od niego nauczyłem).

Tu jest link:

https://www.goldenline.pl/grupy/Pozostale/hdl/

niestety trzeba założyć profil na goldenline.pl

Co do tematów do realizacji trzeba wymyślić sobie jakiś praktyczny układ/problem i starać się go zrealizować na FPGA. Ja np. wymyśliłem sobie sterownik rolet na drzwiach balkonowych (z silnikiem DC 12v sterowanym przez PWM) i zrealizowałem go na FPGA.

Pozdrawiam

Elvis

9:55, 26.11.2017

#8

To może opiszesz swój projekt na forum? Fajnie byłoby poczytać :) Może to racja że trzeba na projekcie się skoncentrować.

FlyingDutch

10:10, 26.11.2017

#9

Elvis napisał/a:

To może opiszesz swój projekt na forum? Fajnie byłoby poczytać :) Może to racja że trzeba na projekcie się skoncentrować.

Praktycznie większość kodu jest w postach na tym forum HDL na Goldenline.pl

Musiałbym tylko lepiej opisać założenia i mostek MOSFET użyty w układzie.

Zajrzyj pod ten link na to forum (bo warto):

https://www.goldenline.pl/grupy/Pozostale/hdl/

Czytać posty można bez profilu na goldenLine, ale są "przeszkadzajki" (BTW: Jakub zwykle odpowiada tego samego dnia, a ma naprawdę dużą wiedzę i jest bardzo sympatyczny)

Pozdrawiam

Elvis

10:28, 26.11.2017

#10

Dzięki za linka - nie jestem fanem goldenline, szkoda że takiej dyskusji nie udało się zrobić na Forbocie :(

FlyingDutch

16:04, 26.11.2017

#11

Elvis napisał/a:

Dzięki za linka - nie jestem fanem goldenline, szkoda że takiej dyskusji nie udało się zrobić na Forbocie :(

Jeszcze nic straconego, coś się wymyśli

Pozdrawiam

Treker
Administrator

18:26, 26.11.2017

#12

FlyingDutch, dziękuję za miłe słowa, ciesze się, że kurs "się podoba" :)

Tak jak od początku zakładaliśmy kurs dotyczy podstaw FPGA, ponieważ wiele osób nie wie, czy ta droga jest dla nich odpowiednia. Do tej pory nie układy programowalne nie były zbyt często wybierane przez hobbystów. W dalszych częściach kursu pojawi się jeszcze maszyna stanu, zrobimy też bardziej zawiłe projekty :) Dodatkowych rzeczy do płytki nie podłączamy celowo, aby zbytnio nie komplikować nauki VHDL (dodatkowa elektronika, to miejsce na potencjalne nowe błędy). Będzie to jednak dobre zadanie do ewentualnej kontynuacji kursu :)

Inicjatywie Elvisa mocno kibicuję, mam nadzieję, że wyjdzie z tego coś ciekawego! Zachęcam, aby inni też dzielili się swoimi przykładowymi projektami. Link do tematu, o którym mowa: https://www.forbot.pl/forum/topics51/kurs-fpga-wlasne-programy-vt14886.htm

Zobacz powyższe komentarze na forum

FORBOT Damian Szymański © 2006 - 2017 Zakaz kopiowania treści oraz grafik bez zgody autora. vPRsLH.