一种基于SOC隔离Memory的10Gbps以太网实时数据采集方法
技术领域
本发明适用于Xilinx Zynq系列SOC,属于数据通信领域,具体涉及10Gbps以太网实时数据采集方法,以及实现同样功能的芯片、UE、仪器等。
背景技术
1.Zynq系列SOC
Zynq可扩展处理平台是采用赛灵思新一代FPGA(Artix-7与KINTEX-7FPGA)所采用的同一28nm可编程技术的最新产品系列。可编程逻辑可由用户配置,并通过“互连”模块连接在一起,这样可以提供用户自定义的任意逻辑功能,从而扩展处理系统的性能及功能。Zynq嵌入式处理平台系列的每款产品均采用带有NEON及双精度浮点引擎的双核ARMCortex-A9MPCore处理系统,该系统通过硬连线完成了包括L1,L2缓存、存储器控制器以及常用外设在内的全面集成。该处理系统不仅能在开机时启动并运行各种独立于可编程逻辑的操作系统(OS),而且还可根据需要配置可编程逻辑。利用这种方法,软件编程模式与全功能的标准ARM处理SoC毫无二致。
应用开发人员利用可编程逻辑强大的并行处理能力,不仅可以解决多种不同信号处理应用中的大量数据处理问题,而且还能通过实施更多外设来扩展处理系统的特性。系统和可编程逻辑之间的高带宽-AXI互联能以极低的功耗支持千兆位级数据传输,从而解决了控制、数据、I/O和存储器之间的常见性能瓶颈问题。
2.以太网
以太网是在20世纪70年代研制开发的一种基带局域网技术,使用同轴电缆作为网络媒体,采用载波多路访问和冲突检测(CSMA/CD)机制。但是如今以太网更多的被用来指各种采用CSMA/CD技术的局域网。以太网的帧格式与IP是一致的,特别适合于传输IP数据。以太网由于具有简单方便、价格低、速度高等。
以太网(Ethernet)是由Xerox公司创建并由Xerox、Intel和DEC公司联合开发的基带局域网规范,是当今现有局域网采用的最通用的通信协议标准。后来它被作为802.3标准为电气与电子工程师协会(IEEE)所采纳。
以太网以包交换为基础,包长可定义,其包格式如图2所示。
3.Pcap
pcap文件是wireshark配置脚本文件。可以用Wireshark软件打开。Pcap的报文格式如 图3所示。其中:
magic为文件识别头,pcap固定为:0xA1B2C3D4。(4个字节)
major为主版本号(2个字节)
minor为次要版本号(2个字节)
time zone为当地的标准时间(4个字节)
sigflags为时间戳的精度(4个字节)
snaplen为最大的存储长度(4个字节)
linktype为链路类型(4个字节)
其中packet header又包含
ts为抓包时间,8字节,4字节表示秒数,4字节表示微秒数。
caplen为保存下来的包长度,4字节。
len为数据包的真实长度,4字节。
4,现有方案介绍
高速以太网实时数据采集由于有速率的限制,要求最大的带宽为10Gbps,因此目前大部分方案为在FPGA下实现DDR控制,通过FPGA读、写DDR。当操作系统请求数据时,FPGA读取DDR数据,再通过慢速总线转发至操作系统。这一方面原因在于现有系统FPGA与处理器之间的接口带宽无法达到持续10Gbps带宽,即使达到也需要较高成本。另一方面原因在于处理这种高带宽读写通常需要直接对物理地址操作或者利用CPU DMA技术,Linux操作系统为虚拟地址存储,因此无法直接通过读写物理地址的方式存储,否则会导致操作系统崩溃,而通过CPU DMA技术由于会频繁中断,大大增加系统开销,这也是目前嵌入式处理器甚至PC机都无法实现10Gbps数据流实时采集的原因。
发明内容
本发明的目的是低成本解决10Gbps以太网实时数据采集问题,提供一种基于SOC隔离Memory的10Gbps以太网实时数据采集方法。
本发明通过Zynq SOC在逻辑侧实现AXI-Burst总线操作,既能减小CPU的系统开销,同时最大数据传输带宽接近10.5Gbps,满足10Gbps以太网报文实时采集所需的带宽。与此同时,由于本发明实现与Linux操作系统共享memory,降低了系统成本。两种方案的对比如图4,图5所示,其中图4为现有方案,图5为本发明方案。
本发明提供的适用于Zynq系列SOC的基于SOC隔离Memory的10Gbps以太网实时 数据采集方法,包含以下步骤:
第1、经过线路侧SFP+或PHY处理后将线路侧的电信号转换为逻辑侧的并行数字序列——即以太网报文,并传输至SOC的PL中(可编程逻辑阵列FPGA),在PL中(可编程逻辑阵列FPGA)将得到的并行数字序列——以太网报文进行预处理。
第2,将预处理后的以太网报文存入PL里的缓冲FIFO中,并依据FIFO水位启动状态机向PS侧HP口发送AXI-Burst接口形式的数据报文;
第3,修改操作系统设备树文件,使高位地址空间对操作系统不可见,但是这部分地址空间在U-boot文件中已定义,操作系统视该地址空间为外设,待数据报文抓取完毕后操作系统通过mmap()函数映射该部分地址,从而可以访问或修改该地址空间数据;
第4,操作系统用户空间通过程序将数据写入根文件系统,最终在PC机或其他嵌入式设备通过Wireshark等相关软件对数据进行协议分析。
第1步中所述的将以太网报文进行预处理是指进行如下处理:
第1.1,将以太网报文加以太网长度信息,同时记录每个以太网报文的到达时间,并将该时间以pcap的格式封装到以太网报文中,得到pcap报文。
第1.2,将得到的pcap报文进行数据流化处理。由于本发明中AXI-Burst接口位宽为8字节(64bits),而以太网数据包长是随机的,有可能在最后一个时钟周期不满足8字节。本步骤的操作是如果上一包最后一个周期不满足8字节,则保留,待下一包到来时凑成8字节再发送。示意图如图6所示。这样每次数据采集操作只有最后一个周期不是8的整数倍,中间的数据是连续的。降低了后端AXI-Burst总线的实现难度。
第2步所述的将以太网报文存入缓冲FIFO中的具体操作是,当FIFO水位达到128字节,即满足一次burst操作所需要的深度后,PL启动数据发送状态机,通过AXI-Burst总线向PS侧HP口写入报文数据。
本发明的优点和有益效果:
本发明可实现10Gbps以太网的实时数据采集,也可以实现其他高速实时数据传输业务。当多个HP口联合使用时,总的通信带宽可以达到30Gbps。同时与Linux操作系统共享在同一块存储空间的不同位置中,降低Linux系统开销,节约设备开发成本。
附图说明:
图1为基于SOC系统实时数据采集框架示意图;
图2为以太网帧格式示意图;
图3为pcap报文格式示意图;
图4为常规以太网数据采集示意图;
图5为基于SOC隔离DDR方式数据采集示意图;
图6为以太网数据流拼接示意图;
图7为预处理阶段的流程图;
图8为写状态机跃迁图;
图9为读操作状态跃迁图;
图10为系统地址空间分布图;
图11为vivado软件下地址编辑界面;
图12为读操作实际波形示意图;
图13为数据文件示意图;
图14为写操作仿真示意图;
图15为写操作实际波形示意图;
图16为软件修改示意图。
具体实施方式
下面结合附图和实例,详细描述本发明的技术方案。本发明的所有内容均已在Xilinx Zynq系列SOC中实现。为了在有限的资源中实现本发明的所有细节,对本发明的算法在不影响性能的前提下,进行有适当的简化。本发明软件编译环境为vivado2014.4和petalinux2014.4.本发明的Block Design框图如图7所示。本发明预处理阶段的流程图如图8所示。本发明预处理阶段状态机跃迁图如图9所示。下面简述硬件(PL部分)和软件(PS部分)的实现方式。
第1、经过线路侧SFP+或PHY处理后将线路侧的电信号转换为逻辑侧的并行数字序列——即以太网报文,并传输至SOC的PL中(可编程逻辑阵列FPGA),在PL中(可编程逻辑阵列FPGA)将得到的并行数字序列——以太网报文进行如下预处理:
第1.1,将以太网报文加以太网长度信息,同时记录每个以太网报文的到达时间,并将该时间以pcap的格式封装到以太网报文中,得到pcap报文。
第1.2,将以太网报文进行数据流化处理,多字节对齐传输。数据经过pcap封装后进入streamizer模块,该模块的主要功能为将各个以太网报文拼接成连续的8字节序列,以方便 后续模块的处理。这样整个数据采集过程中只有最后一个时隙会有不满足8字节整数倍的情况,整个DDR存储空间不会出现空洞。工程中的以太网数据总线宽度为64bit,这样如果以太网的包长不是8字节的整数倍时,最后一个周期会出现有的字节为无效字节的情况,为优化带宽,方便流处理,如果出现这种情况,streamizer将下一包的包头进行移位,与上一包的包尾进行拼接操作,凑成8字节的整数倍,并进行存储至FIFO中等待传输。
第2,将预处理后的以太网报文存入PL里的缓冲FIFO中,并依据FIFO水位启动状态机向PS侧HP口发送AXI-Burst接口形式的数据报文。具体操作如下:
通过对FIFO水位进行监测,当FIFO水位达到128字节,即满足一次burst操作所需要的深度后,启动相应的AXI-burst传输。本例中,总线带宽为8字节。依据AMBA总线标准,一次Burst操作最多可以传输16beats,这样每次Burst操作最多可以传输128字节。在PL侧例化逻辑FIFO为8字节宽度,当FIFO水位超过16时,状态机启动FULL_TRANSFER,即以最大长度进行AXI-Burst操作;当FIFO水位不满16时,且FIFO已长时间没有继续收到数据报文,则状态机PART-TRANSFER操作,即以当前FIFO水位为准,将FIFO中剩下的数据一次性传输至PS侧的HP口。
AXI-Burst总线控制模块依据FIFO的水位判断如何发送FIFO中的以太网数据,同时也可以读取Memory中的内容,实现交互操作。其中图9为写操作状态跃迁图,图10为读操作状态跃迁图。
第2.1,读操作:实现axi burst slave接口,接收从axi interconnect传输过来的DDR数据。
由状态机方式实现,逻辑发起读操作,通过外部接口配置,当I_axi_rd_en检测为高,启动读状态机。在I_axi_rd_en为高的同时,采样mem_rd_start_addr和mem_rd_length信号,该信号由操作系统通过AXI-Lite总线配置,分别表示读的起始地址和读操作transfer的个数,即总共需要burst的次数,一次burst传送128字节。因此传输1M数据需要burst 2048次,以此推类。
当检测到arready信号为1,则状态机进入ARADDR状态,否则在ARREADY状态等待。如果进入ARADDR状态,则配置地址位和地址有效位,与AXI Master进行地址交互。因为AXI协议中没有地址response,所以ARADDR状态持续一拍后直接进入数据传输状态,没有等待确认操作。同时地址位和地址有效位归0。
期间增加超时检查,即在一定时间内没有数据到来,判定读错误,设置err为1。
在DATA状态中,设置计数器,读来一个beat(8字节),计数器加1,检测这个burst是否完成了16个beats,如果完成,设置读操作完成标志。同时检测response信号是否为成 功标志,如果传输成功,则设置相关标志位,表示一次burst读操作传输完成。同时这里也要设置超时检查,如果一个burst读操作只传了一半或者没有收到response标志,则设置错误标志。
完成一次burst读操作后,在进行下一次burst读操作之前,需要:
1,地址计数器加32'b1000_0000,128字节,从第一个burst之后的地址继续读取。
2,Burst次数计数器加1,同时与软件配置的值相比较,如果读次数计数器与软件配置的值相等,表明已经读取了要求的字节数,所以设置读完成标志,表明整个读操作完成,进入IDLE状态。如果没有读取到要求的字节数,则系统进入下一次burst操作,状态机转到ARADDR中,如此往复。如果其中检测到错误标志,则系统进入ERR状态,退出读状态,同时向软件报错。图13为实际抓取的读操作数据,图14为保存到文件中的读取数据。可见操作系统与PL中的字节序是相反的。
第2.2,写操作:实现axi slave侧接口,与axi connect互联。通用接口设计,由于前面已经将报文进行数据流处理,因此可以不考虑wstrb情形,默认8byte传输,64bit,wstrb置为全1,初始状态为idle态,逻辑测流入的数据流缓存至64x1024FIFO中,FIFO输出fifo_full信号,表示fifo将要满,这是外部应停止继续向FIFO写数,否则将造成数据丢失。该FIFO为异步FIFO。
当FIFO内的数据满16深度时,即满足一次完整的burst传输时,状态机跳转至C_FULL_TRANSFER状态。如果fifo内的数据不能达到一次完整的16x8传输,则进入C_PART_TRANSFER状态。判定条件为此时fifo内的深度小于16,且一定时间内没有数据流入FIFO。如果长时间没有数据进入,开始读取FIFO内残余数据,目前该等待时间为2048个时钟周期。
当awvalid信号有效则进入C_ARADDR状态。地址初始态为C_BASE_WR_ADDR,经历了一次C_FULL_TRANSFER后,在下一次操作之前将地址加128,经历了一次C_PART_TRANSFER后,在下一次操作之前将地址加{S_axi_burst_count_set,4'b0}。I_reset_transfer信号用于将地址寄存器归C_BASE_WR_ADDR,由软件设置。
当wready信号有效时进入C_DATA状态,开始传输数据。如果是从C_FULL_TRANSFER状态跃迁过来,则一次写入128字节,如果是从C_PART_TRANSFER状态跃迁过来,一次写入{count,4'b0}字节,其中count为FIFO中的剩余字节数。
C_TRANSFER_DONE状态主要用于检测axi response信号,如果长时间没有收到response信号,同样进入IDLE状态,但超时计数器置位,上报错误。
设置地址保护,目前的基准地址为0x38000000,DDR的地址范围为0x0~0x40000000,因此预留的是高128MB地址空间作为共享空间。地址空间示意图如图11所示,vivado软件中的地址编辑界面如图12所示。考虑以太网包长度应该小于16000,因此设置0x3fffafff为保留地址门限,当目前的写入地址大于该门限,同时输入的valid为低时,停止写入fifo。该操作的目的是保存一个完整的包而不会导致截断。需要预留空间的计算方式为16384+1024*8=0x6000,计算方式为最大包长加上fifo中的剩余数据,fifo为1024x8字节。图15为通过modelsim仿真得到发送时序图,图16为实际抓取波形得到的写操作时序图。如图所示,系统写操作最大吞吐量在时钟频率200MHz时为200x64x16/20=10.24Gbps。如想继续提高吞吐量,则需要提高时钟频率。
第3,修改操作系统设备树文件,使高位地址空间对操作系统不可见,但是这部分地址空间在U-boot文件中已定义,操作系统视该地址空间为外设,待数据报文抓取完毕后操作系统通过mmap()函数映射该部分地址,从而可以访问或修改该地址空间数据。
修改操作系统设备树文件,依据系统需求使高地址Memory空间从操作系统Memory中隔离出来,以保证操作系统不会访问该存储空间,否则会导致操作系统崩溃。本例中将Memory的高128M Bytes从系统Memory隔离出来,这样该空间物理基地址为0x38000000,来自PL侧的AXI-Burst以该地址为基地址进行数据传输。修改方式如图16所示,注意需要将地址改为0x38000000。同时,为了不使最后一个以太网报文被截断,系统中设置地址上限保护。本系统中,系统上限地址为0x40000000,预留出一个以太网最长包的长度。当AXI-Burst地址超过该上限时,停止数据采集,否则有报文截断的风险。当报文保存完毕后,操作系统可以像访问外设一样通过mmap()函数访问该高地址Memory空间。之后可以将该数据进行pcap封装,以文件的形式保存在根文件系统中。
第4,操作系统用户空间通过程序将数据写入根文件系统,最终在PC机或其他嵌入式设备通过Wireshark等相关软件对数据进行协议分析。
待数据传输完毕或PL侧向操作系统通过AXI-Lite总线上报写满时,由Linux用户空间将该空间地址通过mmap()函数映射进操作系统中,再通过fwrite()等函数将数据写入指定区域,并最终以文件的形式保存在根文件系统中。
当转包文件已经保存完毕后,用户可以在Linux环境下直接通过Wireshark等软件直接对抓包文件进行协议分析,也可以将抓包文件保存在SD卡中,将文件拷贝到PC机中通过PC机集中对数据文件进行协议分析。