CPLD Kurs od podstaw, Elektronika

[ Pobierz całość w formacie PDF ]
Technika cyfrowa
Kurs CPLD
część 1
Wstęp
Korzystając z możliwości, jaką udostępniła mi
Redakcja, chciałbym zaprosić Czytelników
do udziału w kursie poświęconym układom
programowalnym, a konkretnie układom
CPLD. Niniejszy cykl ma w przystępny spo-
sób zapoznać Czytelnika z podstawami two-
rzenia projektów dla układu programowalne-
go, oprogramowaniem wykorzystywanym do
tego celu oraz sposobem jego obsługi.
Internet pełen jest artykułów poświę-
conych temu tematowi, jednakże niniejsze
opracowanie ma tę zaletę, iż jest kursem
praktycznie od zera, opartym na zaprojek-
towanej w tym celu, dobrze udokumento-
wanej płytce testowej, której opis zawarty
był w sierpniowym numerze EdW. Płytka ta
umożliwi zbadanie w praktyce wszystkich
poruszonych zagadnień, co oprócz wiedzy
teoretycznej, pozwoli samodzielnie sprawdzić
swoje umiejętności. Płytka testowa posiada
podstawowe bloki funkcjonalne umożliwiają-
ce wykonanie szeregu różnorodnych ćwiczeń,
a oprócz tego zawiera również programator!
Jest to dodatkowe ułatwienie, które zaoszczę-
dzi Czytelnikom sporo czasu i nerwów. Do
rozpoczęcia zabawy potrzebna będzie wspo-
mniana płytka (dostępna w sklepie AVT),
przewód do podłączenia jej do komputera
przez port LPT oraz komputer ze stosownym
(bezpłatnym) oprogramowaniem.
Kurs jest przeznaczony dla wszystkich
pasjonatów techniki cyfrowej, w tym dla
zagorzałych zwolenników mikrokontrolerów,
którzy zyskają możliwość rozszerzenia swojej
wiedzy, oraz dla Czytelników mniej obe-
znanych z zagadnieniami techniki cyfrowej.
Niezbędna będzie jednak podstawowa wiedza
z zakresu układów cyfrowych (bramki, licz-
niki, rejestry, etc.), którą można uzupełnić
ze stosownej książki (np. „Układy cyfrowe
– pierwsze kroki” P. Góreckiego). Znacznie
ułatwi to zrozumienie problemów porusza-
nych w kolejnych odcinkach. Część tego
materiału będzie przypomniana w następnej
części kursu, ale z naciskiem na aspekty prak-
tyczne. Pokazane zostanie funkcjonowanie
wszystkich podstawowych „bloczków” tak,
aby Czytelnik mógł samodzielnie sprawdzić
jak one pracują.
Kurs będzie prowadzony przede wszyst-
kim w formie ćwiczeń. Przez najbliższe kilka
miesięcy postaramy się zrealizować szereg
projektów, zrozumieć ich funkcjonowanie
oraz w jaki sposób przystąpić do ich imple-
mentacji. Realizacja projektów będzie opierać
się głównie na edytorze schematów, za pomo-
cą którego można rysować połączenia pomię-
dzy elementami bibliotecznymi, takimi jak
bramki, liczniki, rejestry... Jest to narzędzie
bardzo proste w obsłudze, intuicyjne i przej-
rzyste. Widząc schematy połączeń w książ-
kach, będzie je można bezpośrednio przenieść
do układu programowalnego i wypróbować,
co daje nowy wymiar nauczania – praktycz-
ne sprawdzenie tego, co opisuje autor danej
publikacji.
Omówione zostaną również typowe
techniki syntezy układów cyfrowych (tabli-
ce Karnaugha, układy kombinacyjne, auto-
maty) oraz poruszony będzie temat języka
opisu sprzętu, jakim jest VHDL, aby poka-
zać alternatywną metodę tworzenia pro-
jektów. Dość wygodną funkcją środowiska
WebPACK ISE jest tworzenia własnych
elementów bibliotecznych, co także zosta-
nie przybliżone w jednym z najbliższych
odcinków. Zagadnienia te mogą wydawać
się skomplikowane i trudne, jednakże posta-
ram się pokazać, że tak nie jest. Pomimo
wymaganej podstawowej wiedzy z zakresu
układów cyfrowych, poruszane zagadnienia
zostaną przedstawione w skrótowej formie
w najbliższym odcinku. Nie poprzestaniemy
oczywiście na teoretycznych rozważaniach,
tylko skorzystamy z poznanych narzędzi
i będziemy w oparciu o nie konstruować
różnorodne urządzenia.
Pozostaje mi tylko zaprosić do dalszej lektury
i mieć nadzieję, iż kurs znajdzie uznanie w
oczach Czytelnika.
Plan kursu
Zanim rozpoczniemy na poważnie zgłębiać
tajniki układów CPLD, chciałbym przed-
stawić ogólny plan, według którego będą
przygotowywane następne odcinki. W miarę
możliwości postaram się uwzględnić suge-
stie Czytelników i wprowadzać zmiany w
kolejnych częściach – szczególnie rozwinąć
kwestie wymagającej dokładniejszego wyjaś-
nienia lub dodawać materiały, który będą
interesujące dla szerszego grona.
Pierwsza część
kursu, czyli ta, którą
właśnie czytasz, poświęcona jest sprawom
organizacyjnym.
Znajduje się tu przede wszystkim instrukcja
opisująca krok po kroku, jak pobrać i zain-
stalować środowisko WebPACK ISE 6.2i,
z którym będziemy pracować w najbliższej
przyszłości. Bardzo szczegółowe przedsta-
wienie tego zagadnienia, poparte dużą liczbą
rysunków, pozwoli pomyślnie przeprowadzić
proces instalacji nawet najmłodszym i mało
zaawansowanym Czytelnikom. Nauczymy
się przy okazji korzystać z programatora i
przesyłać program do układu CPLD. Jest
to potrzebne również podczas wykonywania
płytki testowej – po jej zmontowaniu warto
byłoby przetestować poprawność lutowania.
Do tego celu przewidziano specjalny test
dostępny na stronie Elportalu, który można
pobrać ze strony i uruchomić na płytce. Po
szczegóły testowania odsyłam do artykułu
poświęconego płytce testowej.
Część druga
porusza zagadnienia związa-
ne ze środowiskiem WebPACK ISE 6.2i. W
tej części nauczymy się rysować schematy i
konfigurować układ programowalny. Część
Elektronika dla Wszystkich
Luty 2009
31
 Technika cyfrowa
