VHDL Zalecenia


Technika Cyfrowa i Mikroprocesory
Język opisu sprzętu VHDL
Zalecenia projektowe, przykłady.
dr inż. Krzysztof Kołek
Materiały wyłącznie dla potrzeb wykładu  Układy cyfrowe oraz mikroprocesory II/III rok RA wydział EAIiE AGH.
Inne wykorzystanie bez zgody autora zabronione.
1
Plan
" Użycie sygnałów a użycie zmiennych
" Pipelining
" Zalecenia dotyczące praktycznej implementacji w
języku VHDL
" Przykłady projektów w języku VHDL
 Generator PWM
 Kolejka FIFO
" Podsumowanie
" Literatura
2
Przykłady implementacji
(użycie sygnałów)
Library IEEE;
use IEEE.std_logic_1164.all;
entity xor_sig is
port (A, B, C: in STD_LOGIC;
X, Y: out STD_LOGIC);
end xor_sig;
architecture SIG_ARCH of xor_sig is
signal D: STD_LOGIC;
begin
SIG:process (A,B,C)
begin
D <= A; -- ignored !!
X <= C xor D;
D <= B; -- overrides !!
Y <= C xor D;
end process;
end SIG_ARCH;
3
Przykłady implementacji
(użycie zmiennych)
Library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_unsigned.all;
entity xor_var is
port (A, B, C: in STD_LOGIC;
X, Y: out STD_LOGIC);
end xor_var;
architecture VAR_ARCH of xor_var is
begin
VAR:process (A,B,C)
variable D: STD_LOGIC;
begin
D := A;
X <= C xor D;
D := B;
Y <= C xor D;
end process;
end VAR_ARCH;
4
Pipelining
" Pipelining  zmiana długich ścieżek sygnału zawierających wiele niezależnych stopni
logiki na niezależne fragmenty wykonywane w poszczególnych cyklach zegara
" Zwiększona przepustowość kosztem zwiększonego czasu przepływu danych
Zegar taktujący
Pobranie 1 Etap I 1 Etap II 1 Gen. wyników 1 Pobranie 2 Etap I 2 Etap II 2 Gen. wyników 2
Zegar taktujący
Pobranie 1 Pobranie 2 Pobranie 3 Pobranie 4
Etap I 1 Etap I 2 Etap I 3 Etap I 4
Etap II 1 Etap II 2 Etap II 3 Etap II 4
Gen. wyników 1 Gen. wyników 2 Gen. wyników 3 Gen. wyników 4
5
Zalecenia dotyczące praktycznej implementacji
" Definicja języka VHDL zawiera konstrukcje, które nie są wspierane przez
konkretne implementacje języka lub nie są w ogólnym przypadku możliwe do
zsyntezowania układu cyfrowego; częściowo są to konstrukcje
wykorzystywane podczas symulacji
" Instrukcje wait for xx ns; oraz Q<= 0 after xx ns; mogą być wykorzystywane
wyłącznie do symulacji i nie są syntezowalne do postaci komponentu.
ODLICZANIE CZASU MYSI BYĆ REALIZOWANE POPRZEZ
POBUDZANE SYGNAAEM ZEGAROWYM LICZNIKI
" Grupowanie funkcji arytmetycznych może wpłynąć na syntezę; np.
ADD <= A1 + A2 + A3 + A4;
ADD <= (A1 + A2) + (A3 + A4);
w pierwszym przypadku powoduje użycie 3 kaskadowo połączonych
sumatorów, a w drugim przypadku 2 sumatory równoległe A1+A2 oraz
A3+A4 zsumowane trzecim sumatorem. Takie zachowania zależne są jednak
od konkretnej implementacji języka (algorytmów syntezy)
6
Zalecenia dotyczące praktycznej implementacji
" Każda instrukcja if jest kodowana jako enkoder priorytetowy. Zagnieżdżanie
instrukcji if zwiększa zajętość zasobów oraz zwiększa opóznienia. Nadmierne
zagnieżdżanie powinno być unikane i w miarę możliwości zastępowane
instrukcją case. Instrukcja case nie koduje warunków priorytetowo.
" Rejestry typu Latch tworzone są na skutek występowania niekompletnych
wyrażeń warunkowych
LATCH: process (GATE, DATA)
begin
if (GATE =  1 ) then
Q <= DATA;
end if;
end process;
Rejestr flop-flop typu D generowany jest za pomocą:
MY_D_REG: process (CLK, DATA)
begin
if (CLK event and CLK= 1 ) then
Q <= DATA;
end if;
end process;
7
Zalecenia dotyczące praktycznej implementacji
" Tradycyjnie stany w maszynie FSM koduje się w sposób binarny. Jest to
uzasadnione w przypadku układów PAL posiadających duże zasoby logiki
kombinacyjnej. W układach FPGA, posiadających duże zasoby przerzutników
oraz stosunkowo limitowane zasoby generatorów funkcyjnych, lepsze wyniki
daje kodowanie metodą  one-hot . Dla FPGA tylko małe maszyny FSM 9do 8
stanów) są efektywnie kodowane w sposób binarny
" Multipleksery mogą być efektywnie zastępowane przez bufory trójstanowe.
Posiada to następujące zalety:
 zmiana wielkości minimalnie wpływa na rozmiar i opóznienia
 liczba wejść może być bardzo duża
 kodowane wejść metodą  one-hot
