Skocz do zawartości

Kompilator języka C dla Soft_CPU "PicoBlaze" Xilinxa


FlyingDutch

Pomocna odpowiedź

Cześć,

zamieszczam link do działającego kompilatora języka C dla Soft_CPU Xilinxa "PicoBlaze":

http://www.fit.vutbr.cz/~meduna/work/doku.php?id=projects:vlam:pbcc:pbcc

temat ten był już poruszany w wątku:

https://www.forbot.pl/forum/topics51/picoblaze-z-jaka-maksymalna-czestotliwoscia-zegara-dziala-na-elbercie-vt15024,30.htm

Znajduje się tam także krótki opis jak z niego skorzystać. Tutaj link do dokumentacji tego kompilatora:

http://www.fit.vutbr.cz/~meduna/work/lib/exe/fetch.php?media=projects:vlam:pbcc:pbccv2_user_manual.pdf

Pozwoliłem sobie zamieścić tą informację w nowym wątku, ponieważ temat był "zakopany" w innym bardzo długim wątku, a jeśli ktoś będzie szukał takiego kompilatora ma tutaj potrzebne informacje.

Pozdrawiam

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

Odpowiadam tutaj na wątek: https://www.forbot.pl/forum/topics51/picoblaze-z-jaka-maksymalna-czestotliwoscia-zegara-dziala-na-elbercie-vt15024,45.htm

Pojawiło się w nim zbyt wiele tematów, a skoro ten jest dedykowany kompilatorowi C dla PicoBlaze, chyba lepiej przenieść dyskusję.

FlyingDutch napisał:

Cześć Elvis,

Ja też zauważyłem małe 'dewiacje' w składni. Np pętla for:

Nie możesz napisać tak:

for(int i =0; i < 19; i++)

tylko:

int i = 19;

for(i; i <19; i++)

Na stronie kompilatora są przykłady programów do pobrania (z nich można dużo wywnioskować).

Mógłbyś podać kod programu, który nie działa prawidłowo?

BTW: moim zdanie użycie tego kompilatora ma sens, aby wygenerować szkielet programu w assemblerze, a szczegóły uzupełnić "ręcznie" (zaoszczędza to sporo czasu).

Pozdrawiam

Jak chodzi o 'dewiacje' składni, to tego bym się nie czepiał. Deklaracja zmiennej w instrukcji for to naleciałość z C++ i została dodana do C w miarę niedawno (C99). Może sdcc nie obsługuje c99, a może po prostu wymaga dodania odpowiedniej flagi podczas kompilacji (domyślnie używa starszego standardu).

Sam kompilator SDCC jest w porządku, niestety na potrzeby PicoBlaze został on przerobiony w ramach pracy magisterskiej. I niestety jakość tej przeróbki jest dokładnie taka... Działa, ale tylko w skończonej liczbie przypadków (czyli tych które były potrzebne do obrony).

Moją pierwszą niechęć wzbudziła próba komunikacji z magistralą systemową. PicoBlaze może się komunikować ze "światem" używając instrukcji asemblera INPUT oraz OUTPUT.

W źródłach kompilatora znalazłem plik include/pblaze/port.h, a w nim:

/*
* port.h - port communication functions header file
*
* adopted for SDCC and picoBlaze port by Zbynek Krivka, 2010 <krivka @ fit.vutbr.cz>
*
*/
void __port_write(unsigned char, unsigned char);
unsigned char __port_read(volatile unsigned char);

void __port_write(unsigned char port, unsigned char arg)·
{
 unsigned volatile char p;
 unsigned volatile char a;
 p = port;
 a = arg;
 __asm;
    OUTPUT _a, _p
 __endasm;
 delay(MIN_PAUSE);
}

Pomyślałem, super sprawa, eleganckie funkcje, które rozwijają się w instrukcje INPUT lub OUTPUT.

Napisałem więc program:

#include "port.h"

