| Author |
Message
|
Szef_FBI Poziom 14

Joined: 28 Jun 2005 Posts: 163 Location: Jelenia Góra
|
#1
13 Dec 2011 12:21 VHDL - Połączenie komponentów - port map |
|
|
|
Witam serdecznie.
Wykonałem projekt kodera/dekodera kodu liniowego Hamminga 7,4 w VHDL.
Cały projekt był jednym modułem, co nie podobało się prowadzącemu, więc zgodnie z zasadami projektowania, chcę teraz podzielić mój projekt na moduły.
Wygladałoby to tak:
Top.vhd - odpowiada za wczytanie danych -> wysłanie ich do modułu koder/dekoder, a następnie odebranie gotowych danych i wyrzucenie ich na fizyczny port
Koder.vhd - moduł kodera
Dekoder.vhd - moduł dekodera
Poniżej zamieszczam spis portów dla modułów kodera i dekodera.
Całego kodu nie ma chyba sensu prezentować, wszystko działa jak należy :D
entity Koder is Port ( clk : in STD_LOGIC;-- Sygnał zegarowy reset : in STD_LOGIC;-- Reset wczytaj_dane : in STD_LOGIC;-- Przycisk uruchamiajacy wczytywanie danych dane_we_koder : in STD_LOGIC_VECTOR (0 to 3);-- Wektor wejsciowy dla kodera ( 4 bity ) dane_wy_koder : out STD_LOGIC_VECTOR (0 to 6)); -- Wektor wyjsciowy po zakodowaniu ( 7 bitow ) end Koder; architecture Behavioral of Koder is signal dane_we_k : STD_LOGIC_VECTOR(0 to 3):= (others => '0'); -- Sygnal danych wejsciowych dla kodera signal dane_wy_k : STD_LOGIC_VECTOR(0 to 6):= (others => '0'); -- Sygnal danych wyjsciowych kodera signal temp_k : STD_LOGIC_VECTOR(0 to 3):= (others => '0'); -- Wektor tymczasowy do wykonywania operacji XOR
entity Dekoder is Port ( clk : in STD_LOGIC;-- Sygnał zegarowy reset : in STD_LOGIC;-- Reset wczytaj_dane : in STD_LOGIC;-- Przycisk uruchamiajacy wczytywanie danych wyjscie_bledu : out STD_LOGIC;-- Wyjscie na ktorym pojawia sie komunikat o bledzie odebranego wektora (1) dane_we_dekoder : in STD_LOGIC_VECTOR (0 to 6); -- Wektor wejsciowy dla dekodera ( 7 bitow ) dane_wy_dekoder : out STD_LOGIC_VECTOR (0 to 3));-- Wektor wyjsciowy po zdekodowaniu ( 4 bitoy ) end Dekoder; architecture Behavioral of Dekoder is signal dane_we_d : STD_LOGIC_VECTOR(0 to 6):= (others => '0'); -- Sygnal danych wejsciowych dla dekodera signal dane_wy_d : STD_LOGIC_VECTOR(0 to 3):= (others => '0'); -- Sygnal danych wyjsciowych dekodera signal temp_d : STD_LOGIC_VECTOR(0 to 6):= (others => '0'); -- Wektor tymczasowy do wykonywania operacji XOR signal syndrom : STD_LOGIC_VECTOR(0 to 2):= (others => '0'); -- Wektor z syndromem signal blad : integer range 0 to 8 :=8 ; -- Sygnal bledu dekodowania ( przenoszony na wyjscie fizyczne )
Poniżej znajduje się proces wczytywania danych, jak widać dane były wczytywane z portu na sygnał wewnętrzny.
wczytywanie_danych : process (wczytaj_dane, reset, dane_we_koder, dane_we_dekoder)-- Proces realizujacy rejestr wejsciowy pierwszego stopnia begin if reset = '1' then dane_we_k <= (others => '0');-- Zeruj dane wejsciowe po nacisnieciu reset dane_we_d <= (others => '0'); elsif wczytaj_dane = '1' then dane_we_k <= dane_we_koder;-- Wprowadz dane wejsciowe dane_we_d <= dane_we_dekoder; end if; end process;
No i teraz rodzi się moje pytanie, jak wykonać mapowanie portów, aby funkcja wczytywania danych była w module Top i przenosiła dane wejściowe do poszczególnych modułów, a na koniec dane wyjściowe wracały do modułu Top na porty wyjścia?
|
|
| Back to top |
|
 |
lss Poziom 17

Joined: 14 Dec 2008 Posts: 352 Location: Warszawa
|
#2
13 Dec 2011 13:55 Re: VHDL - Połączenie komponentów - port map |
|
|
|
Przecierze sam prawie zapisałeś to co ci trzeba. Skorzystaj z tego http://pl.wikibooks.org/wiki/VHDL/Przykłady_kodu jest tu pokazany bardzo prosto jak mapować. Na pewno zrozumiesz jak nie to pisz będziemy tłumaczyć.
|
|
| Back to top |
|
 |
