Aktyw Forum

Zarejestruj się na forum.ep.com.pl i zgłoś swój akces do Aktywu Forum. Jeśli jesteś już zarejestrowany wystarczy, że się zalogujesz.

Sprawdź punkty Zarejestruj się

Problem z implementacją w VHDLu

Moderatorzy: Jacek Bogusz, Moderatorzy

anderson20
-
-
Posty: 26
Rejestracja: 15 gru 2008, o 14:07
Lokalizacja: Poznań

Problem z implementacją w VHDLu

Postautor: anderson20 » 15 gru 2008, o 14:19

Jak w VHDLu zaimplementować RÓWNOLEGLE takie coś (zaimplementowałem szeregowo, ale nie umiem równolegle a muszę :( ) :

Kod: Zaznacz cały

P1: process(s) if (s = 2) then for i in 0 to k loop A(i) <= s; end loop; end if; end process P1;
gdzie A(i) to sygnał wewnętrzny (zadeklarowany na początku architektury) typu: type tablica is array (10 downto 1) of integer
s to jakiś też sygnał wewnętrzny, który się zmienia w trakcie wykonywania programu i jak dojdzie do 2 to żeby mi się przypisywanie w sposób równoległy wykonywało:
A(i) <= s

k_binarnie to zmienna wejściowa deklarowana na początku jednostki projektowej entity i w programie mam zamienianie k_binarnie na k, które jest typu integer.

Czyli pdosumowując jak ten mój program który jest szeregowy zamienić by był wykonywany równolegle?

bartekgajos
-
-
Posty: 57
Rejestracja: 10 lis 2006, o 11:50
Lokalizacja: Gdansk

Postautor: bartekgajos » 16 gru 2008, o 10:42

Witam

Kod: Zaznacz cały

Entity ABC is generic( K : integer := 10 ); port( S : in std_logic_vector(1 downto 0); A : out std_logic_vector(K-1 downto 0) ); architecture RTL of ABC is begin P1: process(S) variable X : std_logic_vector(K-1 downto 0); begin for I in 0 to K-1 loop begin if S=2 then X[I]:=S; end if; end loop; A<=X; end process; end RTL;
Nawet nie wiem czy zadziała bo S powinno być bitem a nie wektorem ( na pewno )
Ale zamiana na równoległę wykonywanie polega na wprowadzeniu zmiennej wewnątrz procesu.

Pozdrawiam
bartek

Edit: Proszę zacząć używać znacznika

Kod: Zaznacz cały

. Pajączek.[/color]
Ostatnio zmieniony 16 gru 2008, o 12:44 przez bartekgajos, łącznie zmieniany 1 raz.

anderson20
-
-
Posty: 26
Rejestracja: 15 gru 2008, o 14:07
Lokalizacja: Poznań

Postautor: anderson20 » 16 gru 2008, o 21:13

Moim zdaniem to co zrobiłeś w procesie P1 to się wykonuje SZEREGOWO, nie równolegle bo w procesie wszystkie instrukcje wykonują się względem siebie szeregowo (sekwencyjnie) oprócz instrukcji przypisania do SYGNAŁÓW! Wpadłem na to jak przeczytałem Twój kod. Czyli w Twoim przypadku jak X nie jest zmienną a sygnałem to wtedy równolegle to co napisałeś się wykona.

Czyli ten kod poniżej wykonuje się RÓWNOLEGLE jak A jest SYGNAŁEM a jak A jest ZMIENNĄ to szeregowo:

Kod: Zaznacz cały

P1: process(s) if (s = 2) then for i in 0 to k loop A(i) <= s; end loop; end if; end process P1;
Mam rację czy się mylę? Bo gdzieś czytałem o tym, że sygnał przyjmuje nową wartość dopiero po zakończeniu procesu a zmienna od razu.

Czyli podsumowując te 2 kody poniżej są sobie równoważne?

Kod: Zaznacz cały

architektura a <- 2 b <- 3 end architektura oraz architektura process a <- 2 b <- 3 end process end architektura
gdzie a i b to sygnały

anderson20
-
-
Posty: 26
Rejestracja: 15 gru 2008, o 14:07
Lokalizacja: Poznań

Postautor: anderson20 » 16 gru 2008, o 21:32

czyli doszedłem do tego, że to co napisałem w pierwszym poście to jest równolegle a nie szeregowo!

anderson20
-
-
Posty: 26
Rejestracja: 15 gru 2008, o 14:07
Lokalizacja: Poznań

Postautor: anderson20 » 17 gru 2008, o 13:45

Kto się zna na vhdlu to byłbym wdzięczny jakby napisał czy mam racje czy nie mam bo nie mam skąd się dowiedzieć.

bartekgajos
-
-
Posty: 57
Rejestracja: 10 lis 2006, o 11:50
Lokalizacja: Gdansk

Postautor: bartekgajos » 17 gru 2008, o 20:25

Zadeklaruj sobie zmienną wewnątrz procesu, sprawdz to pogadamy.

poza tym wszysko w FPGA lub PLD jest sygnałem ( w VHDL są używane zmienne żeby sie lepiej programowało ).

pozdrawiam
Bartek

anderson20
-
-
Posty: 26
Rejestracja: 15 gru 2008, o 14:07
Lokalizacja: Poznań

Postautor: anderson20 » 18 gru 2008, o 00:06

nie no, operacje na zmiennych wewnątrz procesu wykonywane są sekwencyjnie. Więc na bank instrukcja for wypełnia zmienną sekwencyjnie a nie równolegle. Równolegle natomiast następuje w Twoim przypadku przypisywanie zmiennej do sygnału tam na końcu, to fakt, ale to takie sztuczne obejście problemu, tak nie mogę zrobić. Czy jak od razu instrukcją for przypiszę do sygnału wartości to to jest RóWNOLEGLE?

Piotr Czak
-
-
Posty: 22
Rejestracja: 1 lut 2009, o 20:07
Lokalizacja: Wejherowo

Postautor: Piotr Czak » 3 lut 2009, o 20:10

Cześć

nie wiem czy to nie za późno na odpowiedź, którą może już znasz, ale jeśli nie to:

we wszelkich procesach przypisanie zachodzi sekwencyjni czyli jedno po drugim, ważne jest natomiast kiedy takie przypisanie następuje do portu do signal a kiedy do variable.
Do variable przypisanie następuje natychmiast gdy jest w kodzie, czyli
A := 0;
B := 0;
A := 3;
B := A;

to B będzie równać się 3.
natomiast przypisanie do portu lub do signal'a następuje dopiero przy wyjściu z procesu który jest uruchamiany przez zmianę sygnału podanego w liście czułości, czyli
zakładamy, że A = 0 i B = 0;
A <= 1;
B <= A;

to A = 1 a B = 0 ponieważ w momencie przypisania sygnał A = 0; czyli jednoznacznie wynika; że przypisanie jest równoległe.

Oczywiście do dokładnego zapoznania się z tym mechanizmem najlepsza będzie symulacja.

możesz jeszcze zrobić tak:
G1 : for i in 0 to k GENERATE
A(i) <= s when (s = 2) else A(i);
end GENERATE G1;

z tym, że nie mam jak tego rozwiązania teraz sprawdzić najwcześniej jutro jak znajdę czas.

Pozdrawiam

Wróć do „PLD/FPGA i inne zagadnienia techniki cyfrowej”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 88 gości