kursu będzie poświęcona na
pokazanie, jak pracują ele-
menty opisywane w książ-
kach, tzn. sprawdzimy, czy
bramka AND rzeczywiście
daje jedynkę dla dwóch jedy-
nek na wejściu, czy liczniki
rzeczywiście liczą i w jaki
sposób, jak zbudować nie-
standardowy dzielnik (np.
przez 7) czy też wykorzystać
przerzutnik typu D.
W
części trzeciej
przedstawiona zostanie
tablica Karnaugha i sposób jej wykorzystania
przy budowie prostych układów kombina-
cyjnych. Przyjrzymy się również narzędziom
wspomagającymi pracę z tymi tablicami.
Zaczniemy też wykonywać bardziej prak-
tyczne rzeczy, takie jak obsługa wyświetlacza
7-segmentowego, budowa własnych symboli
bibliotecznych, etc.
Część czwarta
zostanie przeznaczona na
doskonalenie umiejętności syntezy układów
cyfrowych – wykonamy proste projekty takie
jak minutnik do jajek oraz kostkę do gry.
W
części piątej
przyjrzymy się bliżej
językowi opisu sprzętu jakim jest VHDL.
Poznamy w ten sposób alternatywną meto-
dę implementacji – opisywanie zachowania
układu logicznego zamiast rysowania jego
schematu. Po zapoznaniu się z podstawami
VHDL-a wykonamy w ramach tej części
kursu regulator mocy oparty o PWM oraz
prostą barierę podczerwieni.
W
części szóstej
będziemy zmuszać układ
programowalny do interakcji z otoczeniem.
Zobaczymy, jak za pomocą bramek i reje-
strów zbudować dekoder kodu RC5 i dzięki
temu zyskamy możliwość zdalnego stero-
wania urządzeniem przyłączonym do płytki
testowej.
Przedostatnia, czyli
siódma część
kursu,
będzie poświęcona automatom synchronicz-
nym. Przeznaczymy trochę czasu na omó-
wienie tego „tworu”, przyjrzymy się grafom
przejść takiego automatu, będziemy konstru-
ować własne grafy i następnie „implemen-
tować je w krzemie”. Na tę okazję został
oczywiście przewidziany stosowny projekt
– automat oświetleniowy.
Ostatnia,
ósma część
, poświęcona jest
również automatom i innemu projektowi,
jakim jest zamek szyfrowy. Nastąpi tutaj pod-
sumowanie kursu i być może, co będzie zależ-
ne od Czytelników i stanowiska Redakcji,
wytyczenie planu zdobycia kolejnego stopnia
wtajemniczenia, jakim są układy FPGA.
Czym jest układ
programowalny?
Zanim zaczniemy na poważnie zagłębiać
tajniki układów programowalnych, warto
byłoby odpowiedzieć sobie na pytanie: co to
jest? Wierzę, że każdy Czytelnik bez proble-
mu znajdzie w Internecie stosowną definicję
Rys. 1
(choćby na Wikipedii), więc nie będę jej tu
przytaczał. Rozwinięciem tego tajemniczego
CPLD skrótu jest:
Complex Programmable
Logic Device
, co oznacza po polsku złożony,
programowalny układ logiczny. W uprosz-
czeniu możemy przyjąć, że układ progra-
mowalny jest zbiorem dużej liczby bramek
oraz rejestrów zgromadzonych wewnątrz
pojedynczego układu scalonego. Co wię-
cej, układ taki jest wyposażony w pamięć
nieulotną (np. EEPROM), którą można wie-
lokrotnie przeprogramować. Zawiera ona
informację o połączeniach pomiędzy zaso-
bami układu CPLD, co pozwala je dowolnie
konfigurować i tworzyć określone bloki speł-
niające zadaną funkcję. Od strony użytkow-
nika wygląda to trochę jak fabryka układów
scalonych, gdzie Czytelnik przygotowuje
projekt, zleca jego opracowanie odpowied-
nim ludziom (środowisko WebPACK ISE), a
na końcu jest on wykonywany przez fabrykę
(konfiguracja za pomocą programatora). W
przeciwieństwie jednak do fizycznej produk-
cji układu scalonego, możesz się, Czytelniku,
wielokrotnie mylić lub zmieniać zdanie – bez
żadnych konsekwencji. Ceną tej elastycz-
ności jest jednak mniejsza wydajność oraz
mniejsze zasoby logiczne (liczba dostępnych
elementów) oferowane przez układ CPLD w
stosunku do produkowanych na zamówienie
układów scalonych. W naszym przypadku
nie będzie miało to dużego znaczenia. Gdyby
jednak w przyszłości było potrzebne zapro-
jektowania bardziej złożonego projektu, to
pozostają układy FPGA wyposażone w kilka
milionów bramek.
Użyty układ XC9572 pozostawia do dys-
pozycji użytkownika 34 linie I/O (dla obu-
dowy PLCC), które mogą pełnić rolę wejścia
lub wyjścia. Wejścia pozwalają wprowadzić
dowolny sygnał logiczny, a na wyjściu poja-
wia się sygnał zależny od konfiguracji układu
i stanu wejść, podobnie jak w typowym
układzie z bramkami. Różnica polega na tym,
iż porty te mogą być dowolnie zamieniane i
określenie, który port gdzie ma być dołączo-
ny, leży już w gestii Czytelnika – projektanta.
Służy do tego specjalne narzędzie zintegro-
wane ze środowiskiem WebPack ISE, które-
mu również się przyjrzymy.
W porównaniu do mikrokontrolerów, ukła-
dy programowalne są znacznie szybsze, gdyż
przy odpowiednim zaprojektowaniu potrafią
wykonywać nawet najbardziej skomplikowa-
ne zadania w jednym takcie zegara. Poza tym
umożliwiają równoległe wykonywanie kilku
zadań. Układ XC9536XL może być taktowa-
ny częstotliwością sięgającą od 100MHz do
178MHz (zależnie od wersji układu).
Filozofia projektowania jest oczywiście
odmienna niż dla mikrokontrolerów. Spór o
to, czy lepszy jest mikrokontroler, czy układ
programowalny, jest bezcelowy, gdyż odpo-
wiedź na to pytanie jest zależna od urządze-
nia, jakie chcemy zbudować. W przypadku
bardzo dużych projektów z niektórymi zada-
niami lepiej radzi sobie jednak procesor, ale
nic nie szkodzi na przeszkodzie, aby... zbudo-
wać własny! Jest to rozwiązanie pracochłonne
i wymagające dużych zasobów logicznych
(dostępnych w układach FPGA), dlatego nie
będziemy poruszać tego zagadnienia.
Architektura rodziny
XC9500
Przed rozpoczęciem właściwego kursu warto
byłoby zapoznać się z architekturą układu
XC9572XL. Materiał zawarty w niniejszym
paragrafie ma charakter uzupełniający wiedzę
i jego zrozumienie nie jest wymagane do pro-
wadzenia własnych eksperymentów. Pozwoli
jednak spojrzeć trochę głębiej i zapoznać się z
zasadami rządzącymi pracą CPLD.
Rodzina układów XC9500XL wymaga
zasilania 3,3V i jest dedykowana do wyso-
kowydajnych, niskonapięciowych aplikacji,
w których wymaga się dużej niezawodności
oraz niskiego zużycia energii. Każdy układ z
tej rodziny zapewnia wsparcie dla interfejsu
JTAG (IEEE 1149.1) oraz programowania w
systemie (ISP). Pozwala to na lepsze wyszu-
kiwanie błędów w programowanie, a pozo-
stawienie dedykowanego złącza dla JTAG na
płytce drukowanej umożliwia bezstresową
pracę nawet z układami SMD w małych
obudowach. Rodzina XC9500XL została
stworzona głównie z myślą o współpracy
z większymi układami logicznymi, takimi
jak FPGA, pozwalając na optymalny podział
zadań pomiędzy szybki układ przetwarzający
(CPLD) oraz bardziej złożone, ale wolniejsze
układy FPGA. Jak pokazano na
rysunku 1
,
złożoność układów z serii XC9500XL zawie-
ra się w granicach od 800 do 6400 bramek
logicznych z liczbą rejestrów w przedziale
od 36 do 288. Dostępne obudowy oraz liczba
Luty 2009
32
Elektronika dla Wszystkich
 Technika cyfrowa