Google

|
#
13 Dec 2011 13:55 |
|
|
|
|
|
| Back to top |
|
 |
Szef_FBI Poziom 14

Joined: 28 Jun 2005 Posts: 163 Location: Jelenia Góra
|
#3
13 Dec 2011 14:00 Re: VHDL - Połączenie komponentów - port map |
|
|
|
Czytałem już ten opis i o ile przy takich prostych bramkach wszystko łapię, to przy moim problemie robi się to już zbyt skomplikowane (mapowanie jest w 2 strony przecież).
W sumie to sam już nie wiem, czy subkomponenty mam dodawać do Top, czy odwrotnie...
Używam funkcji "View HDL Instantiation Template" z ISE.
|
|
| Back to top |
|
 |
lss Poziom 17

Joined: 14 Dec 2008 Posts: 352 Location: Warszawa
|
#4
13 Dec 2011 14:27 Re: VHDL - Połączenie komponentów - port map |
|
|
|
a jaka jest relacja miedzy dekoderem a koderem oraz jakie maja byc I/O w topie
|
|
| Back to top |
|
 |
Szef_FBI Poziom 14

Joined: 28 Jun 2005 Posts: 163 Location: Jelenia Góra
|
#5
13 Dec 2011 14:37 Re: VHDL - Połączenie komponentów - port map |
|
|
|
Między koderem i dekoderem nie ma żadnych relacji. Tak jak przedstawiłem to na obrazku.
W Topie chcę żeby były wejścia/wyjścia fizyczne (porty) dla kodera/dekodera, port błędu dekodera i cały proces wczytywania danych.
|
|
| Back to top |
|
 |
Google

|
#
13 Dec 2011 14:37 |
|
|
|
|
|
| Back to top |
|
 |
lss Poziom 17

