本发明涉及数据处理技术领域,特别是一种用于fpga实现的排序方法。
背景技术:
排序是计算机领域中必不可少的基本数据处理操作。通过排序可以使得数据能够以一定的顺序进行全排列,减少后续操作的时间。在目前的软件实现中,已经有很多比较经典的排序算法,比如:插入排序、快速排序、冒泡排序等。但是这些排序算法大都是针对软件设计的采用串行执行的方式,不利于实时性较高的工程实现。
现代cpu主要利用线程的本地存储层次优化数据在存储单元中的排列,以减少访存次数以及减少访存缺失,同时利用单指令多数据流技术,来提高算法的数据级并行度;gpu则需要将多个线程组织成线程块,依靠共享内存提高线程块的访存速度,而在线程块内则使用单指令多线程技术提高线程的执行效率。fpga则是依靠硬件描述语言或高级综合语言优化电路设计,提高资源利用率的同时提高fpga的吞吐量。
文献“吕伟新,李清清,娄俊岭.fpga比较矩阵排序法及在中值滤波器中的应用[j].电子器件,2012,35(1):34-38.”中所提出的比较排序法很好的适应了fpga的并行性的特点。但是随着同时输入元素的增加,需要的fpga逻辑单元也呈指数增加,无法完成过多输入元素的同时排序。
技术实现要素:
本发明所要解决的技术问题是克服现有技术的不足而提供一种用于fpga实现的排序方法,本发明通过将二维比较矩阵拆分成两个一维ram,在保证排序结果准确性的同时,能够利用流水线操作,提高排序效率以及解决了原组合逻辑带来的时序影响,并且支持多种类型数据的排序。
本发明为解决上述技术问题采用以下技术方案:
根据本发明提出的一种用于fpga实现的排序方法,采用数据排序ram存储待排序数据,采用读取控制模块读取排序数据并传输至比较器,待排序数据的数目为n,读取控制模块访问数据排序ram的次数为n-1,每次执行排序时将数据排序ram的装载地址load_addr初始化为0;
读取控制模块执行以下步骤:
步骤1.1:若是第一次读取,则设置首次读取标志first_read有效,否则设为无效;
步骤1.2:首先设置数据排序ram的读取地址为装载地址load_addr,然后每个时钟节拍对数据排序ram的读取地址进行加1操作,直至读取地址为n-1停止,从load_addr读取的数据锁存为数据a,在步骤1.2中,数据a保持不变,从load_addr+1到n-1读取的数据锁存为数据组b,所述数据a只包含一个数据,所述数据组b包含n-load_addr-1个数据,所述数据a与数据组b参与比较器的比较排序运算,设置数据组b有效标志valid为有效且保持在n-load_addr-1个时钟节拍内始终保持有效;
步骤1.3:load_addr加1,若load_addr等于n-1,则终止本次操作,否则跳转到步骤1.1;
采用比较器比较输入到比较器的数据a与数据组b,若比较结果为数据a排在前面,则设置比较结果信号a_first为有效、否则设为无效;若比较器完成数据比较需要k个时钟周期,则采用延迟模块将读取控制模块输出的数据组b的有效标志valid与首次读取标志frist_read延迟k个时钟周期,所述有效标志valid延迟为经过延迟的有效标志valid_delay,所述首次读取标志first_read延迟为经过延迟的首次读取标志first_read_delay;所述比较器将比较结果a_first传输到计数模块,所述延迟模块将经过延迟的有效标志valid_delay和首次读取标志first_read_delay传输到计数模块,得到原数据在序列中所对应的新的索引值,从而得到有序的序列。
作为本发明所述的一种用于fpga实现的排序方法进一步优化方案,计数模块包括行计数模块、列计数模块以及用于计数的行计数ram与列计数双口ram。
作为本发明所述的一种用于fpga实现的排序方法进一步优化方案,行计数模块在有效标志valid有效的时候对a_first取反的结果进行累加,在有效标志valid无效的时候把该结果写入到行计数ram中,在首次读取标志first_read_delay有效的时候设置所述行计数ram的写入地址为0,所述结果写入行计数ram后,行计数ram的地址加1。
作为本发明所述的一种用于fpga实现的排序方法进一步优化方案,所述列计数控制在valid_delay信号有效时将a_first与列计数双口ram的数据进行累加,然后结果存储到列计数双口ram中。
作为本发明所述的一种用于fpga实现的排序方法进一步优化方案,计数模块采用双端口的访问模式来完成,列计数双口ram的初始化地址initial_addr=1,计数模块采用以下方法步骤:
步骤6.1:当valid有效并且first_read_delay有效时,将比较结果加0,新的结果从初始地址initial_addr开始按照地址递增的顺序,写入ram,直至写到地址n-1为止;
步骤6.2:initial_addr加1,当valid有效并且first_valid无效时,从地址为initial_addr开始,按照地址递增的顺序将当前地址的数据读出并与当前产生的比较值相加,结果重新写入该地址,直到地址为n-1;
步骤6.3:重复步骤6.2,直到initial_addr=n-2。
本发明采用以上技术方案与现有技术相比,具有以下技术效果:
本发明利用行/列计数双口ram实现一个二维的比较计数矩阵,对比较计数矩阵采用对角线取反方法,使得时间复杂度变为
附图说明
图1是排序的系统结构框图。
图2是本次发明的比较矩阵理论分析图。
图3是实施例一波形图。
图4是实施例一波形图。
具体实施方式
为了使本发明的目的、技术方案和优点更加清楚,下面将结合附图及具体实施例对本发明进行详细描述。
本发明包括数据存储ram、排序数据读取控制模块、比较器、计数控制模块、计数存储ram和结果模块。在排序需求发起后,排序数据读取控制模块进行第一次遍历读取数据,分别送入两个数据通道,其中a通道存放每次遍历的读取到的第一数,b通道存放按顺序存放剩下的数据。将a通道和b通道的数据送入比较器进行比较,比较的结果在计数控制模块的控制下,写入相应的计数存储ram。第一次遍历完成后,进行第二次遍历,第二遍历的起始地址在第一次遍历的基础上加1。重复第一次遍历的操作。对于数据量为n的序列而言,从需要进行n-1轮遍历。等到第n-1轮结束后,比较计数的过程结束。在结果模块的控制下,得到原数据在序列中所对应的新的索引值,从而得到有序的序列。
参见图1,本发明的基于比较矩阵的高效排序算法的fpga实现方法的操作步骤如下:
在fpga上建立数据排序ram模块、读取控制模块、数据a、数据组b、比较器、延迟模块、计数模块、索引统计。
为了便于描述,假定一组待排序的数据量为n,则总共需要访问数据排序ram的次数为n-1次。第i次访问的起始地址为(i-1),第i次访问共需要遍历(n-i+1)个数据。进一步的说明。对于每组待排序的数据而言,分为第1次访问数据排序ram和第i(i≠1)次访问数据排序ram。
第1次访问数据排序ram,在读取控制的作用下,给出起始访问地址load_addr=0,按照地址递增的顺序将存放在ram中的数据读出,直到地址n-1结束。读取完成后,load_addr加1。其中第1个读取到的数据送入数据a进行锁存,从load_addr+1到n-1读取的数据锁存为数据组b。所述数据a只包含一个数据,所述数据组b包含n-load_addr-1个数据,当数据通道b有数据时,将valid信号拉高并保持n-load_addr-1个时钟节拍内有效,表明通道a和通道b中有数据可以进行比较。当读取结束后,valid信号拉低置0。在valid有效时,数据通道a和数据通道b的数据送入比较器进行数据比较。如果数据a的数据大于等于数据组b的数据,输出的a_first置1,否则置0。与此同时,由于比较器的结果输出有延迟,所以将valid信号经过延迟模块,得到valid_delay信号,使得valid信号与比较器输出的结果信号时序对齐,标志比较结果有效。由于本次为第1次访问数据排序ram,所以将first_read信号拉高置1,经过延迟模块,得到first_valid_delay信号,延迟的时钟节拍数与valid信号相同。行/列计数模块通过判断valid信号和first_valid信号给出不同的控制信息。对于行计数模块而言,在valid有效的时候对a_first信号取反的结果进行累加,累加的结果在valid信号无效的时候写入行计数ram,写入完成后,行计数ram地址加1。对于列计数模块而言,设置列计数双口ram的初始化地址initial_addr=1,从initial_addr所指地址开始,按照地址递增的顺序,将a_first加0的结果写入当前的地址中,直到地址n-1结束。结束后,将initial_addr的值加1。第1次访问数据排序ram的所有流程结束。
第i次访问数据排序ram。由于不是第一次访问所以first_read信号置为0。在读取控制模块的作用下,从起始地址load_addr=(i-1)开始读取数据,直到地址n-1结束。读取完成后,load_addr加1。接下来的过程与第一次流程的相同,不同的地方在于图1中的计数模块。经过前级的操作可以得到a_first、valid_delay、first_read_delay信号。对于行计数模块而言,通过判断valid信号,在valid有效的时候对a_first信号取反的结果进行累加,累加的结果在valid信号无效的时候写入行计数ram,写入完成后,行计数ram地址加1。对于列计数模块而言,在valid有效,first_valid无效的时候,按照地址递增的顺序,从initial_addr所指地址开始,将列计数双口ram中地址所对应的数据从端口1读出并与a_first相加,相加的结果从端口2写回该地址,直到地址n-1结束。结束后,将initial_addr的值加1。从而第i次访问数据排序ram流程结束。
参见图2,经过n-1次访问数据排序ram,得到了所有数据的比较结果值。最后,从地址0开始,按地址递增的顺序,将行计数ram和列计数双口ram中相同地址中的数读取出来相加,直到地址n-1结束,便得到了原始数据所对应的新的索引值。
实施例一
参考图3。对一组数据量为4的序列进行降序排序,总需要访问3次数据ram。数据4,3,9,6按照地址递增得顺序存放在数据ram中。第1次访问数据排序ram。给出地址0、1、2、3,经过两个时钟延迟,读到结果4、3、9、6。第一个读取到的数4送入数据a锁存;3、9、6送入数据组b寄存。在数据3、9、6有效期间,valid保持高电平有效。表明可以对数据a和数据组b中的数进行比较。比较的判别方式为:如果数据a大于等于数据组b,则a_first为1,否则为0。比较的结果经过3个时钟的延迟得到输出结果a_first。由于是第一次访问,所以first_read在第1轮读出的数据有效期内保持高电平。对first_read和valid信号经过3个时钟的延迟,得到了valid_delay和first_read_delay信号。当valid_delay信号有效的时候,将a_first信号取反累加,累加的结果在valid信号无效的时候写入行计数ram的地址0。行计数ram的地址加1。将当前a_first值加0的结果写入列计数ram的地址1、2、3。第一次访问结束。第2次访问给出地址1、2、3,由于采用流水线操作,不需要再第一次的基础上再额外等待2个时钟的延迟。如图3所示,直接在第一次读取数据后便可以得到第二次访问读取结果3、9、6。在数据9、6有效期间,valid保持高电平有效,由于不是第一次访问,所以first_read信号无效。经过3拍的延迟,得到了比较结果a_first以及valid_delay和first_read_delay信号。当valid_delay信号有效的时候,将a_first信号取反累加,累加的结果在valid信号无效的时候写入行计数ram的地址1。行计数ram的地址加1。当valid有效,first_valid无效的时候,从地址2开始,将列计数ram中的数读出,读出的数与当前的比较结果相加,相加的结果再写回该地址,如图上红色和蓝色线圈所示。第三次重复第二次的过程。
参见图4。可以看到比较结束后,行/列计数ram中个地址中的统计数值。将两个计数ram相同地址中的数据读出相加,便得到了原始数据所对应的新的索引值。如果中所示,括号中4所对应的索引值为2。按照索引值从小到大的顺序将数据输出,便得到了一组降序序列9,6,4,3。与理论分析结果一致。
本发明是一种基于比较矩阵的高效排序算法的fpga实现方法,包括以下步骤:待排序的数据预先存储在数据排序ram中,通过读取控制模块将ram中的数据读出。在一组数据量为n的排序过程中,共需要读取控制(n-1)次。其中对于每一次读出的第1个数据在锁存信号有效的情况下,将数据锁存在数据a,其余读出的数依次锁存在数据组b并依次与第一个读出的数据送入比较器进行比较并获得比较结果,如果数据a的数大于等于数据组b的数,则数据a的数得1分,否则得0分。然后将比较的结果在行/列计数模块的控制下,对比较的结果进行处理存放在行/列计数ram中。最后统计分析行/列计数ram中的数值得到原始数据的新的索引值,从而获得一组有序队列。
本发明基于比较矩阵的高效排序算法的fpga实现方法用两个一维的数据缓存空间ram实现了二维的数据比较矩阵。在能够满足时序要求的同时,可以减少时间复杂度,提高数据的吞吐量,数据实时性,能够满足电力物联网海量数据的排序处理要求。
以上所述,仅为本发明的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到的变化或替换,都应涵盖在本发明的保护范围内。