一种现场可编程门阵列中管理发送缓冲区的方法和装置的制作方法

文档序号:7589574阅读:317来源:国知局
专利名称:一种现场可编程门阵列中管理发送缓冲区的方法和装置的制作方法
技术领域
本发明涉及现场可编程门阵列(FPGA),尤其涉及在现场可编程门阵列(FPGA)中管理发送缓冲区的方法和装置。
背景技术
在当前通讯领域的FPGA设计中,经常要将被处理的数据帧先暂存到外挂的大容量RAM中,之后再将数据帧移入FPGA内部的发送缓冲区,最后发送出去。通常方法是发送缓冲区的容量至少是1个完整的数据帧长度。每当有数据需要发送、并且先进先出缓冲区(FIFO)中的空间超过帧长度时;就开始将整个数据包移入到FIFO中。这种方法的优点是处理方法简单。但是当处理帧类型的最大长度比较长、发送通道数量比较多的情况下,所需要的FPGA内部存储区将需要很大。(例如以太网的帧长度可以是1518BYTE,如果发送通道是32个,那么单单需要的发送缓冲区容量就要至少1518*32*8=388Kbit。)这对于FPGA来说将是一个很大的开销。
在申请号为03121413.4(公开号CN1439966)的中国专利申请中,描述了一种将多个通道所需要的FIFO集成到一个双端口RAM中,并且将各个通道的读写指针控制也分别集成于一个读/写指针控制单元中的装置。该装置减少了多个独立FIFO构造所使用的大量读写指针计数器资源。但是,该专利并不能够解决当要处理的帧长度很长的情况下,缓冲区占用FPGA内部大量存储块(BLOCKRAM)资源的问题。

