Skocz do zawartości

Czy jest to mozliwe w układzie opartym na FPGA?


FlyingDutch

Pomocna odpowiedź

Cześć,

zastanawiam się nad dość prostym problemem w przypadku układu opartego o mikro-kontroler, a wydającym mi się trudnym w przypadku układów programowalnych.

Przypuśćmy, że mamy jakiś działający układ mający ileś portów wejściowych i wyjściowych (cyfrowych) oraz, że porty są aktywowane poziomem wysokim. Przestawiamy jeden switch podłączony do układu i zmieniamy działanie układu tak, że aktywny jest poziom niski portów - czyli negujemy wszystkie sygnały I/O.

Drugi scenariusz: łączymy się z układem (metoda dowolna np. UART, USB, ethernet) i ustawiamy kilka parametrów układu np. wartości maksymalne zliczania licznika w timerach. Po zmianie parametrów układ działa w sposób zmodyfikowany np. czasy jakichś operacji są inne.

Jest to proste do osiągnięcia w przypadku układów opartych na CPU, ale czy możliwe i jak to osiągnąć w układach FPGA?

Pozdrawiam

Link do komentarza
Share on other sites

Zasadniczo wszystko co możliwe do wykonania za pomocą mikrokontrolera jest też możliwe za pomocą układu programowalnego - zawsze można po prostu wgrać soft-procesor 😉

Skoro ustaliliśmy, że to możliwe można zastanowić się czy łatwe - to oczywiście rzecz względna.

Pierwszy problem wydaje się banalny - zobacz jak działa bramka XOR. Jej dodanie wystarczy, żeby układ zmieniał logikę w zależności od stanu przełącznika (wejścia).

Natomiast odpowiedzią na ostatnie pytanie jest najzwyklejszy rejestr - przechowujesz w nim wartość parametru i aktualizujesz poprzez wybrany interfejs.

Link do komentarza
Share on other sites

Zasadniczo wszystko co możliwe do wykonania za pomocą mikrokontrolera jest też możliwe za pomocą układu programowalnego - zawsze można po prostu wgrać soft-procesor 😉

Natomiast odpowiedzią na ostatnie pytanie jest najzwyklejszy rejestr - przechowujesz w nim wartość parametru i aktualizujesz poprzez wybrany interfejs.

No tak, ale sam wiesz, że przeważnie pamięć ROM z programem dla Soft-CPU jest tworzona na etapie syntezy? Myślisz o wczytywaniu wartości tego rejestru z portów I/O soft CPU?

Czy może o wykorzystaniu bootloadera lub interfejsu JTAG?

Pozdrawiam

Link do komentarza
Share on other sites

Program dla soft-procesora wcale nie musi być przygotowywany na etapie syntezy - to jest bardzo niewygodne i powolne rozwiązanie, ale proste.

Natomiast nie widzę związku programu z przechowywaniem wartości, przecież nawet mały picoblaze miał do dyspozycji mały ram, gdzie można wartość przechowywać.

A w samym vhdl-u po prostu deklarujesz sygnał lub zmienną i masz to o co pytałeś - rejestr w którym możesz przechować wartość np. dla licznika.

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

Program dla soft-procesora wcale nie musi być przygotowywany na etapie syntezy - to jest bardzo niewygodne i powolne rozwiązanie, ale proste.

Natomiast nie widzę związku programu z przechowywaniem wartości, przecież nawet mały picoblaze miał do dyspozycji mały ram, gdzie można wartość przechowywać.

A w samym vhdl-u po prostu deklarujesz sygnał lub zmienną i masz to o co pytałeś - rejestr w którym możesz przechować wartość np. dla licznika.

Cześć Elvis,

masz rację, chyba jeszcze nie do końca się przestawiłem na właściwe myślenie jeśli chodzi o układy programowalne.

Pozdrawiam

Link do komentarza
Share on other sites

Zastanawiam się nad dość prostym problemem w przypadku układu opartego o mikro-kontroler, a wydającym mi się trudnym w przypadku układów programowalnych.

Dobrze, że to spostrzegłeś!

W każdym razie co do problemów:

Przypuśćmy, że mamy jakiś działający układ mający ileś portów wejściowych i wyjściowych (cyfrowych) oraz, że porty są aktywowane poziomem wysokim. Przestawiamy jeden switch podłączony do układu i zmieniamy działanie układu tak, że aktywny jest poziom niski portów - czyli negujemy wszystkie sygnały I/O.