portów I/O zostały wymienione w tabeli na
rysunku 2
. Dużą zaletą jest zachowanie zgod-
ności wyprowadzeń pomiędzy poszczególny-
mi przedstawicielami tej rodziny, pozwalając
łatwo zwiększyć dostępne zasoby w razie
potrzeby. W płytce prototypowej do niniej-
szego kursu bez przeszkód można zastosować
również układ XC9536XL, który charaktery-
zuje się jednak mniejszą ilością zasobów.
Jak wspomniałem wcześniej, architektura
XC9500XL zapewnia obsługę programo-
wania w systemie (ISP) w pełnym zakresie
temperatur. Podwyższona żywotność pamię-
ci i możliwość przypisywania sygnałów
do dowolnego portu I/O zapewniają bez-
stresowe projektowanie. Ma to szczególne
znaczenie na etapie projektowania płytki
drukowanej, gdyż nie trzeba się przejmo-
wać rozmieszczeniem portów – można je
dowolnie podłączyć i uwzględnić to na eta-
pie tworzenia oprogramowania. Wydłużony
czas podtrzymania danych w pamięci Flash
zapewnia bardziej niezawodną pracę urzą-
dzenia przez dłuższy czas.
Zaawansowane funkcje systemu dają
możliwość kontrolowania czasu narastania
zboczy sygnałów wyjściowych oraz pro-
gramowego dołączania portów do masy, co
przekłada się na zmniejszenie zakłóceń w
urządzeniu. Wszystkie wejścia są kompaty-
bilne ze standardami napięć 5V, 3,3V oraz
2,5V, natomiast wyjścia mogą pracować w
standardzie 3,3V lub 2,5V.
Każdy układ CPLD z serii XC9500XL
jest systemem złożonym z wielu bloków
funkcyjnych (FB – Functions Blocks) oraz
bloków wejścia-wyjścia (IOB – I/O Blocks)
połączonych między sobą za pomocą specjal-
nej matrycy przełączników: FastCONNECT
II switch matrix. Bloki IO buforują wejścia
i wyjścia układu programowalnego. Każdy
z bloków funkcjonalnych zapewnia możli-
wość programowania 54 wejść i 18 wyjść.
Wszystkie sygnały wejściowe i wyjściowe FB
mogą być łączone ze sobą za pomocą matrycy
Rys. 3
przełączników FastCONNECT. Każdy blok
funkcyjny posiada do 18 wejść (zależnie od
obudowy) oraz przypisane wyjścia umożli-
wiające bezpośrednie doprowadzenie sygna-
łów do bloków IO –
rysunek 3
.
W bloku funkcyjnym, jak pokazano to
na
rysunku 4
, zawartych jest 18 niezależ-
nych makrokomórek. Doprowadzone są tu
również globalne sygnały zegarowe, wejścia
aktywujące oraz sygnały resetujące i ustawia-
jące. Blok funkcyjny generuje 18 sygnałów
wyjściowych, które są dołączone do matrycy
przełączników. Sygnały te oraz powiązane
z nimi sygnały aktywujące mogą być także
dołączone do bloków I/O. Funkcje logiczne
są implementowane w oparciu o reprezenta-
cję sum wynikowych. Wejścia, w liczbie 54,
dostarczają 108 sygnałów komplementarnych,
które zostają doprowadzone do matrycy bra-
mek AND i tworzą
w ten sposób 90 linii
product term, które
mogą być alokowa-
ne do makrokomórek poprzez układ PTA
(Product Term Allocator).
Układ CPLD zawiera makrokomórki, które
można indywidualnie konfigurować. Pełnią
one funkcje kombinacyjne lub rejestrowe. Na
rysunku 5
przedstawiono makrokomórkę i
stowarzyszony z nią blok funkcyjny.
Pięć elementów wynikowych (linie pro-
duct terms) wychodzących z matrycy AND
można wykorzystać jako pierwotne wejścia
danych dla bramek OR lub XOR. Umożliwia
to implementowanie funkcji kombinacyjnych
lub kontrolowanie wejść w tym sygnały zega-
rowe, ustawiające, kasujące, bramkowanie
itp. Elementy te są powiązane z każdą makro-
komórką, pozwalając określić sposób wyko-
rzystania pięciu linii product term.
Rejestr makrokomórki może być skon-
figurowany jako przerzutnik typu D lub T
lub zostać wykorzystany do pełnienia funk-
cji kombinacyjnych. Każdy z tych rejestrów
może być asynchronicznie ustawiany lub
kasowany. Po włączeniu zasilania wszystkie
Rys. 2
Rys. 4
Elektronika dla Wszystkich
Luty 2009
33
33
 Technika cyfrowa