" Projekt może zawierać specyfikacje maksymalnych opóznień dla danego
zbioru ścieżek. Ścieżka musi mieć wyspecyfikowany punkt początkowy i
końcowy. Punkty te mogą być: przerzutnikami, pinami I/O, przerzutnikami
IOB lub pamięciami
" Narzędzie Floorplanner umożliwia rozlokowanie elementów projektu w
układzie scalonym  szczególnie fragmentów krytycznych czasowo.
8
Zalecenia dotyczące praktycznej implementacji
" Współdzielenie umożliwia redukcję zasobów implementacji:
P1: process (A1,B1,C1,D1,COND_1)
begin
if (COND_1= 1 ) then
Z1 <= A1 + B1;
else
Z1 <= C1 + D1;
end if;
end process;
P2: process (A1,B1,C1,D1,COND_1)
variable Arg1, Arg2 :
std_logic_vector(A1 range);
begin
if (COND_1= 1 ) then
Arg1 := A1; Arg2 := C1;
else
Arg1 := B1; Arg2 := D1;
end if;
Z1 <= Arg1 + Arg2;
end process;
9
Zalecenia dotyczące praktycznej implementacji
" Zaleca się wykorzystywanie elementów bibliotecznych  są wykonane w
sposób optymalny dla danej docelowej architektury sprzętowej
" Układy FPGA firmy XILINX zawierają rejestry z wejściami ustawiającymi
oraz zerującymi
FF_ASR_CLOCK_ENABLE: process (ENABLE, RESET, SET, CLOCK)
begin
if (RESET = '1') then
E_Q_OUT <= "00000000";
elsif (SET = '1') then
E_Q_OUT <= "11111111";
elsif (CLOCK'event and CLOCK='1') then
if (ENABLE='1') then
E_Q_OUT <= D_IN;
end if;
end if;
end process;
10
Zalecenia dotyczące praktycznej implementacji
" Zaleca się stosowanie globalnych sygnałów zegarowych jako wejść
zegarowych przerzutników; jeżeli nie jest to możliwe i sygnał zegarowy
tworzony jest jako funkcja innych sygnałów wykorzystuje się sygnały Clock
Enable CE
GATECLK <= (IN1 and IN2 and CLK); ENABLE <= IN1 and IN2 and LOAD;
GATE_PR: process (GATECLK,DATA,LOAD) EN_PR: process (ENABLE,DATA,CLOCK)
begin begin
if (GATECLK event and GATECLK= 1 ) then if (CLOCK event and CLOCK= 1 ) then
if (LOAD= 1 ) then if (ENABLE= 1 ) then
OUT1 <= DATA; DOUT <= DATA;
end if; end if;
end if; end if;
end process; end process;
11
PRZYKAAD 1: Generator PWM
" PWM (Pulse Width Modulation) oznacza sygnał o zmiennym współczynniku
wypełnienia (Duty Cycle); istotna również częstotliwość sygnału PWM
DC = 60% DC = 20%
" Sygnały PWM powszechnie stosowane np. do sterowania silnikami prądu
stałego DC; zaletą niewielkie rozpraszanie mocy na elementach sterujących
+Vz
+Vz
B
A
-
+
Uin
B
A
GND
-Vz
12
Generator PWM - sterowanie silnikiem prądu stałego
S terowanie - napiecie na s ilniku S terowanie - napiecie na s ilniku - 1Hz
30 60
20 40
10 20
0 0
0 1 2 3 4 5 6 7 8 9 10 0 1 2 3 4 5 6 7 8 9 10
P redkos c obrotowa P redkos c obrotowa
20 40
15 30
10 20
5 10
0 0
0 1 2 3 4 5 6 7 8 9 10 0 1 2 3 4 5 6 7 8 9 10
Czas [s ] Czas [s ]
S terowanie - napiecie na s ilniku - 10Hz
S terowanie - napiecie na s ilniku - 100Hz
60
60
40
40
20
20
0
0
0 1 2 3 4 5 6 7 8 9 10
0 1 2 3 4 5 6 7 8 9 10
P redkos c obrotowa
P redkos c obrotowa
25
20
20
15
15
10
10
5
5
0
0
0 1 2 3 4 5 6 7 8 9 10
0 1 2 3 4 5 6 7 8 9 10
Czas [s ]
Czas [s ]
13
Generator PWM
" Generator sygnału PWM posiada swoją rozdzielczość; rozdzielczość określa
na ile części podzielony jest okres sygnału (ile zawiera kwantów) i jest zwykle
określana w bitach
" Czas trwania pojedynczego kwantu określa okres sygnału i jest
wielokrotnością pewnej częstotliwości podstawowej
Częstotliwość podstawowa
Częstotliwość kwantu
Sygnał PWM (DC = 12.5%)
" Generując sygnał PWM należy ustalić częstotliwość kwantu oraz
współczynnik wypełnienia tj. ile okresów kwantu w ciągu całego okresu
sygnału PWM sygnał jest równy jedynce logicznej
14
Generator PWM
" Sformułowanie zadania: zbudować w języku VHDL w postaci modułu
generator PWM o rozdzielczościach 8 oraz 12-bitowej oraz o zmiennej
częstotliwości pracy
" Definicja tablicy typu rekordowego zawierającego stan generatora (definicja
wykonana np. w pakiecie rt_dac_pci_package)
constant NoOfPWM: INTEGER := 4;
type PWM_STATE_REC is record
MODE : std_logic; -- 8/12 bit mode
PREDIVIDER : std_logic_vector(15 downto 0); -- predivider value
WIDTH : std_logic_vector(11 downto 0); -- 'H' state length
end record;
type PWM_STATE_ARR is array (NoOfPWM-1 downto 0) of PWM_STATE_REC;
15
Generator PWM  definicja modułu
" Definicja modułu generatora PWM
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
library work;
use work.rt_dac_pci_package.ALL;
entity rt_dac_pci_pwm is
Port ( CLK : in std_logic; -- Excitation clock signal
STATE : in PWM_STATE_REC; -- PWM state record
PWM : inout std_logic); -- Output wave
end rt_dac_pci_pwm;
architecture Behavioral_PWM of rt_dac_pci_pwm is
16
Generator PWM  definicja modułu c.d.
procedure PWM_GENERATE_WAVE ( signal MODE : in STD_LOGIC;
signal PREDIVIDER : in STD_LOGIC_VECTOR(15 downto 0);
signal P_COUNTER : inout STD_LOGIC_VECTOR(15 downto 0);
signal WIDTH : in STD_LOGIC_VECTOR(11 downto 0);
variable COUNTER : inout STD_LOGIC_VECTOR(11 downto 0);
variable WAVE : out STD_LOGIC ) is
begin
if P_COUNTER < PREDIVIDER then P_COUNTER <= P_COUNTER + 1;
else
P_COUNTER <= x"0000";
COUNTER := COUNTER + 1;
if MODE = '0' then -- 8-bit PWM mode
if COUNTER(7 downto 0) = x"FF" then COUNTER(7 downto 0) := x"00";
end if;
if COUNTER(7 downto 0) < WIDTH(7 downto 0) then WAVE := '1';
else WAVE := '0';
end if;
else -- 12-bit PWM mode
if COUNTER = x"FFF" then COUNTER := x"000";
end if;
if COUNTER < WIDTH then WAVE := '1';
else WAVE := '0';
end if;
end if;
end if;
end;
17
Generator PWM  definicja modułu c.d.
-- Local PWM signals: predivider counter and quants counter
signal PWM_P_COUNTER : STD_LOGIC_VECTOR(15 downto 0);
signal PWM_COUNTER : STD_LOGIC_VECTOR(11 downto 0);
begin
PWM_PROCESS: process( CLK )
variable PWM_VAR : STD_LOGIC;
variable PWM_COUNTER_VAR : STD_LOGIC_VECTOR(11 downto 0);
begin
if rising_edge( CLK ) then
PWM_VAR := PWM;
PWM_COUNTER_VAR := PWM_COUNTER;
PWM_GENERATE_WAVE ( STATE.MODE, STATE.PREDIVIDER, PWM_P_COUNTER,
STATE.WIDTH, PWM_COUNTER_VAR, PWM_VAR );
PWM <= PWM_VAR;
PWM_COUNTER <= PWM_COUNTER_VAR;
end if;
end process;
end Behavioral_PWM;
18
Generator PWM
" Definicja sygnałów
signal PWM_STATE : PWM_STATE_ARR;
signal PWM : STD_LOGIC_VECTOR (NoOfPWM-1 downto 0);
"  Instancjonowanie bloków generatorów PWM
PWM_BLOCKS: for I in 0 to NoOfPWM-1 generate
PWM_BLOCK: rt_dac_pci_pwm port map(
CLK => CLK,
STATE => PWM_STATE(I),
PWM => PWM(I) );
end generate;
19
PRZYKAAD 2: Kolejka FIFO
" Sformułowanie zadania: utworzyć moduł implementujący kolejkę FIFO (ang.
First In First Out) o strukturze 1024 x 48 bitów; zapewnić możliwość
monitorowania stanu kolejki (pusta/pełna) oraz generowania przerwania po
opróżnieniu kolejki powyżej zadanego poziomu
" FIFO  bufor danych o określonej organizacji; możliwy zapis oraz odczyt
danych z bufora; odczyt danych w takiej kolejności w jakiej wykonywany był
zapis
" Struktura danych użyteczna w przypadku producenta oraz konsumenta danych
pracujących asynchronicznie względem siebie
" Przykładem wykorzystania może być generator sygnałów analogowych o
dowolnym określanym przez komputer kształcie; komputer wpisuje dane do
kolejki FIFO; automat generatora odczytuje dane z kolejki oraz steruje
przetwornikami C/A wytwarzającymi napięcie wyjściowe; opróżnienie kolejki
w określonym stopniu powoduje generację przerwania w odpowiedzi na które
komputer uzupełnia dane w kolejce; jest to sposób na uniknięcie tzw. jittering
(nierównomierne pojawianie się w czasie generowanych danych)
20
Kolejka FIFO
" Dane zapisuje się do tzw. głowy (ang. head) kolejki; odczytuje z ogona (ang.
tail) kolejki
" Realizacja w postaci bufora cyklicznego
" Poniższe rysunki przedstawiają rozrastanie się oraz skracanie kolejki w miarę
wykonywania operacji zapisu oraz odczytu
Tail
Tail
Head
Head
Head
Tail
21
Kolejka FIFO  sekcja entity modułu
" Sekcja entity ma postać:
entity FIFO is
Port ( WR : in std_logic;
RD : in std_logic;
IN_DATA : in std_logic_vector(47 downto 0);
RESET : in std_logic;
INTR_TRESHOLD : in std_logic_vector( 9 downto 0);
FULL : inout std_logic;
EMPTY : inout std_logic;
OUT_DATA : out std_logic_vector(47 downto 0);
LENGTH : inout std_logic_vector( 9 downto 0);
TAIL : inout std_logic_vector( 9 downto 0);
HEAD : inout std_logic_vector( 9 downto 0);
INTR : out std_logic
);
end FIFO;
" WR, RD - strob zapisu i odczytu (aktywne zbocze 0->1); nieaktywny stan '1'
" IN_DATA, OUT_DATA  wejściowe i wyjściowe dane kolejki FIFO
" RESET - ustawienie kolejki w stan początkowy (kolejka pusta) (aktywny stan  1 )
" INTR_TRESHOLD  minimalna liczba elementów w kolejce generująca przerwanie
" FULL, EMPTY  sygnały całkowitego zapełnienia oraz opróżnienia FIFO (aktywne  1 )
" LENGTH  liczba zapisanych i jeszcze nie odczytanych elementów w kolejce
" TAIL, HEAD  pozycja ogona i głowy kolejki
" INTR  sygnał generacji przerwania (aktywny  1 )
22
Kolejka FIFO  realizacja bufora
" Do realizacji bufora wykorzystana zostanie pamięć dwuportowa; port A wykorzystany
zostanie do zapisu danych a port B do odczytu danych z kolejki; wykorzystany zostanie
blok RAMB4_S4_S4
component RAMB4_S4_S4
port (
ADDRA : in std_logic_vector (9 downto 0);
DIA : in std_logic_vector (3 downto 0);
DOA : out std_logic_vector (3 downto 0);
CLKA : in std_logic; -- 0->1 enables all operations
ENA : in std_logic; -- 1 enables chip access
WEA : in std_logic; -- 0-read, 1-write
RSTA : in std_logic; -- 1-reset data cell, 0-normal operation
ADDRB : in std_logic_vector (9 downto 0);
DIB : in std_logic_vector (3 downto 0);
DOB : out std_logic_vector (3 downto 0);
CLKB : in std_logic;
ENB : in std_logic;
WEB : in std_logic;
RSTB : in std_logic
);
end component;
23
Kolejka FIFO  realizacja bufora
" Nie występują konflikty w dostępie do pamięci dwuportowej  nigdy nie ma
jednoczesnego zapisu/odczytu z tego samego adresu (głowa i ogon posiadają odmienne
adresy)
" Pamięć o organizacji 1024 x 48 powstaje przez wykorzystanie 12 bloków
RAMB4_S4_S4
Memory: for I in 0 to 11 generate
RAMB4_S48_S48 : RAMB4_S4_S4 port map (
ADDRA => HEAD,
DIA => IN_DATA(4*I+3 downto 4*I),
DOA => open,
CLKA => WR,
ENA => HI,
WEA => HI,
RSTA => LO,
ADDRB => TAIL,
DIB => "0000",
DOB => OUT_DATA(4*I+3 downto 4*I),
CLKB => RD,
ENB => HI,
WEB => LO,
RSTB => LO );
end generate;
24
Kolejka FIFO  implementacja
" Generacja sygnałów EMPTY, FULL, LENGTH oraz INTR
EMPTY <= '1' when (TAIL = HEAD) else '0';
FULL <= '1' when ((HEAD+1) = TAIL) else '0';
LENGTH <= HEAD - TAIL;
INTR <= '1' when (LENGTH < INTR_TRESHOLD) else '0';
" Procesy zapisu oraz odczytu połączone z zerowaniem; zmieniają tylko pozycje
głowy i ogona; zapis i odczyt realizowany przez dołączenie sygnałów do
bloków pamięci dwuportowej
WR_PROC: process( WR, RESET ) RD_PROC: process( RD, RESET )
begin begin
if rising_edge(WR) then if rising_edge(RD) then
if RESET = '1' then if RESET = '1' then
HEAD <= (others => '0'); TAIL <= (others => '0');
elsif FULL = '0' then elsif EMPTY = '0' then
HEAD <= HEAD + 1; TAIL <= TAIL + 1;
end if; end if;
end if; end if;
end process; end process;
25
System on the Chip (SoC)
Soft-processor
FPGA W.fiz.
A.szer. W.fiz.
CAN
uP
DRAM
14-bitów
RAM
Soft-processor
Bridge
uP
8-bitów
uP
RAM
16-bitów
DPRAM
W.fiz.
Ethernet
Interface
A/C
Soft-processor
C/A
FPGA  przykład zastosowania
Sterownik dwusuwowego silnika spalinowego
Fuel Engine
Valve 1 pulse Temperature
FPGA
Valve 2 pulse
Shaft position
Injection pulse
Injection pulse width [ms]
2.5
Accelarator position
Stepper motor control
2
MATLAB / Simulink
Excel / ActiveX
1.5
0 20 40 60 80 100 120
Engine velocity [RPM]
2500
2000
1500
1000
500
0
0 20 40 60 80 100 120
Time [s]
FPGA  przykład zastosowania
3D Crane
Podsumowanie
" Języki HDL służą do projektowania zachowania i struktury układów i systemów
cyfrowych (być może wkrótce również analogowych)
" OGROMNA różnica między specyfikacją języka VHDL a możliwościami
praktycznych implementacji
" Efektywne kodowanie w językach HDL wymaga wykorzystania specyficznych cech
docelowej platformy CPLD lub FPGA. Metody stosowane do projektowania ASIC nie
zawsze stosują się do FPGA. ASIC zwykle ma więcej bramek i zasobów
połączeniowych niż FPGA. Używając ASIC można stosunkowo łatwo wygenerować
efektywny kod HDL. Projektując dla FPGA JEST NIEZBDNYM utworzenie
efektywnego kodu.
" ISP  In-System Programming elastyczną technika tworzenia układów logicznych;
programowanie układów  w locie
" SoC  System on the chip  system komputerowy w pojedynczymm układzie
scalonym
" Aktualnie dostępne w Internecie bezpłatnie następujące rodzaje bloków: RS232,
Centronics, USB, PCI (?), CAN, IrDA, Ethernet, mikroprocesory (np. 8051,
Microblaze) i wiele innych
" Elastyczność oddana angielskim zwrotem  limit is the sky
" Rekonfigurowalne  procesory w komputerach PC
(RT-DAC/PCI & RT-DAC/USB)
29
Literatura
" Synthesis and Simulation Design Guide, materiały w formie PDF dostępne na
serwerze www.xilinx.com.
" ISE Quick Start Tutorial, materiały w formie PDF dostępne na serwerze
www.xilinx.com.
" ModelSim Xilinx Tutorial, materiały w formie PDF dostępne na serwerze
www.xilinx.com.
" Język VHDL w praktyce, praca zbiorowa pod redakcją J.Kalisza, WKiA,
Warszawa,2002.
" Kalisz J. Podstawy elektroniki cyfrowej, WKiA , 2002
" Auba T., Jasiński K., Zbierzchowski B.: Specjalizowane układy cyfrowe w
strukturach PLD i FPGA, WKA, Warszawa, 1997.
" Zbysiński P., Pasierbiński J.: Układy programowalne pierwsze kroki, Wydawnictwo
BTC, Warszawa, 2002.
" Skahill K: Język VHDL. Projektowanie programowalnych układów logicznych, WNT,
Warszawa, 2001.
" Wrona W: VHDL. Język opisu i projektowania układów cyfrowych, WPK, Gliwice,
1998.
" Zwoliński Marek: Projektowanie układów cyfrowych z wykorzystaniem języka
VHDL, WKiA, Warszawa, 2002.
" INTERNET !!!
30
INNE
" Pliki XNF (Xilinx Netlist File) zawierają kompletny opis połączeń wewnątrz
modułu
" Zalety języków HDL:
 podejście do projektowania dużych systemów metodą  top-down
 automatyczna konwersja do postaci RTL (rejestry+bramki)
 sprawdzanie typów
 możliwość symulacji funkcjonalnej
 możliwość testowania różnorodnych implementacji projektu