Jeśli chcesz tak zrobić to zrób tak jak zasugerował Elvis - bramki XOR (ustawiasz wtedy stan na jednym wejściu przeciwny do tego na drugim - chcesz stan wysoki no to ustawisz wtedy stan niski, a jeśli niski no to wysoki - jak widać, niezależnie od sytuacji wtedy masz na wyjściu bramki stan wysoki i wtedy żaden problem - wykonuje się całość bez względu na to jaki stan masz na wyprowadzeniu. Inny sposób: zmienna i rejestr (o których mowa w drugim problemie) czy też konfiguracja w pamięci (o czym też mowa w drugim problemie).

Drugi scenariusz: łączymy się z układem (metoda dowolna np. UART, USB, ethernet) i ustawiamy kilka parametrów układu np. wartości maksymalne zliczania licznika w timerach. Po zmianie parametrów układ działa w sposób zmodyfikowany np. czasy jakichś operacji są inne.

Co masz za problem napisać zmienne, które będą rejestrami- w końcu w mikrokontrolerze takie timery czy inne komponenty mają rejestry nie? Możesz też użyć bloków pamięciowych lub pamięci zewnętrznej, dołączonej do układu (o ile takową masz), która też będzie pełnila rolę rejestru. W końcu w mikrokontrolerach timery i inne komponenty są sterowane rejestrami nie? Innymi słowy: potwierdzam to co napisał Elvis.

masz rację, chyba jeszcze nie do końca się przestawiłem na właściwe myślenie jeśli chodzi o układy programowalne.

To oczywiste - przecież widać, że "na siłę" próbujesz uczynić z FPGA mikrokontroler, który dałby się zaprogramować językiem C (i to cię ciągle gubi).

Link do komentarza
Share on other sites

masz rację, chyba jeszcze nie do końca się przestawiłem na właściwe myślenie jeśli chodzi o układy programowalne.

To oczywiste - przecież widać, że "na siłę" próbujesz uczynić z FPGA mikrokontroler, który dałby się zaprogramować językiem C (i to cię ciągle gubi).

Cześć,

dziękuję Wam obu za odpowiedź, będę się starał zmienić swoje "podejście" do układów programowalnych - czyli nie myśleć o nich jak o układach opartych na CPU.

BTW: moglibyście podać linki do materiałów jak ładować program do Soft-CPU w trakcie działania układu (np. bootloader, JTAG i inne o których nie słyszałem)?

Pozdrawiam

Link do komentarza
Share on other sites

BTW: moglibyście podać linki do materiałów jak ładować program do Soft-CPU w trakcie działania układu (np. bootloader, JTAG i inne o których nie słyszałem)?

Możesz zawsze do mikroprocka dołączyć dwuportową pamięć RAM, której połowa przestrzeni będzie zarezerwowana dla jednego programu, a druga połowa da drugiego - i teraz wystarczy, że dołączysz jeden port do mikroprocka, a drugi do układu, który będzie wymieniał dane z i do JTAG-a i wpisywał je albo do jednej "połówki" pamięci, albo do drugiej. Wtedy też wystarczy, że między mikrooprocek, a samą pamięć dołożysz układ, który będzie "translatorem" adresów pamięci tj. w zależności od potrzeb będzie przekierowywał mikroprocek na jedną połówkę lub drugą połówkę pamięci (to na którą może wskazywać właśnie układ działający z JTAG-iem). To jedna metoda.

Druga metoda - dostawienie drugiej pamięci do mikroprocka, którą zepniesz "multiplekserem" z pierwszą pamięcią. Idea jest wówczas taka, że: mikroprocek działa na pierwszej pamięci tj. realizuje program w niej zawarty, a ty w tym czasie do drugiej pamięci ładujesz nowy program, nie przerywając dotychczasowego działania. Po załadowaniu przełączasz się multiplekserem na drugą pamięć i ładuje się nowy program (oczywiście przed samym przełączeniem próbujesz zatrzymać mikroprocesor, żeby po prostu nie wyrzucił nie wiadomo czego, albo żeby nie zblokował się wskutek nagłego przełączenia się jednej zawartości na drugiej - stąd ująłem multiplekser cudzysłowie, bo to w praktyce musiałby być też układ, który zatrzymałby właśnie taki mikroprocesor na chwilę).

Trzecia metoda (dość trudna) - po prostu podłączasz między mikroprocek, a pamięć układ, który w jednej chwili realizuje wymianę danych między nim, a nią, po czym w drugiej sukcesywnie wpisuje nową porcję danych. Potem w trzeciej znów wymiana danych, a w czwartej kolejna nowa porcja danych. Oczywiście dane ładowane do wolnej przestrzeni danych lub do starej jeśli wiesz co robisz 😃

I tak to w skrócie wygląda ^^ Metody w zasadzie takie jak dla podwójnego buforowania grafiki (bo w zasadzie niczym to się nie różni - i tu i tu ładujesz nowe dane, nie przerywając dotychczasowego działania)

Link do komentarza
Share on other sites

Strasznie przekombinowane te metody - oczywiście jeśli jest to układ który ma działać prawie nieprzerwanie, marnowanie połowy RAM-u może mieć sens. Ale do prostych, amatorskich rozwiązań proponowałbym skopiować zachowanie mikrokontrolerów.

Czyli po resecie procesora uruchamia się bootloader, który sprawdza stan np. Pinu. Jeśli ustwiony, to oczekuje na dane (powiedzmy z UART-a), które zapisuje w pamięci. Inaczej wykonuje program wgrany wcześniej. Takie działanie wystarczy na potrzeby pisania programu, a ostateczną wersję i tak trzeba będzie zachować w pamięci nieulotnej.

Sam bootloader może być sprzętowy lub programowy - w zależności od dostępnych zasobów i umiejętności.

Link do komentarza
Share on other sites

Pytanie było o wgrywanie w trakcie działania czyli w aensie, że mikrolrocesor ma działać nieprzerwanie - stąd zaproponowałem "ramożerne" rozwiązania - a sposób z bootloaderem jest właśnie przekombinowany - bo mam resetować mikroprocek żeby przerzucić zawartość do pamięci co i tak odbędzie się po przerwaniu działania - czyli nie spełnia zapytania, które było postawione.

Link do komentarza
Share on other sites

To trochę zależy od tego jak rozumiemy pytanie. Zakładam, że było to proste pytanie - czyli mam wgrany kod do FPGA i chcę łatwo zmienić program CPU bez programowania całego FPGA.

Rozwiązanie z resetem CPU w pełni to spełnia - przecież układ programowalny ciągle działa, reset dotyczy tylko modułu procesora.

Natomiast przełączanie RAM-u nie dość że zużywa zasoby, to w tak uproszczonej postaci i tak nie zadziała. Przecież nie ma pewności, że nowy program różni się niewiele, czyli np. Wartościami stałych. Jeśli to zupełnie inny kod, nagła zmiana banków pamięci to przepis na kłopoty - w miejscu stosu może np. Wylądaować nowy program. Poza tym nie wiadomo w jakim stanie był CPU gdy wykonywane było przełączenie. Można oczywiście próbować tworzyć takie rozwiązanie, ale to dość skompliowane i raczej nie o to w pytaniu chodziło - poza tym sprowadzi się to do pisania własnej procedury resetu, bo po przełączeniu banków musimy wprowadzić procesor w przewidywlany stan, a to dokładnie robi reset.

Problem z PicoBlaze jest taki, że każda zmiana programu wymaga czasochłonnego programowania całości, więc byłoby wygodnie tylko aktualizować program i testować jego działanie od nowa.

[ Dodano: 28-01-2018, 11:52 ]

Co do gotowych rozwiązań, to może: http://zh.kia.prz.edu.pl/index.php?page=verilog_b

A dokładniej "Sprzętowy bootloader dla mikrokontrolerów pBlazeZH/PicoBlaze" http://zh.prz-rzeszow.pl/get_file.php?id=030

Link do komentarza
Share on other sites

Cześć,

dziękuję Wam obu za odpowiedzi - to moja wina bo pytanie nie było precyzyjnie sformułowane. Dla moich amatorskich celów rozwiązanie z bootloaderem wystarczy, jednak dobrze mieć świadomość jakie opcje są dostępne (i jak można to zrobić).

Pozdrawiam

Link do komentarza
Share on other sites

I o to chodzi! A to, że skomplikowane - no przepraszam, ale taka specyfika mojej pracy, że nie mogę tak podchodzić, że coś skomplikowane, bo nie za to mi płacą - jak to u mnie mawiają "nie umiesz - to się nauczysz", "jest skomplikowane - nie szkodzi - też się nauczysz" ^^

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.