【SoC FPGA学习】十一、基于 Linux 应用程序的 HPS 在线配置 FPGA

网友投稿 1059 2022-05-29

在众多的嵌入式系统应用中, 有一类应用可能需要根据不同的应用场景,动态的更改 FPGA 内部的逻辑设计, 以适配不同的工作环境。 例如在一个数据采集系统中,连接不同型号的模拟数据采集卡, 其所需要的 FPGA 接口逻辑以及内部的数据变换处理逻辑都有可能不同。不同性能的 ADC 芯片其所能工作的采样率不一样, 即所需的接口时钟频率不一样,而在 FPGA 中针对高速时钟信号希望动态修改频率,传统的方案只能使用多路时钟切换电路, 或者使用PLL 动态重配置方案。 而基于 SoC FPGA 的在系统重配置 FPGA 解决方案,可以通过识别不同的 ADC 型号, 选择对应的 FPGA 驱动和应用逻辑的配置数据配置到 FPGA 中, 从而实现对不同硬件的匹配。

而另外一个更加能够体现出这种在系统重配置方案的优势情景是,如果不同的硬件,其与 FPGA 连接时同一功能属性的引脚可能分布在不同的位置,例如对于 AC501-SoC 开发板上的通用显示扩展接口,其能够连接 8080 接口的 LCD 液晶屏,也能连接 RGB 接口的TFT 显示屏, 还能够连接 VGA 输出模块,实现 VGA 视频的输出, 而这三种外设的功能引脚定义都有差异, 直接连接到开发板上很难通过同一个逻辑驱动电路实现自动兼容,此时, 如果希望系统能够根据连接的是 LCD、 RGB-TFT 或者 VGA 来适配相应的逻辑驱动和 IO 映射,就可以使用基于 Linux 应用程序的HPS 在系统重配置 FPGA 方案。首先 FPGA 中可能会配置进一个基本的逻辑系统,以支持 Linux 系统通过读取某些特定 IO 的高低电平来识别连接的是 LCD液晶屏, 或是 RGB-TFT 显示屏,或是 VGA 输出电路。 然后 Linux 系统再根据识别结果将支持对应硬件外设的 FPGA 配置数据流配置到 FPGA 中, 这样FPGA 中就拥有了正确兼容所连接硬件外设的驱动逻辑, Linux 也能够正常的对其实现操作了。

一、制作 Quartus 工程

为了通过明显的实验现象展示通过 Linux 系统在线配置 FPGA 的效果,这里使用 AC501_SoC_GHRD 工程进行简单的修改,得到另一个工程。 为了避免大家在刚开始接触 SoC FPGA 的时候因为操作不熟练而出现低级的错误耽误时间, 这里提供一种最简单的修改方式, 就是交换两个 FPGA 侧 LED 灯的引脚分配, 例如工程中默认 fpga_led[1]分配在 PIN_V9, fpga_led[0]分配在 PIN_V10上,就可以将 AC501_SoC_GHRD 工程拷贝并打开,将 fpga_led[1]分配在PIN_V10 上,而将 fpga_led[0]分配在 PIN_V9 上, 然后重新编译得到 sof 文件即可。由于没有修改任何的逻辑设计和 Qsys 系统内容,因此无需重新生成设备树,也无需重新更新 uboot。 例如,在本书配套的工程源码中,修改后的工程文件夹名为 AC501_SoC_GHRD_ExPin。

filter location和location区别:仔细观察上面的Filter Location一栏,没有跟随Location变化。据群里网友说是:没给location分配引脚的时候,这列的分配置位就生效。

二、生成rbf格式配置数据

rbf 文件是 Quartus 编译生成的 fpga 配置文件的二进制数据量格式的文件,主要用于使用外部主机通过 PS 方式配置 FPGA。

在含 ARM 硬核的 SoC FPGA 中,可以使用 HPS 在线配置 FPGA,配置时分为两种情况,一种是在 HPS 处于 uboot 启动阶段时通过 u-boot 配置(见《【SoC FPGA学习】八、从零开始体验一把为 HPS 添加外设,以 UART 外设为例》的1.9小节),一种是Linux 启动之后通过应用程序配置。这两种配置方式都需要用到 rbf 格式的配置文件,但是两种方式所需的 rbf 格式的配置文件却又存在着差异,其中 uboot 阶段配置 fpga 需要使用未经压缩的 rbf 格式文件,而在 Linux 应用程序中配置fpga 时,需要使用经过压缩了的 rbf 文件。默认情况下, Quartus 软件不能自动生成 rbf 文件,需要在设置种开启生成 rbf 文件选项。开启方法如下:

双击工程,如下图所示

点击其中的Device and Pin Options…

勾选在Programming Files下面的Raw Binary File(.rbf)文件

需要注意的是,这种方式生成的 rbf 文件是经过压缩了(应用程序阶段)的,可以支持 Linux中使用应用程序直接配置 FPGA,不支持 uboot 阶段配置 fpga。除了使能 Quartus 软件在编译时自动生成 rbf 文件,用户也可以在编译结束后通过脚本命令手动实现 sof 文件到 rbf 文件的转换。

使用 sof 文件直接转换得到**未经压缩(uboot阶段)**的 rbf 文件的命令格式为:

quartus_cpf -c my_input_file.sof my_output_file.rbf

1

使用 sof 文件直接转换得到**经过压缩(应用程序阶段)**的 rbf 文件的命令格式为:

quartus_cpf -c -o bitstream_compression=on my_input_file.sof my_output_file.rbf

1

其中, my_input_file.sof 是工程编译得到的 sof 文件, 作为转换输入文件,my_output_file.rbf 为转换得到的 rbf 文件,可以用来使用 HPS 配置 FPGA。

使用时,可以直接在 SoC EDS 软件中输入上述命令生成 rbf 文件,也可以将上述命令做成脚本, 然后一键运行(见《【SoC FPGA学习】八、从零开始体验一把为 HPS 添加外设,以 UART 外设为例》的1.9小节)。

制作 sof 文件直接转换得到**未经压缩(uboot阶段)**的 rbf 文件的脚本:

%QUARTUS_ROOTDIR%\bin64\quartus_cpf -c AC501_SoC_GHRD.sof soc_system.rbf pause

1

2

将 sof2rbf.bat 文件拷贝到工程中 sof 所在目录下(GHRD工程的output_files目录),直接双击运行该 bat 文件,就能生成名为 soc_system.rbf 的文件了,该文件是未经压缩的rbf 文件。

制作 sof 文件直接转换得到**经过压缩(应用程序阶段)**的 rbf 文件的脚本呢:

%QUARTUS_ROOTDIR%\bin64\quartus_cpf -c -o bitstream_compression=on AC501_SoC_GHRD.sof soc_system_dc.rbf pause

1

2

将 sof2rbf_dc.bat 文件拷贝到工程中 sof 所在目录下(GHRD工程的output_files目录),直接双击运行该 bat 文件,就能生成名为 soc_system_dc.rbf 的文件了,该文件是经过压缩的rbf 文件。

注意,上述命令内容中, AC501_SoC_GHRD.sof 名字需要换成工程中实际的 sof 文件的名字。

下图为分别使用 sof2rbf.bat 和 sof2rbf_dc.bat 脚本生成的 rbf 文件,可以看到,两者尺寸差距较大, soc_system.rbf 为 4146KB,而 soc_system_dc.rbf 仅为 1269KB。

三、编译 Linux 配置 FPGA 应用程序

当需要在 Linux 运行时配置 FPGA, 需要有一个 Linux 应用程序来完成此操作。该应用程序会读取指定的 rbf 文件并通过 HPS 的 FPGA 管理器外设将数据流配置到 FPGA 中。在 AC501-SoC 开发板的配套光盘资料中\AC501-SoC开发板资料文件夹版\Demos\SOC_FPGA\c_project,提供了一个名为hps_config_fpga 的 Linux 应用工程源码, 使用时仅需导入到 DS-5 中,然后就可以进行编译调试了,如下图所示。

该程序实际上和之前介绍的基于虚拟地址映射的外设编程方式一致, 其将HPS 中的 FPGA 管理器外设也通过虚拟地址映射的方式得到了每个寄存器的虚拟地址,然后通过直接读写寄存器的方式完成 FPGA 的配置。

四、在系统重配置 FPGA 实验

要进行在系统重新配置 FPGA 的实验, 首先要获得希望配置进入 FPGA 的rbf 格式的配置数据流文件, 在上述介绍中,已经介绍了制作一键生成 rbf 文件的脚本,因此,这里仅需将带压缩属性的生成脚本分别拷贝入AC501_SoC_GHRD 和 AC501_SoC_GHRD_ExPin 工程的 output_files 目录下并运行,即可得到对应的 rbf 文件,为了以示区分,将 AC501_SoC_GHRD_ExPin工程生成的 rbf 文件手动重命名为 soc_system_expin_dc.rbf, 然后将这两个 rbf文件均拷贝入 soc 开发板的 SD 卡中。

