基于SoCFPGA异步通信接口的实现
2015-12-28唐文龙田茂吴志强马应智张雄
唐文龙 田茂 吴志强 马应智 张雄
摘 要:针对Altera SoC FPGA平台的Linux环境下ARM核与FPGA逻辑之间的数据交换问题,提出了一种简单有效的异步接口实现方案。该方案在轻量级总线桥上挂载Avalon 三态控制器,并通过Linux应用程序读写控制器对应的地址,从而实现ARM核与FPGA逻辑间数据的异步交换。实验结果表明,该方案能够稳定、正确、快速地读写数据,可达到预期目标。
关键词:SoC FPGA ;异步通信;三态控制器;Linux
中图分类号:TN702 文献标识码:A 文章编号:2095-1302(2015)12-00-02
0 引 言
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可以看出,双核 Cortex A9由经L3主交换通过轻量级的HPS-to-FPGA总线桥对Avalon三态电路组件访问。Altera 提供的 Avalon 三态电路组件包括,通用三态控制器(Generic Tri-State Conduit Controller)、三态引脚共享器(Tri-State Conduit Pin Sharer)、三态桥(Tri-State Conduit)[2]。 通用三态控制器提供了自定义的数据位宽和时序功能,以提供不同的外设兼容。三态引脚共享器则可将多个态控制的地址、数据、读写信号共享到一个三态桥上,配合片选信号控制特定的外设,三态桥则实现了与外界的双向数据通路接口。
本设计通过Quartus II 软件中的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总线上,对应需要修改相关设备描述信息如下:
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数据交换的实现方式。
参考文献
[1] Altera SoC:体系结构的重要性[EB/OL].http://www.eefocus.com/fpga/325832 , 2014
[2] Cooperation . Avalon Tri-State Conduit Components User Guide[R].2011.
[3] 宋宝华. Linux设备驱动开发详解[M].北京:人民邮电出版社,2010.
[4] 梁庚,陈明,马小陆.高质量嵌入式Linux C编程[M].北京:电子工业出版社,2015:282-285.