基于SoCFPGA异步通信接口的实现
扫描二维码
随时随地手机看文章
引 言
FPGA 硬件资源和ARM 处理器的片内紧密耦合是Altera SoC FPGA 体系结构最显著的优势。Altera SoC FPGA 使用高宽带干线互联,在 FPGA 架构中集成了基于 ARM 的硬核处理器系统(HPS),该系统包括处理器、外设和存储器接口。可同时实现硬核知识产权(IP)的性能和低功耗,以及可编程逻辑的灵活性 [1]。ARM 的AMBA NIC-301 网络互联基础架构提供了三种交换架构——L3 主交换、L3 主机外设交换、L3 从机外设交换。在 L3 主交换和 FPGA 之间则由FPGA- to-HPS 总线桥 、HPS-to-FPGA 总线桥、轻量级的 HPS-to- FPGA 总线桥连接,HPS-to-FPGA 总线桥上可以挂载 AXI 接口逻辑或 Avalon 接口逻辑,实现处理器对FPGA 中寄存器的访问。
在实际应用中,许多功能简单的FPGA 逻辑与ARM 之间的数据交换量不是很多,交换速度要求不高,这样就可以通过在总线上挂载通用的异步接口来实现 ARM 对这类外设或逻辑的访问。Altera 提供了一种Avalon Tri-State Conduit Components, 该组件可以实现多种异步接口的时序如 CFI Flash、SSRAM、8086 接口外设等,可使开发者快速实现简单有效的数据访问。
1 硬件设计
1.1 异步接口的实现
本系统可在友晶科技的DE1-SOC 开发板上实现,其系统架构如图 1 所示。
从图 1可以看出, 双核 CortexA9由经 L3主交换通过轻量级的HPS-to-FPGA总线桥对Avalon三态电路组件访问。Altera提供的 Avalon三态电路组件包括,通用三态控制器(GenericTri-StateConduitController)、三态引脚共享器(Tri-State Conduit Pin Sharer)、三态桥(Tri-State Conduit)[2]。 通用三态控制器提供了自定义的数据位宽和时序功能,以提供不同的外设兼容。三态引脚共享器则可将多个态控制的地址、数据、读写信号共享到一个三态桥上,配合片选信号控制特定的外设,三态桥则实现了与外界的双向数据通路接口。
本设计通过 QuartusII软件中的 Qsys工具向HPS的轻量级HPS-to-FPGA总线桥主端(h2f_lw_axi_master)添加了Avalon通用三态电路组件,硬核系统的Qsys互联如图2所示。
图2 中ext_bus 即为三态控制器,其包含片选信号、读信号、写信号、片选、读信号、写信号、16 位地址线和 16 位数据线。
1.2 异步接口解析逻辑的实现
与上述异步接口对应,解析逻辑包括片选信号 cs_n、读使能 oe_n、写使能 wr_n、16 位的地址 addr 和 16 位双向数据线data。当cs_n 为低电平且是 oe_n 的下降沿时,总线根据给出的addr上的地址在相应的mem 寄存器上读取数据到data 数据线上完成读操作;当 cs_n 为低电平且是wr_n 的上跳沿时, 总线根据给出的addr上的地址将 data 数据线上的数据写入对应的mem 寄存器完成写操作。mem 寄存器读写的HDL 代码如下:
2 软件设计
2.1 在设备树中添加接口信息
为解决arm 体系内核代码中充斥着大量的板级垃圾代码, Device Tree(设备树)被引入到 Linux 3.x 内核中。Device Tree 是一种用以描述硬件的数据结构,由一系列的硬件节点和属性构成,许多硬件细节可以直接透过它传递给内核 [3]。在修改硬件后,一般要修改相应的设备树描述文件与之对应以便内核能正确识别硬件。由于在上述过程中,三态控制被添加到轻量级的HPS-to-FPGA 总线上,对应需要修改相关设备描述信息如下:
hps_0_h2f_lw :bridge@0xff200000 {
compatible = "altr,h2f_lw_bridge-1.0","simple-bus" ;
reg = < 0xFF200100 0x00200000 > ;
ranges = < 0x00000100 0xFF200100 0x00000080
0x00030000 0xFF230000 0x00010000
> ;
ext_bus :bus_ctr@0x30000 {
compatible =“altr,generic_tristate_controller-14.0”,
“altr,generic_tristate_controller-1.0”;
reg = < 0x00030000 0x00010000 > ;
} ;//end bus_ctr@0x30000(bus_ctr_0)
} ;//endbridge@0xff200000(hps_0_h2f_lw)
由描述信息可知,ext_bus位于h2f_lw(轻量级的HPS- to-FPGA总线桥)下。它的起始地址为 0xFF23000(总线地址0xff200000 + 偏移地址为 0x30000),地址长度为 0x10000。
2.2 应用程序设计
Linux 应 用 程 序 通 过 Linux 内 核 的 memory-mapped device 驱动访问[4],由ext_bus 所在的物理地址进而实现对ext_bus 所在的地址空间进行读写。首先,使用系统 open 函数打开/dev/mem 设备,然后调用系统 mmap 函数映射 HPS 的 L3 外设区域的物理地址到一个虚拟地址, 并根据轻量级HPS-to-FPGA 总线相对于L3 外设区域基地址的偏移量和ext_bus 相对于轻量级HPS-to-FPGA 总线的偏移量计算出ext_bus 的虚拟地址。读写则直接操作对应的虚拟地址完成操作,异步总线的地址获取代码实现如下:
3 结 语
实验表明,这种设计方法可以正确有效地完成对异步接口的读写操作。其设计思路非常简单,只需要将控制器添加到总线上,在应用程序中操作相应的虚拟地址即可,是一种快速有效的ARM 与FPGA 数据交换的实现方式。