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ę

checksyntax wyświetla bardzo dużo błędów w moim kodzie

Moderatorzy: Jacek Bogusz, Moderatorzy

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

checksyntax wyświetla bardzo dużo błędów w moim kodzie

Postautor: anderson20 » 6 sty 2009, o 19:28

Chociaż z mojego punktu widzenia znajomości vhdla wszystko powinno być ok. Nie będę zamieszczał całęgo kodu, bo ma około 250 linijek ale fragmenty.
Błędy:
1.)

Kod: Zaznacz cały

elsif((ster = 3)and(ind=0)and(start=1))then
can not have such operands in this context.
Jak to poprawić?
2.)

Kod: Zaznacz cały

type tablica is array (1 to 6435; 1 to 15) of integer;
parse error, unexpected TYPE
Jak wobec tego zadeklarować tablicę 2 wymiarową w której liczby są typu integer jak tak nie można???
3.)
Deklaruje sygnały wewnętrzne w architekturze:

Kod: Zaznacz cały

architecture arch of bincombgen is begin type tablica is array (1 to 6435; 1 to 15) of integer; --100 wierszy i 10 kolumn -- 6435 to maksymalna liczba mozliwosci wylosowania 7 oraz 8 liczb z puli 15 i jest to najszerszy -- przypadek w naszym problemie jaki moze byc type tablica2 is array (1 to 15) of integer; signal A: tablica2; signal K: tablica; signal ster, ind, s, MAX, n, k, w, z: integer;
Niestety vhdl nie widzi deklaracji tych sygnałów, bo wyświetlają potem błędy przy używaniu tych sygnałów:
Undefined symbol 'ster' czy undefined symbol 'MAX' itd.
Sygnały te używam w procesach np.

Kod: Zaznacz cały

P4: process(ster) begin if((ster = 2)and(start=1))then ind <= k; end if; ster <= 3; end process P4;
Co ciekawe do sygnałów zadeklarowanych podczas deklaracji entity np. 'start' nie wyświetla check syntax żadnych błędów tylko do wszystkich wewnętrznych. Co jest nie tak?
4.)
oraz jeszcze jedno pytanie, kolega mi coś mówił, że nie mozna w proceach dawać np. instrukcji takiej:

Kod: Zaznacz cały

for i in ind to k loop A(i) <= s; end loop;
gdzie i to zmienna a A, s, k, ind to sygnały, bo dla fora można dawać tylko stałe wartości liczbowe. Czy ma rację?

tg3a
-
-
Posty: 243
Rejestracja: 26 maja 2008, o 19:46
Lokalizacja: Warszawa

Postautor: tg3a » 6 sty 2009, o 23:32

Witam.
Ja bardzo przepraszam osoby, które się znają na rzeczy, że się odezwę, bo VHDL-a nie znam ani ciut-ciut. Ale ogólnie w językach programowania bywa tak, że błąd siedzi wcześniej, i parser (analizator składni) jest to w stanie stwierdzić dopiero dalej, gdy już mamy przykładowo następny wiersz z całkowicie poprawnym kodem. Dlatego prezentacja samego wiersza, na którym parser zareagował, jest moim zdaniem niewystarczająca.
Stawiam bardzo ostrożnie hipotezę, że może sytuacja taka wystąpiła przykładowo w 2) przy deklaracji tablicy - może parser nieoczekiwanie napotkał słowo kluczowe "TYPE", podczas, gdy poprzednia deklaracja czy instrukcja (czy cokolwiek innego) nie została zakończona, lub zawiera jakiś błąd.
Dalszych porad niech udzielają Koledzy znający VHDL.
Pozdrawiam

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

Postautor: anderson20 » 7 sty 2009, o 01:11

znaczy na bank te parsery powstały przy tych fragmentach, linijkach co wyżej bo okienko takie na dole jest i sie pokazuje coś w stylu linijka 68 parser error itd. Także jeśli o to chodzi to no nie trzeba całego kodu pokazywać, no ale no dobra zamieszcze.

Kod: Zaznacz cały