" Kompilator nie syntezuje lub optymalizuje bloków typu RPM
(Relationally Placed Modules  relacyjne makra). Są one
sklasyfikowane jako czarne skrzynki ( black box )
31


Wyszukiwarka

Podobne podstrony:
SIMULINK MATLAB to VHDL Route
Zalecenia WHO Porod nie jest choroba
eb28fb55f8914e208dbd30e388bef47508( zalecenia interpretacja Pzp
Wady postawy ciała zalecenia,
Zdrowe odżywanie zalecenia ogólne dla chorych na cukrzycę
lab1 VHDL
Zalecenia dotyczące prędkości skrawania
tut?2 sdram vhdl
SEMINARIUM zalecenia
zalecenie komisji 2003
Standardy Medyczne 14 Zalecenia ywienia
GDDKIA ZALECENIA DOTYCZĄCE STOSOWANIA GEOSYNTETYKÓW W ODWODNIENIACH DRÓG
PUP niest wyk5 VHDL[51F] v1
2008 zaleceniaUDP MRR GDOS przedsiewziecia miejskie
Zalecenia dotyczace aktywnosci ruchowej w profilaktyce chorob ukladu krazenia
Wady postawy Cwiczenia i zalecenia dla dzieci z bocznym skrzywieniem kręgosłupa

więcej podobnych podstron