一种基于FPGA的数据流除法运行装置及方法
技术领域
本发明涉及数据流的不间断处理,更具体的是一种数据流除法的FPGA实现装置。
背景技术
由于目前现场可编程阵列(FPGA)具有工艺成熟、实现简单、性价比高等优点,所以在很多产品设计中被用于实现算法处理。
数据流的处理一般难点在于数据在源源不断的流入,不管是用于加减乘除,都对建立保持时间有较高的要求,其中用于除法计算时,对时间更是有严格要求,因为使用除法器计算过程耗时太长,而且会占用过多资源。流水线太长会导致版本编译时间过长,性能不会达到最优。
图1表示的是现有技术中数据流的算法处理流程,包括取绝对值、扩展位宽、统计第一个数值1之前数值0的个数、统计的个数进行减法运算、减法运算后的值进行2的幂次方乘法、幂次方乘法的结果作为除数进行除法运算。其中统计数据流的每一个数据第一个数值1之前数值0的个数,在硬件语言中,传统做法一般是用for语句实现。硬件语言中的for循环和C语言中的for循环不一样,它表示的是硬件行为,循环几次就是将相同的电路复制几次。因此,循环次数越多,占用面积越大,编译时间就会越长。所以,在数据位宽较大的情况下,基于FPGA实现时,使用for语句统计每个数据数值1之前数值0的个数并没有优势。
基于for语句实现,得到数值0的个数之后进行减法运算,并且减法运算之后的结果再进行2的幂次方运算。2的幂次方运算基于FPGA实现,即是对数据进行移位,但需要根据减法运算后的结果进行移位。减法运算后的结果有正有负,移位时,一般做法是利用case语句实现。case语句是一种多分支选择语句,但是如果分支过长,时钟较快的情况下,会导致时序不满足。所以减法运算后的结果取值范围较广时,此种实现方案不能体现优势。
发明内容
本发明提出了一种数据流除法的FPGA实现装置,可以降低硬件资源消耗、缩短版本编译时间,提高性能。
本发明技术方案提供一种基于FPGA的数据流除法运行装置,数据流a0,a1,…,ai-1作为输入,其长度为i,每个数据对应的位宽长度是A;数据流b0,b1,…,bi-1作为输入,其长度为i,每个数据对应的位宽长度是B;数据流c0,c1,…,ci-1作为输出,其长度为i,每个数据对应的位宽长度是C,其特征在于:包括以下模块,
取绝对值模块,用于求取数据流b0,b1,…,bi-1的每个数据的绝对值,得到新的数据流,即为|b0|,|b1|,…,|bi-1|;
扩展位宽模块,用于扩展数据流|b0|,|b1|,…,|bi-1|的位宽,得到新的数据流b′0,b′1,…,b′i-1,使数据流b′0,b′1,…,b′i-1的当前数据b′k的位宽长度与数据流a0,a1,…,ai-1的当前数据ak的位宽长度相等;
比特位分组模块,用于根据数据流a0,a1,…,ai-1当前数据ak的位宽长度A和预设的分组值s,将数据流b′0,b′1,…,b′i-1当前数据b′k按照比特位分组,以s个比特位为一组,分成A/s组;
比特位判断模块,用于从每组的高位开始,判断数据流b′0,b′1,…,b′i-1的当前数据b′k对应的比特位的值是否为1,
如果对应值为1,则结合此比特位的位置信息对数据流a0,a1,…,ai-1的当前数据ak进行截位和拼接处理,并将此组对应的标识设置为有效,同时输出此组此比特位对应的移位索引号;
如果对应值为0,则跳转到此组的下一比特位进行判断,直到此组的最后一个比特位判断完毕;如果此组所有比特位对应值都为0,则此组对应的有效标识设置为无效,并且此组输出的数据为0,此组比特位对应的移位索引号也为0;
有效输出模块,用于按照先后顺序,从第一组开始,根据每组对应的有效标志是否有效,得到数据流c0,c1,…,ci-1的当前数据ck;根据数据流a0,a1,…,ai-1和数据流b0,b1,…,bi-1的完整输入,得到最终的数据流c0,c1,…,ci-1。
而且,比特位判断模块中,判断当前数据b′k对应的比特位的值是否为1,如果对应值为1,则结合比特位的位置信息对数据流a0,a1,…,ai-1的当前数据ak进行截位和拼接处理,实现如下,
设数据流b′0,b′1,…,b′i-1的每个数据位宽长度是A,当前数据b′k统计的第一个非0值之前数值0的个数为y,数据流b′0,b′1,…,b′i-1的每个数据对应的数值0的个数y取值范围是y大于等于0小于等于A-1,再经过减法运算,得到y的取值范围是大于等于x-A+1小于等于x,其中x是被减数,x-A+1的值是负数;
假设数据流b′0,b′1,…,b′i-1的当前第k个数据的当前第t个比特位b′k[t的值为1,并且其属于分组中的第j组,
如果t的值等于A-x-2,则输出的第j组的数据为截取数据流a0,a1,…,ai-1的当前第k个数据ak的第A-x-1位到第0位;
如果t的值大于A-x-2,t等于A-x+m,则输出的第j组的数据为截取数据流a0,a1,…,ai-1的当前第k个数据ak的第A-x+m+1到第m+2位,其中m为小于等于x-2的任意正数;
如果t的值小于A-x-2,比如t的值等于A-x-n,则输出的第j组数据为截取数据流a0,a1,…,ai-1的当前第k个数据ak的第A-x-n+1位到第0位,并在右侧拼接n-2个数值0。
而且,数据流a0,a1,…,ai-1的每个数据为正或负或0;数据流b0,b1,…,bi-1的每个数据为正或负或0;数据流c0,c1,…,ci-1的每个数据为正或负或0;
若输入的数据流a0,a1,…,ai-1的当前数据为0,则输出的数据流c0,c1,…,ci-1的当前数据也为0;若输入的数据流b0,b1,…,bi-1的当前数据为0,则输出的数据流c0,c1,…,ci-1的当前数据的值等于输入的数据流a0,a1,…,ai-1的当前数据的值。
而且,数据流b0,b1,…,bi-1的每个数据位宽长度B小于或等于数据流a0,a1,…,ai-1的每个数据位宽长度A。
本发明相应提供一种基于FPGA的数据流除法运行方法,数据流a0,a1,…,ai-1作为输入,其长度为i,每个数据对应的位宽长度是A;数据流b0,b1,…,bi-1作为输入,其长度为i,每个数据对应的位宽长度是B;数据流c0,c1,…,ci-1作为输出,其长度为i,每个数据对应的位宽长度是C,包括以下步骤,
取绝对值步骤,用于求取数据流b0,b1,…,bi-1的每个数据的绝对值,得到新的数据流,即为|b0|,|b1|,…,|bi-1|;
扩展位宽步骤,用于扩展数据流|b0|,|b1|,…,|bi-1|的位宽,得到新的数据流b′0,b′1,…,bi′-1,使数据流b′0,b′1,…,b′i-1的当前数据b′k的位宽长度与数据流a0,a1,…,ai-1的当前数据ak的位宽长度相等;
比特位分组步骤,用于根据数据流a0,a1,…,ai-1当前数据ak的位宽长度A和预设的分组值s,将数据流b′0,b′1,…,b′i-1当前数据b′k按照比特位分组,以s个比特位为一组,分成A/s组;
比特位判断步骤,用于从每组的高位开始,判断数据流b′0,b′1,…,b′i-1的当前数据b′k对应的比特位的值是否为1,
如果对应值为1,则结合此比特位的位置信息对数据流a0,a1,…,ai-1的当前数据ak进行截位和拼接处理,并将此组对应的标识设置为有效,同时输出此组此比特位对应的移位索引号;
如果对应值为0,则跳转到此组的下一比特位进行判断,直到此组的最后一个比特位判断完毕;如果此组所有比特位对应值都为0,则此组对应的有效标识设置为无效,并且此组输出的数据为0,此组比特位对应的移位索引号也为0;
有效输出步骤,用于按照先后顺序,从第一组开始,根据每组对应的有效标志是否有效,得到数据流c0,c1,…,ci-1的当前数据ck;根据数据流a0,a1,…,ai-1和数据流b0,b1,…,bi-1的完整输入,得到最终的数据流c0,c1,…,ci-1。
而且,比特位判断模块中,判断当前数据b′k对应的比特位的值是否为1,如果对应值为1,则结合比特位的位置信息对数据流a0,a1,…,ai-1的当前数据ak进行截位和拼接处理,实现如下,
设数据流b′0,b′1,…,b′i-1的每个数据位宽长度是A,当前数据b′k统计的第一个非0值之前数值0的个数为y,数据流b′0,b′1,…,b′i-1的每个数据对应的数值0的个数y取值范围是y大于等于0小于等于A-1,再经过减法运算,得到y的取值范围是大于等于x-A+1小于等于x,其中x是被减数,x-A+1的值是负数;
假设数据流b′0,b′1,…,b′i-1的当前第k个数据的当前第t个比特位b′k[t的值为1,并且其属于分组中的第j组,
如果t的值等于A-x-2,则输出的第j组的数据为截取数据流a0,a1,…,ai-1的当前第k个数据ak的第A-x-1位到第0位;
如果t的值大于A-x-2,t等于A-x+m,则输出的第j组的数据为截取数据流a0,a1,…,ai-1的当前第k个数据ak的第A-x+m+1到第m+2位,其中m为小于等于x-2的任意正数;
如果t的值小于A-x-2,比如t的值等于A-x-n,则输出的第j组数据为截取数据流a0,a1,…,ai-1的当前第k个数据ak的第A-x-n+1位到第0位,并在右侧拼接n-2个数值0。
而且,数据流a0,a1,…,ai-1的每个数据为正或负或0;数据流b0,b1,…,bi-1的每个数据为正或负或0;数据流c0,c1,…,ci-1的每个数据为正或负或0;
若输入的数据流a0,a1,…,ai-1的当前数据为0,则输出的数据流c0,c1,…,ci-1的当前数据也为0;若输入的数据流b0,b1,…,bi-1的当前数据为0,则输出的数据流c0,c1,…,ci-1的当前数据的值等于输入的数据流a0,a1,…,ai-1的当前数据的值。
而且,数据流b0,b1,…,bi-1的每个数据位宽长度B小于或等于数据流a0,a1,…,ai-1的每个数据位宽长度A。
本发明提出的一种数据流除法的FPGA实现技术方案,没有采用传统算法的for语句和case语句实现,而是采用简单步骤实现相同的功能。两者相比,本发明实现简单,耗时短,占用硬件资源少,通用性强,具有重要的市场价值。
附图说明
图1为现有技术中数据流的算法原理图;
图2为本发明实施例中FPGA实现过程框图;
图3为本发明中数据流b′0,b′1,…,b′i-1当前数据b′k比特位分组示意图;
图4为本发明中第t组数据的FPGA实现流程图。其中t是数据分组中的第t组。
具体实施方式
下面结合附图及实施例对本发明做进一步的详细说明。
本发明的实施例,提出一种数据流除法的FPGA实现装置。本发明跳出传统for语句和case语句的实现方式,采用分组检测比特位的方法,保证整个处理流程占用时间短、硬件资源少,性能达到最优。
图2为本发明实施例中FPGA实现的框图,具体的流程说明如下:
输入数据流a0,a1,…,ai-1,其长度为i,每个数据的位宽长度为A,对应的值可正可负可为0。
输入数据流b0,b1,…,bi-1,其长度为i,每个数据的位宽长度为B,对应的值可正可负可为0。
输出数据流c0,c1,…,ci-1,其长度为i,每个数据的位宽长度为C,对应的值可正可负可为0。
并且,若输入的数据流a0,a1,…,ai-1的当前数据ak的值为0,则输出的数据流c0,c1,…,ci-1的当前数据ck的值也为0;若输入的数据流b0,b1,…,bi-1的当前数据bk的值为0,则输出的数据流c0,c1,…,ci-1的当前数据ck的值等于输入的数据流a0,a1,…,ai-1的当前数据ak的值。其中,k的取值为0,1,…i-1。
数据流b0,b1,…,bi-1的当前数据bk的值可以等于数据流a0,a1,…,ai-1的当前数据ak的值,也可以为其他值。
数据流b0,b1,…,bi-1的每个数据位宽长度B要小于等于数据流a0,a1,…,ai-1的每个数据位宽长度A。
数据流c0,c1,…,ci-1的每个数据位宽长度C的值等于A减去x。其中,x是一个小于A的任意正数。
具体实施步骤如下:
步骤(1)取绝对值:求取数据流b0,b1,…,bi-1的每个数据的绝对值,得到新的数据流,即为|b0|,|b1|,…,|bi-1|。
步骤(2)扩展位宽:扩展数据流|b0|,|b1|,…,|bi-1|的位宽,得到新的数据流,即为b′0,b′1,…,b′i-1,使数据流b′0,b′1,…,b′i-1的当前数据b′k的位宽长度与数据流a0,a1,…,ai-1的当前数据ak的位宽长度相等。
步骤(3)比特位分组:根据数据流a0,a1,…,ai-1当前数据ak的位宽长度A和预设的分组值s,将数据流b′0,b′1,…,b′i-1当前数据b′k按照比特位分组,实施例中s=6,以预定数值6个比特位为一组,分成A/6组。所以,若A是6的整数倍,则最后一组有6个比特位;否则,最后一组少于6个比特位。
步骤(4)比特位判断:从每组的高位开始,判断数据流b′0,b′1,…,b′i-1的当前数据b′k对应的比特位的值是否为1。
如果对应值为1,则结合此比特位的位置信息对数据流a0,a1,…,ai-1的当前数据ak进行截位和拼接处理,并将此组对应的标识设置为有效,同时输出此组此比特位对应的移位索引号,也就是数据流b′0,b′1,…,b′i-1当前数据b′k的第一个非0值之前数值0的个数进行减法运算后的结果,并结束判断;
如果对应值为0,则跳转到此组的下一比特位进行判断,直到此组的最后一个比特位判断完毕;如果此组所有比特位对应值都为0,则此组对应的有效标识设置为无效,并且此组输出的数据为0,此组比特位对应的移位索引号也为0;
针对上述数据流a0,a1,…,ai-1的当前数据ak进行截位和拼接处理的具体实现方式,举例说明:假设数据流b′0,b′1,…,b′i-1的每个数据位宽长度是A,当前数据b′k统计的第一个非0值之前数值0的个数为y,从整个数据流的方向考虑,根据算法原理,数据流b′0,b′1,…,b′i-1的每个数据对应的数值0的个数y取值范围是y大于等于0小于等于A-1,再经过减法运算,得到y的取值范围是大于等于x-A+1小于等于x,其中x是被减数,x-A+1的值是负数。假设数据流b′0,b′1,…,b′i-1的当前第k个数据的当前第t个比特位b′k[t的值为1,并且其属于分组中的第j组,以数值A-x-2为分界线,如果t的值等于A-x-2,则输出的第j组的数据为截取数据流a0,a1,…,ai-1的当前第k个数据ak的第A-x-1位到第0位;如果t的值大于A-x-2,比如t的值等于A-x+m,则输出的第j组的数据为截取数据流a0,a1,…,ai-1的当前第k个数据ak的第A-x+m+1到第m+2位,其中m为小于等于x-2的任意正数;如果t的值小于A-x-2,比如t的值等于A-x-n,则输出的第j组数据为截取数据流a0,a1,…,ai-1的当前第k个数据ak的第A-x-n+1位到第0位,并在右侧拼接n-2个数值0,其中第A-x-n+1位到第0位作为输出数据的高位,右侧拼接的n-2个数值0作为输出数据的低位,n为大于等于A-x的任意正数。
针对上述数据流a0,a1,…,ai-1的当前数据ak进行截位和拼接处理的举例说明,当t的值等于A-x-2时,此组此比特位对应的索引号为0;当t的值大于A-x-2,比如t的值等于A-x+m时,此组此比特位对应的索引号为m+2,此值为正数;当t的值小于A-x-2,比如t的值等于A-x-n时,此组此比特位对应的索引号为2-n,此值为负数。具体实施时,上述的t、A、x、m、n的值均为已知固定值,所以此组输出的有效数据以及此组此比特位对应的索引号也均为固定值。
步骤(5)有效输出:每组完成判断时间相同。判断完成后,按照先后顺序,从第一组开始,根据每组对应的有效标志是否有效,得到数据流c0,c1,…,ci-1的当前数据ck。根据数据流a0,a1,…,ai-1和数据流b0,b1,…,bi-1的完整输入,得到最终的数据流c0,c1,…,ci-1。
上述步骤(3)中描述的是按照6个比特位分为一组,可以是5个比特位、也可以是7个、8个比特位、甚至是其他值。具体实施时,主要是在满足时序设计的前提下,根据数据的位宽长度制定分组值。
图3为本发明中数据流b′0,b′1,…,b′i-1的当前数据b′k比特位分组示意图。数据流b′0,b′1,…,b′i-1的当前数据b′k,其位宽长度是A,按6个比特位分为一组,可以分成A/6组,分别为b′k[A-2],…,b′k[A-6]…..b′k[t],…,b′k[t-5]………b′k[1],b′k[0],b′k[A-1]无需处理。举例说明:
假设A的值为40,按照6个比特为一组,则可以分成7组,并且第7组只有4个比特位。即b′k[38]、b′k[37]、b′k[36]、b′k[35]、b′k[34]5个比特位作为第一组,因为最高位无需判断;b′k[33]、b′k[32]、b′k[31]、b′k[30]、b′k[29]、b′k[28]6个比特位作为第二组;以此类推,b′k[3]、b′k[2]、b′k[1]、b′k[0]4个比特位作为第七组。
图3以及举例说明都是按照6个比特位作为一组分配,实施时也可以按照5个、7个、8个比特位作为一组分配,具体可以视情况而定。比如上面的举例说明中,数据位宽长度是40,在满足时序要求的情况下,可以按照8个比特位作为一组,分成5组。
图4为本发明中第t组数据的FPGA实现流程图。其中t是数据分组中的第t组。判断流程如下:
(1)判断b′k[t是否为1,若为1,则输出参数t_valid_flag、t_shift_index、t_shift_data的有效值,否则跳转到步骤(2);
(2)判断b′k[t-1]是否为1,若为1,则输出参数t_valid_flag、t_shift_index、t_shift_data的有效值,否则跳转到步骤(3);
(3)判断b′k[t-2]是否为1,若为1,则输出参数t_valid_flag、t_shift_index、t_shift_data的有效值,否则跳转到步骤(4);
(4)判断b′k[t-3]是否为1,若为1,则输出参数t_valid_flag、t_shift_index、t_shift_data的有效值,否则跳转到步骤(5);
(5)判断b′k[t-4]是否为1,若为1,则输出参数t_valid_flag、t_shift_index、t_shift_data的有效值,否则跳转到步骤(6);
(6)判断b′k[t-5]是否为1,若为1,则输出参数t_valid_flag、t_shift_index、t_shift_data的有效值,结束判断;否则输出参数t_valid_flag、t_shift_index、t_shift_data的无效值,结束判断。
其中,t_valid_flag、t_shift_index、t_shift_data三个参数的第一个字母t代表对应的组号,比如第一组是first_valid_flag、第二组是second_valid_flag。t_valid_flag指的是第t组数据输出是否有效,如果值为1,则表示有效;反之,则表示无效。t_shift_index指的是第t组某个比特位对应的移位索引号,即当前数据的第一个非0值之前数值0的个数。t_shift_data指的是第t组某个比特位对应的经过截位和拼接处理后的输出数据。
每组完成判断时间相同。判断完成后,按照先后顺序,从第一组开始,根据每组对应的参数t_valid_flag是否有效,决定最终输出的有效数据以及移位索引号。整个功能FPGA实现只需2个时钟周期即可完成。
本发明的实施例,提出一种数据流除法的FPGA实现装置。在数据流b0,b1,…,bi-1的位宽小于等于数据流a0,a1,…,ai-1的位宽的前提下,数据位宽可以任意配置,并且数据流b0,b1,…,bi-1的内容可以为一固定值,也可以等于数据流a0,a1,…,ai-1的值,具有可配性。此发明输入数据灵活,整个功能实现过程只占用2个时钟周期,大大减少了寄存器、存储器等存储资源,提高了数据处理速率。
本发明中所描述的具体实施例仅仅是对本发明进行举例说明。任何熟悉该技术的技术人员在本发明做揭露的技术范围内,都可轻易得到其变化或替换,因此本发明保护范围都应涵盖在由权利要求书所限定的保护范围之内。