Skocz do zawartości

Kurs FPGA - #6 - rejestry przesuwne w VHDL


Komentator

Pomocna odpowiedź

html_mig_img
Bramki logiczne i multipleksery, które poznaliśmy w poprzednim artykule to niezbędne podstawy. Pora poznać kolejny, nowy element układanki, którym są rejestry przesuwne.Po krótkim wstępie teoretycznym przejdziemy do implementacji jednej z wersji rejestru w VHDL.

UWAGA, to tylko wstęp! Dalsza część artykułu dostępna jest na blogu.

Przeczytaj całość »

Poniżej znajdują się komentarze powiązane z tym wpisem.

Link do komentarza
Share on other sites

marek1707, przyznam, że mam/miałem ten sam dylemat i do tej pory nie wiem, która wersja jest poprawna. Obie nazwy można znaleźć w Internecie bez problemu. Przykładowo w TME jest kategoria "Rejestry przesuwne": https://www.tme.eu/pl/katalog/rejestry-przesuwne_113431/ Jak ktoś zna jedną, słuszną wersję, to będę wdzięczny za sygnał 🙂

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

FPGA nie jest stosowalne zazwyczaj, gdyż:

-float nie istnieje w wydajnej formie, to samo się dotyczy emulowanych rdzeni np. ARM i innych,
-obliczenia całkowitoliczbowe są wydajniejsze, ale nie spotkałem jeszcze rozbudowanej biblioteki obliczeń fixed point na FPGA (na DSP udostępnia za darmo Texas Instruments),
-problemy przepływów danych,

-brak znanych mi narzędzi automatycznych do poszukiwania hazardów,
-często kończy się na średniej wydajności kosztem dużej ilości pracy,
-interlink - czy jak tam się nazywa matryca połączeń Logic Cells (2 do 8TBps) wypada o wątpliwej wydajności wzgledem łatwości oprogramowania rejestrów GPU (GTX1080ti za 3.3kPLN to 3.5k rdzeni i 7MB FPR ze sporym zakresem instrukcji jednocyklowych). Rejestry zgaduję, że mają przepływności ok. 1TBps,
-FPGA nie posiada dużej pamięci masowej o dużej przepustowości za rozsądna cenę,
-nie jestem przeciwnikiem FPGA-po prostu zrobiłem research przed straceniem ileś tam czasu,
-FPGA jako przetwornik dla GPU jest gdzieniedzie (SETI@HOME) wydajnie używane, to samo dotyczy urządzeń sieciowych,
-wypadają najlepiej jeśli chodzi o pobieraną moc - więc większość mobilnych zastosowań powinno zawierać (a o dziwo typowo nie zawiera) FPGA,

-są przydatne, żeby zrobić prototyp nowego typu urządzenia,
-nie znam się na FPGA, tak tylko podpowiadam dla osób szukających wydajności, aby zainteresowali się już posiadanymi kartami graficznymi

Link do komentarza
Share on other sites

Próbuję zrobić rejestr, w którym dane nie wracają na początek. Aby program był bardziej zwarty, użyłem pętli (choć w kursie jeszcze ich nie przerabiałem). Myślałem, że wpadłem na dobry pomysł dopisywania zer w pozostałe miejsca rejestru i użyłem takiej instrukcji:

for i in 6 downto 0 loop
rej_przesuwny <= rej_przesuwny(i downto 0) & (others => '0'); 
end loop;

Otrzymuję jednak 2 błędy:

Can not determine the "others" values in aggregate. (LRM 7.3.2.2)

Can not determine the "others" values in aggregate. (LRM 7.3.2)

Dlaczego nie mogę użyć takiej konstrukcji i czym mogę ją zastąpić?

Edit. Czy samo wykorzystanie "others" jest tutaj dobre?

Link do komentarza
Share on other sites

Czy samo wykorzystanie "others" jest tutaj dobre?

Najprościej sprawdzić to w praktyce. Spróbuj stworzyć program bez "others" i zobacz jak wtedy zadziała. Zastanawiam się jednak czy faktycznie coś sobie tą pętlą tutaj ułatwiłeś? Taki sam rejestr (bez przenoszenia wartości na początek) można uzyskać bazując na programie z kursu. Będzie to nawet chyba łatwiejsze.

Link do komentarza
Share on other sites

Domyślam się, że wystarczy przenieść zero zamiast wartości z rejestru (w wolnej chwili oczywiście przetestuję). Ale ja jestem uparty i zastanawiam się, dlaczego to "others" nie działa.

Edit: bez pętli i bez "others" działa. Ale...

Czy "others" odnosi się zawsze do wszystkich elementów wektora, czy też jak nazwa wskazuje - do pozostałych.

Link do komentarza
Share on other sites

@TheZioMeK, witam na forum 😉 Widzę, że to Twoje pierwsze kroki na Forbocie, oto najważniejsze informacje na start:

  • Chcesz przywitać się z innymi członkami naszej społeczności? Skorzystaj z tematu powitania użytkowników.
  • Opis najciekawszych funkcji, które ułatwiają korzystanie z forum znajdziesz w temacie instrukcja korzystania z forum - co warto wiedzieć?
  • Poszczególne posty możesz oceniać (pozytywnie i negatywnie) za pomocą reakcji - ikona serca w prawym dolnym rogu każdej wiadomości.

11 minut temu, TheZioMeK napisał:

Mam mały problem z działaniem układu. Wszystko działa, ale rejestr przesuwa się odwrotnie niż na gifach. Z czego to wynika? Coś się zmieniło w samej i płytce i przypisaniu diod?

Nic mi na ten temat nie wiadomo. Czy nie wykryłeś podobnych problemów podczas wcześniejszych ćwiczeń? Masz zieloną czy pomarańczową wersję płytki?

Link do komentarza
Share on other sites

21 godzin temu, Treker napisał:

Nic mi na ten temat nie wiadomo. Czy nie wykryłeś podobnych problemów podczas wcześniejszych ćwiczeń? Masz zieloną czy pomarańczową wersję płytki?

Z poprzednimi ćwiczeniami nie było problemów. Płytka jest pomarańczowa.

Link do komentarza
Share on other sites

32 minuty temu, TheZioMeK napisał:

Z poprzednimi ćwiczeniami nie było problemów. Płytka jest pomarańczowa.

Cześć,

z tego co pamiętam to chyba na stronie producenta w przykładowym pliku ucf kolejność diód była zamieniona (i switchy też).

Według mnie ta prawidłowa to :

####################################################################################################
#                                       LED
####################################################################################################

    NET "LED[8]"             LOC = P46   | IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 12;
    NET "LED[7]"             LOC = P47   | IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 12;
    NET "LED[6]"             LOC = P48   | IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 12;
    NET "LED[5]"             LOC = P49   | IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 12;
    NET "LED[4]"             LOC = P50   | IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 12;
    NET "LED[2]"             LOC = P51   | IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 12;
    NET "LED[2]"             LOC = P54   | IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 12;
    NET "LED[1]"             LOC = P55   | IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 12;

####################################################################################################
#                                   DP Switches
####################################################################################################

    NET "DPSwitch[8]"        LOC = P70   | PULLUP  | IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 12;
    NET "DPSwitch[7]"        LOC = P69   | PULLUP  | IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 12;
    NET "DPSwitch[6]"        LOC = P68   | PULLUP  | IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 12;
    NET "DPSwitch[5]"        LOC = P64   | PULLUP  | IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 12;
    NET "DPSwitch[4]"        LOC = P63   | PULLUP  | IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 12;
    NET "DPSwitch[3]"        LOC = P60   | PULLUP  | IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 12;
    NET "DPSwitch[2]"        LOC = P59   | PULLUP  | IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 12;
    NET "DPSwitch[1]"        LOC = P58   | PULLUP  | IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 12;

####################################################################################################
#                                   Switches
####################################################################################################

    NET "Switch[1]"          LOC = P80   | PULLUP  | IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 12;
    NET "Switch[2]"          LOC = P79   | PULLUP  | IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 12;
    NET "Switch[3]"          LOC = P78   | PULLUP  | IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 12;
    NET "Switch[4]"          LOC = P77   | PULLUP  | IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 12;
    NET "Switch[5]"          LOC = P76   | PULLUP  | IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 12;
    NET "Switch[6]"          LOC = P75   | PULLUP  | IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 12;

####################################################################################################
#                     

Reszta by6ła bez błędów. Oczywiście numeracja od zero a nie od jeden, ale ta kolejność jest OK.

Pozdrawiam

Edytowano przez FlyingDutch
  • Lubię! 1
  • Pomogłeś! 1
Link do komentarza
Share on other sites

Być może w tym był problem. Dzięki! 🙂

Teraz natomiast mam problem z zamianą kodu, tak aby rejestr działał w drugą strone. Po zmianie na

rej_przesuwny <= rej_przesuwny(7) & rej_przesuwny(0) & rej_przesuwny(1) & rej_przesuwny(2) & rej_przesuwny(3) & rej_przesuwny(4) & rej_przesuwny(5) & rej_przesuwny(6);

podświetlanie diod zamiast przesuwać się po każdej z kolei skacze po dwóch pozycjach

Link do komentarza
Share on other sites

Dnia 29.04.2019 o 19:44, FlyingDutch napisał:

z tego co pamiętam to chyba na stronie producenta w przykładowym pliku ucf kolejność diód była zamieniona (i switchy też).

Ano tak właśnie jest. W trakcie ćwiczenia pisałem swój własny ucf na podstawie dokumentacji i wszystko mi działało jak powinno ale porównując później pliki z tym z kursu faktycznie zauważyłem, że są piny na odwrót.

Dnia 29.04.2019 o 20:06, TheZioMeK napisał:

podświetlanie diod zamiast przesuwać się po każdej z kolei skacze po dwóch pozycjach

Wszystko jest zgodne z logiką tego co napisałeś. Najpierw bit zerowy(najmłodszy bit) jest ustawiany na 6 bicie a później to co jest na 6 bicie jest ustawiane na zerowym i tak w kółko. Przypuszczam, że chodziło Ci o inny efekt i wtedy bity powinieneś łączyć tak: 0 & 7 & 6 & 5 & 4 & 3 & 2 & 1 o ile rejestr ma się przesuwać w prawo albo 6 & 5 & 4 & 3 & 2 & 1 & 0 & 7 jeżeli w lewo. Oczywiście można to zrobić krócej - tak jak jest napisane w kursie ale może rozbicie tego na pojedyncze bity faktycznie jest lepsze pod względem dydaktycznym.

  • Lubię! 1
Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.