void main()
{
   while (1)
   {
       __port_write(0, 1);
       __port_write(0, 0);
   }

}

Niestety pojawiły się błędy kompilacji. Okazyje się że dyrektywa asm po prostu wstawia tekst, bez zmiany dowołań do zmiennych na rejestry. Wygenerowany kod wyglądał tak:

___port_write:
       LOAD    s0, sB
       LOAD    s1, sC
       ;       /home/elvis/Downloads/pbccv2-src-20110901/sdcc3/device/include/pblaze/port.h:20: p = port;
       LOAD    s2, s0
       ;       /home/elvis/Downloads/pbccv2-src-20110901/sdcc3/device/include/pblaze/port.h:21: a = arg;
       LOAD    s0, s1
       ;       /home/elvis/Downloads/pbccv2-src-20110901/sdcc3/device/include/pblaze/port.h:24: __endasm;
            OUTPUT _a, _p
       ;       /home/elvis/Downloads/pbccv2-src-20110901/sdcc3/device/include/pblaze/port.h:25: delay(MIN_PAUSE);
}

Ten problem udało mi się rozwiązać bo znalazłem, że można zadeklarować zmienną globalną PBLAZEPORT i odwołania do niej magicznie zmienią się w INPUT/OUTPUT. Ale pierwszy niesmak pozostał.

Później było już niestety tylko gorzej.

Najpierw poprawiłem program używając PBLAZEPORT zamiast funkcji z modułu port.h. Program działa pięknie:

extern volatile unsigned char PBLAZEPORT[];

void main()
{
   while (1)
   {
       PBLAZEPORT[0] = 1;
       PBLAZEPORT[0] = 0;
   }

}

Niestety naszło mnie udoskonalenie i chęć obsługi więcej niż jednej diody. Zmieniłem więc trochę program:

extern volatile unsigned char PBLAZEPORT[];

void main()
{
   int i = 0;

   while (1)
   {
       if (++i > 7) i = 0;
       PBLAZEPORT[0] = 1 << i;
   }
}

Moim zdaniem program powinien działać, niestety nie spodobał się kompilatorowi:

Internal error: validateOpType failed in OP_LIVETO(left) @ gen.c:2639: expected symbol, got value

Co to za kompilator, który nawet przesunięcia bitowego nie rozumie 🙁

Wspomnę tylko że program w końcu uruchomiłem używając mnożenia...

Pomyślałem - do trzech razy sztuka, może to takie drobne niedoskonałości. Postanowiłem więc dodać obsługę wyśwetilaczy 7-segmentowych. Część na FPGA wydłubałem w pocie czoła, zostało przetestować.

Test miał być banalny, jeden licznik, a później wpisanie kolejnych cyfr do rejestrów. Ponieważ jestem leniwy użyłem dzielenia (bajtu przez stałą). Teoretycznie to nic skomplikowanego...

Uproszczony program wygląda tak:

extern volatile unsigned char PBLAZEPORT[];

void main()
{
   unsigned char licznik = 0;

   while (1)
   {
       PBLAZEPORT[1] = licznik % 10;
       licznik++;
   }

}

Asembler program skwitował komunikatem:

ERROR line: 41: Invalid label

W sumie miał rację, bo okolica linii 41 wygląda następująco:

__moduchar:
__moduschar:
       CALL    __divuschar
       XOR     sB, sC
       XOR     sC, sB
       XOR     sB, sC
       RETURN

__divuchar:

Czyli kompilator wygenerował kod dla __divuchar, ale próbuje używać __divuschar. Próbowałem ręcznie ten kod zmieniać i kompilować - niestety i tak nie działało.

Ostatecznie więc się zniechęciłem i powiem tak - moim zdaniem ten kompilator to tylko zabawka. Zostaje polubić asembler PicoBlaze, albo zmienić FPGA i używać MicroBlaze.

Link do komentarza
Share on other sites

...

Niestety naszło mnie udoskonalenie i chęć obsługi więcej niż jednej diody. Zmieniłem więc trochę program:

