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执行锁存器 对结果进行锁存。 最后应当说明的是:以上实施例仅用以说明本发明的技术方案而非对其限制,尽管 参照上述实施例对本发明进行了详细的说明,所属领域的普通技术人员应当理解: 依然可以对本发明的具体实施方式进行修改或者等同替换,而未脱离本发明精神和 范围的任何修改或者等同替换,其均应涵盖在本发明的权利要求范围当中。


发布评论