Rys. 6
Rys. 7
funkcyjnych z jednakowym
opóźnieniem.
Bloki I/O pośredniczą
pomiędzy wewnętrznymi
zasobami logicznymi oraz
fizycznymi portami I/ O.
Każdy z nich posiada bufor
wejściowy, stopień wyj-
ściowy, multiplekser służą-
cy do wyboru aktywnego wyjścia oraz pro-
gramowalne podciąganie do masy. Szczegóły
pokazano na
rysunku 11
. Bufor wejściowy
jest kompatybilny z sygnałami w standardzie
5V CMOS, 5V TTL, 3,3V CMOS oraz 2,5V
CMOS. Bufor ten wykorzystuje wewnętrz-
ne zasilanie napięciem 3,3V (V
CCINT
), aby
zapewnić stabilny i niezmienny próg przełą-
czenia, który nie będzie zmieniał w przypad-
ku zakłóceń napięcia V
CCIO
. Każdy z buforów
wejściowych zapewnia histerezę przełączenia
Rys. 5
rejestry są inicjowane do stanu określonego
przez użytkownika (domyślnie jest to zero).
Wszystkie globalne sygnały kontrolne
dostępne są w makrokomórkach (wejścia
zegarowe, ustawiające, kasujące oraz akty-
wujące). Jak pokazano na
rysunku 6
reje-
stry makrokomórek mogą być taktowane za
pomocą jednego z wejść zegarowych lub linii
product term. Możliwe jest również wybranie
aktywnego zbocza: opadające lub narastające.
Wejście GSR umożliwia ustawienie rejestrów
w stan zadany przez użytkownika.
Układ Product Term
Allocator (PTA) określa w
jaki sposób pięć linii pro-
duct term jest przypisy-
wanych do każdej makro-
komórki. Przykładowo
wszystkich pięć linii
może być wyprowadzo-
nych na wejście bramki
OR, jak pokazano to na
rysunku 7
. Układ PTA
może dokonać reorgani-
zacji innych linii product
term wchodzących w
skład bloku funkcyjnego,
aby zwiększyć zasoby
logiczne makrokomórki.
Każda z makrokomórek
wymagająca dodatko-
wych linii product term
może wykorzystać wolne
linie dostępne w danym
bloku funkcyjnym. Jak
pokazano na
rysunku
8
, makrokomórka może
wykorzystać do 15 linii
product term kosztem nie-
znacznego zwiększenia
czasu propagacji sygnału.
Warto zauważyć, że dotyczy
to tylko linii korzystających z
zasobów innej makrokomórki.
Wewnętrzna logika układu
PTA została przedstawiona na
rysunku 9
.
Szybka matryca przełączników
(FastCONNECT II Switch Matrix) podłą-
cza sygnały do wejść bloków funkcyjnych,
jak pokazano na
rysunku 10
. Wszystkie
wyjścia bloku I/O (odpowiadające portom
wejściowym) oraz wszystkie wyjścia blo-
ków funkcyjnych stanowią wejścia matrycy
FastCONNECT II. Każde z tych wejść
może być doprowadzone do wejść bloków
Rys. 8
Rys. 9
Luty 2009
34
Elektronika dla Wszystkich
 Technika cyfrowa