extern volatile unsigned char PBLAZEPORT[];

void main()
{
   int i = 0;

   while (1)
   {
       if (++i > 7) i = 0;
       PBLAZEPORT[0] = 1 << i;
   }
}

Moim zdaniem program powinien działać, niestety nie spodobał się kompilatorowi:

Internal error: validateOpType failed in OP_LIVETO(left) @ gen.c:2639: expected symbol, got value

Co to za kompilator, który nawet przesunięcia bitowego nie rozumie 🙁

Wspomnę tylko że program w końcu uruchomiłem używając mnożenia...

Elvis,

to dziwne bo ja używałem przesunieć bitowych w programi liczenia CRC-8 i to działało bez zarzutu:

//Funkcja obliczajaca CRC-8
unsigned char Compute_CRC8_Simple_OneByte(volatile unsigned char byteVal)
{
   volatile const unsigned char generator = 0x1D;//Uzyty wielomian (custom)
   volatile unsigned char crc = byteVal; /* init crc directly with input byte instead of 0, avoid useless 8 bitshifts until input byte is in crc register */
   int i = 0;
   for (i; i < 8; i++)
   {
       if ((crc & 0x80) != 0)
       { /* most significant bit set, shift crc register and perform XOR operation, taking not-saved 9th set bit into account */
           crc = (unsigned char)((crc << 1) ^ generator);
       }
       else
       { /* most significant bit not set, go to next bit */
           crc <<= 1;
       }
   }
   return crc;
}

Nawet to prze-symulowałem i funkcja jest prawidłowo liczona.

Link do komentarza
Share on other sites

Ale Ty przesuwasz zmienną o stałą liczbę miejsc. A ja odwrotnie - stałą o zmienną liczbę miejsc. Niestety w drzewie wyprowadzenia ktoś nie dodał odpowiedniej produkcji... i nie działa.

[ Dodano: 05-01-2018, 15:25 ]

Ze zmienną left też nie działa, tylko jeśli zamiast << i dam << 1 pójdzie... Mam gdzieś taki kompilator przy którym muszę zgadywać co i jak on zrozumie. To już lepiej w asemblerze pisać.

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

Ale Ty przesuwasz zmienną o stałą liczbę miejsc. A ja odwrotnie - stałą o zmienną liczbę miejsc. Niestety w drzewie wyprowadzenia ktoś nie dodał odpowiedniej produkcji... i nie działa.

[ Dodano: 05-01-2018, 15:25 ]

Ze zmienną left też nie działa, tylko jeśli zamiast << i dam << 1 pójdzie... Mam gdzieś taki kompilator przy którym muszę zgadywać co i jak on zrozumie. To już lepiej w asemblerze pisać.

Elvis,

rozumiem twoje oburzenie. Dla mnie nawet z tymi błędami jest to jakaś pomoc bo ostatnio w jakimkolwiek assemblerze programowałem w 1998 roku 🙄

Ja używam tego kompilatora do wygenerowania "szkieletu" programu w assemblerze a szczegóły dodaję ju w tym programie assemblerowym.

Pozdrawiam.

Link do komentarza
Share on other sites

Ja też go używam do testowania modułów, które dłubię na FPGA. Tylko coraz bardziej mam dosyć 🙁 No i obawiam się, że pisanie jakiegokolwiek dłuższego programu nie ma sensu - i tak trzeba sprawdzać, czy wygenerowany kod jest poprawny.

Link do komentarza
Share on other sites

Ja też go używam do testowania modułów, które dłubię na FPGA. Tylko coraz bardziej mam dosyć 🙁 No i obawiam się, że pisanie jakiegokolwiek dłuższego programu nie ma sensu - i tak trzeba sprawdzać, czy wygenerowany kod jest poprawny.

Elvis,

