2024年6月10日发(作者:)

(19)中华人民共和国国家知识产权局

(12)发明专利说明书

(21)申请号 CN2.5

(22)申请日 2009.05.11

(71)申请人 曙光信息产业(北京)有限公司

地址 100084 北京市海淀区水磨西街64号

(72)发明人 曾宇 方信我 郑臣明 白宗元

(74)专利代理机构 北京安博达知识产权代理有限公司

代理人 徐国文

(51)

G11C7/00

G11C11/401

G11C16/06

(10)申请公布号 CN 101599294 A

(43)申请公布日 2009.12.09

权利要求说明书 说明书 幅图

(54)发明名称

一种基于FPGA的多虚拟队列数据

存储的方法

(57)摘要

一种基于FPGA的多虚拟队列数据

存储的方法,本发明设计基于FPGA中实

现高速网卡数据读写技术,特别是涉及一

种多虚拟队列的数据存储方法,本设计采

用接收引擎模块、读写模块、块状存储器

的多个寄存器组,每个寄存器组都属于其

中的一个队列、块状存储器设有读写模式

状态转换模块、块状存储器和读写模式状

态转换模块均支持三种操作模式,对所有

大量的(如2048个)队列中的寄存器使用

FPGA中的块RAM进行存储和处理,实现

对同一队列的相关寄存器进行同时读写。

解决了现有技术中逻辑存储和外部存储的

逻辑资源不足、存储速度慢、存储周期长

等问题。

法律状态

法律状态公告日

法律状态信息

法律状态

权 利 要 求 说 明 书

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-1、读写模式状态转换模块初始状态为idle状态时,

c4-2、读写模式状态转换模块检测到主机发送的命令host_wr_en时,处于主机写使

能状态,

c4-3、读写模式状态转换模块进入写状态,

c4-4、由读写模块将数据写入块状存储器的队列中,以实现数据的写操作,

c4-5、读写模式状态转换模块进入写结束状态,关闭写命令,

c4-6、读写模式状态转换模块回到初始状态idle状态,等待下一次写操作,写操作

完毕;

II、执行d4步骤的读操作具体为:

d4-1、读写模式状态转换模块初始状态为idle状态时,

d4-2、读写模式状态转换模块检测到主机发送的命令host_rd_en时,处于主机读使

能状态,

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个,中断频率控制寄存器组为1个。

5、根据权利要求4所述的一种基于FPGA的多虚拟队列数据存储的方法,其特征

在于:所述中断频率控制寄存器组可以是深度为4096的MSIX寄存器或深度为

2176的ReceiveVLAN Filter Table Array接收VLAN过滤表或深度为128的

Receive Multicast Table ArrayRegister接收组播寄存器或深度为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中实现高速网卡数据读写技术,特别是涉及一种多虚拟队

列的数据存储方法。

背景技术

虚拟化技术是当前市场的一个热点,采用虚拟化技术可以节省了高达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存储器进行写操作,命令字为0,地址维持两个周期有效,写

使能维持一个周期有效,数据在两个周期内给出(每个周期128bits),这样实现了

burst length=4的操作,4x64bit=2x128bit。地址是按照4的倍数给出,也就是说

每个64bit一个地址,一次写操作要使用4个地址。读取命令字为1,地址维持1

个周期有效,读使能维持一个周期有效,地址也是4的倍数,在读数据有效时,数

据出现在读数据输出端口上,每128bit维持1个周期;但是从发出读取命令字到读

出数据则需要8个周期,并且DDR2_SDRAM控制器比较复杂,数据存储周期长、

数据存储速度慢且不灵活。

因此,需要设计一种能够提供数据存储速度快、控制便捷灵活、可用于大量数据的

存储的存储机制,以解决上述现有技术的缺陷。

发明内容

为了解决上述逻辑资源不足、存储速度慢、存储周期长等问题,本设计采用一种巧

妙的设计方法对所有大量的(如2048个)队列中的寄存器使用FPGA中的块RAM进

行存储和处理,实现对同一队列的相关寄存器进行同时读写。