Rys. 11
Rys. 10
Rys. 12
na poziomie 50mV, aby pomóc zredukować
wpływ szumów w układach z wolno narasta-
jącymi lub opadającymi zboczami.
Stopnie wyjściowe zostały zaprojektowane
pod kątem szybkiego przełączania przy mini-
malnym zużyciu energii. Każdy z nich może
zostać skonfigurowany do pracy z poziomami
napięć 3,3V CMOS (kompatybilnymi rów-
nież ze standardem 5V TTL) lub 2,5V CMOS.
Wybór pomiędzy tymi dwoma poziomami
dokonuje się poprzez dołączenie do wejścia
V
CCIO
napięcia 3,3V lub 2,5V. Na
rysunku 12
przedstawiono przykłady współpracy układu
CPLD z różnymi standardami napięć.
Porty wyjściowe posiadają funkcję
zmniejszania stromości zboczy sygnałów –
możliwe jest pogorszenie ich jakości kosztem
mniejszych zakłóceń generowanych przez
układ. Szybkozmienne sygnały charaktery-
zują się dużą zawartością harmonicznych,
co zwiększa zakłócenia radiowe generowane
przez pracujące urządzenia. Obowiązujące
regulacje prawne nakazują przeciwdziałanie
nadmiernym zakłóceniom i spowolnienie
zboczy jest jedną z moż-
liwości. Podczas pracy na
płytce uniwersalnej nie
będzie miało to jednak
znaczenia. Rezultat dzia-
łania spowalniania poka-
zano na
rysunku 13
.
Sygnał wyjściowy na
porcie I/O może pocho-
dzić z linii product term,
linii GTS lub można na
stałe wymusić stan logiczny 1 lub 0. Te
dwie ostatnie opcje będą użyteczne przy
pierwszym kontakcie z płytką prototypową,
gdyż pozwolą w prosty sposób włączyć np.
diodę i tym samym określić, czy układ CPLD
pracuje prawidłowo i daje się programować.
Dla układów wyposażonych w 72 lub mniej
makrokomórek przewidziano dwie linie GTS,
a dla zawierających 144 lub więcej makroko-
mórek – cztery. Każdy z tych sygnałów może
być lokalnie zanegowany, co prowadzi do
zwiększenia elastyczności projektu.
Każdy z bloków I/O umożliwia progra-
mowe dołączenie wybranego pinu do masy.
Pozwala to ustawić porty w stan niski, co może
zapewnić lepszą pracę układu. Podciąganie
do masy jest realizowane przez wewnętrzną
logikę, która wymusza stan niski niezależnie
od sygnału pochodzącego z makrokomórki.
Logika wewnętrzna makrokomórki jest w tym
wypadku ignorowana.
Układy z rodziny XC9500XL zosta-
ły wyposażone w obwody podtrzymujące
stan wyjściowy portów. Funkcja ta elimi-
Rys. 13
Rys. 14
Elektronika dla Wszystkich
Luty 2009
35
35
  [ Pobierz całość w formacie PDF ]
  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • lemansa.htw.pl