一种实现链表流水操作的电路结构及操作方法
技术领域
本发明涉及链表操作领域,具体涉及一种实现链表流水操作的电路结构及操作方法。
背景技术
基于软件的链表操作方法已经很成熟,像Lisp和Scheme这样的语言的内建数据类型中就包含了链表的存取和操作。目前芯片技术中用到的片内缓存RAM,灵活性最大的为真正双端口RAM,它具有两个独立的可读可写的操作口,流水操作电路结构如图1所示,流水操作波形如图2所示。由于首次入链在更新链尾的同时也需要更新链头和链表非空指示,入链需要更新链表存储区的有效指示,而出链需要更新链头和链表非空指示和清除当前链头指向的下一跳指针有效指示。也就是说,多块RAM会有入链和出链同时进行读写操作的需求,这是目前芯片技术中RAM的操作特性无法达到的。因此,普通链表电路的入链和出链是分时操作的,如图3所示,无法做到入链和出链同时处理进行。
发明内容
本发明要解决的技术问题是:提供一种实现链表流水操作的电路结构,解决软件、通用链表电路无法做到每个时钟周期同时处理入链和出链的问题,并提高了处理带宽。
本发明为解决上述技术问题所采取的技术方案为:一种实现链表流水操作的电路结构,包括链表存储区和链表队列,链表存储区包括下一跳指针和下一跳指针有效指示,链表队列包括链头、链尾和链头的非空指示;其特征在于:所述的下一跳指针有效指示用2比特表示,记为status0[1:0],它的2个比特位分别表示为status0[0]和tatus0[1],定义status0[0]入链侧可读可写、出链侧只能读,status0[1]出链侧可读可写、入链侧只能读;
所述的链表队列还包括重起链头和重起链头的指示状态,重起链头的指示状态用2比特表示,记为status1[1:0],它的2个比特位分别表示为status1[0]和status1[1],定义status1[0]入链侧可读可写、出链侧只能读,status1[1]出链侧可读可写、入链侧只能读;链尾包含有对应链表存储区的status0[0]信息。
按上述方案,所述的链表存储区的下一跳指针、链表队列的链头、重起链头、链尾、链尾的status0[0]信息和链头的非空指示分别对应一块RAM,链表存储区的下一跳指针有效指示的2个比特位status0[0]和status0[1]分别各对应一块RAM,链表队列的重起链头的指示状态的2个比特位status1[0]和status1[1]分别各对应一块RAM。
按上述方案,对链表存储区的下一跳指针有效指示status0[1:0]进行如下定义:当status0[1:0]等于2’b00或者2’b11时,表示该链下一跳为空;当status0[1:0]等于2’b01或者2’b10时,表示该链下一跳为非空。
按上述方案,对链表队列的重起链头的指示状态status1[1:0]进行如下定义:当status1[1:0] 等于2’b00或者2’b11时,表示该重起链头为空;当status1[1:0]等于2’b01或者2’b10时,表示该重起链头为非空。
上述一种实现链表流水操作的电路结构的操作方法,其特征在于:它包括入链操作和出链操作;其中,
入链操作:电路解复位后,所有的状态位默认为0,即所有的链表为空,链表存储区的每个下一跳指针所对应的下一跳指针有效指示都为空;第一个入链请求进来后,用目标队列号QID来查询该队列的重起链头是否为空,如果重起链头是空,那么该入链请求就进入重起链头,同时新指针SID_NEW挂到链表存储区的RAM读地址上;
第一拍:1)QID作为链表队列RAM的读地址,准备获得重起链头的空状态;2)QID作为链表队列RAM的读地址,准备获得链尾指针值SID_OLD;3)SID_NEW作为链表存储区RAM的读地址,准备获得status0[0];
第三拍从下一跳指针有效指示status0[1:0]中获得重起链头的空状态、旧链尾指针SID_OLD和链表存储区status0[0]的值;
第三拍入重起链头操作:
1)将SID_NEW写入QID对应的链尾,同时将status0[0]写入链尾的相应位置;
2)将SID_NEW写入QID对应的重起链头,同时将重起链头的空状态取反,写入重起链头的指示状态status1[0];
3)将相关信息写入SID_NEW对应的位置;
第三拍入链尾操作:
1)将SID_NEW写入QID对应的链尾区域,同时将新的status0[0]写入链尾的相应位置;
2)将SID_NEW写入SID_OLD的下一跳指针,同时将链尾中存储的原来的status0[0]取反,写入到SID_OLD对应的状态位status0[0];链表存储区的旧链尾下一跳就有效了;
第四拍,入队成功;
出链操作:
第一拍:QID作为链表队列RAM的读地址,获得链头和重起链头的空状态;
第三拍获得链头的空状态、链头指针、重起链头的空状态、重起链头指针;
如果链头非空,则操作链头;如果链头为空,则看重起链头是否为空;如果重起链头非空,则操作重起链头;如果重起链头为空,则不动作;
第三拍重起链头出队:
1)将重起链头的指示状态status1[1]取反,写入重起链头的指示状态status1[1];
2)用重起链头指针去链表存储区读取下一跳指针和对应的status0[1:0];
第五拍重起链头出队:
1)如果链表存储区的status0[1:0]为空,则置链头状态位为空;
2)如果链表存储区的status0[1:0]为非空,则将下一跳指针写入链头,将status0[1]取反写入链表存储区的status0[1],将链头状态位置为非空;
第三拍链头出队:用链头指针去链表存储区读取下一跳指针和对应的status0[1:0];
第五拍链头出队:
1)如果status0[1:0]为空,则置链头状态位为空;
2)如果status0[1:0]为非空,则将下一跳指针写入链头,将status0[1]取反写入链表存储区的status0[1],将链头状态位置为非空;
第六拍:出队成功。
本发明的有益效果为:链表队列区增加重起链头,将原有的单条链拆分为双条链,使得入链和出链区分开来,重起链头的指示状态和链表存储区的下一跳指针有效指示由1比特改为2比特,使得链表状态的更新可以流水操作;从而解决了软件、通用链表无法做到每个时钟周期同时处理入链和出链的问题,并提高了处理带宽。
附图说明
图1为RAM流水操作电路结构图。
图2为RAM流水操作时序图。
图3为普通硬件电路链表的结构框图。
图4为本发明一实施例的结构示意框图。
具体实施方式
下面结合具体实例和附图对本发明作进一步说明。
本发明提供一种实现链表流水操作的电路结构,如图4所示,包括链表存储区和链表队列,链表存储区包括下一跳指针和下一跳指针有效指示,链表队列包括链头、链尾和链头的非空指示;所述的下一跳指针有效指示用2比特表示,记为status0[1:0],它的2个比特位分别表示为status0[0]和status0[1],定义status0[0]入链侧可读可写、出链侧只能读,status0[1]出链侧可读可写、入链侧只能读;所述的链表队列还包括重起链头和重起链头的指示状态,重起链头的指示状态用2比特表示,记为status1[1:0],它的2个比特位分别表示为status1[0]和status1[1],定义status1[0]入链侧可读可写、出链侧只能读,status1[1]出链侧可读可写、入链侧只能读;链尾包含有对应链表存储区的status0[0]的信息。
进一步的,所述的链表存储区的下一跳指针、链表队列的链头、重起链头、链尾、链尾的status0[0]信息和链头的非空指示分别对应一块RAM,链表存储区的下一跳指针有效指示的2个比特位status0[0]和status0[1]分别对应一块RAM,链表队列的重起链头的指示状态的2个比特位status1[0]和status1[1]分别对应一块RAM。
再进一步的,对链表存储区的下一跳指针有效指示status0[1:0]进行如下定义:当status0[1:0]等于2’b00或者2’b11时,表示该链下一跳为空;当status0[1:0]等于2’b01或者2’b10时,表示该链下一跳为非空。
同理,对链表队列的重起链头的指示状态status1[1:0]进行如下定义:当status1[1:0] 等于2’b00或者2’b11时,表示该重起链头为空;当status1[1:0]等于2’b01或者2’b10时,表示该重起链头为非空。
下面具体描述流水操作的详细过程,假设链表所有的信息都是存储在FPGA RAM中,RAM读地址后2拍能取到数据。
上述一种实现链表流水操作的电路结构的操作方法,包括入链操作和出链操作;其中,
入链操作:电路解复位后,所有的状态位默认为0,即所有的链表为空,链表存储区的每个下一跳指针所对应的下一跳指针有效指示都为空;第一个入链请求进来后,用目标队列号QID来查询该队列的重起链头是否为空,如果重起链头是空,那么该入链请求就进入重起链头,同时新指针SID_NEW挂到链表存储区的RAM读地址上,目的是为了获得status0[0],该值可能为0,可能为1;
第一拍:1)QID作为链表队列RAM的读地址,准备获得重起链头的空状态;2)QID作为链表队列RAM的读地址,准备获得链尾指针值SID_OLD;3)SID_NEW作为链表存储区RAM的读地址,准备获得status0[0];
第三拍从下一跳指针有效指示status0[1:0]中获得重起链头的空状态、旧链尾指针SID_OLD和链表存储区status0[0]的值;
第三拍入重起链头操作:
4)将SID_NEW写入QID对应的链尾,同时将status0[0]写入链尾的相应位置;
5)将SID_NEW写入QID对应的重起链头,同时将重起链头的空状态取反,写入重起链头的指示状态status1[0];
6)将相关信息写入SID_NEW对应的位置;
第三拍入链尾操作:
1)将SID_NEW写入QID对应的链尾区域,同时将新的status0[0]写入链尾的相应位置;
2)将SID_NEW写入SID_OLD的下一跳指针,同时将链尾中存储的原来的status0[0]取反,写入到SID_OLD对应的状态位status0[0];链表存储区的旧链尾下一跳就有效了;
第四拍,入队成功;
出链操作:
第一拍:QID作为链表队列RAM的读地址,获得链头和重起链头的空状态;
第三拍获得链头的空状态、链头指针、重起链头的空状态、重起链头指针;
如果链头非空,则操作链头;如果链头为空,则看重起链头是否为空;如果重起链头非空,则操作重起链头;如果重起链头为空,则不动作;
第三拍重起链头出队:
1)将重起链头的指示状态status1[1]取反,写入重起链头的指示状态status1[1];
2)用重起链头指针去链表存储区读取下一跳指针和对应的status0[1:0];
第五拍重起链头出队:
3)如果链表存储区的status0[1:0]为空,则置链头状态位为空;
4)如果链表存储区的status0[1:0]为非空,则将下一跳指针写入链头,将status0[1]取反写入链表存储区的status0[1],将链头状态位置为非空;
第三拍链头出队:用链头指针去链表存储区读取下一跳指针和对应的status0[1:0];
第五拍链头出队:
3)如果status0[1:0]为空,则置链头状态位为空;
4)如果status0[1:0]为非空,则将下一跳指针写入链头,将status0[1]取反写入链表存储区的status0[1],将链头状态位置为非空;
第六拍:出队成功。
本发明保护的是链表的特殊电路实现结构、链表队列状态位的表示方式、链表缓存区下一跳状态的表达方式;本发明不局限于用FPGA实现,也可以用ASIC等其他硬件电路实现。
以上实施例仅用于说明本发明的设计思想和特点,其目的在于使本领域内的技术人员能够了解本发明的内容并据以实施,本发明的保护范围不限于上述实施例。所以,凡依据本发明所揭示的原理、设计思路所作的等同变化或修饰,均在本发明的保护范围之内。