发明内容
本发明所要解决的技术问题是提供一种在FPGA中管理发送缓冲区的方法和装置,来解决当要处理的帧长度很长的情况下,缓冲区占用FPGA内部大量存储块(BLOCKRAM)资源的问题。
本发明提供一种在FPGA中管理发送缓冲区的方法,其适应于带有外挂RAM的FPGA,通过将存储在外挂大容量RAM中的一个长数据帧采用轮循的方法分多次传入FPGA,以节约FPGA内部发送缓冲区资源。
根据本发明的上述方法,进一步包括如下步骤步骤一在FPGA内部定义缓冲区存储单元、写入控制单元、读/写指针寄存器、总长度/已写入长度寄存器、状态指示单元、读出单元,并且将总长度/已写入长度寄存器、读/写指针都初始化为0;步骤二所述写入控制单元查询所述外挂RAM,当发现有要传送的数据帧时,将总长度寄存器的总长度赋值为该帧的长度,将已写入长度寄存器中的已经写入长度赋值为0;步骤三所述写入控制单元采用轮循的方法,分多次将数据帧从所述外挂RAM中读出并写入到所述缓冲区存储单元中;用所述读/写指针寄存器分别记录缓冲区存储单元当前的读/写位置;由所述读出单元读取所述缓冲区存储单元中的数据,然后发送出去;当一个帧发送完毕,就转入步骤二。
根据本发明的上述方法,在单发送通道情况下,在所述步骤三,所述写入控制单元通过查询总长度/已写入长度寄存器而确定一次需要传送的数据长度,并且不断查询状态指示单元以确定缓冲区的可用空间能否容纳一次传送的部分数据;每当数据写入或者读出缓冲区时,由状态指示单元就根据读/写指针寄存器计算缓冲区的空闲容量是否超过预定的阈值,并更新状态值。
根据本发明的上述方法,在所述步骤三,当总长度减去已写入长度所得的剩余部分帧的长度小于或等于一次写入的长度S时,则传送长度为剩余部分帧的长度;当剩余部分帧的长度大于一次写入的长度S时,则传送长度为S,由写入控制单元从外挂的RAM中读取数据的读起点在帧内的偏移量等于已经写入长度寄存器的值,每当写入控制单元向缓冲区写入一个数据时,写指针递增1,同时将已写入长度寄存器更新;用读出单元根据读/写指针寄存器判断是否有数据可以读出,且在每次读出数据之后,更新读指针。
根据本发明的上述方法,所述的缓冲区存储单元包括多个通道,在所述的步骤三,将读/写指针寄存器、总长度/已写入长度寄存器按照通道号存储在FPGA内部的一个块RAM中,作为一个“位置表格”使用;在状态指示单元中记录有各通道的状态;由写入控制单元轮循各通道,查找允许写入的通道,并确定是否有数据帧需要发送。
根据本发明的上述方法,将多个通道的缓冲区合并成为容量大的一整片双口RAM,每个通道占用固定的一部分区域,每次访问的时候,高位地址用来选择通道号,低位地址用来表示相应通道的缓冲区内部地址;当写入控制单元发现有可用的通道时,访问位置表格,得到读/写指针寄存器、总长度/已写入长度寄存器中的数值。
本发明提供一种在FPGA中管理发送缓冲区的装置,其包括一缓冲区存储单元,用于缓冲存储要发送的数据帧的数据;一读/写指针寄存器,用于分别记录缓冲区存储单元当前的读出、写入的位置;一总长度/已写入长度寄存器,用于分别记录当前缓冲区中数据帧的总长度、已经写入长度;一写入控制单元,用于将一个数据帧的数据分多次从外挂RAM中连续读出,写入到FPGA内部的缓冲区存储单元中;一读出单元,用于将缓冲区存储单元中的数据读出、发送出去;一状态指示单元,用于指示当前缓冲区的可用空间是否超过预定的阈值,可以容纳一次传送的部分数据;当外挂RAM中有要传送的数据帧时,写入控制单元通过总长度/已写入长度寄存器确定一次需要传送的数据长度,查询状态指示单元以确定缓冲区中是否有足够空闲空间,当有足够空间时,从外挂RAM中读出数据,并将所读出的数据写入缓冲区存储单元。
根据本发明的上述装置,所述的缓冲区存储单元是单通道的。
根据本发明的上述装置,所述的缓冲区存储单元是多通道的,其中多通道的缓冲区合并成为一整片双口RAM,每个通道占用其中固定的一部分区域。
根据本发明的上述装置,所述的各个通道的读/写指针寄存器、总长度/已写入长度寄存器按照通道号存储在FPGA内部的另一个块RAM中,用作“位置表格”;写入控制单元轮循各路通道,以确定可以写入的通道;写入控制单元访问位置表格从中获得写指针寄存器、总长度/已写入长度寄存器中的数值,并查询判断是否有数据帧需要发送;当有数据帧发送且有可用的通道时,就从外挂RAM中读取部分帧,并写入到双口RAM的对应区域中,并将更新后的写指针寄存器、总长度/已写入长度寄存器数值存到位置表格中;读出单元查询“位置表格”中的读/写指针寄存器,判断有否数据读出,每次读出数据之后,更新读指针并存回“位置表格”中。