为了实现上述目的,本发明提供了一种基于FPGA的多虚拟队列数据存储的方法,

包括网卡、FPGA,所述FPGA包括块状存储器(块ram)、MAC控制器模块、DMA

控制器、PCIe控制器模块,其特殊之处在于:

所述FPGA中设有接收引擎模块(Rx engine)、发送引擎模块(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 Nonposted)、接收Completion包模块

(Rx Completion);

所述发送引擎模块(Tx engine)包括发送有限状态机模块(Tx FSM)、发送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,由

发送有限状态机模块(Rx FSM)对三种数据包进行处理分类,发送有限状态机模块

(RxFSM)对posted request执行c操作,发送有限状态机模块(Rx FSM)对non-

posted request执行d操作,

c、posted request由接收Posted包模块(Rx posted)通过读写模块(Reg_Rd_Wr)分配给

寄存器进行写操作,执行c1操作,

c1、接收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)分配给寄存器进行读操作,执行d1操作,

d1、接收NonPosted包模块(Rx Nonposted)根据数据包中的地址判断是进行逻辑存

储还是块状存储器(块ram)存储,如果是块状存储器(块ram)存储,执行d2操作,

d2、接收NonPosted包模块(Rx Nonposted)根据数据包中的地址判断是对发送端寄

存器还是接收端寄存器操作,如果是接收端寄存器操作,执行d3操作,

d3、接收NonPosted包模块(Rx Nonposted)根据数据包中的地址判确定对接收端寄

存器的具体块状存储器(块ram)读操作,再根据数据包中的地址判断具体要向该块

状存储器(块ram)的哪一个队列进行读操作,执行d4操作,

d4、由读写模块(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-1、读写模式状态转换模块初始状态为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)将数据从块状存储器的队列中读出,以实现数据的

读操作,

d4-5、读写模式状态转换模块进入读结束状态(read_end),关闭读命令,

d4-6、读写模式状态转换模块进入读结束延时状态(read_end_dly),将读取的数据备

份至锁存器中进行数据锁存,

d4-7、读写模式状态转换模块回到初始状态idle状态,等待下一次读操作,读操作

完毕;

所述每个寄存器虚拟设有多个队列的深度为16或32或64或128或256或2048等。

每个寄存器虚拟设有多个队列的深度为2048,寄存器组为15个,发送端寄存器组

(TXreg)为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、块状存储器和读写模式状态转换模块均支持三种操作模式:写优先模式、读优

先模式、输出不变模式,通过界面控制三种操作模式的选择、切换,主要是方便控

制,提高操作效率,提高读写效率,缩短数据存储的周期。

因此,本发明提供了一种数据存储速度快、控制便捷灵活、可用于大量数据的存储

的存储方法。

附图说明

图1:本发明框架图;

图2:读写模块实现寄存器的逻辑存储和块RAM存储的结构框图;

图3:发送寄存器在块RAM中的存储示意图;

图4:接收寄存器在块RAM中的存储示意图;

图5:单端口块RAM模型示意图;

图6:write_first(写优先)模式下数据读写示意图;

图7:read-first(读优先)模式下数据读写示意图;

图8:no_change(输出不变)模式下数据读写示意图;

图9:块RAM中的读写模式状态转换模块示意图;

图10:现有技术中虚拟网卡芯片按照2048、512、128和64队列设计的资源需求

表。

相关技术技术术语:

Engine:接收引擎模块;

FSM:接收有限状态机模块Receive Finite State Machine;

Posted:接收到的Posted包;Posted request:Posted包请求;

Non-Posted:接收到的NonPosted包;Non-Posted request:Non-Posted包请求;

Completion:接收到的Completion包;

:传输层数据包Transaction Layer Packets;

_Rd_Wr:读写模块register_read_write;

Engine:发送引擎模块transmit Engine;

FSM:发送有限状态机Receive Finite State Machine;

Completion:发送的Completion包;

Reg:发送端寄存器组;

Reg:接收端寄存器;

:初始状态(一般用Idle表示初始状态,没有什么特殊含义);

_wr_en:主机写使能,主机发出的要写寄存器的命令;

