
å
æ¥ã
EBV SoCratesè©äŸ¡ããŒããç§ã®æã«èœã¡ãŸããã ç°¡åã«èšãã°ãããã¯
ã¢ã«ãã©ã® SoCã
æèŒããããŒãã§ããã¥ã¢ã«ã³ã¢ARMããã³Cyclone V FPGAãæèŒãããŠããŸãã
åããããäžã®
ARMãš
FPGA-éåžžã«è峿·±ãã¯ãã§ãïŒ ããããããããããã®ãã¹ãŠã®åã¯ãé«ãããããå¿
èŠããããŸãã
ãã®ããã»ã¹ã«ã€ããŠã¯ããã®èšäºã§èª¬æããŸãã
ãããŸãã¯åæ§ã®ããŒããæã«å
¥ããŠããããã©ããããå®å
šã«ããããªãå Žåã
FPGAãè€éãªãã®ã§ãããããã«ã¢ãããŒãããæ¹æ³ãæç¢ºã§ãªããšåžžã«èããŠããå Žåã ãŸãã¯ãããªãã¯åã«å¥œå¥å¿engineerçãªãšã³ãžãã¢ã§ããïŒ ããããå
¥ã£ãŠ ç§ãã¡ã¯ãã¹ãŠã«æºè¶³ããŠããŸãã
ã¡ãã£ãšããããŒãã¹ãšããŠã
CPUãš
FPGAéã®åž¯åå¹
ãæž¬å®ããŸãã
äœæ¥èšç»
ç§ãã¡ã®èšç»ã¯ã次ã®é
ç®ã§æ§æãããŠããŸãã
- FPGAãã¡ãŒã ãŠã§ã¢ã®å
¥æ
- ã«ãŒãã«ã¢ã»ã³ããª
- U-BootãšããªããŒããŒãæ§ç¯ãã
- Rootfsãã«ã
- ãã¹ãããã°ã©ã ãæžã
- SDã«ãŒããäœæ
- ããŒãã®èµ·åãšåž¯åå¹
ã®æž¬å®
è¡ããïŒ
FPGAãã¡ãŒã ãŠã§ã¢ã®äœæ
ãŸããFPGAãã¡ãŒã ãŠã§ã¢ãå
¥æããå¿
èŠããããŸãã
ãã®ããŒã«ã«ã¯CAD Quartusãå¿
èŠã«ãªããŸãã
å
¬åŒWebãµã€ãããããŠã³ããŒãã§ããŸãã
ç§ã¯ã€ã³ã¹ããŒã«ã«ã€ããŠèª¬æããŸãã-ãã¹ãŠãããã«ããªãæçœã§ãã
ãããžã§ã¯ãäœæ
Quartusãå®è¡ãã
[ãã¡ã€ã«]-> [æ°ãããããžã§ã¯ããŠã£ã¶ãŒã ]ã«ç§»åããŠã[
次㞠]ãã¯ãªãã¯ãããã£ã¬ã¯ããªãšãããžã§ã¯ãåãå
¥åããŸãã
次ã®ããŒãžãã¹ãããããFPGAã®ãã¡ããªãšã¿ã€ããéžæããŸãã
æ®ãã®èšå®ã¯éèŠã§ã¯ãããŸããã[
å®äº ]ãã¯ãªãã¯ããŸãã
Qsysãããžã§ã¯ã
Qsysã¯åå¿è
åãã®åªããããŒã«ã§ãã ã³ãŒãã1è¡ãæžããã«ãã¡ãŒã ãŠã§ã¢ãååŸã§ããŸãã 代ããã«ãéçºè
ã¯äºåå®çŸ©ããããã¥ãŒãïŒIPããŒã«ïŒããã³ã³ã¹ãã©ã¯ã¿ãŒãçµã¿ç«ãŠãŸãã åããŒã«ãé©åã«èšå®ããé©åã«æ¥ç¶ããã ãã§ãã
ãããã£ãŠã
ããŒã«-> Qsysã§ã¯ãå·ŠåŽã®ãŠã£ã³ããŠïŒ
IPã«ã¿ãã° ïŒã«2ã€ã®IPããŒã«ãå¿
èŠã§ãã
- ããã»ããµãŒãšåšèŸºæ©åš->ããŒãããã»ããµãŒã·ã¹ãã -> Arria V / Cyclone VããŒãããã»ããµãŒã·ã¹ãã
- åºæ¬æ©èœ->ãªã³ãããã¡ã¢ãªââ->ãªã³ãããã¡ã¢ãªââïŒRAMãŸãã¯ROMïŒ
ããŒãããã»ããµã·ã¹ãã ïŒHPSïŒã¯åœç€Ÿã®ARMã§ãã ãã®èšå®ããå§ããŸãã
æåã®ã¿ãã§ã¯ãCPUããå
éšFPGAã¡ã¢ãªã«ã¢ã¯ã»ã¹ã§ããããã«ã
HPSããFPGAãžã®ã€ã³ã¿ãŒãã§ã€ã¹å¹
ã«é¢å¿ããããŸãã
FPGAã€ã³ã¿ãŒãã§ãŒã¹ 次ã«ãããŸããŸãªã€ã³ã¿ãŒãã§ãŒã¹ã®èšå®ããããŸã-ã©ã®ã¢ãŒãã§åäœããããã©ã®ãã³ã䜿çšããããïŒ
次ã®ã¿ãã¯çްæåŠçã®èšå®ã§ãã
å
¥åã¯ããã¯ã§ã¯ ããã¹ãŠã倿ŽããŸããã
[
åºåã¯ããã¯]ã§ã[ HPS-to-FPGAãŠãŒã¶ãŒ0ã¯ããã¯ãæå¹ã«ãã]ããªã³ã«ããŸããæ¬¡ã«ãDDR3ã¡ã¢ãªã®ããŸããŸãªèšå®ãå«ã倧ããªãµãã»ã¯ã·ã§ã³ããããŸãã
DDR3ã¡ã¢ãªãã©ã¡ãŒã¿ DDR3ã¡ã¢ãªã¿ã€ãã³ã° HPSã䜿çšããŠã
ãªã³ãããã¡ã¢ãªã®æ§æã«é²ã¿ãŸããã ããã¯ãFPGAå
ã«çŽæ¥é
眮ãããŠããã¡ã¢ãªã§ãã
èšå®ãã¯ããã«å°ãªãïŒ
次ã«ããããã¯ãæ¥ç¶ããå¿
èŠããããŸãã ãã¹ãŠãéåžžã«çŽæçã§ãïŒ
s1ã®å察åŽã®ããŒã¹ã¢ãã¬ã¹ã®å€ã«æ³šæããŠãã ããïŒïŒ
ã§ãã
socãšããŠä¿åïŒ
ãã¡ã€ã«->ä¿å ïŒ
ããã¡ã€ã«ãçæããããã«æ®ããŸãã [
HDLã®çæ ]ãã¿ã³ãã¯ãªãã¯ãã衚瀺ããããŠã£ã³ããŠã§ã[
çæ ]
ãããäžåºŠã¯ãªãã¯ããŠãåŸ
æ©ãã[
å®äº ]
ãã¯ãªãã¯ããŸãã
ãããžã§ã¯ãã®ã³ã³ãã€ã«
次ã«ãçæããããã¡ã€ã«ããããžã§ã¯ãã«è¿œå ããå¿
èŠããããŸãã
[å²ãåœãŠ ]
-> [èšå® ]ã¿ã[
ãã¡ã€ã« ]ã§ããã¡ã€ã«
soc / Synthesis / soc.qipã远å ããŸãã
DDRãã³ã®èšå®ãé©çšããå¿
èŠããããŸãã ãã ãããã®åã«ãã³ã³ãã€ã«ã®æåã®æ®µéãå®è¡ããå¿
èŠããããŸãã
åŠç->éå§->åæãšåæã®éå§ã¹ã¯ãªãããå®è¡ããŠãã³ãæ§æããŸãã
ããŒã«-> Tclã¹ã¯ãªãã 衚瀺ããããŠã£ã³ããŠã§ã[
ãããžã§ã¯ã]-> [soc]-> [åæ]-> [ãµãã¢ãžã¥ãŒã«]-> [hps_sdram_p0_pin_assignments.tcl] ã[
å®è¡]ãéžæããŸã ã
ãããžã§ã¯ãã®æçµã³ã³ãã€ã«ïŒ
åŠç->ã³ã³ãã€ã«ã®éå§FPGAãã¡ãŒã ãŠã§ã¢ã
å«ãsoc.sofãã¡ã€ã«ãååŸããŸããã ããããFPGAãCPUããçŽæ¥ãã©ãã·ã¥ãããã®ã§ãå¥ã®ãã©ãŒããããå¿
èŠã§ãã 倿ããŸãããã ããã¯GUIããå®è¡ã§ããŸãããã³ã³ãœãŒã«ã®æ¹ãç°¡åã§ãã ãšã«ãããGUIããæãåºãæéã§ã:)ã
倿ããã«ã¯ãã¿ãŒããã«ãå®è¡ãããããžã§ã¯ãã®ãããã£ã¬ã¯ããªã«ç§»åããå¿
èŠããããŸãã æ¬¡ã«ã
output_filesã«ç§»åããŠã³ãã³ããå®è¡ããŸãïŒQuartusãŠãŒãã£ãªãã£ãå«ããã£ã¬ã¯ããªã
PATH倿°ã«ååšããå¿
èŠãããããšãå¿ããªãã§ãã ããïŒã
quartus_cpf -c soc.sof soc.rbf
ãã£ãïŒ FPGAãã¡ãŒã ãŠã§ã¢ãå
¥æããŸããã
ã«ãŒãã«ã¢ã»ã³ããª
ããã§ã¯ãARMã®ã«ãŒãã«ããã«ãããŸãããã
ããŒã«ã®ãã¡ã
ã¢ã«ãã©SoC EDSãå¿
èŠã«ãªããŸãã ãããããã¯ãã¹ã³ã³ãã€ã«ã«
arm-linux-gnueabihf-ã³ã³ãã€ã©ãŒã䜿çšããŸãã
ã«ãŒãã«ããã³ãã¢ãŠãããŸãã
git clone https://github.com/coliby/terasic_MTL.git
ã¹ã¯ãªãããèµ·åããã³ã³ãã€ã©ãã£ã¬ã¯ããªã
PATHã«è¿œå ããŠ
bashãå®è¡ããŸãã
/opt/altera/quartus14.0/embedded/embedded_command_shell.sh
ç°å¢å€æ°ãèšå®ããŸãã
export ARCH=arm export CROSS_COMPILE=arm-linux-gnueabihf- export LOADADDR=0x8000
ã«ãŒãã«ããããã£ã¬ã¯ããªã«ç§»åããæ§æãå®è¡ããŸãã
cd terasic_MTL/ make socfpga_defconfig
U-Bootçšã®ã«ãŒãã«ã€ã¡ãŒãžããã«ãããŸãã
make -j 4 uImage
次ã«ããããã
.dtb ïŒããã€ã¹ããªãŒBLOBïŒãã¡ã€ã«ãååŸããå¿
èŠããããŸãã ããã¯ããã©ãããã©ãŒã ã«é¢ããæ
å ±ïŒã€ã³ã¿ãŒãã§ã€ã¹ããã³ãã¯ããã¯ä¿¡å·ãã¢ãã¬ã¹ç©ºéãªã©ïŒãå«ããã€ããªãã¡ã€ã«ã§ãã ã«ãŒãã«ã¯åæåäžã«ãã®ãã¡ã€ã«ãèªã¿åãã倿ŽããŸãã ããã«ãããè€æ°ã®ããŒããŠã§ã¢ãã©ãããã©ãŒã ã§1ã€ã®ã¢ã»ã³ãã«ãããã³ã¢ã䜿çšã§ããŸãã
ãããã£ãŠã
.dtbãã¡ã€ã«ãååŸããŸãã
make socfpga_cyclone5.dtb
ãã ãããã®ãã¡ã€ã«ã¯ãã©ãããã©ãŒã çšã§ã¯ãªããããå°ã倿Žããå¿
èŠããããŸãã ãããè¡ãã«ã¯ããã¡ã€ã«ãããã¹ã圢åŒã®
.dts ïŒããã€ã¹ããªãŒãœãŒã¹ïŒã«å€æããŸãã
./scripts/dtc/dtc -I dtb -O dts -o soc.dts arch/arm/boot/dts/socfpga_cyclone5.dtb
ããã§ã
soc.dtsã§ bridge @ 0xff200000ãããã¯ãåé€ããå¿
èŠããã
ãŸã ã ããã¯ãæåãŸãã¯ããããé©çšããããšã§å®è¡ã§ããŸãã
patch soc.dts dts.patch
dts.patch 942,966d941 < bridge@0xff200000 { < compatible = "altr,h2f_lw_bridge-1.0", "simple-bus"; < reg = <0xff200000 0x200000>; <
ãã¡ã€ã«ã倿ããŠ
.dtbã«æ»ããŸãã
./scripts/dtc/dtc -I dts -O dtb -o soc.dtb soc.dts
åèšã§ã2ã€ã®ãã¡ã€ã«ã«èå³ããããŸãã
- ã¢ãŒã/ã¢ãŒã /ããŒã/ uImage
- soc.dtb
U-BootãšããªããŒããŒãæ§ç¯ãã
SoCã®èµ·åããã»ã¹ã¯æ¬¡ã®ãšããã§ãã
- ããŒãROM
- ããªããŒããŒ
- ããŒãããŒããŒ
- OS
ããŒãROMã¯ã黿ºæå
¥çŽåŸã«å®è¡ãããæåã®ããŒããã§ãŒãºã§ãã ãã®äž»ãªæ©èœã¯ã第2段éã§ãã
Preloaderãç¹å®ããŠå®äºããããšã§ãã
ããªããŒããŒæ©èœã¯ãã»ãšãã©ã®å Žåã
SDRAMã€ã³ã¿ãŒãã§ã€ã¹ã®åæåãš
HPSãã³ã®æ§æã§ãã
SDRAMã®åæåã§ã¯ãã³ãŒããå©çšå¯èœãªå
éšã¡ã¢ãªã®60 KBã«åãŸããªãå¯èœæ§ããããããæ¬¡ã®ã¹ããŒãžãå€éšã¡ã¢ãªããããŒãã§ããŸãã
ããŒãããŒããŒã¯
HPSã®ãããªãåæåã«åå ã§ããŸãã ãŸãããã®ã¹ããŒãžã¯ãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ãŸãã¯ãŠãŒã¶ãŒã¢ããªã±ãŒã·ã§ã³ãããŒãããŸãã éåžžïŒãããŠç§ãã¡ã®å ŽåïŒã
U-Bootã¯
BootloaderãšããŠæ©èœããŸãã
OS-ãã¹ãŠãã·ã³ãã«ã§ãã ãããç§ãã¡ã®ãæ°ã«å
¥ãã®
Linuxã§ãã ã«ãŒãã«ã¯ãã§ã«ãããŸããã«ãŒããã¡ã€ã«ã·ã¹ãã ã¯å°ãåŸã§ååŸããŸãã
次㫠ã
ããªããŒããŒãš
U-Bootãæ±ããŸã
ã¿ãŒããã«ãéããæ¢ç¥ã®ã¹ã¯ãªãããå®è¡ããŸãã
/opt/altera/quartus14.0/embedded/embedded_command_shell.sh
ãããžã§ã¯ãã®ãããã£ã¬ã¯ããªã«ç§»åããŸãã
cd ~/src/soc_test/
ã³ã³ãã€ã«åŸã
hps_isw_handoffãã£ã¬ã¯ããªã
ããã«è¡šç€ºãããã¯ãã§ãã
cd hps_isw_handoff
å¿
èŠãªãã¡ã€ã«ã®çæãéå§ããŸãã
bsp-create-settings --type spl --bsp-dir build --preloader-settings-dir soc_hps_0 --settings build/settings.bsp --set spl.boot.WATCHDOG_ENABLE false
ãã®åŸã
ãã«ããã£ã¬ã¯ããªã衚瀺ãããŸãã
ããªããŒããŒã®æ§ç¯ïŒ
make -C build
U-bootã®ãã«ãïŒ
make -C build uboot
ããã§ã
U-Bootã®å€æ°ãæ§æããå¿
èŠããããŸãã æåã«ãããã¹ããã¡ã€ã«
u-boot-env.txtãäœæããŸãã
u-boot-env.txt console=ttyS0 baudrate=115200 bootfile=uImage bootdir=boot bootcmd=run mmcboot bootdelay=3 fdt_file=soc.dtb fdt_addr_r=0xf00000 ethaddr=00:01:02:03:04:05 kernel_addr_r=0x10000000 mmcroot=/dev/mmcblk0p2 mmcpart=2 con_args=setenv bootargs ${bootargs} console=${console},${baudrate} misc_args=setenv bootargs ${bootargs} uio_pdrv_genirq.of_id=generic-uio mmc_args=setenv bootargs ${bootargs} root=${mmcroot} rw rootwait mmcboot=mmc rescan; ext2load mmc 0:${mmcpart} ${kernel_addr_r} ${bootdir}/${bootfile}; ext2load mmc 0:${mmcpart} ${fdt_addr_r} ${bootdir}/${fdt_file}; run mmc_args con_args misc_args; bootm ${kernel_addr_r} - ${fdt_addr_r} verify=n
次ã«ã倿°ãå«ãé åã®ãµã€ãºãæå®ããããšãå¿ããã«ããã€ããªåœ¢åŒã«å€æããŸã-4096ãã€ãã§ååã§ãã å®éã®ãµã€ãºãæå®ããããµã€ãºãè¶
ããå Žåã§ãã
mkenvimageã¯ãããå ±åããŸãã
./build/uboot-socfpga/tools/mkenvimage -s 4096 -o u-boot-env.img u-boot-env.txt
3ã€ã®ãã¡ã€ã«ã«èå³ããããŸãã
- ãã«ã/ uboot-socfpga / u-boot.img
- u-boot-env.img
- build / preloader-mkpimage.bin
Rootfsãã«ã
ãã®ã»ã¯ã·ã§ã³ã¯ã
Debianã䜿çšããŠãã人ïŒãŸãã¯ãã£ã¹ããªãã¥ãŒã·ã§ã³ã«
debootstrapããã
å Žå ïŒã察象ãšããŠããŸãã ããªãããããã®äžã«ããªãå Žåã
YoctoãŸãã¯ããªãã«äŸ¿å©ãªä»ã®æ¹æ³ã䜿çšã§ããŸãã
å¿
èŠãªããã±ãŒãžãã€ã³ã¹ããŒã«ããŸãã
sudo apt-get install debootstrap qemu-user-static binfmt-support
ãã£ã¬ã¯ããªãäœæããããã«å¿
èŠãªãã¡ã€ã«ãããŠã³ããŒãããŸãã
mkdir rootfs sudo debootstrap --arch armel --foreign wheezy rootfs http://ftp.debian.org/debian
ARMã¢ãŒããã¯ãã£çšã«æ§ç¯ãããã¢ããªã±ãŒã·ã§ã³ãå®è¡ããã«ã¯ã
qemu staticã䜿çšã
ãŸã ã ãããè¡ãã«ã¯ããã¡ã€ã«ã
rootfsã«ã³ããŒããŸãã
sudo cp /usr/bin/qemu-arm-static rootfs/usr/bin/
æ°ãããã¡ã€ã«ã·ã¹ãã ã«ç§»åããŸãã
sudo chroot rootfs /bin/bash
ã€ã³ã¿ããªã¿ã®ããã³ããããååããããŸããïŒ@ãã¹ãåïŒ/ïŒãã«å€æŽãããå Žåããã¹ãŠãããŸããããŸããã
ã€ã³ã¹ããŒã«ããã»ã¹ãå®äºããŸãã
/debootstrap/debootstrap --second-stage
/ etc / inittabã«æ¬¡ã®è¡
ãæ®ããŸãã
/ etc / inittab id:5:initdefault: si::sysinit:/etc/init.d/rcS ~~:S:wait:/sbin/sulogin l0:0:wait:/etc/init.d/rc 0 l1:1:wait:/etc/init.d/rc 1 l2:2:wait:/etc/init.d/rc 2 l3:3:wait:/etc/init.d/rc 3 l4:4:wait:/etc/init.d/rc 4 l5:5:wait:/etc/init.d/rc 5 l6:6:wait:/etc/init.d/rc 6 z6:6:respawn:/sbin/sulogin S:2345:respawn:/sbin/getty 115200 console
ãã¹ã¯ãŒããèšå®ããŸãã
passwd
ã¢ãŒã«ã€ããäœæããŸãã
tar -cpzf rootfs.tar.gz --exclude=rootfs.tar.gz /
ãã¹ãããã°ã©ã ãæžã
ç°¡åã«èšããšã
SoCã³ã³ããŒãã³ãéã®ã»ãšãã©ãã¹ãŠã®çžäºäœçšã¯ã1ã€ã®ã³ã³ããŒãã³ãã®ã¢ãã¬ã¹ç©ºéãå¥ã®ã³ã³ããŒãã³ãã®ã¢ãã¬ã¹ç©ºéã«ãããã³ã°ããããšã«ãã£ãŠçºçããŸãã
äŸãèããŠã¿ãŸãããã
Qsysã䜿çšãããããžã§ã¯ã
ã§ã¯ãã¢ãã¬ã¹
0ããå§ãŸã
HPS-to-FPGAã€ã³ã¿ãŒãã§ã€ã¹ã«ããµã€ãºã
262144ãã€ãã®
ãªã³ãããã¡ã¢ãªãããã¯ãé
眮ãããŠããããšã瀺ããŸããã
HPS-FPGAã€ã³ã¿ãŒãã§ã€ã¹èªäœã¯ã
0xC0000000ã® CPUã¢ãã¬ã¹ç©ºéã«ããããããŸãïŒ
Cyclone Vã®ããã¥ã¡ã³ããåç
§ïŒã ãã®çµæãïŒ
0xC0000000 + 0 ïŒããïŒ
0xC0000000 + 262143 ïŒã®ã¢ãã¬ã¹ã§CPUã«ã¢ã¯ã»ã¹ãããšãFPGAã®å
éšã¡ã¢ãªã«ã¢ã¯ã»ã¹ããŸãã
ãããã£ãŠãäœæ¥ã«ã¯ãä»»æã®ã¡ã¢ãªã¢ãã¬ã¹ã«ã€ããŠèªã¿æžãã§ãããŠãŒãã£ãªãã£ãå¿
èŠã§ãã ãœãŒã¹ã³ãŒãã¯æ¬¡ã®ãšããã§ãã
mem.c #include <stdio.h> #include <stdlib.h> #include <stdint.h> #include <fcntl.h> #include <sys/types.h> #include <sys/mman.h> #include <unistd.h> #include <errno.h> #define MAP_SIZE (4096) #define MAP_MASK (MAP_SIZE-1) int main( int argc, char *argv[] ) { int fd; if( argc < 2 ) { printf( "Usage:\n" ); printf( "%s byte_addr [write_data]\n", argv[ 0 ] ); exit( -1 ); } // /dev/mem , . fd = open( "/dev/mem", O_RDWR | O_SYNC ); if( fd < 0 ) { perror( "open" ); exit( -1 ); } void *map_page_addr, *map_byte_addr; off_t byte_addr; byte_addr = strtoul( argv[ 1 ], NULL, 0 ); // /dev/mem . . map_page_addr = mmap( 0, MAP_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, byte_addr & ~MAP_MASK ); if( map_page_addr == MAP_FAILED ) { perror( "mmap" ); exit( -1 ); } // ( ) map_byte_addr = map_page_addr + (byte_addr & MAP_MASK); uint32_t data; // , , -- . if( argc > 2 ) { data = strtoul( argv[ 2 ], NULL, 0 ); *( ( uint32_t *) map_byte_addr ) = data; } else { data = *( ( uint32_t *) map_byte_addr ); printf( "data = 0x%08x\n", data ); } // . if( munmap( map_page_addr, MAP_SIZE ) ) { perror( "munmap" ); exit( -1 ); } close( fd ); return 0; }
次ã«ãã¯ãã¹ã³ã³ãã€ã©ã䜿çšããŠãã«ãããå¿
èŠããããŸãã ãããè¡ãã«ã¯ãã¹ã¯ãªãããå®è¡ããŸãã
/opt/altera/quartus14.0/embedded/embedded_command_shell.sh
ãããŠã³ã³ãã€ã«ããŸãïŒ
arm-linux-gnueabihf-gcc -o mem.o mem.c
垯åå¹
ãæž¬å®ãããŠãŒãã£ãªãã£ãå¿
èŠã§ãã
memblock.c #include <stdio.h> #include <stdlib.h> #include <stdint.h> #include <fcntl.h> #include <sys/types.h> #include <sys/mman.h> #include <unistd.h> #include <errno.h> // #define COP_WRITE (0) #define COP_READ (1) #define COP_CHECK (2) int main( int argc, char *argv[ 0 ] ) { int fd; void *map_addr; if( argc < 5 ) { printf( "Usage:\n" ); printf( "%s <cop> <address> <word_count> <cycles>\n", argv[ 0 ] ); exit( -1 ); } // /dev/mem , . fd = open( "/dev/mem", O_RDWR | O_SYNC ); if( fd < 0 ) { perror( "open" ); exit( -1 ); } uint8_t cop; off_t addr; uint32_t word_cnt; uint32_t cycle_cnt; // cop = strtoul( argv[ 1 ], NULL, 0 ); // addr = strtoul( argv[ 2 ], NULL, 0 ); // / word_cnt = strtoul( argv[ 3 ], NULL, 0 ); // cycle_cnt = strtoul( argv[ 4 ], NULL, 0 ); // /dev/mem . map_addr = mmap( 0, word_cnt * 4, PROT_READ | PROT_WRITE, MAP_SHARED, fd, addr ); if( map_addr == MAP_FAILED ) { perror( "map" ); exit( -1 ); } uint32_t cycle; uint32_t word; uint32_t data; // switch( cop ) { // "". case( COP_WRITE ): for( cycle = 0; cycle < cycle_cnt; cycle++ ) { for( word = 0; word < word_cnt; word++ ) { *( ( uint32_t *) map_addr + word ) = word; } } break; // . case( COP_READ ): for( cycle = 0; cycle < cycle_cnt; cycle++ ) { for( word = 0; word < word_cnt; word++ ) { data = *( ( uint32_t *) map_addr + word ); printf( "idx = 0x%x, data = 0x%08x\n", word, data ); } } break; // " ". case( COP_CHECK ): for( cycle = 0; cycle < cycle_cnt; cycle++ ) { for( word = 0; word < word_cnt; word++ ) { data = *( ( uint32_t *) map_addr + word ); if( data != word ) { printf( "Error! write = 0x%x, read = 0x%x\n", word, data ); exit( -1 ); } } } break; default: printf( "Error! Unknown COP\n" ); exit( -1 ); } if( munmap( map_addr, word_cnt * 4 ) ) { perror( "munmap" ); exit( -1 ); } close( fd ); return 0; }
ã³ã³ãã€ã«ããŸãïŒ
arm-linux-gnueabihf-gcc -o memblock.o memclock.c
ãããã£ãŠã察象ã®ãã¡ã€ã«ã¯æ¬¡ã®ãšããã§ãã
SDã«ãŒããäœæ
ãã¹ãŠããŸãšãããšãã§ãã çŸæç¹ã§ã¯ã次ã®ãã¡ã€ã«ãå¿
èŠã§ãã
- soc.rbf
- uImage
- soc.dtb
- preloader-mkpimage.bin
- u-boot.img
- u-boot-env.img
- rootfs.tar.gz
- mem.o
- memblock.o
ãããã®ãããããååšããªãå Žåãããªãã¯äœããèŠéãã:)
ãã£ã¬ã¯ããªãäœæããæå®ããããã¹ãŠã®ãã¡ã€ã«ããã®ãã£ã¬ã¯ããªã«ã³ããŒããŸãã æ¬¡ã«ãmicroSDã«ãŒããèŠã€ããŠæ¥ç¶ããå¿
èŠããããŸãã
次ã®ã³ãã³ãã¯ãã«ãŒããdevice
/ dev / sdbãšããŠå®çŸ©ãããŠããããšãåæãšããŠããŸãã ãã®äžã«2ã€ã®ã»ã¯ã·ã§ã³ãäœæããŸãã
- / dev / sdb1-ããªããŒããŒããã³U-Bootçš
- / dev / sdb2-ãã¡ã€ã«ã·ã¹ãã çš
ã«ãŒããå¥ã®ååã§èå¥ãããŠããå Žåã¯ãé©åãªå€æŽãå ããŸãã
念ã®ããããã¹ãŠããŒãã§äžæžãããŸãã
泚æïŒ ããäžåºŠã/ dev / sdbã2çªç®ã®ããŒããã©ã€ãã§ã¯ãªãã«ãŒãã§ããããšã確èªããŸãã sudo dd if=/dev/zero of=/dev/sdb bs=10M
ããŒãã£ã·ã§ã³ãäœæããã«ã¯ã
fdiskãŠãŒãã£ãªãã£ã䜿çšããŸãã
sudo fdisk /dev/sdb
次ã«ã次ã®ã³ãã³ããå
¥åããŸãïŒç©ºã®è¡-EnterããŒãæŒããŸãïŒã
fdiskã®ã³ãã³ã o n p 1 2048 +1M n p 2 t 1 a2 t 2 83 w
æåããããšã確èªã§ããŸãïŒ
sudo fdisk -l /dev/sdb
次ã®ãããªãã®ãããã¯ãã§ãã
Fdisk -lã®åºå Disk /dev/sdb: 1966 MB, 1966080000 bytes 61 heads, 62 sectors/track, 1015 cylinders, total 3840000 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x02be07e5 Device Boot Start End Blocks Id System /dev/sdb1 2048 4095 1024 a2 Unknown /dev/sdb2 4096 3839999 1917952 83 Linux
次ã«ã
U-Boot倿°ãå«ãã€ã¡ãŒãžããããã«ã³ããŒããŸãã
sudo dd if=u-boot-env.img of=/dev/sdb bs=1 seek=512
ãã®åŸã
ããªããŒããŒãã³ããŒããŸãïŒ
sudo dd if=preloader-mkpimage.bin of=/dev/sdb1
ãããŠã
U-Bootèªäœ ïŒ
sudo dd if=u-boot.img of=/dev/sdb1 bs=64k seek=4
ext3ãã¡ã€ã«ã·ã¹ãã ãäœæããŸãã
sudo mkfs.ext3 /dev/sdb2
ããŠã³ãããïŒ
sudo mount /dev/sdb2 /mnt/
ãããŠã
rootfsãå±éã
ãŸã ïŒ
sudo tar xvf rootfs.tar.gz -C /mnt/
次ã«ãã«ãŒãã«ã€ã¡ãŒãžã
dtb ãFPGAãã¡ãŒã ãŠã§ã¢ãããã³ãã¹ãããã°ã©ã ãã³ããŒããŸãã
sudo cp uImage /mnt/boot/ sudo cp soc.dtb /mnt/boot/ sudo cp soc.rbf /mnt/boot/ sudo cp mem.o /mnt/root/ sudo cp memblock.o /mnt/root/
ãã¡ã€ã«ã·ã¹ãã ãã¢ã³ããŠã³ãããŸãã
sudo umount /dev/sdb2
ãã¹ãŠãã«ãŒãã®æºåãã§ããŸããïŒ
ããŒãã®èµ·åãšåž¯åå¹
ã®æž¬å®
ãã¹ãŠãæçµçã«äœæ¥ã®æºåãã§ããŸããã ã«ãŒããæ¿å
¥ããUSBãšé»æºãæ¥ç¶ããŸãã
ã³ã³ãœãŒã«ã«è¡ããŸãïŒ
minicom -D /dev/ttyUSB0 -b 115200 -s
ãŸãã
FPGAããã©ãã·ã¥ããŸãã
ãããè¡ãã«ã¯ãããŒãã®
P18ã¹ã€ããããOn On On On Onãäœçœ®ïŒã¹ã€ãã1ã5ïŒã«èšå®ããŸãã
FPGAã®çŸåšã®ç¶æ
ã確èªããŸãã
cat /sys/class/fpga/fpga0/status
æ§æãã§ãŒãºã衚瀺ãããã¯ãã§ã
ãã¡ãŒã ãŠã§ã¢ãå
¥åããŸãã
dd if=/boot/soc.rbf of=/dev/fpga0 bs=4096
ç¶æ
ãããäžåºŠç¢ºèªããŸãã
cat /sys/class/fpga/fpga0/status
ã¹ããŒã¿ã¹ã
ãŠãŒã¶ãŒã¢ãŒãã«å€æŽãã
ãŸã ã ããã¯ãFPGAãæ§æãããŠæºåãæŽã£ãããšãæå³ããŸãã
次ã«ããŠãŒãã£ãªãã£ã確èªããŸãã ããããã®åã«ãããå°ãããã¡ã€ã«äœæ¥ãã
ã¯ãã¹ã³ã³ãã€ã©ãš
Debian㯠ãåçãªã³ã«ã®åå
ãç°ãªããŸãã ãããã£ãŠããŠãŒãã£ãªãã£ãæ©èœããããã«ã¯ãæ£ãããªã³ã«ãŒãžã®ãªã³ã¯ãäœæããå¿
èŠããããŸãã
ln -s /lib/ld-linux.so.3 /lib/ld-linux-armhf.so.3
ãã®ããããŠãŒãã£ãªãã£ãèµ·åããŸãïŒã¢ãã¬ã¹ã®èª¬æã¯å°ãäžã«ãªããŸãïŒã
./mem.o 0xFFD0501C
ãã®çµæãè¡
ããŒã¿= 0x00000007ã衚瀺ãããå Žåããã¹ãŠãæ£åžžã§ãã
äžã§æžããããã«ãå
éšFPGAã¡ã¢ãªã¯ã¢ãã¬ã¹
0xC0000000ããå§ãŸãã¢ãã¬ã¹ç©ºéã«ããããããŸãã ãããããã®ã¡ã¢ãªã䜿çšããåã«ãããã«2ã€ã®ã¢ã¯ã·ã§ã³ãå®è¡ããå¿
èŠããããŸãã
ãŸããããã©ã«ãã§ã¯
CPUãš
FPGAéã®ãã¹ãŠã®ã€ã³ã¿ãŒãã§ã€ã¹ããªã»ãããããŠãããããåé€ããå¿
èŠããããŸãã
ãªã»ãããããŒãžã£ãŒïŒrstmgrïŒãããã¯ã¯ãããŒã¹ã¢ãã¬ã¹ã
0xFFD05000ã§ãããå
·äœçã«ã¯ãªãã»ããã
0x1Cã® brgmodrstã¬ãžã¹ã¿ã§ãããã
æ
åœããŸãã æçµã¬ãžã¹ã¿ã¢ãã¬ã¹ã¯
0xFFD0501Cã§ãã é¢äžããæäžäœãããã¯3ã€ã ãã§ãã
- 0th - HPS-FPGAã€ã³ã¿ãŒãã§ã€ã¹ããªã»ããããŸã
- 1çªç® â LWHPSããFPGAãžã®ã€ã³ã¿ãŒãã§ã€ã¹ããªã»ããããŸã
- 2çªç® â FPGAããHPSãžã®ã€ã³ã¿ãŒãã§ã€ã¹ããªã»ããããŸã
ãã¹ãŠã®ãããã®åäœã®ããžãã¯ã¯åãã§ã-ãŠããããããã«æžã蟌ãŸããŠããå Žåã察å¿ããã€ã³ã¿ãŒãã§ãŒã¹ã¯ãªã»ãããããŠããŸãã ãã®çµæããã®ã¬ãžã¹ã¿ã®ããã©ã«ãå€ã¯
0x7ã§ããããŠãŒãã£ãªãã£ã䜿çšããŠèªã¿åã£ããšãã«èŠãŸããã
HPS-to-FPGAã€ã³ã¿ãŒãã§ã€ã¹ãããªã»ãããåé€ããå¿
èŠããããŸããã€ãŸããã¬ãžã¹ã¿ã«
0x6ã®æ°å€ãæžã蟌ãå¿
èŠããããŸãã
./mem.o 0xFFD0501C 0x6
ãã®åŸãã¬ãžã¹ã¿ãå床èªã¿åããããŒã¿ãæ£ããæžã蟌ãŸããããšã確èªããŸãã
./mem.o 0xFFD0501C
次ã«ã
HPSããFPGAãžã®ã€ã³ã¿ãŒãã§ã€ã¹ã®
CPUã®ã¢ãã¬ã¹ç©ºéãžã®ãããã³ã°ãæå¹ã«ããå¿
èŠããã
ãŸã ã ããã¯ãããŒã¹ã¢ãã¬ã¹ã
0xFF800000ã®
L3ïŒNIC-301ïŒGPVãããã¯ïŒl3regsïŒ ãããã³å
·äœçã«ã¯ãªãã»ãã
0ã® ãªãããã¬ãžã¹ã¿ãåå ã§ãã
HPS-to-FPGAã®å Žåããããçªå·
3ã責任ãè² ããŸãã ãã®ãããã¬ãžã¹ã¿ã«æ°å€
0x8ãæžã蟌ãå¿
èŠããããŸãã
./mem.o 0xFF800000 0x8
æ®å¿µãªããããã®ã¬ãžã¹ã¿ã¯æžã蟌ã¿ã®ã¿å¯èœãªãããæ€èšŒã®ããã«ããŒã¿ãèªã¿åãããšã¯ã§ããŸããã
ããã§ã
FPGAã¡ã¢ãªã®èªã¿åããšæžã蟌ã¿ãã§ããããã«ãªããŸããã ããããã§ãã¯ããŠãã ããã ç§ãã¡ã¯èªã¿ãŸãïŒ
./mem.o 0xC0000000
åœç¶ããŒããå¿
èŠã§ãã ããã«äœããæžããŸãïŒ
./mem.o 0xC0000000 0x12345678
ããäžåºŠèªãã§ãã ããïŒ
./mem.o 0xC0000000
èšé²ãšäžèŽããå¿
èŠããããŸãã
ãã£ãïŒ ãã£ãšãã£ãïŒ
FPGAãåäœãã
SoCãå
¥æãã
CPUããã¡ã¢ãªãžã®ã¢ã¯ã»ã¹ãæé
ããŸããã
ãããããã èªã¿æžãããã ãã§ã¯å®å
šã«éå±ã§ãã å°ãªããšãã€ã³ã¿ãŒãã§ãŒã¹ã®ã¹ã«ãŒããããæž¬å®ããŸãããã ãŸããæéãããããŸããã
ãããè¡ãã«ã¯ã2çªç®ã®
memblockãŠãŒãã£ãªãã£ãå¿
èŠã§ãã
root@desktop:~
次ã®ããã«æ©èœããŸããæåã®åŒæ°
copã0ã®å Žåãã¢ãã¬ã¹
addressããå§ãŸã32ãããã¯ãŒãã®
word_countã« ã
0ãã
word_count-1ãŸã§ã®æ°åã®ã·ãŒã±ã³ã¹ãæžã蟌ãŸããŸãã æé å
šäœã
ãµã€ã¯ã«æéå®è¡ãããŸãïŒããã¯åž¯åå¹
ãããæ£ç¢ºã«æž¬å®ããããã«è¡ãããŸãïŒã
copã1ã®å Žåããããã®åãåèªãèªã¿åãããŠè¡šç€ºãããŸãã
copã2ã®å Žåãåèªãèªã¿åããããã®æå³ãä»®æ³çã«æžããããã®ãšæ¯èŒãããŸãã
ã芧ãã ããã ããã€ãã®ããŒã¿ãæžããŸãããïŒ
./memblock.o 0 0xC0000000 10 1
ä»ããããèæ
®ããŠãã ããïŒ
./memblock.o 1 0xC0000000 10 1
çµæã¯æ¬¡ã®ããã«ãªããŸãã
çµè«memblock.o data = 0x00000000 data = 0x00000001 data = 0x00000002 data = 0x00000003 data = 0x00000004 data = 0x00000005 data = 0x00000006 data = 0x00000007 data = 0x00000008 data = 0x00000009
ããã§ãããŒã¿ãæ¯èŒããå
·äœçã«ã¯ãããã«å€ãã®åèªãèšå®ããŠã¿ãŸãããã
./memblock.o 2 0xC0000000 11 1
ãã®è¡ãååŸããå¿
èŠããããŸãïŒ
Error! write = 0xa, read = 0x0
次ã«ã1000åã®ç¹°ãè¿ãã§ã¡ã¢ãªå
šäœã®èšé²ãéå§ããèšé²æéãæž¬å®ããŸãã
time ./memblock.o 0 0xC0000000 0x10000 1000
5åã®éå§æã®å¹³åå€ã¯11.17ç§ã§ãã ã¹ã«ãŒããããèæ
®ããŸãã
1000 * 65536 * 4 * 8 /_ / ( 11.17 * 10^6 ) = 187.75 /c
ããã»ã©åããªãã èªæžã¯ã©ãã§ããïŒ
time ./memblock.o 2 0xC0000000 0x10000 1000
å¹³åæé10.5ç§ã çµæïŒ
1000 * 65536 * 4 * 8 / ( 10.5 * 10^6 ) = 199.73 /c
ã»ãŒåãã åœç¶ããããã®æäœã®ããããã®æéäžã2ã€ã®ã³ã¢ã®ããããã100ïŒ
ããŒããããŸãã
ã³ã³ãã€ã«äžã«
-O3ãã©ã°ã远å ãããšãæžã蟌ã¿ããã³èªã¿åãã®ã¹ã«ãŒãããã¯ãããã
212 Mbit / sããã³
228 Mbit / sã«ãªããŸãã å°ãè¯ããªããŸããããæµæã§ã¯ãããŸããã
ããããããã¯é©ãããšã§ã¯ãããŸãã-ãã®ã¹ã«ãŒããããäžããããã«äœãããŸããã§ããã ããªãããŒãªæé©åã詊ããããã«ãŒãã«ã«ç®ãåããããææªã®å Žåã¯å°ãªããšã
DMAãåºå®ããŠããã»ããµãè§£æŸãããããã®ã¯è¯ãããšã§ãã
ããããããã¯ãã¡ããã誰ãã«ãšã£ãŠè峿·±ããã®ã«ãªãå Žåã¯ã次ã®èšäºã§æ¢ã«èª¬æããŠããŸãã
æåŸã«éããäººã«æè¬ããŸãïŒ é 匵ã£ãŠ
䟿å©ãªãªã³ã¯
Cyclone V ã«é¢ãããã¯ã€ãããŒããŒRocketboards.org -SoCãæèŒããããŒãã«é¢ããããŸããŸãªèšäº
EBV SoCratesè©äŸ¡ããŒã
ã«é¢ããå
·äœçãª
æ
å ±