**
光纤工程系统概述
** 光纤项目是明德扬承担。该项目的功能是通过内部接收4个光纤数据。DDR缓存后,通过PCIE接口发送到计算机保存。其中,光纤收集到数据后,需要进行一定的算法处理,由客户实现,明德阳保留了易于修改和插入的模块接口。 本项目本质上是一种数据采集卡功能:采集到高速数据并保存到计算机本地,具有高速、大数据量的特点。采集卡项目可参考本方案实现。 本项目采用光纤接口学习光纤IP核的应用。 本项目可通过PCIE,实现对FPGA配置。特别是可分别配置和读取1路接收FPGA、4路发送FPGA寄存器的功能。关于上位机,如DSP、ARM、单片机,电脑 ,如何与FPGA如果是通信交互,可以参考这个方案。(在优化版中,还提供了即将到来的串口配置方案。PCIE将配置改为串口配置。 PCIE不解释部分,要注意。 该项目有相应的视频专题课程,并提供代码学习。
上图为本项目整体简图,包括4个发送板、1个接收板和PC计算机。本项目主要实现提接板功能。 接收板包括四件DDR3、一个PCIE接口,四路光纤接口。当然,接收板上还有很多其他接口,但这三个接口是我们项目的主要接口。 接收卡通过PCIE直接插入接口PC在插槽上,跟着PC进行相连。 发送板可以通过光纤端口发送数据。从接收板的角度来看,可以认为外部有四个光纤端口,接收这四种光纤的数据。 在这个项目中,四路发送板实际上是每个发送板的一个AD采集卡。每个发送板大约有16条路AD的采集,采集好数据汇总通过光纤送到这个接收卡。 接收卡从光纤接收数据后,收集数据,进行适当的处理,保存数据DDR三中,等待被读出送给PCIE接口,然后上送PC电脑 ,这是我们的整体功能。
上图是FPGA内部实现架构。可分为光纤功能、存储控制功能、PCIE功能三部分。
本项目通过光纤模块实现接收板和发送板的通信,通信速率为2.5Gbps,采用XILINX的官方IP核:7 Series FPGAs Transceivers Wizard(以下简称:GTX IP核)。关于该IP核的设置,有兴趣的读者,可以阅读我们之前发表的文章《XILINX(K7)和CycloneV光纤通信设置之间的文章。 设置高速收发器是因为使用了4路光纤IP核 注意生成4个通道。生成后,每个通道只向用户侧发送两个数据接口:发送数据tx_data和K码指示tx_kchar。同样,接收方向是rx_data和rx_kchar。 我们注意到,数据接口只有数据和K码指示器,而不是明德阳常见的包装形式。事实上,两个更先进的设备之间的通信通常以包装的形式发送一组数据,每组数据可以达到数千字节。为了实现分组发送,特别定制了光纤协议层包装格式,如下表所示。
包文头 数据长度 校验和 无效值 数据 16位 16位 16位 16位 数据长度数据
上面是光纤协议层的包文格式,有16个包文头(固定为0x55d5),16位长度指示(指示后面数据的长度,单位为字节),16位校准码,16位无效值,数据。 在FPGA从上游模块收到包文时,计算包文的长度、验证和内部架构图中的光纤包装模块,然后生成包文头 数据长度 校验和 无效值字段,加上输入的包文数据,发送给GXT IP核。GTX IP核通过光纤送到发送板。 同样,发送板上也应该有一个包装模块。如果要向接收卡发送数据,将包装文件包装成上述格式,然后通过光纤传输到接收板。接收板从GTX IP在光纤解包模块中,搜索包文头55D5。如果搜索到包文头,下一个状态将获得数据长度和验证。根据数据长度,接收后面的数据。边接收数据边计数据的验证和验证。当接收数据完成时,验证和计算。此时,比较收到的验证和计算验证是否相同。若相同,则表示包文正确;若不同,则表示包文错误。 以上是光纤的基本功能,主要涉及光纤包装、光纤解包等。 事实上,如果光纤使用它Aurora建议使用另一个协议IP核:Aurora 8B10B。这个IP核使用AXI4-stream总线接口,已经是包文格式了。所以使用起来更简单。
接收光纤数据后,项目将首先保存DDR3.当存储足够的数据时,读取数据并发送到PCIE。 共有4块接收板DDR3,每片DDR3的数据位宽为16位。需要注意的是,虽然有4块DDR4,但这4片DDR3不是自己独立工作。在硬件设计中,将DDR地址线和控制线共享,数据线分开。也就是说,4片DDR同时读写,对FPGA这相当于64位DDR3。 由于光纤数据共有4路,4路数据同时来,但只有64位DDR3.如果不处理,就会有冲突。因此,必须制作一个调度模块:4路光纤数据将首先保存到内部FIFO中间调度模块判断4路FIFO从而决定读取哪些数据并将其存储在空闲中DDR3中。未读取的,将继续保存FIFO直到调度出来。 在设计调度模块时,应注意以下几点: a.优先调度 总共有四个数据,那么如何选择调度器的优先级,也就是说,如果四条路中有超过一条路同时有数据,那么如何选择哪条路。例如,您可以指定第0~三路优先级由高到低,即当第0路有数据时,必须选择0路;当第0路没有数据时,决定看下一路。当采用这种方法时,我们应该考虑是否存在以下情况:第0条道路总是有数据,导致其他道路无法读取和发送DDR这是一个需要思考的问题。 b.调度的单位 调度单位是指选择一路数据后会读取多少数据。可供选择的是一个数据、多个数据或读取FIFO到目前为止。这里需要考虑的是,一个数据是最灵活但最繁琐的,会有频率调度;数据越多,调度就没那么繁琐,但也意味着写FIFO要临时存比较多的数据才行,所以这里要有一个平衡。 c.起启水线的调度 起启水线:当FIFO调度器可以调度存储足够的数据。这是要考虑的DDR编写速度、光纤输入速度和调度单位。例如,如果调度单位为1024个数据,则启动水线为100DDR当写作速度快于光纤速度时,就可能存在DDR写到一半的时候,新数据还没来。 当然,最容易的事情就是把启动水线设置成和调度单位一样的,这样绝对没有问题,但是会有一定的浪费。为什么呢?当我们想象以下场景时DDR在写数据的同时,光纤也会同时发送新的数据FIFO。我们可以计算DDR根据写作速度和新数据输入速度,得到起水线。最理想的情况是,当最后一个数据被写入时FIFO正好要写这个数据DDR,然后调度结束。这样做的好处是会FIFO深度设置为最合适的尺寸,节约资源。 在FPGA这个领域似乎无法理解FIFO更深或更少有什么意义。但这是芯片设计领域经常考虑的问题。作者在做芯片设计时,往往需要花费大量的精力来计算最省钱的方案。事实上,这也表明FPGA设计和芯片设计的区别在于做得更好。 by the way,就像我一直强调的,FPGA芯片是一种注重细节的技术。很多人可以做粗功能,但很少有人可以做细功能。例如,很多人会显示图像,但他们不会使用更少的资源来实现图像显示。
PCIE实现FPGA与上位机通信功能相比,通信包文有两种,一种是包文。 配置包文是用来读写接收卡和发送卡中的寄存器的包文。比如上位机开户关闭接收卡通道,控制发送卡的数据收发,上位机读取接收卡的内部状态。 业务包文是指发送卡中的业务包文AD采集的数据是上位机要保存的数据。 下上位机和FPGA通信格式。 包文类型 (16b) 读写属性 (1b) 板卡编号 (15b) 寄存器地址 (16b) 寄存器数据 (32b) 无效填充 (48b)
?包文类型:用于指示是商业包文还是配置包文。商业包文的包文类型为16’h55AA;配置包文的类型为16’hF8F8。 ?读写属于:用于上位机指示FPGA的寄存器进行写,还是读其值 。 ?板卡号:用于指示当前包装文本配置哪张板卡,可理解为设备地址。例如,读取接收卡或特定的发送卡。编号为03表示发送板03.编号4为接收卡。 ?可以理解理解的 寄存器地址。 ?寄存器数据:如果读取寄存器配置的数据,请填写0。
当上位机需要配置或读取寄存器时,它将按格式生产一个配置包文,通过PCIE传给FPGA。FPGA的内部有一个PCIE IP核。该IP核支持AXI4并且是包文形式,从PCIE里接收到包文数据,并送往协议解析模块。 协议解析模块分析该包文,特别是对包文编号进行识别。根据编号,如果是接收卡配置包文,则直接对内部的寄存器进行读取;如果是某一路发送板配置包文,则将该包文转发到该路光纤接口。 如果是读取寄存器数据,则会将配置包文返回给上位机,具体路径是:协议解析模块处理后,将寄存器数据补充到包文的数据域,然后读该包文转给6选1 SP调度模块。在该调度模块中,从6路包文(1路是业务包文,1路是接收卡返回的配置包文,其他4路是4个光纤返回的配置包文),选取一路发给PCIE IP核。 上位机从包文类型中,识别出业务包文还是配置包文,做相对应的处理。