专利名称:一种基于fpga的多虚拟队列数据存储的方法
技术领域:
本发明设计基于FPGA中实现高速网卡数据读写技术,特别是涉及一种多虚拟队列的数 据存储方法。
背景技术:
虚拟化技术是当前市场的一个热点,采用虚拟化技术可以节省了高达70%的硬件成本。 因为虚拟化技术可以帮助用户合并多种应用工作负荷,在单个系统上运行多种操作环境; 优化应用开发,在单一系统上进行测试和开发;提高系统可用性,在系统之间迁移虚拟环 境。当前设计主要是通过逻辑存储和外部存储,外部存储主要是采用DDR2—SDRAM、 FLASH 等存储。
逻辑存储的情况下在FPGA中实现高速虚拟网卡设计就是采用的虚拟化技术,在虚拟 网卡设计过程中需要用到大量的队列,如2048个,每个队列中又存在大量的32-bit的寄 存器,图1是虚拟网卡芯片按照2048、 512、 128和64队列设计的资源需求表。为节约设 计成本,FPGA采用Xilinx的XC5VLX50T芯片,该芯片的Slices大小为7200Clbs,经过 计算总共是28Kb的FF。如果按照要求设计2048个虚拟队列,某些寄存器与队列一一对应 的,需要2048个32-bit的寄存器,所占用的总资源大小为1047.6Kb,见图1所示;逻辑 存储适用于占用资源量不多的情况,很显然,这些寄存器若完全使用逻辑单元进行存储, 将会占用全部的逻辑资源,最终会使设计无法实现。
在外部存储的情况下如果采用DDR2_SDRAM对大量数据进行存储,时钟333MHz ,对 DDR2存储器进行写操作,命令字为O,地址维持两个周期有效,写使能维持一个周期有效, 数据在两个周期内给出(每个周期128bits),这样实现了 burst length = 4的操作,4x 64bit = 2 x 128bit。地址是按照4的倍数给出,也就是说每个64bit—个地址, 一次写 操作要使用4个地址。读取命令字为l,地址维持l个周期有效,读使能维持一个周期有 效,地址也是4的倍数,在读数据有效时,数据出现在读数据输出端口上,每128bit维 持l个周期;但是从发出读取命令字到读出数据则需要8个周期,并且DDR2—SDRAM控制器比较复杂,数据存储周期长、数据存储速度慢且不灵活。
因此,需要设计一种能够提供数据存储速度快、控制便捷灵活、可用于大量数据的存 储的存储机制,以解决上述现有技术的缺陷。
发明内容
为了解决上述逻辑资源不足、存储速度慢、存储周期长等问题,本设计采用一种巧妙 的设计方法对所有大量的(如2048个)队列中的寄存器使用FPGA中的块RAM进行存储和处 理,实现对同一队列的相关寄存器进行同时读写。
为了实现上述目的,本发明提供了一种基于FPGA的多虚拟队列数据存储的方法,包括 网卡、FPGA,所述FPGA包括块状存储器(块ram)、 MAC控制器模块、DMA控制器、PCIe 控制器模块,其特殊之处在于
所述FPGA中设有接收引擎模块(Rxengine)、发送引擎模块(Tx engine)、读写模块 (Reg一Rd—Wr),接收引擎模块(Rx engine)通过读写模块(Reg—Rd—Wr)与发送引擎模块 (Tx engine)连接,接收引擎模块(Rx engine)实现从主机发送过来的数据包进行处理 分类,发送引擎模块(Tx engine)实现将用户发往主机的数据打包,按照相应的时序发 送给核接口,读写模块(Reg—Rd_Wr)实现数据的存储与提取;
所述接收引擎模块(Rx engine)包括接收有限状态机模块(Rx FSM)、接收Posted 包模块(Rx posted)、接收NonPosted包模块(Rx No叩osted)、接收Completion包模块 (Rx Completion);
所述发送引擎模块(Tx engine)包括发送有限状态机模块(TxFSM)、发送Completion 包模块(Tx Completion);
所述块状存储器(块ram)内虚拟设有已编址的多个寄存器组,多个寄存器组包括发 送端寄存器组(TX reg),接收端寄存器组(RX reg),中断频率控制寄存器组,每个寄存 器虚拟设有多个队列;
一种基于FPGA的多虚拟队列数据存储的方法步骤如下
a、 主机将数据包发送到PCIe模块,由PCIe模块传递到接收引擎模块(Rx engine), 由接收引擎模块(Rx engine)进行处理,执行b操作;
b、 接收至ll的数据包有三禾中posted request, non—posted request, rx completion,由发送有限状态机模块(RxFSM)对三种数据包进行处理分类,发送有限状态机模块(Rx FSM)对posted request执行c操作,发送有限状态机模块(Rx FSM)对non-posted request 执行d操作,
c、 posted request由接收Posted包模块(Rx posted)通过读写模块(Reg—Rd_Wr) 分配给寄存器进行写操作,执行cl操作,
cl、接收Posted包模块(Rx posted)根据数据包中的地址判断是进行逻辑存储 还是块状存储器(块ram)存储,如果是块状存储器(块ram)存储,执行c2操作,
c2、接收Posted包模块(Rx posted)根据数据包中的地址判断是对发送端寄存 器(TX reg)还是接收端寄存器(RX reg)操作,如果是接收端寄存器(RX reg)操作, 执行c3操作,
c3、接收Posted包模块(Rx posted)根据数据包中的地址判断确定对接收端寄 存器的具体块状存储器(块ram)写操作,再根据地址判断具体要向该块状存储器(块ram) 的哪一个队列进行写操作,执行c4操作;
c4、由读写模块(Reg—Rd—Wr)将数据写入块状存储器的队列中,以实现数据的写 操作,写操作完毕;
d、 non_posted request由接收NonPosted包模块(Rx No叩osted)通过读写模块 (Reg—Rd_Wr)分配给寄存器进行读操作,执行dl操作,
dl、接收NonPosted包模块(Rx Nonposted)根据数据包中的地址判断是进行逻 辑存储还是块状存储器(块ram)存储,如果是块状存储器(块ram)存储,执行d2操作,
d2、接收NonPosted包模块(Rx Nonposted)根据数据包中的地址判断是对发送 端寄存器还是接收端寄存器操作,如果是接收端寄存器操作,执行d3操作,
d3、接收NonPosted包模块(Rx Nonposted)根据数据包中的地址判确定对接收 端寄存器的具体块状存储器(块ram)读操作,再根据数据包中的地址判断具体要向该块 状存储器(块ram)的哪一个队列进行读操作,执行d4操作,
d4、由读写模块(Reg_Rd—Wr)将数据从块状存储器的队列中读出,以实现数据的 读操作,读操作完毕,执行d5操作;所述块状存储器设有读写模式状态转换模块,读写模式状态转换模块分为读模式状态 的转换和写模式状态的转换,读模式状态分为初始状态(idle),主机读使能状态 (host—rd—en ),读状态(read),读结束状态(read_end ),读结束延时状态 (read—end_dly),写模式状态分为初始状态(idle),主机写使能状态(host_wr—en), 写状态(write),写结束状态(write—end), I、执行c4步骤的写操作具体为;
c4-l、读写模式状态转换模块初始状态为idle状态时,
c4-2、读写模式状态转换模块检测到主机发送的命令host一wr—en时,处于主机写 使能状态,
c4-3、读写模式状态转换模块进入写状态(write),
c4-4、由读写模块(Reg一Rd一Wr)将数据写入块状存储器的队列中,以实现数据的
写操作,
c4-5、读写模式状态转换模块进入写结束状态(write—end),关闭写命令, c4-6、读写模式状态转换模块回到初始状态idle状态,等待下一次写操作,写操
作完毕;
II 、执行d4步骤的读操作具体为
d4-l、读写模式状态转换模块初始状态为idle状态时,
d4-2、读写模式状态转换模块检测到主机发送的命令host—rd—en时,处于主机读 使能状态,
d4-3、读写模式状态转换模块进入读状态(read),
d4-4、由读写模块(Reg_Rd—Wr)将数据从块状存储器的队列中读出,以实现数据 的读操作,
d4-5、读写模式状态转换模块进入读结束状态(read一end),关闭读命令, d4-6、读写模式状态转换模块进入读结束延时状态(read—end—dly),将读取的数 据备份至锁存器中进行数据锁存,
d4-7、读写模式状态转换模块回到初始状态idle状态,等待下一次读操作,读操
作完毕;
所述每个寄存器虚拟设有多个队列的深度为16或32或64或128或256或2048等。每个寄存器虚拟设有多个队列的深度为2048,寄存器组为15个,发送端寄存器组(TX reg)为7个,接收端寄存器组(RX reg)为7个,中断频率控制寄存器组为1个。
所述中断频率控制寄存器组可以是深度为4096的MSIX寄存器或深度为2176的 Receive VLAN Filter Table Array接收VLAN过滤表(RVFTA寄存器)或深度为128的 Receive Multicast Table Array Register接收组播寄存器(RMTA寄存器)或深度为256 的Flexible TCO Filter Table Register灵活TCO过滤寄存器(FTFT寄存器)。
所述FPGA采用Xilinx的XC5VLX50T芯片,
所述块状存储器(块ram)可以采用单端口、双端口、数据宽度的转换等传输方式,
在对同一队列同时进行读写操作的状态下,所述块状存储器(块ram)和读写模式状 态转换模块均支持三种操作模式写优先模式、读优先模式、输出不变模式。
写优先模式状态下读出的数据与写入的数据相同;读优先模式状态下先将该地址 所指定缓冲器的数据读出,再写入数据,在写操作时不影响该数;输出不变模式状态下 数据仅写入相应的缓冲器,而不影响输出,输出缓冲器保持上一次读操作时的数据。
所述数据包为传输层数据包。
与现有的技术相比,本发明具有以下优点及有益效果
1、 本发明采用接收引擎模块对三种数据包进行处理分类,处理逻辑存储和块状存储 器存储,实现对发送端寄存器还是接收端寄存器操作,使得数据控制、处理灵活高效。
2、 读写模块主机可以对块RAM存储的数据进行灵活的读写。
3、 块状存储器的多个寄存器组,每个寄存器组都属于其中的一个队列支持大量数据 的存储,寄存器组中的数据同属于一个队列,接收控制器或发送发送控制器需要读写相关 寄存器时,可以同时将相关寄存器读写,主要是方便数据的读取、縮短数据存储的周期。
4、 块状存储器设有读写模式状态转换模块完成读写操作后立刻返回初始状态,等待 下一次的命令,再进行下一次的读写操作,主要是方便控制,提高操作效率,提高读写效 率,縮短数据存储的周期。
5、 块状存储器和读写模式状态转换模块均支持三种操作模式写优先模式、读优先模 式、输出不变模式,通过界面控制三种操作模式的选择、切换,主要是方便控制,提高操 作效率,提高读写效率,縮短数据存储的周期。
因此,本发明提供了一种数据存储速度快、控制便捷灵活、可用于大量数据的存储的存储方法。
图l:本发明框架图2:读写模块实现寄存器的逻辑存储和块RAM存储的结构框图; 图3:发送寄存器在块RAM中的存储示意图; 图4:接收寄存器在块RAM中的存储示意图; 图5:单端口块R層模型示意图6: write—first(写优先)模式下数据读写示意图; 图7: read-first (读优先)模式下数据读写示意图; 图8: no—change(输出不变)模式下数据读写示意图; 图9:块RAM中的读写模式状态转换模块示意图10:现有技术中虚拟网卡芯片按照2048、 512、 128和64队列设计的资源需求表。 相关技术技术术语
1. Rx Engine:接收引擎模块;
2. Rx FSM:接收有限状态机模块Receive Finite State Machine;
3. Rx Posted:接收到的Posted包;Posted request: Posted包请求;
4. Rx Non-Posted:接收至!j的NonPosted包;Non-Posted request: Non_Posted包请求;
5. Rx Completion:接收到的Completion包;
6. TU3: 传输层数据包Transaction Layer Packets;
7. Reg—Rd—Wr: 读写模块register—read—write;
8. Tx Engine: 发送弓l擎模块transmit Engine;
9. Tx FSM:发送有限状态机Receive Finite State Machine;
10. Tx Completion: 发送的Completion包 ;
11. TX Reg:发送端寄存器组;
12. RX Reg:接收端寄存器;
13. Idle:初始状态(一般用Idle表示初始状态,没有什么特殊含义);
14. host—wr_en:主机写使能,主机发出的要写寄存器的命令;15. host—rd—en:主机读使能,主机发出的要读寄存器的命令;
16. write:写状态,在此状态下要发出写的命令并且准备好要写入的地址和数据;
17. write—end:写结束状态,在此态下要设置写命令无效;
18. read:读状态,在此状态下发出读的命令和要读取的地址;
19. reacLend:读结束状态,在此态下已将要读的地址内的数据读出;
20. read—end_dly:读结束延时态,在此态下将读出的数据进行锁存;
21. Block ram:块状存储器、块ram;
22. 中断频率控制寄存器组;
23. MSIX寄存器MSI-X中断寄存器(MSI-X是公知的, 一种中断方式);
24. RVFTA寄存器Receive VLAN Filter Table Array接收VLAN过滤表;
25. RMTA寄存器Receive Multicast Table Array Register接收组播寄存器;
26. FTFT寄存器:Flexible TCO Filter Table Register灵活TC0过滤寄存器。
具体实施方式
下面结合附图,对本发明作进一步说明。
本发明提供了一种基于FPGA的多虚拟队列数据存储的方法,包括网卡、FPGA,所述 FPGA包括块状存储器(块ram)、 MAC控制器模块、DMA控制器、PCIe控制器模块,其特殊 之处在于
所述FPGA中设有接收引擎模块(Rxengine)、发送引擎模块(Tx engine)、读写模块 (Reg_Rd_Wr),接收引擎模块(Rx engine)通过读写模块(Reg_Rd—Wr)与发送引擎模块 (Tx engine)连接,接收引擎模块(Rx engine)实现从主机发送过来的数据包进行处理 分类,发送引擎模块(Tx engine)实现将用户发往主机的数据打包,按照相应的时序发 送给核接口,读写模块(Reg_Rd—Wr)实现数据的存储与提取;
所述接收引擎模块(Rx engine)包括接收有限状态机模块(Rx FSM)、接收Posted 包模块(Rx posted)、接收NonPosted包模块(Rx No叩osted)、接收Completion包模块 (Rx Completion);
所述发送引擎模块(Tx engine)包括发送有限状态机模块(TxFSM)、发送Completion 包模块(Tx Completion);所述块状存储器(块ram)内虚拟设有已编址的多个寄存器组,多个寄存器组包括发 送端寄存器组(TX reg),接收端寄存器组(RX reg),中断频率控制寄存器组,每个寄存 器虚拟设有多个队列;
一种基于FPGA的多虚拟队列数据存储的方法步骤如下
a、 主机将数据包发送到PCIe模块,由PCIe模块传递到接收引擎模块(Rx engine), 由接收引擎模块(Rx engine)进行处理,执行b操作;
b、 接收到的数据包有三禾中posted request, non—posted request, rx completion, 由发送有限状态机模块(RxFSM)对三种数据包进行处理分类,发送有限状态机模块(Rx FSM)对posted request执行c操作,发送有限状态机模块(Rx FSM)对non-posted request 执行d操作,
c、 posted request由接收Posted包模块(Rx posted)通过读写模块(Reg—Rd一Wr) 分配给寄存器进行写操作,执行cl操作,
cl、接收Posted包模块(Rx posted)根据数据包中的地址判断是进行逻辑存储 还是块状存储器(块ram)存储,如果是块状存储器(块ram)存储,执行c2操作,
C2、接收Posted包模块(Rx posted)根据数据包中的地址判断是对发送端寄存 器(TX reg)还是接收端寄存器(RX reg)操作,如果是接收端寄存器(RX reg)操作, 执行c3操作,
c3、接收Posted包模块(Rx posted)根据数据包中的地址判断确定对接收端寄 存器的具体块状存储器(块ram)写操作,再根据地址判断具体要向该块状存储器(块ram) 的哪一个队列进行写操作,执行c4操作;
C4、由读写模块(Reg_Rd—Wr)将数据写入块状存储器的队列中,以实现数据的写 操作,写操作完毕;
d、 non-posted request由接收NonPosted包模块(Rx Nonposted)通过读写模块 (Reg—Rd一Wr)分配给寄存器进行读操作,执行dl操作,
dl、接收NonPosted包模块(Rx Nonposted)根据数据包中的地址判断是进行逻 辑存储还是块状存储器(块ram)存储,如果是块状存储器(块ram)存储,执行d2操作,
d2、接收NonPosted包模块(Rx No叩osted)根据数据包中的地址判断是对发送 端寄存器还是接收端寄存器操作,如果是接收端寄存器操作,执行d3操作,d3、接收NonPosted包模块(Rx No叩osted)根据数据包中的地址判确定对接收 端寄存器的具体块状存储器(块ram)读操作,再根据数据包中的地址判断具体要向该块 状存储器(块ram)的哪一个队列进行读操作,执行d4操作,
d 4、由读写模块(Reg—Rd—Wr)将数据从块状存储器的队列中读出,以实现数据 的读操作,读操作完毕,执行d5操作;
d5、读写模块(Reg_Rd_Wr)将具体块状存储器(块ram)的具体队列中读取到的 数据通过发送Completion包模块(Tx Completion)返回给主机。
所述块状存储器设有读写模式状态转换模块,读写模式状态转换模块分为读模式状态 的转换和写模式状态的转换,读模式状态分为初始状态(idle),主机读使能状态 (host_rd—en ),读状态(read),读结束状态(read_end ),读结束延时状态 (read—end_dly),写模式状态分为初始状态(idle),主机写使能状态(host—wr—en), 写状态(write),写结束状态(write_end),
I 、执行c4步骤的写操作具体为;
c4-l、读写模式状态转换模块初始状态为idle状态时,
c4-2、读写模式状态转换模块检测到主机发送的命令host—wr一en时,处于主机写 使能状态,
c4-3、读写模式状态转换模块进入写状态(write),
c4-4、由读写模块(Reg_Rd—Wr)将数据写入块状存储器的队列中,以实现数据的
写操作,
C4-5、读写模式状态转换模块进入写结束状态(write—end),关闭写命令, c4-6、读写模式状态转换模块回到初始状态idle状态,等待下一次写操作,写操
作完毕;
II 、执行d4步骤的读操作具体为
d4-1、读写模式状态转换模块初始状态为idle状态时,
d4-2、读写模式状态转换模块检测到主机发送的命令host—rd—en时,处于主机读 使能状态,
d4-3、读写模式状态转换模块进入读状态(read),
d4-4、由读写模块(Reg—Rd—Wr)将数据从块状存储器的队列中读出,以实现数据
14的读操作,
d4-5、读写模式状态转换模块进入读结束状态(read—end),关闭读命令, d4-6、读写模式状态转换模块进入读结束延时状态(reacLend—dly),将读取的数 据备份至锁存器中进行数据锁存,
d4-7、读写模式状态转换模块回到初始状态idle状态,等待下一次读操作,读操
作完毕;
所述每个寄存器虚拟设有多个队列的深度为16或32或64或128或256或2048等。 例如每个寄存器虚拟设有多个队列的深度为2048,寄存器组为15个,发送端寄存器组
(TX reg)为7个,接收端寄存器组(RX reg)为7个,中断频率控制寄存器组为1个。 所述中断频率控制寄存器组可以是深度为4096的MSIX寄存器或深度为2176的 Receive VLAN Filter Table Array接收VLAN过滤表(RVFTA寄存器)或深度为128的 Receive Multicast Table Array Register接收组播寄存器(RMTA寄存器)或深度为256 的Flexible TCO Filter Table Register灵活TC0过滤寄存器(FTFT寄存器)。
所述FPGA采用Xilinx的XC5VLX50T芯片,所述数据包为传输层数据包(TLP),所述 块状存储器(块ram)可以采用单端口、双端口、数据宽度的转换等传输方式。
在对同一队列同时进行读写操作的状态下,所述块状存储器(块ram)和读写模式状 态转换模块均支持三种操作模式写优先模式、读优先模式、输出不变模式。写优先模式 状态下读出的数据与写入的数据相同;读优先模式状态下先将该地址所指定缓冲器的 数据读出,再写入数据,在写操作时不影响该数;输出不变模式状态下数据仅写入相应 的缓冲器,而不影响输出,输出缓冲器保持上一次读操作时的数据。
如图1所示从主机中传出的数据只能通过PCIe到Rx engine,由外部向主机传输数 据是有Rx engine通过PCIe传递到主机,Rx Engine模块实现将从主机发送过来的数据 包进行处理分类。接收到的包有三种
(1) Posted request:不需要返回Completion,如写寄存器。
(2) Non-Posted request:需要返回Completion,如读寄存器。
(3) Rx Completion:网卡向主机请求读数据或者描述符,通过Rx Completion包将 所请求的对象发送至网卡。
根据接收到的TLP类型,Rx Engine模块可以分成Rx FSM、 RxPosted、 RxNonPosted和Rx Completion模块,Rx FSM根据不同类型的TLP,将数据分配给不同的模块。其中, Posted和Non-Posted的数据包将分配给寄存器读写模块,Non-Posted的数据包需要返 回数据,由Reg_Rd—Wr模块返回数据通过Tx Co卿letion传递回主机。
如图2所示模块Reg一Rd一Wr主要实现寄存器的存储和读写模块,存储类型是逻辑存 储和块RAM存储。
首先主机通过PCIe Core接收的数据经过Rx FSM模块,Rx FSM根据不同类型的TLP, 将数据分配给不同的模块,若为RxPosted模块,则进行寄存器的写操作,根据地址判断 是进行逻辑存储还是块RAM存储;若为RxNonPosted模块,则进行寄存器的读操作,也要 根据地址判断是进行逻辑存储还是块RAM存储;逻辑存储主要是针对单个32bit的寄存器 存储,其中逻辑存储比较简单,在此不再赘述,主要讲述利用块RAM存储深度大的寄存器。
如图3、图4所示在进行此设计中,首先对深度为2048的寄存器进行编址,每个寄 存器的深度不一定都为2048,要根据资源大小而定,要是资源不够可以设计深度为256、 128、 64等,在此以深度2048为例。
通过分析深度为2048的有15个寄存器组,分别是TX Reg和RX Reg各7个,外加一 个中断频率控制寄存器组ITRC;中断频率控制寄存器组ITRC可以为深度为4096的MSIX 寄存器或者深度为2176的RVFTA寄存器或者深度为128的RMTA寄存器或者深度为6272 的寄存器(RMHTA+RMATA)或者深度为256的寄存器FTFT。
以发送寄存器TX为例,将TDBAL寄存器地址设置为0x10—0000+nX 0x20 (n=0~2047), 寄存器TDBAH地址设置为0x10—0004+nX 0x20 (n=(T2047),其他寄存器依此类推;接收寄 存器以寄存器RDBAL为例,将其寄存器地址设置为0x40—0000+nX 0x20 (n=(T2047),寄存 器RDBAH地址设置为0x40_0004+nX0x20(n=(T2047),其他寄存器依此类推。图3、图4 分别为发送寄存器和接收寄存器在块RAM中的存储情况。
假设主机要读或写数据的地址是address, address[23:16]决定是对发送寄存器还是 接收寄存器操作。n表示的是块RAM的编号,n=address[4:0];如果『5' h0,表示是要 向块RAM0中读或写;n=5' h4,表示是要向块RAM1中读或写;n=5' h8,表示是要向块RAM2 中读或写;n=5' hc,表示是要向块RAM3中读或写;n=5' hlO,表示是要向块RAM4中读 或写;n=5, h14,表示是要向块RAM5中读或写;n=5, h18,表示是要向块RAM6中读或写。
在确定某一块RAM读或写后,就要决定具体要向该块RAM的哪一个地址中读写,该地址为address [15:5]。
如图5所示根据实际的需要,本文采用的单端口块RAM是使用的Xilinx的IP核设 计,IP核的生成在此不再阐述;单端口块RAM模型。 Block RAM的各个信号定义如下。
CLKA: block ram的a 口时钟控制信号。
ENA: block ram使能信号,当该控制脚为低时,写入和读出操作无效; WEA: block ram读/写控制信号,当ENA控制为高时,WEA=1表示对目标地址执行写 操作;WEA=0表示对目标地址执行读操作。
SSRA: block ram的置位控制信号,当ENA控制为高时,该信号有效。
ADDRA: block ram地址输入信号。
DINA: block ram的数据输入。
DOUTA: block ram的数据输出。
REGCEA: block ram的最后寄存器使能输出。
块存储器除了实现单/双端口的存储器以外,还可支持数据宽度的转换(包括奇偶校验 位),可以用多个block ram组成更大深度和宽度的存储单元。
如图6、图7、图8所示块RAM支持三种操作模式,这些模式在下面进行详述。
write—first (写优先)模式在write—frist模式下同时读/写block ram的同一地址 时,读出的数据与写入的数据相同,如图6所示。这种传输模式在向同一端口进行写操作 时,使得数据输出总线变得很灵活。
read-first(读优先)模式在该模式下,同时读/写blok ram的同一地址时,首先将 该地址所指定缓冲器的数据读出。在写操作时不影响该数据,如图7所示。
no—change(输出不变)模式在该模式下,同时读/写block ram的同一地址时,数据 仅写入相应的缓冲器,而不影响输出。输出缓冲器保持上一次读操作时的数据,如图8所 示。
根据块RAM的三种模式,结合项目的实际需要,选择write—first(写优先)模式还是 read-first (读优先)模式还是no—change (输出不变)模式。
如图9所示块RAM读写模式状态转换模块示意图,该状态转换主要分为读写两个 操作,当初时态处于idle时,若检测到主机发送的命令host—wr—en时,此时要写的地址和数据己经准备完毕,则进入写操作;检测到主机发送的host—rd—en命令时,此时要读 取的地址已经准备完毕,则执行读操作。根据将要写入或读取数据的地址address,解析 出数据要写入的哪一个块RAM,以及该块RAM的哪一个位置空间。
在进行写操作时,首先进入write状态。在该状态下将数据写入地址中,下一周期进 入write—end状态,在该状态下,将信号wea和ena均置为0,关闭写命令,完成此数据 的写操作。在进行写操作时,write状态将数据写入块RAM地址中,写入数据操作完毕后 由write_end状态关闭写命令。
在进行读操作时,首先进入read状态,在该状态下将读取地址中数据,下一周期进入 read—end状态,在该状态下,将信号wea和ena均置为0,关闭读命令,完成此数据的读 操作,此时数据已经由douta输出。为了保持数据的稳定性,避免亚稳态出现,在 read—end—dly状态下,用一锁存器对结果进行锁存。在进行读操作时,read状态读取块 RAM地址中的数据,并将数据发送至指定的寄存器,读取数据操作完毕后由read—end状态 关闭读命令。完成读操作后在read—end—dly执行锁存器对结果进行锁存。
最后应当说明的是以上实施例仅用以说明本发明的技术方案而非对其限制,尽管参照 上述实施例对本发明进行了详细的说明,所属领域的普通技术人员应当理解依然可以对 本发明的具体实施方式
进行修改或者等同替换,而未脱离本发明精神和范围的任何修改或 者等同替换,其均应涵盖在本发明的权利要求范围当中。
18
权利要求
1、一种基于FPGA的多虚拟队列数据存储的方法,包括网卡、FPGA,所述FPGA包括块状存储器、MAC控制器模块、DMA控制器、PCIe控制器模块,其特征在于所述FPGA中设有接收引擎模块、发送引擎模块、读写模块,接收引擎模块通过读写模块与发送引擎模块连接,接收引擎模块实现从主机发送过来的数据包进行处理分类,发送引擎模块实现将用户发往主机的数据打包,按照相应的时序发送给核接口,读写模块实现数据的存储与提取;所述接收引擎模块包括接收有限状态机模块、接收Posted包模块、接收NonPosted包模块、接收Completion包模块;所述发送引擎模块包括发送有限状态机模块、发送Completion包模块;所述块状存储器内虚拟设有已编址的多个寄存器组,多个寄存器组包括发送端寄存器组,接收端寄存器组,中断频率控制寄存器组,每个寄存器虚拟设有多个队列;一种基于FPGA的多虚拟队列数据存储的方法步骤如下a、主机将数据包发送到PCIe模块,由PCIe模块传递到接收引擎模块,由接收引擎模块进行处理,执行b操作;b、接收到的数据包有三种posted request,non-posted request,rx completion,由发送有限状态机模块对三种数据包进行处理分类,发送有限状态机模块对posted request执行c操作,发送有限状态机模块对non-posted request执行d操作,c、posted request由接收Posted包模块通过读写模块分配给寄存器进行写操作,执行c1操作,c1、接收Posted包模块根据数据包中的地址判断是进行逻辑存储还是块状存储器存储,如果是块状存储器存储,执行c2操作,c2、接收Posted包模块根据数据包中的地址判断是对发送端寄存器还是接收端寄存器操作,如果是接收端寄存器操作,执行c3操作,c3、接收Posted包模块根据数据包中的地址判断确定对接收端寄存器的具体块状存储器写操作,再根据地址判断具体要向该块状存储器的哪一个队列进行写操作,执行c4操作;c4、由读写模块将数据写入块状存储器的队列中,以实现数据的写操作,写操作完毕;d、non-posted request由接收NonPosted包模块通过读写模块分配给寄存器进行读操作,执行d1操作,d1、接收NonPosted包模块根据数据包中的地址判断是进行逻辑存储还是块状存储器存储,如果是块状存储器存储,执行d2操作,d2、接收NonPosted包模块根据数据包中的地址判断是对发送端寄存器还是接收端寄存器操作,如果是接收端寄存器操作,执行d3操作,d3、接收NonPosted包模块根据数据包中的地址判确定对接收端寄存器的具体块状存储器读操作,再根据数据包中的地址判断具体要向该块状存储器的哪一个队列进行读操作,执行d4操作,d4、由读写模块将数据从块状存储器的队列中读出,以实现数据的读操作,读操作完毕,执行d5操作;d5、读写模块将具体块状存储器的具体队列中读取到的数据通过发送Completion包模块返回给主机。
2、根据权利要求1所述的一种基于FPGA的多虚拟队列数据存储的方法,其特征在于 所述块状存储器设有读写模式状态转换模块,读写模式状态转换模块分为读模式状态的转换 和写模式状态的转换,读模式状态分为初始状态,主机读使能状态,读状态,读结束状态,读结束延时状态,写模式状态分为初始状态,主机写使能状态,写状态,写结束状态, I、执行C4步骤的写操作具体为;c4-l、读写模式状态转换模块初始状态为idle状态时,c4-2、读写模式状态转换模块检测到主机发送的命令hostjr—en时,处于主机写使能状态,c4-3、读写模式状态转换模块进入写状态,c4-4、由读写模块将数据写入块状存储器的队列中,以实现数据的写操作, c4-5、读写模式状态转换模块进入写结束状态,关闭写命令,c4-6、读写模式状态转换模块回到初始状态idle状态,等待下一次写操作,写操作完毕;II、执行d4步骤的读操作具体为d4-l、读写模式状态转换模块初始状态为idle状态时,d4-2、读写模式状态转换模块检测到主机发送的命令host—rcLen时,处于主机读使能状态,d4-3、读写模式状态转换模块进入读状态,d4-4、由读写模块将数据从块状存储器的队列中读出,以实现数据的读操作, d4-5、读写模式状态转换模块进入读结束状态,关闭读命令,d4-6、读写模式状态转换模块进入读结束延时状态,将读取的数据备份至锁存器中 进行数据锁存,d4-7、读写模式状态转换模块回到初始状态idle状态,等待下一次读操作,读操作完毕;
3、 根据权利要求1或2所述的一种基于FPGA的多虚拟队列数据存储的方法,其特征在 于所述每个寄存器虚拟设有多个队列的深度为16或32或64或128或256或2048等。
4、 根据权利要求3所述的一种基于FPGA的多虚拟队列数据存储的方法,其特征在于 所述每个寄存器虚拟设有多个队列的深度为2048,寄存器组为15个,发送端寄存器组为7 个,接收端寄存器组为7个,中断频率控制寄存器组为l个。
5、 根据权利要求4所述的一种基于FPGA的多虚拟队列数据存储的方法,其特征在于 所述中断频率控制寄存器组可以是深度为4096的MSIX寄存器或深度为2176的Receive VLAN Filter Table Array接收V副过滤表或深度为128的Receive Multicast Table Array Register接收组播寄存器或深度为256的Flexible TCO Filter Table Register灵活TCO 过滤寄存器。
6、 根据权利要求1或2所述的一种基于FPGA的多虚拟队列数据存储的方法,其特征在 于所述FPGA采用Xilinx的XC5VLX50T芯片,
7、 根据权利要求1或2所述的一种基于FPGA的多虚拟队列数据存储的方法,其特征在 于所述块状存储器可以采用单端口、双端口、数据宽度的转换等传输方式,
8、 根据权利要求1或2所述的一种基于FPGA的多虚拟队列数据存储的方法,其特征在 于在对同一队列同时进行读写操作的状态下,所述块状存储器和读写模式状态转换模块均支持三种操作模式写优先模式、读优先模式、输出不变模式。
9、 根据权利要求8所述的一种基于FPGA的多虚拟队列数据存储的方法,其特征在于 写优先模式状态下读出的数据与写入的数据相同;读优先模式状态下先将该地址所指定 缓冲器的数据读出,再写入数据,在写操作时不影响该数;输出不变模式状态下数据仅写 入相应的缓冲器,而不影响输出,输出缓冲器保持上一次读操作时的数据。
10、 根据权利要求1或2所述的一种基于FPGA的多虚拟队列数据存储的方法,其特征在 于所述数据包为传输层数据包。
全文摘要
一种基于FPGA的多虚拟队列数据存储的方法,本发明设计基于FPGA中实现高速网卡数据读写技术,特别是涉及一种多虚拟队列的数据存储方法,本设计采用接收引擎模块、读写模块、块状存储器的多个寄存器组,每个寄存器组都属于其中的一个队列、块状存储器设有读写模式状态转换模块、块状存储器和读写模式状态转换模块均支持三种操作模式,对所有大量的(如2048个)队列中的寄存器使用FPGA中的块RAM进行存储和处理,实现对同一队列的相关寄存器进行同时读写。解决了现有技术中逻辑存储和外部存储的逻辑资源不足、存储速度慢、存储周期长等问题。
文档编号G11C11/401GK101599294SQ20091008389
公开日2009年12月9日 申请日期2009年5月11日 优先权日2009年5月11日
发明者方信我, 宇 曾, 白宗元, 郑臣明 申请人:曙光信息产业(北京)有限公司