Skocz do zawartości

Kurs FPGA - #6 - rejestry przesuwne w VHDL


Pomocna odpowiedź

Napisano
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.

Hm, a czy nie są to rejestry przesuwające? Nie wiem jaka jest oficjalna, polska nomenklatura na shift registers, ale chyba przesuwamy informację w rejestrach a nie je same? One nie są przesuwne jak np. regał.

Na Politechnice Gdanskiej używany był i pewnie dalej jest termin "rejestr przesuwny". Choć pewnie na innej uczelni można spotkać się z innym tłumaczeniem.

  • 3 tygodnie później...

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

PiotrLenarczyk, witam na forum i dziękuję za ciekawy komentarz. Zawsze warto poczytać o doświadczeniach związanych z doborem platform 😉

  • 8 miesiące później...

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?

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.

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.

  • 8 miesiące później...

@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?

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.

(edytowany)
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

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

  • 9 miesiące później...
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

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...