Joined: 14 Dec 2008 Posts: 352 Location: Warszawa
|
#6
13 Dec 2011 22:54 Re: VHDL - Połączenie komponentów - port map |
|
|
|
Tworzysz sobie topa
entity top is Port ( clk : in STD_LOGIC;-- Sygnał zegarowy reset : in STD_LOGIC;-- Reset wczytaj_dane : in STD_LOGIC;-- Przycisk uruchamiajacy wczytywanie danych dane_we_koder : in STD_LOGIC_VECTOR (0 to 3);-- Wektor wejsciowy dla kodera ( 4 bity ) dane_we_dekodera : in STD_LOGIC_VECTOR (0 to 6);-- Wektor wejsciowy dla kodera ( 4 bity ) wyjscie_bledu : out STD_LOGIC; dane_wy_koder : out STD_LOGIC_VECTOR (0 to 6); dane_wy_dekoder : out STD_LOGIC_VECTOR (0 to 3)); end top; Mając top zadeklarowany tworzysz sobie tak jak Tobie pokazałem w przykładzie z bramką komponenty które będziesz łączył czy z nich korzystał
component Koder is Port ( clk : in STD_LOGIC;-- Sygnał zegarowy reset : in STD_LOGIC;-- Reset wczytaj_dane : in STD_LOGIC;-- Przycisk uruchamiajacy wczytywanie danych dane_we_koder : in STD_LOGIC_VECTOR (0 to 3);-- Wektor wejsciowy dla kodera ( 4 bity ) dane_wy_koder : out STD_LOGIC_VECTOR (0 to 6)); -- Wektor wyjsciowy po zakodowaniu ( 7 bitow ) end component Koder; component Dekoder is Port ( clk : in STD_LOGIC;-- Sygnał zegarowy reset : in STD_LOGIC;-- Reset wczytaj_dane : in STD_LOGIC;-- Przycisk uruchamiajacy wczytywanie danych wyjscie_bledu : out STD_LOGIC;-- Wyjscie na ktorym pojawia sie komunikat o bledzie odebranego wektora (1) dane_we_dekoder : in STD_LOGIC_VECTOR (0 to 6); -- Wektor wejsciowy dla dekodera ( 7 bitow ) dane_wy_dekoder : out STD_LOGIC_VECTOR (0 to 3));-- Wektor wyjsciowy po zdekodowaniu ( 4 bitoy ) end component Dekoder; Następnie deklarujesz sobie sygnały, rejestry które wykorzystasz sobie do łączenia komponentów czy do wprowadzenia do nich danych, przetrzymania etc.
signal wczytaj_dane_we: STD_LOGIC; signal dane_we_k: STD_LOGIC_VECTOR (0 to 3); signal dane_wy_k: STD_LOGIC_VECTOR (0 to 6); signal dane_we_d: STD_LOGIC_VECTOR (0 to 6); signal dane_wy_d: STD_LOGIC_VECTOR (0 to 3);
I tworzysz relacje zgodnie z tym prostym przykładem na podstawie bramki mapujemy komponenty.
Koder_Hamminga: port map ( clk => clk, reset => reset, wczytaj_dane => wczytaj_dane_we, dane_we_koder=> dane_we_k, dane_wy_koder=>dane_wy_k, Dekoder_Hamminga: port map ( clk => clk, reset => reset, wczytaj_dane => wczytaj_dane_we, dane_we_dekoder=> dane_we_d, dane_wy_dekoder=>dane_wy_d,
Mając podłączone komponenty do do topa teraz trzeba zrobić relacje aby wysyłać i odbierać dane z tych sub komponentów.
wczytywanie_danych : process (wczytaj_dane, clk,reset, dane_we_koder, dane_we_dekoder)-- Proces realizujacy rejestr wejsciowy pierwszego stopnia begin if rising_edge(clk) then if (reset = '1' )then dane_we_k <= (others => '0'); dane_wy_k <= (others => '0'); dane_we_d <= (others => '0'); dane_wy_d <= (others => '0'); elsif (wczytaj_dane = '1') then dane_we_k <= dane_we_koder;-- Wprowadz dane wejsciowe dane_we_d <= dane_we_dekoder; end if; end if; end process; dane_wy_koder <= dane_we_k; dane_wy_dekoder <= dane_wy_d;
Tak na szybko stworzyłem bez kompilatora można to uprościć ale chciałem abyś miał to uwidocznione. Podstawa rzecz rysuj sobie takie rzeczy na kartce a potem je przepisuj na kod to jest najwygodniejsza sprawa a jak nie to wygeneruj sobie komponenty do schematic'ka i połącz je za pomocą "rysunków" i już.
Pzdr.
|
|
| Back to top |
|
 |
Szef_FBI Poziom 14

Joined: 28 Jun 2005 Posts: 163 Location: Jelenia Góra
|
#7
13 Dec 2011 23:22 Re: VHDL - Połączenie komponentów - port map |
|
|
|
No i nie działa, wysypało się spektakularnie ;)
ok, już działa, problem był w tym że dodałeś zerowanie wyjść, a tym steruje inny proces...
Wychodzi, że nie jest to do końca połączone...
|
|
| Back to top |
|
 |
lss Poziom 17

Joined: 14 Dec 2008 Posts: 352 Location: Warszawa
|
#8
14 Dec 2011 09:09 Re: VHDL - Połączenie komponentów - port map |
|
|
|
Zmień na to:
Koder_Hamminga: port map ( clk => clk, reset => reset, wczytaj_dane => wczytaj_dane_we, dane_we_koder=> dane_we_koder, dane_wy_koder=>dane_wy_k, Dekoder_Hamminga: port map ( clk => clk, reset => reset, wczytaj_dane => wczytaj_dane_we, wyjscie_bledu =>wyjscie_bledu, dane_we_dekoder=> dane_we_dekoder, dane_wy_dekoder=>dane_wy_dekoder,
|
|
| Back to top |
|
 |
Google

|
#
14 Dec 2011 09:09 |
|
|
|
|
|
| Back to top |
|
 |
Szef_FBI Poziom 14

Joined: 28 Jun 2005 Posts: 163 Location: Jelenia Góra
|
#9
14 Dec 2011 11:42 Re: VHDL - Połączenie komponentów - port map |
|
|
|
Tak już też kombinowałem...
|
|
| Back to top |
|
 |
tymon_x Poziom 20

Joined: 17 Jun 2010 Posts: 814 Location: Gdańsk
|
#10
14 Dec 2011 22:55 Re: VHDL - Połączenie komponentów - port map |
|
|
|
wczytywanie_danych : process (wczytaj_dane, clk,reset, dane_we_koder, dane_we_dekoder)-- Proces realizujacy rejestr wejsciowy pierwszego stopnia begin if rising_edge(clk) then if (reset = '1' )then dane_we_k <= (others => '0'); dane_wy_k <= (others => '0'); dane_we_d <= (others => '0'); dane_wy_d <= (others => '0'); elsif (wczytaj_dane = '1') then dane_we_k <= dane_we_koder;-- Wprowadz dane wejsciowe dane_we_d <= dane_we_dekoder; end if; end if; end process;
Zagadka, co się stanie kiedy ani reset oraz wczytaj_dane nie będą miały wartości jeden ? I podawaj zawsze towarzyszące problemowi warningi...
|
|
| Back to top |
|
 |
Szef_FBI Poziom 14

Joined: 28 Jun 2005 Posts: 163 Location: Jelenia Góra
|
#11
14 Dec 2011 23:32 Re: VHDL - Połączenie komponentów - port map |
|
|
|
Skoro kompilator nie wymagał instrukcji else, to przypuszczam że nic się nie stanie :)
|
|
| Back to top |
|
 |
Szef_FBI Poziom 14

Joined: 28 Jun 2005 Posts: 163 Location: Jelenia Góra
|
#12
15 Dec 2011 14:14 Re: VHDL - Połączenie komponentów - port map |
|
|
|
Problem rozwiązany, może trochę metodą "na piechotę", ale ważne że działa :)
Bardzo pomocny okazał się kolega lss, serdeczne dzięki :D
|
|
| Back to top |
|
 |