library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; ---- Uncomment the following library declaration if instantiating ---- any Xilinx primitives in this code. --library UNISIM; --use UNISIM.VComponents.all; entity gener_komb is port(START: in bit; n_binarne: in bit_vector(3 downto 0); k_binarne: in bit_vector(3 downto 0); EOC: out bit :='0'; LED: out STD_LOGIC_VECTOR (6 downto 0) ); end gener_komb; architecture arch of gener_komb is begin type tablica is array (1 to 6435; 1 to 15) of integer; --100 wierszy i 10 kolumn -- 6435 to maksymalna liczba mozliwosci wylosowania 7 oraz 8 liczb z puli 15 i jest to najszerszy -- przypadek w naszym problemie jaki moze byc type tablica2 is array (1 to 15) of integer; signal A: tablica2; signal K: tablica; signal ster, ind, s, MAX, n, k, w, z: integer; P0: process(start) begin if (start = 1) then ster <= 0; end if; end process P0; P1: process(ster) variable n_temp, k_temp: integer; begin if((ster = 0)and(start=1))then case n_binarne is when "0000" => n_temp:= 0; when "0001" => n_temp:= 1; when "0010" => n_temp:= 2; when "0011" => n_temp:= 3; when "0100" => n_temp:= 4; when "0101" => n_temp:= 5; when "0110" => n_temp:= 6; when "0111" => n_temp:= 7; when "1000" => n_temp:= 8; when "1001" => n_temp:= 9; when "1010" => n_temp:= 10; when "1011" => n_temp:= 11; when "1100" => n_temp:= 12; when "1101" => n_temp:= 13; when "1110" => n_temp:= 14; when "1111" => n_temp:= 15; end case; n <= n_temp; case k_binarne is when "0000" => k_temp:= 0; when "0001" => k_temp:= 1; when "0010" => k_temp:= 2; when "0011" => k_temp:= 3; when "0100" => k_temp:= 4; when "0101" => k_temp:= 5; when "0110" => k_temp:= 6; when "0111" => k_temp:= 7; when "1000" => k_temp:= 8; when "1001" => k_temp:= 9; when "1010" => k_temp:= 10; when "1011" => k_temp:= 11; when "1100" => k_temp:= 12; when "1101" => k_temp:= 13; when "1110" => k_temp:= 14; when "1111" => k_temp:= 15; end case; k <= k_temp; ind <= 1; s <= 1; MAX <= n_temp-k_temp+1; ster <= 1; end if; end process P1; --w procesie P2 równolegle jest wykonywana pętla for P2: process(ster) variable i: integer; begin if((ster=1)and(start=1))then for i in ind to k loop A(i) <= s; end loop; s <= A(ind)+1; ster <= 2; end if; end process P2; -- wykonanie procesów P3 i P4 równolegle względem siebie (w procesie P3 równolegle jest wykonywana pętla for) P3: process(ster) variable i: integer; begin if((ster = 2)and(start=1))then for i in 1 to k loop K(1,i) <= A(i)+i-1; end loop; end if; w <= 1; ster <= 3; end process P3; P4: process(ster) begin if((ster = 2)and(start=1))then ind <= k; end if; ster <= 3; end process P4; -- P5 intrukcja 5.1 P5: process(ster) variable i: integer; begin if((ster = 3)and(ind>0)and(start=1))then for i in ind to k loop A(i) <= s; end loop; ster <= 4; elsif((ster = 3)and(ind=0)and(start=1))then ster <= 5; MAX <= w; -- aby nie deklarowac nowej zmiennej wykorzystamy sygnal MAX jako przechowalnie informacji o ilosci kombinacji w <= 1; z <= 1; EOF <= '1'; end if; end process P5; -- P6 i P7 są wykonywane równolegle -- P6 instrukcja 5.2.1 P6: process(ster) variable i: integer; variable w_temp: integer; begin if((ster = 4)and(ind>0)and(start=1))then w_temp := w + 1; w <= w_temp; for i in 1 to k loop K(w_temp,i):=A(i)+i-1; end loop; end if; ster <= 3; end process P6; -- P7 instrukcja 5.2.2 P7: process(ster) variable i: integer; variable ind_temp: integer; begin if((ster = 4)and(ind>0)and(start=1))then if(A(ind)<MAX) then s <= A(ind)+1; ind <= k; else ind_temp := ind-1; ind <= ind_temp; s <= A(ind_temp)+1; end if; end if; ster <= 3; end process P7; P8: process(ster,z) begin if((ster=5)and(start=1))then if(w<MAX) then if(z<k) then -- podlaczenie segmentow wyswietlacza -- do kolejnych bitow zmiennej LED -- 0 -- --- -- 5 | | 1 -- --- <- 6 -- 4 | | 2 -- --- -- 3 case k(w,z) is when "1" => LED_temp:="1111001"; --1 when "2" => LED_temp:="0100100"; --2 when "3" => LED_temp:="0110000"; --3 when "4" => LED_temp:="0011001"; --4 when "5" => LED_temp:="0010010"; --5 when "6" => LED_temp:="0000010"; --6 when "7" => LED_temp:="1111000"; --7 when "8" => LED_temp:="0000000"; --8 when "9" => LED_temp:="0010000"; --9 when "10" => LED_temp:="0001000"; --A when "11" => LED_temp:="0000011"; --b when "12" => LED_temp:="1000110"; --C when "13" => LED_temp:="0100001"; --d when "14" => LED_temp:="0000110"; --E when "15" => LED_temp:="0001110"; --F when others => LED_temp:="1000000" ;--0 end case; LED <= LED_temp; z <= z+1; elsif w <= w+1; z <= 1; LED <= "1011111"; end if; end if; end if; wait 1s; end process P8; end arch;
Przy okazji w tym kodzie zakładam, że jak do 2 różnych sygnałów w obrębie 1 procesu przypisuję jakąś wartość to zakładam, że przypisanie następuje w sposób RÓWNOLEGŁY do tych 2 sygnałów (to tak na marginesie jakby ktoś czytał i się zastanawiał czemu mam komentarz że równolegle jak jego zdaniem szeregowo). No ale moim zdaniem równolegle, bo sygnały przecież po zakończeniu procesu są dopiero uaktualniane a nie w trakcie więc stąd wnioskuję że musi to następować równolegle.

