PULPino在zedboard上的下载、测试

来源:互联网 发布:datediff mysql 编辑:程序博客网 时间:2024/06/08 19:23

PULPino是一个开源的微型控制系统,基于一个32位RISC-V核心,由瑞士苏黎世联邦理工学院与意大利博洛尼亚大学联合开发。核心IPC接近1,完全支持基整数指令集(RV32I),压缩指令(RV32C)和部分支持乘法指令集扩展(RV32M)。在https://github.com/pulp-platform上有全部源代码,包括:处理器、外设、总线、编译器等,下面是我在zedboard上下载、测试PULPino的过程。试验环境是Ubuntu14.04,64bit。


1、下载、编译GCC编译器

      PULPino中引入了一些扩展指令,所以需要修改原来RISC-V提供的编译器,方法很简单,首先

[objc] view plain copy
  1. git clone https://github.com/pulp-platform/ri5cy_gnu_toolchain.git  
     获取puplino专用编译器。然后打开终端,进入所在目录,输入make,会自动联网下载RISC-V的编译器,并且加入puplino的补丁。编译过程比较长,编译完成后,修改bashrc(使用命令gedit ~/.bashrc),将编译得到的GCC工具所在路径添加到PATH,如下:
[objc] view plain copy
  1. export PATH=$PATH:/home/leisl/ri5cy_gnu_toolchain/install/bin  
     然后在终端中使用source ~/.bashrc,使得新的设置生效。此时在终端中输入riscv32-unknown-elf-,然后按两下tab键,就会出现所有的GCC工具。


2、安装vivado 2015.1

      因为PULPino提供的工程是在vivado 2015.1中测试的,所以这里也下载这个版本,避免出现莫名其妙的问题,下载、解压后,输入

[objc] view plain copy
  1. sudo /.xsetup  
     会出现图形化的安装界面,按照提示安装即可,版本选择vivado webpack,软件包里面要勾选Software DevelopKit,安装目录保持默认的/opt/Xilinx,安装的时候可能会提示权限不足,需要在opt下新建一个文件夹Xilinx即可,赋予所有人读写权限。

     安装完成后,从xilinx官网获取licence,下载导入。修改bashrc(使用命令gedit ~/.bashrc),将xilinx可执行文件的路径添加到PATH,如下:

[objc] view plain copy
  1. export LD_LIBRARY_PATH=/opt/Xilinx/Vivado/2015.1/lib/lnx64.o  
  2. export PATH=$PATH:/home/leisl/ri5cy_gnu_toolchain/install/bin:/opt/Xilinx/Vivado/2015.1/bin:/opt/Xilinx/SDK/2015.1/bin:/opt/Xilinx/SDK/2015.1/gnu/microblaze/lin/bin:/opt/Xilinx/SDK/2015.1/gnu/arm/lin/bin:/opt/Xilinx/SDK/2015.1/gnu/microblaze/linux_toolchain/lin64_be/bin:/opt/Xilinx/SDK/2015.1/gnu/microblaze/linux_toolchain/lin64_le/bin:/opt/Xilinx/DocNav  
  3. export XILINX_VIVADO=/opt/Xilinx/Vivado/2015.1  
     使用source ~/.bashrc使得设置生效。

     此时输入vivado可以直接打开vivado,但是会提示一些文件夹的权限不足,按照提示修改即可。

3、需要PyYAML,使用 sudo python ./setup.py install 进行安装即可。


4、下载pulpino源码

     在终端中输入如下指令:

[objc] view plain copy
  1. git clone https://github.com/pulp-platform/pulpino.git  
     很快,大约13.11MB,进入所在目录,运行./update-ips.py,这个命令会将各个IP的代码从github上clone到ipx目录下。

5、编译pulpino
      在编译的最后需要用到gmake,所以在编译前先建立一个gmake的软连接,如下:

[objc] view plain copy
  1. cd /usr/bin  
  2. sudo ln -s make gmake       
      进入pulpino的fpga目录,输入make all,会自动编译需要下载到FPGA的bit文件、rootfs、devicetree、fbsl、uboot等,都会在pulpino/fpga/sw/sd_image目录下出现。

      在编译得到rootfile的时候可能需要给出交叉编译工具(BR2_TOOLCHAIN_EXTERNAL_PATH)的路径,输入如下路径即可

[objc] view plain copy
  1. /opt/Xilinx/SDK/2015.1/gnu/arm/lin  