_rd_en:主机读使能,主机发出的要读寄存器的命令;

:写状态,在此状态下要发出写的命令并且准备好要写入的地址和数据;

_end:写结束状态,在此态下要设置写命令无效;

:读状态,在此状态下发出读的命令和要读取的地址;

_end:读结束状态,在此态下已将要读的地址内的数据读出;

_end_dly:读结束延时态,在此态下将读出的数据进行锁存;

ram:块状存储器、块ram;

22.中断频率控制寄存器组;

寄存器:MSI-X中断寄存器(MSI-X是公知的,一种中断方式);

寄存器:Receive VLAN Filter Table Array接收VLAN过滤表;

寄存器:Receive Multicast Table Array Register接收组播寄存器;

寄存器:Flexible TCO Filter Table Register灵活TCO过滤寄存器。

具体实施方式

下面结合附图,对本发明作进一步说明。

本发明提供了一种基于FPGA的多虚拟队列数据存储的方法,包括网卡、FPGA,

所述FPGA包括块状存储器(块ram)、MAC控制器模块、DMA控制器、PCIe控制

器模块,其特殊之处在于:

所述FPGA中设有接收引擎模块(Rx engine)、发送引擎模块(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 Nonposted)、接收Completion包模块

(Rx Completion);

所述发送引擎模块(Tx engine)包括发送有限状态机模块(Tx FSM)、发送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,由

发送有限状态机模块(Rx FSM)对三种数据包进行处理分类,发送有限状态机模块

(RxFSM)对posted request执行c操作,发送有限状态机模块(Rx FSM)对non-

posted request执行d操作,

c、posted request由接收Posted包模块(Rx posted)通过读写模块(Reg_Rd_Wr)分配给

寄存器进行写操作,执行c1操作,

c1、接收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)分配给寄存器进行读操作,执行d1操作,

d1、接收NonPosted包模块(Rx Nonposted)根据数据包中的地址判断是进行逻辑存

储还是块状存储器(块ram)存储,如果是块状存储器(块ram)存储,执行d2操作,

d2、接收NonPosted包模块(Rx Nonposted)根据数据包中的地址判断是对发送端寄

存器还是接收端寄存器操作,如果是接收端寄存器操作,执行d3操作,

d3、接收NonPosted包模块(Rx Nonposted)根据数据包中的地址判确定对接收端寄

存器的具体块状存储器(块ram)读操作,再根据数据包中的地址判断具体要向该块

状存储器(块ram)的哪一个队列进行读操作,执行d4操作,

d4、由读写模块(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-1、读写模式状态转换模块初始状态为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)将数据从块状存储器的队列中读出,以实现数据的

读操作,

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芯片,所述数据包为传输层数据包(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 Completion传递回主机。

如图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+n×0x20(n=

0~2047),寄存器TDBAH地址设置为0x10_0004+n×0x20(n=0~2047),其他寄存器

依此类推;接收寄存器以寄存器RDBAL为例,将其寄存器地址设置为

0x40_0000+n×0x20(n=0~2047),寄存器RDBAH地址设置为0x40_0004+n×0x20(n

=0~2047),其他寄存器依此类推。图3、图4分别为发送寄存器和接收寄存器在

块RAM中的存储情况。

假设主机要读或写数据的地址是address,address[23:16]决定是对发送寄存器还是

接收寄存器操作。n表示的是块RAM的编号,n=address[4:0];如果n=5’h0,表

示是要向块RAM0中读或写;n=5’h4,表示是要向块RAM1中读或写;n=5’h8,

表示是要向块RAM2中读或写;n=5’hc,表示是要向块RAM3中读或写;n=

5’h10,表示是要向块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执行锁存器

对结果进行锁存。

最后应当说明的是:以上实施例仅用以说明本发明的技术方案而非对其限制,尽管

参照上述实施例对本发明进行了详细的说明,所属领域的普通技术人员应当理解:

依然可以对本发明的具体实施方式进行修改或者等同替换,而未脱离本发明精神和

范围的任何修改或者等同替换,其均应涵盖在本发明的权利要求范围当中。