rafszym
-
-
Posty: 44
Rejestracja: 4 gru 2007, o 12:39
Lokalizacja: Warszawa

Postautor: rafszym » 7 sty 2009, o 19:52

heja, co do błędów to proponuję:

ad. 1) powinno być

Kod: Zaznacz cały

... (start='1') ...
ad. 2) w nawiasie powinien być przecinek a nie średnik
ad. 3) w złym miejscu jest begin po architecture, mianowicie wszelakie deklaracje typów, sygnałów, itp. zapisujemy po architecture a przed begin, zatem wystarczy zmienić miejsce słowa kluczowego begin, czyli powinno byc przed procesem P0
ad. 4) moim zdaniem można, najważniejsze aby taki zapis akceptował kompilator, bo standard vhdla jest zdefiniowany przez IEEE ale nie wszystkie kompilatory są z nim zgodne w 100%

ponadto w procesie P8 piwinno być else zamiast elsif, chyba że zapomniałeś dopisać warunku dla elsif.

pzdr.

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

Postautor: anderson20 » 7 sty 2009, o 21:00

Bardzo mi pomogłeś, teraz jedynie wyświetlają mi się 2 typy błędów:
1.)np.

Kod: Zaznacz cały

if((ster = '2')and(start='1'))then
can not have such operands in this context.
2.) pisze do prawie keżdego wewnętrznego sygnału w procesach, że np.
Signal ster has a multi source. np w procesie P1

oraz jeszcze 1 mały problemik, do waita w ostatnim procesie pisze:
parse error, unexpected INTEGER_LITERAL, expecting SEMICOLON
i tu rozumiem, bo w procesach które mają liste czułości to nie można w nich zamieszczać instrukcji wait, to jak wobec tego wprowadzić opóźnienie, aby ostatni proces, który de facto wywołuje sam siebie kilkadziesiąt razy to żeby pomiędzy każdym wywołaniem było opóźnienie 1 s?

Awatar użytkownika
pajaczek
Moderator
Moderator
Posty: 2650
Rejestracja: 24 sty 2005, o 00:39
Lokalizacja: Winny gród

Postautor: pajaczek » 8 sty 2009, o 15:23

oraz jeszcze 1 mały problemik, do waita w ostatnim procesie pisze:
parse error, unexpected INTEGER_LITERAL, expecting SEMICOLON
Nie ma czegoś takiego jak wait 1s w modelu układu, konstrukcja "wait czas" jest możliwa wyłącznie przy realizacji testowania i symulacji (do generowania sygnałów testowych).
Poza tym "wait for 1s".
Jeśli Ci zależy by wykonanie było raz na jakiś czas, pozostaje zrobienie licznika/timera, i wykorzystanie konstrukcji "wait on/until (sygnal)".
Signal ster has a multi source. np w procesie P1
Nie chce mi się przeglądać całego kodu, ale czy aby ster nie jest zmieniane w 2 innych procesach??

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

Postautor: anderson20 » 8 sty 2009, o 16:55

tak, jest zmieniane w 2 a nawet więcej innych procesach.

rafszym
-
-
Posty: 44
Rejestracja: 4 gru 2007, o 12:39
Lokalizacja: Warszawa