6、制作zedboard启动的SD卡

      需要将上面得到的bit文件、rootfs、devicetree、fbsl、uboot等复制到SD卡中,在复制之前,需要格式化SD卡,将其分为两个分区,一个boot分区,一个root分区,分区制作的方法在www.wiki.xilinx.com/Prepare+Boot+Medium中有详述,按照其中的步骤一步步来即可。这里也简单提一下,不清楚的可以参考那篇文章。我是通过USB读卡器读写SD卡的,插上读卡器之后,使用命令

[objc] view plain copy
  1. dmesg  
     会在最后列出SD对应的盘符,我的是sdb,所以使用如下指令擦除第一个sector,将其中的X换为b,在后面不再强调这一点

[objc] view plain copy
  1. dd if=/dev/zero of=/dev/sdX bs=1024 count=1  
使用如下指令查看SD卡的情况:

[text] view plain copy
  1. fdisk -l /dev/sdX  
输出类似如下:

[objc] view plain copy
  1. Disk /dev/sdb: 8068 MB, 8068792320 bytes  
  2. 249 heads, 62 sectors/track, 1020 cylinders, total 15759360 sectors  
  3. Units = sectors of 11 * 512 = 512 bytes  
  4. Sector size (logical/physical): 512 bytes / 512 bytes  
  5. I/O size (minimum/optimal): 512 bytes / 512 bytes  
  6. Disk identifier0x00000000  
  7.    
  8. Disk /dev/sdb doesn't contain a valid partition table  
使用上面结果第一行的SD卡总大小除以8225280,得到扇面数,也就是8068792320 / 8225280 = 980,这个值在下面会用到,接下来进行分区:

[objc] view plain copy
  1. fdisk /dev/sdX  
  2. Command (m for help): x  
  3. Expert command (m for help): h  
  4. Number of heads (1-256default 30): 255  
  5. Expert command (m for help): s  
  6. Number of sectors (1-63default 29): 63  
  7. Expert command (m for help): c  
  8. Number of cylinders (1-1048576default 2286): <刚刚计算得到的扇面数>  
  9. Command (m for help): r  
  10. Command (m for help): n  
  11. Partition type:  
  12.  p primary (0 primary, 0 extended, 4 free)  
  13.  e extended  
  14. Select (default p): p  
  15. Partition number (1-4default 1): 1  
  16. First sector (2048-15759359default 2048):  
  17. Using default value 2048  
  18. Last sector, +sectors or +size{K,M,G} (2048-15759359default 15759359): +200M  
  19.    
  20. Command (m for help): n  
  21. Partition type:  
  22.  p primary (1 primary, 0 extended, 3 free)  
  23.  e extended  
  24. Select (default p): p  
  25. Partition number (1-4default 2): 2  
  26. First sector (411648-15759359default 411648):  
  27. Using default value 411648  
  28. Last sector, +sectors or +size{K,M,G} (411648-15759359default 15759359):  
  29. Using default value 15759359  
  30. Command (m for help): a  
  31. Partition number (1-4): 1  
  32.    
  33. Command (m for help): t  
  34. Partition number (1-4): 1  
  35. Hex code (type L to list codes): c  
  36. Changed system type of partition 1 to c (W95 FAT32 (LBA))  
  37.    
  38. Command (m for help): t  
  39. Partition number (1-4): 2  
  40. Hex code (type L to list codes): 83  
  41. Command (m for help): p  
  42.    
  43. Disk /dev/sdb: 8068 MB, 8068792320 bytes  
  44. 249 heads, 62 sectors/track, 1020 cylinders, total 15759360 sectors  
  45. Units = sectors of 11 * 512 = 512 bytes  
  46. Sector size (logical/physical): 512 bytes / 512 bytes  
  47. I/O size (minimum/optimal): 512 bytes / 512 bytes  
  48. Disk identifier0x920c958b  
  49.    
  50.  Device Boot Start End Blocks Id System  
  51. /dev/sdb1 * 2048 411647 204800 c W95 FAT32 (LBA)  
  52. /dev/sdb2 411648 15759359 7673856 83 Linux  
  53.    
  54. Command (m for help): w  
  55. The partition table has been altered!  
  56.    
  57. Calling ioctl() to re-read partition table.  
  58.    
  59. WARNING: If you have created or modified any DOS 6.x  
  60. partitions, please see the fdisk manual page for additional  
  61. information.  
  62. Syncing disks.  
     拔出SD卡,再插入计算机,此时在/dev目录下应该出现了sdb1、sdb2,使用如下命令格式化这两个分区:

[objc] view plain copy
  1. mkfs.vfat -F 32 -n boot /dev/sdb1  
  2. mkfs.ext4 -L root /dev/sdb2  
然后加载这两个分区

