opencores

Elso sajat opencores-projekt: https://opencores.org/projects/softavrcore. Ha valakit erdekel full stack FPGA + AVR kombinacio. 

Kovetkezo feladat: hogyan is lehet svn-ben(!) ilyen dolgokat feltolteni a barhova is...

Hozzászólások

Nagyon izgalmasnak látszik, de pár szóban el tudod mondani, hogy mi ez, és hogy enni vagy inni kell? És jövök egy pár piával, nem felejtettem el.

A cel az volt hogy legyen egy olyan AVR proci amit a szokasos toolchainekkel (avr-gcc, ...) lehet 1:1ben, mindenfele megkotes nelkul C-ben programozgatnunk es ezzel parhuzamosan a periferiait is ugy valogathassuk ossze ahogy eppen szukseges.  FPGA mar kell ehhez, meg meg van par megoldando dolog (leginkabb a self-programming, ugy hogy a teljes architekturat es a periferiakat is lehessen frissiteni tavolrol), de alakul. Meg persze jo sokat is lehet ebbol tanulni :)  

Ügyes projekt. Írjál róla időnként.
Egyébként ha most valamivel foglalkoznék, az nem az AVR lenne, hanem a RISC-V. Nagyon igéretes, jövőbemutató architektúra, az utasításkészlete pedig díjat nyert.
Az utasításkészlete nem monolitikus, hanem opciók mentén bővíthető, függően attól milyen célfeladatra szánják a legyártandó eszközt.
Az alábbi doksiból az RV32I integeres utasításkészletű alap és az RV32E érdekes. Utóbbit embedded-célokra ajánlják. Itt leginkább regiszterszám felezéssel "olcsósítottak". Ezekre a GCC fordít.
Lásd még: https://github.com/riscv/riscv-isa-manual/releases/download/draft-20200…
Ábrás ízelítő az utasításfelépítéséből: http://www.maxvytech.com/images/RV32I-11-2018.pdf

Igenigen, a RISC-V-t neztem en is mar hogy azt is erdemes lehet megnezni. Ugy latom a projekt honlaprol hogy ehhez nincs "referencia implementacio", de valamelyik opencores-os es/vagy egyeb nyilt verzional lattam utalast arra hogy olyan 2-2.5k LC-bol megoldhato az is. Ami mar elegge impressziv.

Most majd a 4-stage pipeline-os implementaciot nezem meg ennel az AVR architekturanal egy kicsit jobban. Akkor mar elegge borulni fog ez a klasszikus "egy utasitas hany oraciklus" dolog, viszont osszessegeben 2x-3x gyorsabb is lehet becsleseim szerint. Illetve igen, tovabbi periferiakat is kell irni :) 

Koszi, ezek tenyleg jok!

Kozben forditok riscv32e-gcc-t is. Hatha sikerul 3ik nekifutasra. No igen, amig ezek nincsenek igy csomagban, egyszeruen kezelheto modon... addig nem lesz egyszeru az elet. Az AVR-nek ez az elonye hogy tenyleg elterjedt, alapbol tudja a toolchain az osszes architekturat, es nagyon jol ossze lehet parositani a rtl/synth-et a gcc-hasznalattal. 

https://wiki.debian.org/RISC-V

ubuntu 20.04:~$ apt-cache search riscv | grep gcc-10 | grep cross
gcc-10-riscv64-linux-gnu - GNU C compiler (cross compiler for riscv64 architecture)
libgcc-10-dev-riscv64-cross - GCC support library (development files)

debian-buster:~$ apt-cache search riscv | grep gcc | grep cross
libgcc-8-dev-riscv64-cross - GCC support library (development files)
libgcc1-riscv64-cross - GCC support library

Kérdés, hogy ez a gcc képes-e 32 bites ISA-ra fordítani?
Úgy nézem hogy nem.

./configure --prefix=/opt/riscv --with-arch=rv32i

Viszont arra jó, hogy a disztróból lerántsd a forráskódot
$ apt-get source ...
és a debian/rules -ben módosítani hogy rv32i-re fordítson, továbbá csomagnév váltás és már fordulhat is az új debian csomag gcc-riscv32-... néven.

Kozben lefordult a gcc, tudok is forditani, de a linkeles elakad: 

$ riscv32-unknown-linux-gnu-gcc -march=rv32i -mabi=ilp32 -c x.c 
$ riscv32-unknown-linux-gnu-gcc -march=rv32i -mabi=ilp32 -o x.elf x.o 
/usr/local/lib/gcc/riscv32-unknown-linux-gnu/9.2.0/../../../../riscv32-unknown-linux-gnu/bin/ld: /usr/local/lib/gcc/riscv32-unknown-linux-gnu/9.2.0/crti.o: can't link RVE with other target
/usr/local/lib/gcc/riscv32-unknown-linux-gnu/9.2.0/../../../../riscv32-unknown-linux-gnu/bin/ld: failed to merge target specific data of file /usr/local/lib/gcc/riscv32-unknown-linux-gnu/9.2.0/crti.o
/usr/local/lib/gcc/riscv32-unknown-linux-gnu/9.2.0/../../../../riscv32-unknown-linux-gnu/bin/ld: /usr/local/lib/gcc/riscv32-unknown-linux-gnu/9.2.0/crtbegin.o: can't link RVE with other target
/usr/local/lib/gcc/riscv32-unknown-linux-gnu/9.2.0/../../../../riscv32-unknown-linux-gnu/bin/ld: failed to merge target specific data of file /usr/local/lib/gcc/riscv32-unknown-linux-gnu/9.2.0/crtbegin.o
/usr/local/lib/gcc/riscv32-unknown-linux-gnu/9.2.0/../../../../riscv32-unknown-linux-gnu/bin/ld: /usr/local/lib/gcc/riscv32-unknown-linux-gnu/9.2.0/crtend.o: can't link RVE with other target
/usr/local/lib/gcc/riscv32-unknown-linux-gnu/9.2.0/../../../../riscv32-unknown-linux-gnu/bin/ld: failed to merge target specific data of file /usr/local/lib/gcc/riscv32-unknown-linux-gnu/9.2.0/crtend.o
/usr/local/lib/gcc/riscv32-unknown-linux-gnu/9.2.0/../../../../riscv32-unknown-linux-gnu/bin/ld: /usr/local/lib/gcc/riscv32-unknown-linux-gnu/9.2.0/crtn.o: can't link RVE with other target
/usr/local/lib/gcc/riscv32-unknown-linux-gnu/9.2.0/../../../../riscv32-unknown-linux-gnu/bin/ld: failed to merge target specific data of file /usr/local/lib/gcc/riscv32-unknown-linux-gnu/9.2.0/crtn.o
collect2: error: ld returned 1 exit status

Ahol:

#include <stdint.h>

#define PORT0   *(volatile uint32_t *)(0x1000000)
#define PORT1   *(volatile uint32_t *)(0x1000004)

int main(void)
{
 uint32_t       a,b;
 a=PORT0;
 PORT1=a+100;
 return(0);
}

Keres hogy mi hianyzik neki. Memoriaterkep? Elvileg vannak alapertelmezett linker szkriptek, meg akkor inkabb definialatlan szimbolumokra panaszkodik...