Postautor: rafszym » 8 sty 2009, o 18:53

heja,

zatem ad. 1) powinno byc

Kod: Zaznacz cały

if((ster = 2)and(start='1'))then
, ponieważ ster jest typu integer i dlatego nie piszemy w cudzysłowie!
ad. 2) "signal ... has multi source" wynika to stąd, że dany sygnał jest sterowany (podstawiana jego wartość) z kilku miejsc RÓWNOLEGLE! w kodzie vhdla, jest to często popełniany błąd, który wymaga innego projektowania (pisania) w vhdlu, moim zdaniem należy dopisać układ sterujący wykonywaniem sekwencyjnym poszczególnych procesów. zwykle eliminacja takiego błędu jest możliwa tylko przez zaprojektowanie innego układu albo dopisania wykluczającychh się podstawień tego zamego sygnału.
ad. 3) jak napisał "robaczek" wait jak i wszystkie inne słowa kluczowe dotyczące opóźnień są tylko do modelowania testbenczów. układ fpga/cpld to takie pole z rozrzuconymi bramkami i przerzutnikami, a program projektowy na podstawie kodu vhdla wymyśla jak to połączyć. zatem skąd ma wiedzieć jak uzystać 1 sekundę? :611:

pzdr.

Awatar użytkownika
pajaczek
Moderator
Moderator
Posty: 2650
Rejestracja: 24 sty 2005, o 00:39
Lokalizacja: Winny gród

Postautor: pajaczek » 8 sty 2009, o 22:30

Ja Ci kurcze dam robaczka... poczekaj no...

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

Postautor: anderson20 » 14 sty 2009, o 20:31

aha czyli chodzi o to, że nie można podstawiać w kliku procesach do tego samego sygnału mimo iż procesy niekoniecznie musza wykonywac się względems siebie równolegle, bo damy instrukcję if wewnątrz procesu i warunek równoległości w ten sposób eliminujemy. To mimo tego i tak wyświetla błąd. Niestety w moim przypadku nie da się dać wszystkiego do 1 procesu. Jak wobec tego napisać program sterujący sekwencyjnym wykonywaniem procesów????
bo robiłem to przez deklarację sygnału wewnętrznego w ten obrazowy sposób:
architecture
signal ster: integer

P1: process(ster)
if(ster=1)
...
end process P1;
P2: process(ster)
if(ster=2)
...
end process P2;
P3: process(ster)
if(ster=3)
...
end process P3;
...
itd.
end architecture
No i niestety pojawia się mnóstwo błędów odnośnie różnych sygnałów typu:
signal .... has a multi source.
Obecnie tylko te błędy się pojawiają.

Strasznie mnie to denerwuje, że jakieś konowały co tworzyły język vhdl nie stworzyły tak, żeby program sprawdzał również równoległość w procesach czy występują jakieś if-y odnośnie tego samego sygnału. A nie konowały stworzyły tak, że jak występują conajmniej 2 procesy i jest w nich użyte przypisywanie do tego samego sygnału to już nie przechodzi kompilacji:
SIGNAL HAS MULTI SOURCE
mimo, że w rzeczywistości by mogło działać. I teraz wszyscy muszą się na świecie męczyć z tym, bo jakimś pajacom co dużą za to kasę wzięli się nie chciało pomęczyć.

rafszym
-
-
Posty: 44
Rejestracja: 4 gru 2007, o 12:39
Lokalizacja: Warszawa

Postautor: rafszym » 16 sty 2009, o 12:29

heja,
lepiej opisz na forum zasadę działania to coś się pokombinuje...
a multi source wzięło się stąd, że w jedną dziurę na raz nie wsadzisz więcej niż jednego ...tasa :611:
pzdr.

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

Postautor: anderson20 » 18 sty 2009, o 12:42

To ma być równoległy generator kombinacji, ale według pewnego algorytmu napisanego w pseudokodzie (ja sam mam nie wymyślać tego równoległego generatora tylko zaimplementować to co poniżej):

Kod: Zaznacz cały