[objc] view plain copy
  1. mkdir -p /mnt/boot  
  2. mount /dev/sdb1 /mnt/boot  
  3. <pre class="text">mkdir -p /mnt/root  
  4. mount /dev/sdb2 /mnt/root   

     将pulpino/fpga/sw/sd_image目录下的BOOT.bin、uImage、devicetree.dtb三个文件复制到/mnt/boot,也就是SD的Boot分区,将rootfs.tar解压缩到/mnt/root,也就是root分区,解压指令如下:

[objc] view plain copy
  1. cd /mnt/root  
  2. tar -xvf /home/leisl/pulpino/fpga/sw/sd_image/rootfs.tar  
    SD卡就制作完成了。


7、安装minicom,这是一个linux下使用的串口工具,使用如下命令即可安装:

[objc] view plain copy
  1. sudo apt-get install minicom  

8、将zedboard接电源,并且将J14 UART口接计算机,网口接到hub,要求有DHCP功能,家用的无线路由器都有这个功能。波动开关,加电。


9、此时在终端中使用ls /dev可以发现又一个新设备ttyACM0,这个对应的就是zedboard,打开minicom,如下:

[objc] view plain copy
  1. sudo minicom -s  
      然后配置串口为/dev/ttyACM0,如下:

      

      其余保持不变,返回后,点击回车,即可连上,如下:

      

     输入reset,重新启动zedboard。登录时用户名是root,没有密码。


10、设置zedboard的SSH

      在zedboard上新建一个用户,与主机的用户名相同,我这里就是leisl,

[objc] view plain copy
  1. adduser leisl  
        修改zedboard上的/etc/shadow,原来的一行如下:


改为如下:

[objc] view plain copy
  1. leisl:1H9sF86SwXPkk:15695:5:99999:7:5:20000:   
    此时就可以正常使用ssh访问zedboard了,也可以使用scp传递文件了。


11、进入pulpino/fpga/sw/apps/spiload,输入make,得到spiload,上传到zedboard

[objc] view plain copy
  1. scp spiload leisl@192.168.2.104:/home/leisl/  

12、编译应用程序

      首先安装cmake、libswitch-perl

[objc] view plain copy
  1. sudo apt-get install cmake  
  2. sudo apt-get install libswitch-perl  
       在pulpino目录下新建一个文件夹build,将pulpino/sw目录下的cmake_configure.riscv.gcc.sh复制到build文件夹下,修改如下两项:
[objc] view plain copy
  1. # if you want to have compressed instructions, set this to 1  
  2. RVC=1,改为1  
  3. PULP_GIT_DIRECTORY=../   按照实际修改即可  
       执行这个配置文件。接下来可以编译应用程序,在build目录下,输入make led_demo,将pulpino/build/apps/fpga/led_demo/slm_files目录下的spi_stim.txt上传到开发板,如下:
[objc] view plain copy
  1. scp spi_stim.txt leisl@192.168.2.101:/home/leisl  
       然后在ssh或者minicom中执行./spiload ./spi_stim.txt,可以发现亮了7个红色LED灯。但是实际上这个程序要丰富的多,LED灯应该是类似于跑马灯那样点亮的,而不是一下子点亮,需要修改pulpino/sw/apps/fpga/led_demo目录下的main.c,将其中waste_time函数中的循环次数变大,改为1000000,重新到build目录下编译,然后上传,运行,可以发现跑马灯的效果。


13、编译应用程序helloworld

       首先需要修改一下helloworld,具体原因不知道,但是如果不做这个修改,不会显示helloworld,修改pulpino/sw/apps/helloworld目录下的main.c文件,如下:

[objc] view plain copy
  1. #include <stdio.h>  
  2. void waste_time() {  
  3.   int i;  
  4.   for(i = 0; i < 1000000; i++) asm volatile("nop");  
  5. }  
  6.   
  7. int main()  
  8. {  
  9.   waste_time();                 // 添加了一个waste_time函数  
  10.   printf("Hello World!!!!!\n");  
  11.   
  12.   return 0;  
  13. }  
然后进入build目录,输入make helloworld,将pulpino/build/apps/helloworld/slm_files目录下的spi_stim.txt上传到开发板,具体步骤参考上面的,然后再minicom中执行,

[objc] view plain copy
  1. ./spiload -t5 ./helloworld  
有个地方需要注意,spiload要加上参数-t,表示在这几秒之内pulpino通过UART输出的信息都显示在屏幕上,就可以发现helloworld了。


其余的试验还没有做,有兴趣的朋友可以试试,到时告诉我测试步骤、测试结果啊。


原创粉丝点击