图1是本发明在单通道情况下的FPGA内部电路的结构图。
图2是本发明在多发送通道的情况下的FPGA内部电路的结构图。
图3是本发明的方法流程图。
具体实施例方式
下面结合附图对本发明做进一步的详细说明。
在图1所示的是本发明在单通道情况下的结构图。当外挂RAM中有数据包时,写入控制单元不断查询状态指示单元,如果发现其为‘1’,说明能够容纳一次传送的数据,则准备写入。写入控制单元首先参考“总长度/已写入长度寄存器”,确定需要一次传送的部分数据帧长度。具体的方法是由数据帧的总长度减去已写入长度寄存器得到剩余部分帧的长度。在数据帧写入缓冲区内之前,已写入长度寄存器应当为0,这时的剩余部分帧的长度就等于外挂RAM中保存的完整数据帧的长度。如果剩余部分帧的长度等于或小于一次传送数据的长度门限S,则这时从外挂的RAM中读出的数据帧可以一次性地全部写入到缓冲区中;如果所得到的剩余部分帧的长度大于一次写入的长度S,则传送的长度为S,写入控制单元从外挂的RAM中连续读出数据帧中的数据,读取起点的帧内偏移量等于已经写入长度寄存器的值,同时将读出的数据连续写入FPGA内部缓冲区。再将“已经写入长度寄存器”更新,增加为本次传送的长度,以作为数据帧的下次读取起点;每写一个数据,写指针递增1。完成一个数据帧的传送之后,则准备下一个帧的传输,当发现外挂RAM中有新的数据帧时总长度寄存器更新为下一帧的长度,已写入长度寄存器更新为0。之后,写入控制单元重复上述操作。
每当数据写入或者读出缓冲区时,状态指示单元就根据“读/写指针寄存器”,计算缓冲区的空闲容量是否超过一定的阈值,并相应地更新状态值。
读出单元,根据读/写指针寄存器判断是否有数据可以读出。每次读出数据之后,需要更新读指针。
例如在以太网的应用中,帧长=1518BYTE。我们采用新的方法设计,一次写入长度S为64BYTE,缓冲区容量可以设置为128BYTE,允许写入标志位的门限可设置为64BYTE(就是相当于半满)。1518长度的帧就被分成24次写入缓冲区,前23次写入的长度都是64BYTE,第24次的写入长度是46BYTE。可见,利用本发明的上述方法,传送长度为1518BYTE的数据帧,所需要的发送缓冲区容量为128*8=1Kbit,使得所用的双口RAM大大减小,节约了发送缓冲区所需要的BLOCKRAM资源。
图2描述了本发明在多发送通道的情况下的结构图。这时,由于每个通道缓冲区容量可以设定得很小,如果为每个通道使用一个单独BLOCKRAM则会很浪费,所以可以将多个通道的缓冲区合并成为容量大的一整片双口RAM,每个通道占用固定的一部分区域。每次访问的时候,高位地址用来选择通道号,低位地址用来表示相应通道的缓冲区内部地址。另外,也可以将“读/写指针寄存器,总长度/已写入长度寄存器”按照通道号存储在FPGA内部的另一个块RAM中,作为一个“位置表格”来使用。这时,状态指示单元由多路通道各自的状态指示位合并成为一个向量构成。
工作时,写入控制单元按照轮循各路通道的方式工作先看哪一路通道的空间的标志位允许写入,并且查询是否有数据帧需要发送。当发现了可用的通道之后,就访问位置表格,获取读/写指针寄存器,总长度/已写入长度寄存器的数值。然后按照单路通道类似的方法处理,得到写入长度。之后,开始将外挂RAM中读出部分帧,并写入到双口RAM的对应区域。最后,将更新之后的“写指针寄存器/总长度寄存器/已写入长度寄存器”存回位置表格中。
读出单元的工作方式也相应变化为先查询“位置表格”得到读/写指针寄存器的数值,判断是否有数据可以读出。每次读出数据之后,更新读指针,再将读指针存回“位置表格“中。
例如,当处理的帧长度最大为1518BYTE,处理通道数量为32,如果选用FPGA内部一个BLOCKRAM的大小是4KBIT时,使用本发明的上述结构,每路通道的发送缓冲区设为128BYTE,则总的缓冲区容量=128*32=4K BYTE(占用8个BLOCKRAM)。在位置表格中,每个通道保存的“读指针/写指针/总长度/已写入长度”4个记录各占2个BYTE。整个位置表格使用的RAM容量=32*8=256BYTE(占用1个BLOCKRAM)。这样,总的占用BLOCKRAM数量只需9个,而如果使用传统的方法388Kbit至少占用95个BLOCKRAM。可见在多通道的情况下,使用本发明的上述方法能够明显减少FPGA内部使用的BLOCKRAM资源数。
图3示出了本发明的方法流程图。如图3所示,在步骤S1在FPGA内部定义缓冲区存储单元、写入控制单元、读/写指针寄存器、总长度/已写入长度寄存器、状态指示单元、读出单元,并且将总长度/已写入长度、读/写指针都初始化为0;在步骤S2所述写入控制单元查询所述外挂RAM,当发现有要传送的数据帧时,将总长度寄存器的总长度赋值为该帧的长度,将已写入长度寄存器中的已经写入长度赋值为0;在步骤S3,所述写入控制单元采用轮循的方法,分多次将数据帧从所述外挂RAM中读出并写入到所述缓冲区存储单元中;用所述读/写指针寄存器分别记录缓冲区存储单元当前的读/写位置;由所述读出单元读取所述缓冲区存储单元中的数据,然后发送出去;当一个帧发送完毕,就转入步骤S2。
上面所述方法在单发送通道情况下,在所述步骤S3,由所述写入控制单元通过查询总长度/已写入长度寄存器而确定一次需要传送的数据长度,并且不断查询状态指示单元以确定缓冲区的可用空间能否容纳一次传送的部分数据;每当数据写入或者读出缓冲区时,状态指示单元就根据读/写指针寄存器计算缓冲区的空闲容量是否超过预定的阈值,并更新状态值。
对于上面所述方法,在所述步骤S3,当总长度减去已写入长度所得的剩余部分帧的长度小于或等于一次写入的长度S时,则传送长度为剩余部分帧的长度;当剩余部分帧的长度大于一次写入的长度S时,则传送长度为S,在这种情况下,写入控制单元从外挂的RAM中读取数据的读起点在帧内的偏移量等于已经写入长度寄存器的值,每当写入控制单元向缓冲区写入一个数据时,写指针递增1,同时将已写入长度寄存器更新;用读出单元根据读/写指针寄存器判断是否有数据可以读出,且在每次读出数据之后,更新读指针。
对于上面所述方法,所述缓冲区存储单元可以包括多个通道,这时,在所述的步骤S3,可以将读/写指针寄存器、总长度/已写入长度寄存器按照通道号存储在FPGA内部的一个块RAM中,作为一个“位置表格”使用;在状态指示单元中记录有各通道的状态;由写入控制单元轮循各通道,查找允许写入的通道,并确定是否有数据帧需要发送。另外,可以将上述多个通道的缓冲区可以被合并成为容量大的一整片双口RAM,其中每个通道占用固定的一部分区域,每次访问的时候,高位地址用来选择通道号,低位地址用来表示相应通道的缓冲区内部地址;当写入控制单元发现有可用的通道时,访问位置表格,获取读/写指针寄存器、总长度/已写入长度寄存器中的数值。
权利要求
1.一种在FPGA中管理发送缓冲区的方法,适应于带有外挂RAM的FPGA,其特征在于,通过将存储在外挂大容量RAM中的一个长数据帧采用轮循的方法分多次传入FPGA,以节约FPGA内部发送缓冲区资源。
2.根据权利要求1所述的方法,其特征在于,进一步包括如下步骤步骤一在FPGA内部定义缓冲区存储单元、写入控制单元、读/写指针寄存器、总长度/已写入长度寄存器、状态指示单元、读出单元,并且将总长度/已写入长度寄存器、读/写指针都初始化为0;步骤二所述写入控制单元查询所述外挂RAM,当发现有要传送的数据帧时,将总长度寄存器的总长度赋值为该帧的长度,将已写入长度寄存器中的已经写入长度赋值为0;步骤三所述写入控制单元采用轮循的方法,分多次将数据帧从所述外挂RAM中读出并写入到所述缓冲区存储单元中;用所述读/写指针寄存器分别记录缓冲区存储单元当前的读/写位置;由所述读出单元读取所述缓冲区存储单元中的数据,然后发送出去;当一个帧发送完毕,就转入步骤二。
3.根据权利要求2所述的方法,其特征在于,在单发送通道情况下,在所述步骤三,所述写入控制单元通过查询总长度/已写入长度寄存器而确定一次需要传送的数据长度,并且不断查询状态指示单元以确定缓冲区的可用空间能否容纳一次传送的部分数据;每当数据写入或者读出缓冲区时,由状态指示单元就根据读/写指针寄存器计算缓冲区的空闲容量是否超过预定的阈值,并更新状态值。
4.根据权利要求2所述的方法,其特征在于,在所述步骤三,当总长度减去已写入长度所得的剩余部分帧的长度小于或等于一次写入的长度S时,则传送长度为剩余部分帧的长度;当剩余部分帧的长度大于一次写入的长度S时,则传送长度为S,由写入控制单元从外挂的RAM中读取数据的读起点在帧内的偏移量等于已经写入长度寄存器的值,每当写入控制单元向缓冲区写入一个数据时,写指针递增1,同时将已写入长度寄存器更新;用读出单元根据读/写指针寄存器判断是否有数据可以读出,且在每次读出数据之后,更新读指针。
5.根据权利要求2所述的方法,其特征在于,所述的缓冲区存储单元包括多个通道,在所述的步骤三,将读/写指针寄存器、总长度/已写入长度寄存器按照通道号存储在FPGA内部的一个块RAM中,作为一个“位置表格”使用;在状态指示单元中记录有各通道的状态;由写入控制单元轮循各通道,查找允许写入的通道,并确定是否有数据帧需要发送。
6.根据权利要求5所述的方法,其特征在于,将多个通道的缓冲区合并成为容量大的一整片双口RAM,每个通道占用固定的一部分区域,每次访问的时候,高位地址用来选择通道号,低位地址用来表示相应通道的缓冲区内部地址;当写入控制单元发现有可用的通道时,访问位置表格,得到读/写指针寄存器、总长度/已写入长度寄存器中的数值。
7.一种采用权利要求1所述方法的装置,其特征在于,包括一缓冲区存储单元,用于缓冲存储要发送的数据帧的数据;一读/写指针寄存器,用于分别记录缓冲区存储单元当前的读出、写入的位置;一总长度/已写入长度寄存器,用于分别记录当前缓冲区中数据帧的总长度、已经写入长度;一写入控制单元,用于将一个数据帧的数据分多次从外挂RAM中连续读出,写入到FPGA内部的缓冲区存储单元中;一读出单元,用于将缓冲区存储单元中的数据读出、发送出去;一状态指示单元,用于指示当前缓冲区的可用空间是否超过预定的阈值,可以容纳一次传送的部分数据;当外挂RAM中有要传送的数据帧时,写入控制单元通过总长度/已写入长度寄存器确定一次需要传送的数据长度,查询状态指示单元以确定缓冲区中是否有足够空闲空间,当有足够空间时,从外挂RAM中读出数据,并将所读出的数据写入缓冲区存储单元。
8.根据权利要求7所述的装置,其特征在于,所述的缓冲区存储单元是单通道的。
9.根据权利要求7所述的装置,其特征在于,所述的缓冲区存储单元是多通道的,其中多通道的缓冲区合并成为一整片双口RAM,每个通道占用其中固定的一部分区域。
10.根据权利要求9所述的装置,其特征在于,所述的各个通道的读/写指针寄存器、总长度/已写入长度寄存器按照通道号存储在FPGA内部的另一个块RAM中,用作“位置表格”;写入控制单元轮循各路通道,以确定可以写入的通道;写入控制单元访问位置表格从中获得写指针寄存器、总长度/已写入长度寄存器中的数值,并判断是否有数据帧需要发送;当有数据帧发送且有可用的通道时,就从外挂RAM中读取部分帧,并写入到双口RAM的对应区域中,并将更新后的写指针寄存器、总长度/已写入长度寄存器数值存到位置表格中;读出单元查询“位置表格”中的读/写指针寄存器,判断有否数据读出,每次读出数据之后,更新读指针并存回“位置表格”中。
全文摘要
本发明涉及一种现场可编程门阵列FPGA中管理发送缓冲区的方法和装置,其在FPGA内部定义缓冲区存储单元、写入控制单元、读/写指针寄存器、总长度/已写入长度寄存器、状态指示单元和读出单元,通过写入控制单元分多次将要传送的数据帧从外挂RAM中读出、并写入到FPGA内部的缓冲区存储单元,然后由读出单元从缓冲区存储单元读取数据并发送出去。通过本发明,即使在处理的数据帧很长的情况下,也可以使缓冲区占用的FPGA内的块RAM资源很小,能够节省出大量FPGA内的块RAM资源。
文档编号H04L12/56GK1783030SQ20041000991
公开日2006年6月7日 申请日期2004年11月30日 优先权日2004年11月30日
发明者林宇平 申请人:中兴通讯股份有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1