1. 前言
最近学习了一点linux驱动的开发,尤其是涉及到和FPGA资源相关的驱动的开发,其实主要是DMA的,有了这个基础,对于了解其他的知识是很有帮助的。之前可能不回去看的内核的源码也可以尝试去看一看了。 在这里不得不说默罕默德的视频和对应的源码对我来说还是很有帮助的,所以这几千块还是花得挺值的。
2. USRP E320 整体结构
在之前确实是由于水平不行,导致不知道从什么地方开始看USRP E320的工程,以前是抓住一个小地方就开始闷着头看,结果也弄不出个所以然还打击自己的信息。经过一段时间的其他知识地掌握,现在来看USRP E320的工程也似乎有点眉目了,这也许就是厚积薄发吧。
在这篇博客当中会从整体的角度来把握一下USRP E320这个软件无线电设备的FPGA架构。
USRP的FPGA工程从整体上来看其实也还是比较简单的。在经过了昨天一下午地对系统结构层次的梳理之后,绘制出了上面的结构图。
红色的连线表示的是AXI-LITE总线:通过这些总线ZYNQ PS能够访问到PL端的寄存器,实现ZYNQ的linux系统对PL端的设备的配置和状态查看。
紫色的连线表示的是AXI-FULL总线: 通过这些总线,FPGA部分的数据能够和完成和内存的交互。
绿色的连线表示的是AXI-STREAM总线:通过这些总线,FPGA内部的各个子模块可以以流的方式进行传输。在Ettus的SDR设备上,这些绿色的总线是非常非常重要的,数据经过以太网进入到FPGA之后,都是以AXIS的形式在FPGA当中进行传输,如果数据需要和内存交互才会通过AXI-FULL接口进行传输。
下面可以从整体结构上来分析模块的主要功能:
- ZYNQ PS
- 系统调度管理
- SFP_Wrapper
- PL端完成以太网PHY和MAC的功能,同时会对特定端口的UDP数据进行卸载,让卸载的数据通过FPGA处理,未卸载的数据会交给ZYNQ PS来处理。这其实就是我最近一直也想做的TOE/UOE。
- 卸载的数据会通过e2v或v2e着两个AXIS接口,将数据交给E320_CORE 来进行处理(e:ethernet, v: vita)
- 未经过卸载的数据会通过e2c/c2e这两个AXIS接口给到axi_eth_dma这个DMA模块,DMA模块最终会把这些数据给到PS的DDR当中这样操作系统就能够完成对这些以太网帧的处理。
- E320_CORE
- 这和是USRP E320的工作的核心,负责管理USRP的SDR对AD9361的数据接收
- 控制USRP E320的同步,外部的时钟等工作
- 进行FPGA和以太网之间的数据传输,对于卸载到FPGA的UDP数据,需要经过这个模块来进行处理,如果用户有自己的基带算法想要实现也可以在这个模块当中来实现。该模块和卸载下来的以太网数据的交互模块一共有4个AXIS接口,其中e2v/v2e接口是和PL端的以太网进行数据的交互。s_dma/m_dma是和PS侧的以太网DMA进行交互的。
- axi_eth_dma
- 这个模块负责将SFP_Wrapper模块没有卸载的数据传递到ZYNQ PS上的操作系统让操作系统来进行处理。因为USRP E320主要是基于UDP传输CHDR包来实现其IQ数据传输的,对于非CHDR包,FPGA不会处理,因此需要将这些报文让cpu来进行处理,常见的有arp,icmp,tcp等等。。。通过这个DMA模块,就能够显示PL和内存之间的数据交互,在内核驱动上写好驱动之后,用户层就能够拿到这些数据了。
- axi_dma和eth_internal
- 这两个模块是组合起来工作的,由于USRP E320 在PS侧有一个网口,当需要使用PS侧的网口来实现SDR功能的时候,需要将内存当中的IQ数据交给PL端进行处理,于是就有这个axi_dma负责和内存进行数据的交互。
- 但不是所有的数据都需要交给E320_CORE来进行处理的,因此eth_internal也会卸载对应的CHDR的报文,其余的报文还是由操作系统自己处理。
经过上面的这一系列的处理,感觉整个系统的工作过程就清晰了很多了。当然,系统中还有很重要的部分我没有绘制出来,比如:和AD9361进行IQ数据传输的LVDS接口,E320 GPSDO这些模块,这些模块其实都是和E320_CORE联系在一起的,在之后对各个模块进行分析的时候,可以再深入地去研究这些内容,在这里能够理清系统的以太网数据的传输过程就很不错了。
2. USRP E320 后续研究内容
其实对整个系统有了一定的了解之后,接下来就需要去弄清楚每个部分具体实现了什么功能。这不仅仅只是包括FPGA部分,对于软件部分同样需要去了解。这也是我想要做和成为的,需要push自己才能掌握到更多的东西。
接下来我主要会从两个方面来了解USRP E320的整个工程:
- FPGA部分:
- 以太网MAC,ettus实现了这个以太网的MAC功能,并且支持10G和1G,而且是采用的AXIS接口的,这对于最近也在研究TOE的我来说,是一个很好的学习资料。
- AXI_ETH_DMA, ettus自己实现了一个AXI DMA模块用来和内存进行数据传输,这个AXI DMA也是工作在scatter gather模式下,之前只用过Xilinx的AXI DMA而且还是register mode。通过在默罕默德哪里学习才稍微了解了一点AXIDMA驱动的东西。所以这个模块也是一个很好的学习资料。
- E320_CORE,这个是USRP E320的信号处理的主要模块,其实这个模块相对于我来说并没有那么重要,因为我的目的是希望能够在自己的板子上移植USRP的固件,因此可以把这个模块当做是一个IP来进行使用。
- axi_dma和eth_internal其实实现的功能和前面的以太网MAC和AXI_ETH_DMA差不多,只要把前面那两个东西弄明白了这个应该也不在话下。
- 软件部分
- 了解NI的以太网驱动,在之前对FPGA部分的AXI接口的驱动不了解的时候,对kernel 设备树这些东西都只是一个很浅显地认知。这次在我看ni的设备树和源码的时候,才发现其实他们的这个以太网的驱动,其实也就是在驱动PL端的DMA的和内存进行数据交互的过程。所以希望通过这个再配合上默罕默德的DMA的内容,能够让我对FPGA的驱动有进一步的了解。