MAX=n-k+1; ind=1; s=1; //poniższa instrukcja for ma być wykonana równolegle for(i=ind;i<=k;i++) A(i)=s; //koniec wykonywania równolegle s=A(ind)+1; //ponownie wykonuj równolegle instrukcje for for(i=1;i<=k;i++) K(i)=A(i)+i-1; // koniec równoległości z tym, że również ma być tu druga równoległość a mianowicie razem z równoległym przypisywaniem w for ma się wykonać poniższa instrukcja: ind=k; //koniec równoległości while ind>0 do { //poniższa instrukcja for ma być wykonana równolegle for(i=ind;i<=k;i++) A(i)=s; //koniec wykonywania równolegle //ponownie wykonuj równolegle instrukcje for for(i=1;i<=k;i++) K(i)=A(i)+i-1; // koniec równoległości z tym, że również ma być tu druga równoległość a mianowicie razem z równoległym przypisywaniem w for ma się wykonać poniższa instrukcja: if A(ind)<MAX then s=A(ind)+1; ind=k; else ind=ind-1; s = A(ind)+1 //koniec równoległości }
W wyniku tego algorytmu takie coś mamy np. dla kombinacji n=6 k=3 (bez powtórzeń):
ind s A K
1 1 111 123
3 2 112 124
3 3 113 125
3 4 114 126
2 2 122 134
itd.
czyli K zawiera tą tablice właściwą z kombinacjami.
Dlatego musze mieć kilka procesów w architekturze i sterować nimi które z nich mają się równolegle wykonywać, które szeregowo i właśnie steruję zmienną wewnętrzną co widac z mojego kodu:

Kod: Zaznacz cały

