1.GHRD工程简介
GHRD的全称为Golden Hardware Reference Design,翻译过来就是黄金硬件参考设计。
1.1.工程所包含组件
-
ARM Cortex™-A9 MPCore HPS
其中f2h_axi代表FPGA端到HPS端的通信总线,h2f_axi代表HPS到FPGA端的通信总线,h2f_lw_axi表示低速的通信。 -
Four user push-button inputs
-
Ten user DIP switch inputs
-
Ten user I/O for LED outputs
-
64KB of on-chip memory
-
JTAG to Avalon master bridges
-
Interrupt capturer for use with System Console
-
System ID
此外还有3个组件,暂时还不知道其作用是什么。
mm_bridge_0应该是内存映射控制。
2.简单开发
开发主要分为硬件开发、系统更新和软件开发。通过硬件开发生成sof文件,最后转换成rbf文件用于SD卡配置HPS系统。系统更新主要有u-boot和preloader以及设备树的更新。软件开发则是C语音开发控制PIO驱动LED灯流水。
2.1.硬件编译
2.1.1.工程准备
首先拷贝一份该工程,放到自己做实验的文件夹中。
双击打开qpf文件。
然后在tool中打开qsys,选择本工程的qsys文件。
2.1.2.修改led_pio配置
双击选中系统设置好的led_pio这个IP核,在右侧会出现这个IP的属性面板。本次实验将位宽由10位修改为5位。
然后点击Assign Base Addresses重新分配一下外设地址。
最后直接点击Generate -> Generate…生成新的qsys文件(也就是硬件配置文件)。
然后关闭qsys。
2.1.3.修改顶层文件
因为只修改了PIO的位宽,所以HPS的接口并没有变,只是LED_PIO接口位宽变为了5。因此只需要修改顶层的这个接口,从10位改为5位。
找到这个信号的定义,改成5位位宽即可
再找到与这个信号有关的信号,也进行一定修改,这里看个人想法改就行。
由28位改为24位
将LED灯的接口由[9:1]改为[9:5]
将剩下的led进行心跳闪烁(原本只有一个LED心跳闪烁)
之后点击编译即可生成sof文件。
2.1.4.将sof文件转换为压缩后的rbf文件
进入工程中的output文件夹,双击sof_to_rbf.bat文件就能够自动生成该文件。
其实到这里生成完rbf文件之后,就可以直接进入2.3.软件开发部分了。2.2只是为了学习一下系统更新是怎样的过程。
2.2.系统更新
2.2.1.制作Preloader Image和u-boot
首先双击该bat文件,打开DES控制台
2.2.1.1使用BSP-editor生成preloader
1.输入:
bsp-editor
2.左上角点击 File ->New HPS BSP…
3.打开之后是这样的界面
4.设置路径选择该工程下面的hps_isw_handoff\soc_system_hps_0
,点击ok
5.之后点击generate生成即可,完成之后点击exit。
6.然后工程文件夹下面会有一个 software 的文件夹,里面有一个 spl_bsp 文件夹。
2.2.1.2.编译 preloader 和 uboot
回到之前的控制台如下命令,进入生成的这个文件夹。
cd E:/SOC_study/altera_soc/DE10_Standard_GHRD/software/spl_bsp
然后输入
make uboot
整个过程很慢,我大概20多分钟,中间要记得按几次回车,不然会不动了。
编译完成后在 software\preloader\uboot-socfpga 目录下会找到 u-boot.img 文
件,在 software\preloader\uboot-socfpga\spl 下会找到 u-boot- spi.bin
2.2.1.3.生成Preloader Image
将上面说的 u-boot- spi.bin 和u-boot.img(这个文件下一步才需要)文件复制,粘贴到向上两层的 preloader 目录中
然后将控制台工作目录转到preloader中,输入:
mkpimage –hv 0 -o preloader.img u-boot-spl.bin
然后会产生一个 preloader.img 文件
2.2.2.更新uboot和preloader
在此之前需要将做好的SD卡插到读卡器,然后再插到电脑上,这里我的U盘是F盘
输入:
alt-boot-disk-util -p preloader.img -b u-boot.img -a write -d F
提示失败
换成在Linux上更新
参考: 在SoCEDS环境下编译和更新preloader和uboot程序的方法.
最终完成uboot更新,在终端上可见最新时间为(Mar 212021 - 00:13:51)
2.2.3.设备树更新
首先确认工程文件当中是否有soc_system.sopcinfo
和hps_common_board_info.xml
以及soc_system_board_info.xml
文件。
根据后两个文件可以生成dts文件。
1.打开控制台
将当前目录调整到工程目录下。
输入
sopc2dts --input soc_system.sopcinfo --output soc_system.dts --board soc_system_board_info.xml --board hps_clock_info .xml --bridge-removal all
生成dts文件。
再输入
dtc -I dts -O dtb -o soc_system.dtb soc_system.dts
生成dtb文件。
dtb文件就是设备树文件,为一个二进制文件。
实际上工程目录文件夹下面还有一个Makefile文件,可以直接输入
make dts
make dtb
生成设备树文件。
生成之后要把设备树文件复制到SD卡中,替换掉原来的设备树文件。
2.3.软件C开发
2.3.1.生成HPS硬件外设的头文件
找到我们安装的EDS路径,双击打开下图标记的bat文件,启动控制台。
输入控制台命令:
1.首先将工作路径调整到GHRD工程路径下。
cd E:/SOC_study/altera_soc/DE10_Standard_GHRD
2.我们需要生成一个HPS头文件,该头文件是定义FPGA端IP对应到HPS上的物理地址等信息的。在工程下面有个generate_hps_qsys_header.sh
文件。
打开是这样的内容,功能是根据qsys生成的sopcinfo硬件数据文件(该硬件信息文件放在工程目录下,如果不是,需要修改路径),生成头文件,该头文件命名为hps_o.h
。
#!/bin/sh
sopc-create-header-files \
"./soc_system.sopcinfo" \
--single hps_0.h \
--module hps_0
操作过程:
./generate_hps_qsys_header.sh
生成之后打开该头文件,可以看到其硬件信息,如图,为led在hps中的相关信息,主要关注其物理地址映射LED_PIO_BASE 为0x100,LED_PIO_DATA_WIDTH 为数据位宽5,也就是该工程定义的LED为5位pio接口。
2.3.2.编译c文件
首先从例程文件夹拿过来一个叫HPS_FPGA_LED的工程放到我们的实验工程下面,这是是控制LED实现流水灯的代码,内部有3个文件,其中hps_0.h
我们需要用刚才生成的硬件的头文件替换掉。
这里先进入HPS_FPGA_LED文件夹中,EDS控制台输入:
cd HPS_FPGA_LED
直接make即可生成可执行文件
操作过程:
最后将HPS_FPGA_LED可执行文件直接复制到sd卡中。
2.4.跑程序测试系统
将开发板上电,插上串口调试。
终端输入操作:
fdisk -l #查看分区
mount -t vfat /dev/mmcblk0p1 /mnt #把mmcblk0p1分区挂载到mnt。
cd /mnt #进入mnt
ls #查看该目录下文件
之后就可以执行刚才复制的可执行文件了。