从 D:\intelFPGA.1\embedded\embeddedsw\socfpga\prebuilt_images 路径中拷贝“socfpga_cyclone5.dtb”到 SD 卡中并改名为 socfpga.dtb(原有的socfpga.dtb文件改为socfpga.dtb.bak)

socfpga_cyclone5.dtb 文件是所有 Cyclone V SoC FPGA 通用的 DTB 文件,它们不依赖于 FPGA 中的软 IP。 Linux 在使用这种 DTB 文件加载设备时不需要FPGA 配置和桥接的复位释放。这种 DTB 文件主要用于一块新设计的 SoC 板卡启动或是仅仅用于简化 SoC 的引导来启动 Linux。 如果当前的开发和调试与FPGA 部分无关,就可以使用该 DTB 加载 Linux 设备驱动以去掉 FPGA 设计带来的复杂部分。

在 Linux 下使用 HPS 在系统配置 FPGA 时, 使用此种方式,可以避开Linux 加载 FPGA 部分而带来各种可能的影响, 首先保证 Linux 系统顺利启动,然后再由 HPS 配置 FPGA。将 DS-5 中 hps_config_fpga 工程编译得到的可执行文件“hps_config_fpga”拷贝到SD卡中

将《LED和按键联动》的实验代码,编译得到的可执行文件,拷贝到SD卡中, 该程序用于完成 FPGA 配置后测试 FPGA 部分逻辑外设功能。

soc_system_dc.rbf - 没有进行引脚交换的GHRD工程,编译后得到的经过压缩rbf文件。

soc_system_dc_ExPin.rbf - 进行引脚交换的GHRD工程,编译后得到的经过压缩rbf文件。

拷贝完所有文件的 SD 卡根目录中的文件列表如下图所示。

【SoC FPGA学习】十一、基于 Linux 应用程序的 HPS 在线配置 FPGA

设置 AC501-SoC 开发板的 MSEL 拨码开关值为 4’b01110 或 4’b01010, 如下图

然后使用拷贝好文件的 SD 卡启动 AC501-SoC 开发板,启动完成后,由于上述执行重配置相关的文件都是存放在 SD 卡的 FAT 分区中的,需要先挂载到 Linux 系统下。使用下述命令完成 FAT 分区在 Linux 系统中的挂载。

mount –t vfat /dev/mmcblk0p1 /mnt

1

然后使用 cd 命令切换到 mnt 路径下

cd /mnt

1

输入 ls 命令就能看到该目录下存在的所有文件了。 新拷贝进来的文件可能没有可执行权限,使用chmod 777 *命令可以一次性为所有文件增加可执行权限。添加好可执行权限后, 首先使用未做修改的 AC501_SoC_GHRD 工程的配置数据 soc_system_dc.rbf 配置 FPGA,输入以下命令即可。

./hps_config_fpga soc_system_dc.rbf

1

程序完成 FPGA 配置之后,可以看到 AC501-SoC 开发板上的两个 LED 灯被点亮了, 同时串口终端上打印以下内容:

可以看到,串口终端提示 FPGA 已经被成功配置。 此时输入./led执行编译好的按键控制 LED 程序,然后按下开发板上的 S7 键, 可以看到 LED 灯D8 随着 S7 的每次按下发生亮灭状态的切换,按下开发板上的 S8 键, 可以看到LED 灯 D9 随着 S8 的每次按下发生亮灭状态的切换。

按下 ctrl+c 组合键结束 pio 程序的运行。然后使用交换了 LED0 和LED1管脚的AC501_SoC_GHRD_ExPin工程的配置数据soc_system_expin_dc.rbf配置 FPGA,输入以下命令即可。

./hps_config_fpga soc_system_dc_Expin.rbf

1

程序完成 FPGA 配置之后,可以看到串口终端上再次提示 FPGA 配置成功的信息。 此时, 再次执行编译好的按键控制 LED 程序“pio”,然后按下开发板上的 S7 键, 可以看到 LED 灯 D9 随着 S7 的每次按下发生亮灭状态的切换,按下开发板上的 S8 键, 可以看到 LED 灯 D9 随着 S8 的每次按下发生亮灭状态的切换。即验证了 FPGA 中确实被配置进入了另一个 FPGA 配置数据。

FPGA Linux

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Git从入门到实战
下一篇:最具潜力的编程语言GO有新书啦!
相关文章