przyznaję rację, niestety z symulatorem "pBlazeIDE" jest podobnie trzeba modyfikować program w assemblerze (pBlazeIDE jest zgodny ze składnią assemblera "kcpsm6" dla Spartana 6, a kcpsm3.exe ma inną składnię) .

MicroBlaze będę próbował na MImasie V2 ze Spartanem 6. Niestety w moim jedynym praktycznym projekcie 'sterownika rolet dla drzwi balkonowych' mam użytą małą płytkę FPGA ze Spartanem 3A (ta wersja co w Elbercie), a chciałbym rozbudować projekt i PicoBlaze (kcpsm3) bardzo mi w tym pomoże. Tak, że będę "się męczył" ze wszystkimi niedoskonałymi produktami dla tej wersji PicoBlaze dla Spartana 3.

Pozdrawiam

Link do komentarza
Share on other sites

Ja wcale nie zniechęcam do używania Spartan3 i Elbert-a w szczególności. Po pierwsze mamy kurs na forbocie, po drugie to jedyna płytka FPGA jaką znalazłem, na której czas syntezy jest przyzwoity. Dla mnie to ważny parametr na początku nauki - czekanie kilku minut na komunikat o błędach to irytujące i zniechęcające doświadczenie. U mnie nawet na maximatora synteza zajmuje 2x tyle co w przypadku Elbert-a.

Napisałem o kompilatorze tylko po to, żeby uprzedzić osoby które ew. planują pobawić się C na PicoBlaze - to jednak niedopracowana opcja.

Link do komentarza
Share on other sites

Ja wcale nie zniechęcam do używania Spartan3 i Elbert-a w szczególności. Po pierwsze mamy kurs na forbocie, po drugie to jedyna płytka FPGA jaką znalazłem, na której czas syntezy jest przyzwoity. Dla mnie to ważny parametr na początku nauki - czekanie kilku minut na komunikat o błędach to irytujące i zniechęcające doświadczenie. U mnie nawet na maximatora synteza zajmuje 2x tyle co w przypadku Elbert-a.

Napisałem o kompilatorze tylko po to, żeby uprzedzić osoby które ew. planują pobawić się C na PicoBlaze - to jednak niedopracowana opcja.

Elvis spoko 😉

Ja też mam Maximatora - to był mój pierwszy zestaw FPGA (i trzeba przyznać, że jest nieźle wyposażony, szczególnie przetwornik ADC to fajna sprawa, no i wyjście HDMI). Ale narzędzia Intela do syntezy (Quartus Lite) nie przypadły mi do gustu (generacja IP Cor'ów według mnie bardziej skomplikowana) i samo środowisko jest dla mnie mniej intuicyjne niż ISE (no i czas syntezy o czym pisałeś). Wiem już, że pozostanę przy rozwiązaniach Xilinxa, szkoda tylko, że Vivado ma tragiczne czasy syntezy (no, ale też większe możliwości np. HLS synteza wysokiego poziomu). Szkoda tylko, że ceny bardziej złożonych zestawów Xilinxa są wyższe niż Intela np. z SoC. Patrz np. "Terasic DE0-Nano-SoC" kit versus "Digilent ZYBO Z7-10:

https://kamami.pl/zestawy-uruchomieniowe/558403-terasic-de0-nano-soc-kit-zestaw-startowy-z-ukladem-fpga-z-rodziny-altera-cyclone-v-soc.html

https://kamami.pl/zestawy-uruchomieniowe/567065-digilent-zybo-z7-10-z-voucherem-zynq-sdsoc-471-014.html

Pozdrawiam

Link do komentarza
Share on other sites

Ja nadal myślę jaki komputer kupić, żeby Vivado działało jak ISE 😎

[ Dodano: 05-01-2018, 18:21 ]

Ten "kompilator" jest jednak jeszcze gorszy niż myślałem... Dla kolejnych zmiennych przydziela kolejne rejestry procesora. I nie przejmuje się zupełnie jeśli rejestrów brakuje, albo są w nich dane - po prostu nadpisuje. Masakra

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.