library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; ---- Uncomment the following library declaration if instantiating ---- any Xilinx primitives in this code. --library UNISIM; --use UNISIM.VComponents.all; entity bincombgen is generic( n: integer :=6; --max 15,jesli chce sie wiecej trzeba odpowiednio zwiekszyc zakres nowo zdefiniowanych w programie typow danych k: integer :=3 ); port(CLK: in std_logic; START: in bit; EOC: out bit :='0'; LED: out STD_LOGIC_VECTOR (6 downto 0) ); end bincombgen; architecture arch of bincombgen is type tablica is array (1 to 6435, 1 to 15) of integer; type tablica2 is array (1 to 15) of integer; signal A: tablica2; signal Kt: tablica; signal ster, ind, s, MAX, w, z, ster2, ster3, czekaj, sekunda: integer; begin -- P0: process(start) -- begin -- if (start = '1') then -- ster <= 0; -- end if; -- end process P0; ---w tym procesie inicjujemy ind=1,MAX=n-k+1 oraz s=1 P1: process(ster) begin if(start='1')then if(ster = 0)then ind <= 1; MAX <= n-k+1; s <= 1; ster <= 1; end if; end if; end process P1; --w procesie P2 rownolegle jest wykonywana instrukcja przypisania s do zmiennej tablicowej A --po wykonaniu powyzszej rownoleglej instrukcji wykonywane jest przypisanie s=A(ind)+1 P2: process(ster) variable i: integer; variable A_temp: tablica2; begin if(start='1')then if(ster = 1)then for i in ind to k loop A_temp(i) := s; end loop; A <= A_temp; s <= A_temp(ind)+1; ster <= 2; end if; end if; end process P2; -- wykonanie procesów P3 i P4 równolegle względem siebie (w procesie P3 równolegle jest wykonywane przypisanie do tablicy K P3: process(ster) variable i: integer; begin if(start='1')then if(ster = 2)then for i in 1 to k loop Kt(1,i) <= A(i)+i-1; end loop; w<=1; ster <= 3; end if; end if; end process P3; P4: process(ster) begin if(start='1')then if(ster=2)then ind <= k; ster2 <= 1; end if; end if; end process P4; -- P5 intrukcja 5.1 P5: process(ster,ster2,ster3) variable i: integer; variable A_temp: tablica2; begin if(start='1')then if(((ster=3)and(ster2=1))or((ster2=2)and(ster3=2)))then if(ind>0)then for i in ind to k loop A_temp(i) := s; end loop; A <= A_temp; ster2 <= 3; ster3 <= 3; elsif(ind=0)then MAX <= w; -- aby nie deklarowac nowego sygnalu wykorzystamy sygnal MAX jako przechowalnie informacji o ilosci kombinacji w <= 1; z <= 1; EOC <= '1'; ster <= 4; end if; end if; end if; end process P5; -- P6 i P7 są wykonywane równolegle -- P6 instrukcja 5.2.1 P6: process(ster2) variable i: integer; variable w_temp: integer; begin if(start='1')then if(ster2=3)then if(ind>0)then w_temp := w + 1; w <= w_temp; for i in 1 to k loop Kt(w_temp,i)<=A(i)+i-1; end loop; ster2 <= 2; end if; end if; end if; end process P6; -- P7 instrukcja 5.2.2 P7: process(ster2) variable i: integer; variable ind_temp: integer; begin if(start='1')then if(ster2 = 3)then if(ind>0)then if(A(ind)<MAX) then s <= A(ind)+1; ind <= k; else ind_temp := ind-1; ind <= ind_temp; s <= A(ind_temp)+1; end if; ster3 <= 2; end if; end if; end if; end process P7; P8: process(ster,z,sekunda,clk) variable LED_temp: STD_LOGIC_VECTOR (6 downto 0); begin if(sekunda=0)then if((clk'event)and(clk='1'))then czekaj <= czekaj+1; end if; if(czekaj=100000)then sekunda <= 1; czekaj <= 0; end if; end if; if((ster=4)and(start='1')and(sekunda=1))then if(w<=MAX) then if(z<=k) then -- podlaczenie segmentow wyswietlacza -- do kolejnych bitow zmiennej LED -- 0 -- --- -- 5 | | 1 -- --- <- 6 -- 4 | | 2 -- --- -- 3 case Kt(w,z) is when 1 => LED_temp:="1111001"; --1 when 2 => LED_temp:="0100100"; --2 when 3 => LED_temp:="0110000"; --3 when 4 => LED_temp:="0011001"; --4 when 5 => LED_temp:="0010010"; --5 when 6 => LED_temp:="0000010"; --6 when 7 => LED_temp:="1111000"; --7 when 8 => LED_temp:="0000000"; --8 when 9 => LED_temp:="0010000"; --9 when 10 => LED_temp:="0001000"; --A when 11 => LED_temp:="0000011"; --b when 12 => LED_temp:="1000110"; --C when 13 => LED_temp:="0100001"; --d when 14 => LED_temp:="0000110"; --E when 15 => LED_temp:="0001110"; --F when others => LED_temp:="1000000" ;--0 end case; LED <= LED_temp; z <= z+1; sekunda <= 0; else w <= w+1; z <= 1; LED <= "1011111"; end if; end if; end if; end process P8; end arch;
EOC jest to wyjście które się nie pali jak następuje proces generowania kombinacji, a które jak się zapali to świadczy to o tym, że jest koniec generacji kombinacji. No i dużo błędów wyskakuje że signal has a multi source. Inne błędy nie wyskakują już.

rafszym
-
-
Posty: 44
Rejestracja: 4 gru 2007, o 12:39
Lokalizacja: Warszawa

Postautor: rafszym » 20 sty 2009, o 11:14

heja,
fajnie, teraz wiemy o co chodzi. no to pomyślmy...
jakie wartościa (zakres) mogą mieć zmienne n i k?
nie zgadza mi się coś w opisie algorytmu: w pętli while, w części if A(ind)<MAX then... występuje dwa razy to samo czyli s=A(ind)+1?
pozdr.

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

Postautor: anderson20 » 21 sty 2009, o 23:01

tak 2 razy tam występuje w tym algorytmie s=A(ind)+1. Jak warunek jest spełniony i jak warunek nie jest spełniony to mamy ind=ind-1 i s=A(ind)+1 potem.
Zakres n i k no tak do 20 nie więcej.

W każdym bądź razie wydaje mi się że poprawnie przeniosłem na vhdla, tylko jak wyeliminowac ten błąd podczas kompilacji signal has multi source. Bo niestety muszę w różnych procesach przypisywać do tych samych sygnałów wartości, aby iść zgodnie z algorytmem tylko xlinx nie rozumie, że nie następuje równoległe przypisywanie, bo mam warunki if(ster=1,2,3,4,5,itd).

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

Postautor: anderson20 » 27 sty 2009, o 00:39

widze że mega trudny problem, nie wiem co zrobić.

rafszym
-
-
Posty: 44
Rejestracja: 4 gru 2007, o 12:39
Lokalizacja: Warszawa

Postautor: rafszym » 27 sty 2009, o 14:33

heja,

check syntax działa, gorzej z kompilacją, dlatego zwlekałem... ale kod jest taki dla opisanego algorytmu:

Kod: Zaznacz cały

library IEEE; use IEEE.STD_LOGIC_1164.ALL; --use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; use IEEE.NUMERIC_STD.ALL; entity gener_komb is port( START: in std_logic; n_bin: in std_logic_vector(3 downto 0); k_bin: in std_logic_vector(3 downto 0); EOF: out std_logic :='0'; LED: out std_logic_vector(6 downto 0) ); end gener_komb; architecture Beh of gener_komb is -- type tablica1 is array (1 to 6435, 1 to 15) of integer; --100 wierszy i 10 kolumn -- 6435 to maksymalna liczba mozliwosci wylosowania 7 oraz 8 liczb z puli 15 i jest to najszerszy -- przypadek w naszym problemie jaki moze byc type tablica1 is array (1 to 6435) of integer range 0 to 31; type tablica2 is array (1 to 15) of integer range 0 to 31 ; signal A: tablica2; signal K: tablica1; signal ster, ind, s, n, kRS, w, z: integer; signal MAX : std_logic_vector(3 downto 0); begin MAX<=n_bin-k_bin+1; process(START) variable A_var : tablica2; variable K_var : tablica1; variable s_var : integer; begin IF START='0' THEN -- WARUNKI POCZATKOWE for i in 1 to TO_INTEGER(unsigned(k_bin)) loop -- ind=1 A_var(i):=1; -- bo s=1 na poczatku end loop; s_var:=A_var(ind)+1; -- nowa wartosc s=2 for i in 1 to TO_INTEGER(unsigned(k_bin)) loop K_var(i):=A_var(i)+i-1; end loop; A<=A_var; K<=K_var; s<=s_var; ind<=TO_INTEGER(unsigned(k_bin)); ELSE -- GLOWNA PETLA if ind>0 then for i in 1 to ind-1 loop A_var(i):=A(i); end loop; for i in ind to TO_INTEGER(unsigned(k_bin)) loop A_var(i):=s; end loop; for i in 1 to TO_INTEGER(unsigned(k_bin)) loop K_var(i):=A_var(i)+i-1; end loop; if A_var(ind)<MAX then ind<=TO_INTEGER(unsigned(k_bin)); else ind<=ind-1; end if; A<=A_var; K<=K_var; s<=A_var(ind)-1; end if; END IF; end process; end;

pzdr.

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

Postautor: anderson20 » 30 sty 2009, o 15:42

ok sprawdze, dzięki. Jeszcze do głowy mi przyszedł automat stanu, żeby zrobić i w ten sposób sterować sobie procesami bo już trzeba by to oddać. Jutro będę z tym walczył, jak zrobię to zamieszczę kod.

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

Postautor: anderson20 » 1 lut 2009, o 19:45

jak w tym beznadziejnym języku zapisać tablicę jednowymiarową mającą 15 elementów do tablicy dwuwymiarowej składającej się z np. 10 tablic 15 wymiarowych.
Niech np.:
X - tablica 1-wymiarowa
K - tablica 2-wymiarowa

Powinno jakoś tak się dać:
K(4)=X;
czyli po tej operacji powinniśmy mieć:
K(4,1)=X(1), K(4,2)=X(2), ..., K(4,15)=X(15)
a wywala błąd.
Jak takie coś zrobić????
Bo bez tego nie da rady zapamiętać wszystkich kombinacji. W sumie można by i w jednej tablicy jakby K było jednowymiarową tablicą ze 150 elementów. Ale ładniej by wyglądał w dwuwymiarowej zapis...

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

Postautor: anderson20 » 1 lut 2009, o 22:30

Mój program, który przeszedł check syntax i powinien działać włącznie z pokazywaniem kombinacji na wyswietlaczu (co sekundę nowa pozycja w kombinacji się wyświetlać powinna):

Kod: Zaznacz cały

library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; ---- Uncomment the following library declaration if instantiating ---- any Xilinx primitives in this code. --library UNISIM; --use UNISIM.VComponents.all; entity bincombgen is generic( n_calk: integer :=6; k_calk: integer :=3 ); port(CLK: in std_logic; START: in bit; EOC: out bit; LED: out STD_LOGIC_VECTOR (6 downto 0) ); end bincombgen; architecture arch of bincombgen is type tablica is array (1 to 6435, 1 to k_calk) of integer; type tablica2 is array (1 to k_calk) of integer; signal present_state, next_state: integer range 1 to 7; signal A: tablica2; signal K: tablica; signal ster, ind, s, MAX, w, z, czekaj, sekunda, il_komb, reset: integer; begin zegar: process(clk,reset) is begin if(reset=0)then sekunda <= reset; czekaj <= 0; end if; if(reset=1)then if((clk'event)and(clk='1'))then czekaj <= czekaj+1; end if; if(czekaj=100000)then sekunda <= 1; czekaj <= 0; end if; end if; end process zegar; takt: process (next_state) is begin present_state <= next_state; end process takt; main: process(start,present_state,sekunda) variable i, ind_temp: integer; variable A_temp: tablica2; variable ilosc_komb: integer; variable LED_temp: STD_LOGIC_VECTOR (6 downto 0); begin if(start = '1')then case present_state is when 1 => ind <= 1; MAX <= n_calk-k_calk+1; s <= 1; next_state <= 2; when 2 => for i in 1 to k_calk loop A_temp(i) := s; end loop; A <= A_temp; s <= A_temp(ind)+1; --nowa wartość s<=2 next_state <= 3; when 3 => for i in 1 to k_calk loop K(1,i) <= A(i)+i-1; --mamy 1 kombinację umieszczoną w tablicy end loop; ind <= k_calk; ilosc_komb:=1; next_state <= 4; when 4 => if(ind>0)then for i in ind to k_calk loop A_temp(i) := s; end loop; A <= A_temp; next_state <= 5; else EOC <= '1'; next_state <= 6; reset <= 1; w <= 1; z <= 1; end if; when 5 => for i in 1 to k_calk loop K(1+il_komb,i) <= A(i)+i-1; --mamy nastepne kombinacje umieszczoną w tablicy end loop; ilosc_komb := ilosc_komb+1; il_komb <= ilosc_komb; if(A(ind)<MAX) then s <= A(ind)+1; ind <= k_calk; else ind_temp := ind-1; ind <= ind_temp; s <= A(ind_temp)+1; end if; next_state <= 4; when 6 => if(sekunda=1)then if(w<=il_komb) then if(z<=k_calk) then -- podlaczenie segmentow wyswietlacza -- do kolejnych bitow zmiennej LED -- 0 -- --- -- 5 | | 1 -- --- <- 6 -- 4 | | 2 -- --- -- 3 case K(w,z) is when 1 => LED_temp:="1111001"; --1 when 2 => LED_temp:="0100100"; --2 when 3 => LED_temp:="0110000"; --3 when 4 => LED_temp:="0011001"; --4 when 5 => LED_temp:="0010010"; --5 when 6 => LED_temp:="0000010"; --6 when 7 => LED_temp:="1111000"; --7 when 8 => LED_temp:="0000000"; --8 when 9 => LED_temp:="0010000"; --9 when 10 => LED_temp:="0001000"; --A when 11 => LED_temp:="0000011"; --b when 12 => LED_temp:="1000110"; --C when 13 => LED_temp:="0100001"; --d when 14 => LED_temp:="0000110"; --E when 15 => LED_temp:="0001110"; --F when others => LED_temp:="1000000" ;--0 end case; LED <= LED_temp; z <= z+1; else w <= w+1; z <= 1; LED <= "1011111"; end if; end if; next_state <= 7; end if; when 7 => next_state <=6; reset<=0; when others => next_state <= 1; EOC <= '0'; ilosc_komb:=0; reset <= 0; end case; else -- jesli start=0; next_state <= 1; EOC <= '0'; ilosc_komb:=0; reset <= 0; end if; end process main; end arch;


ale
jak mam pętle jakąś np.:
for i ind zmienna to druga_zmienna loop
cośtam

to mi wywala podczas Generate post-synthesis simulation model błąd:
range bound must be a constant.

Własnie coś kolega z uczelni mi kiedyś pieprzył że nie można dawać zmiennych na warunek poczatkowy w pętli for no i miał rację. To jak to obejść. Czy po prostu nie da się napisac tego algorytmu w vhdlu i tyle, nie ma jeszcze takiej techniki??????

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

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

Ceść,

sprawa wygląda tak, jeśli mamy jakąś pętle to liczba jej powtórzeń musi być sprecyzowana konkretnie, ponieważ to nie jest zwykła pętla jak w c++ która się ileś razy wykonuje. Pętla for w układzie FPGA po jego zaprogramowaniu N razy rozmieszcza logikę (to co jest w pętli for) w układzie i nie może być ona już wtedy zmieniana.

Można to jednak w pewien sposób obejść przez stosowanie poleceń końca pętli po spełnieniu warunku, przykład:

Kod: Zaznacz cały

F0: for i in 1 to 100 loop K(1+il_komb,i) <= A(i)+i-1; exit F0 when (i >= k_calk); end loop F0;
przy czym zakładam ze k_calk maksymalnie będzie miało 100;

I w taki sposób można obejść wszelkie problemy z pętlami for, trzeba jeszcze przy tym pamiętać jak zachowuje się taka pętla i co ona tak naprawdę robi.

Pozdrawiam

Edit: Code.
Ostatnio zmieniony 5 lut 2009, o 13:26 przez Piotr Czak, łącznie zmieniany 1 raz.

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 21 gości