一种静态哈夫曼并行全编码实现方法转让专利

申请号 : CN201710690814.6

文献号 : CN107565974B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 万国春陈怡夏子为唐令怡

申请人 : 同济大学

摘要 :

一种静态哈夫曼并行全编码实现方法。在排序的同时得到对应权值的码长和编码值,并且在一个时钟周期内对所有变量进行编码,在排序结束的时候即可得到所有变量的码长和编码值。整个过程充分考虑FPGA的并行处理性,采用优化后的并行全比较算法,只需一个时钟周期便可得到所有变量权值的排序,该算法是基于序列中任意两个数并行比较实现,数据之间两两比较统一采用大于等于比较器,任意两个数之间只需要比较一次,这样两个数得到的比较结果互为相反数。开始为输入数据并统计权值的模块,输入结束后,再对输入的数据进行优化的并行全比较排序,在得到排序结果的同时对其进行编码。最后编码值的输出采用流水线的方式,可以使输出过程不间断。

权利要求 :

1.一种静态哈夫曼并行全编码实现方法,其特征在于,

首先进行优化的并行全比较,算法为:一个时钟周期内能得到所有权值的比较值,其中比较值为‘0’或者为‘1’,假如权值A比权值B大,那么A比B的比较值为‘1’,B比A的比较值根据A比B的比较值取反得到,即为‘0’,不需要多增加一个比较器就能得到B比A的比较值,这样只使用一半的大于等于比较器就能够得出所有的比较结果,根据此优化的并行全比较算法,不仅减少FPGA硬件资源的使用率,而且提高时钟频率;

然后半累加值,算法为:把每个权值与其他所有权值的比较值相加,得到一个相应的累加值,考虑到一旦需要比较的权值比较多,为了提高时序,每个权值的所有比较值分两次相加,用两个寄存器变量存放50%比较值的相加结果;

然后全累加值,算法为:下一个时钟周期再把这两个累加值相加得到一个完整的累加值,根据优化的并行全比较算法,每个权值的累加值各不相同,累加值的大小就代表该权值的大小;

然后根据最小的两个累加值选出相应的两个最小权值,把它们的权值相加得到一个新的权值,同时对这两个最小权值进行编码,两者之中最小的那个权值编码0,次最小权值编码1;

接着继续下一次的并行全比较、半累加值相加、全累加值相加、得到每个权值的排序结果、两个最小权值相加为一个新的权值,如此循环下去,直到循环第N-1次,整个过程结束;

此外,在进行两个最小权值相加为一个新的权值的时候,利用FPGA的并行处理功能,同时,对所有数据进行静态Huffman的编码,最后伴随着循环结束,所有数据的静态Huffman编码也随之结束;

最后采用流水线技术,流水输出每个数据对应的Huffman编码值。

2.如权利要求1所述的静态哈夫曼并行全编码实现方法,其特征在于,采用流水线的输出方式,此流水线分为三级,第一级为读取需要输出编码值的数据,第二级为取出该数据对应的静态Huffman编码值和码长,第三级为输出编码,该流水线能够保证在数据码长不固定的情况下,不断流输出编码值。

说明书 :

一种静态哈夫曼并行全编码实现方法

技术领域

[0001] 本发明涉及FPGA和数据、图像压缩技术,特别涉及一种基于FPGA的静态Huffman并行全编码方法。

背景技术

[0002] 自从1952年,David A.Huffman在MIT攻读博士时提出了依据字符出现的概率来构造异字头的平均长度最短的码字,可称为最佳编码,一般称为静态Huffman编码。其步骤就是先通过比较权值逐步构建一棵静态Huffman树,再对该静态Huffman树进行编码、解码。一般静态Huffman编码都需要构建静态Huffman树,然后从根部一直到叶子逐一编码,这样的编码效率不仅很低,而且需要更多的硬件资源,且获得的时钟频率不高。
[0003] 为了能够实现使用更少的硬件资源能达到更高的时钟频率,必须根据静态Huffman编码规范和结合FPGA实现的方式来设计新的静态Huffman编码方式。在诸多的尝试中,基于FPGA的静态Huffman并行全编码方法是一种重要的研究方法。

发明内容

[0004] 本发明是针对静态Huffman编码中编码周期不固定,编码效率不高,硬件资源利用率有待降低以及最高时钟频率有待提高等问题,提出了基于FPGA的静态Huffman并行全编码方法,此方法在充分利用FPGA的并行性和流水线技术,在对权值进行排序的同时得到编码值,而且不管输入变量的权值如何变化,整个的编码过程都只需要固定的时钟周期。
[0005] 本发明的技术方案为:
[0006] 本发明根据静态Huffman编码规范以及FPGA的并行处理,核心排序算法采用是已有的并行全比较算法,但是在这个算法的基础上做优化处理,该算法一个时钟周期内能得到所有权值的比较值,其中比较值为‘0’或者为‘1’,假如权值A比权值B大,那么A比B的比较值为‘1’,B比A的比较值自然就可以根据A比B的比较值取反得到,即为‘0’,这样不需要多增加一个比较器就能得到B比A的比较值,这样可以只使用一半的大于等于比较器就能够得出所有的比较结果,这也是本发明创新点之一,根据此优化的并行全比较算法,不仅减少FPGA硬件资源的使用率,而且提高时钟频率,然后把每个权值与其他所有权值的比较值相加,得到一个相应的累加值,考虑到一旦需要比较的权值比较多,为了提高时序,每个权值的所有比较值分两次相加,用两个寄存器变量存放50%比较值的相加结果(称为半累加值),然后下一个时钟周期再把这两个累加值相加得到一个完整的累加值(称为全累加值),由于根据本发明优化的并行全比较算法每个权值的累加值各不相同,累加值的大小就代表该权值的大小,然后根据最小的两个累加值选出相应的两个最小权值,把他们的权值相加得到一个新的权值,同时对这两个最小权值进行编码,两者之中最小的那个权值编码0,次最小权值编码1,接着继续下一次的并行全比较、半累加值相加、全累加值相加、得到每个权值的排序结果、两个最小权值相加为一个新的权值,如此循环下去,直到循环第N-1次(假设总共有N个待比较的权值),整个过程结束。此外,在进行两个最小权值相加为一个新的权值的时候,利用FPGA的并行处理功能,同时,对所有数据进行静态Huffman的编码,最后伴随着循环结束,所有数据的静态Huffman编码也随之结束;最后采用流水线技术,流水输出每个数据对应的Huffman编码值。
[0007] 本发明需要充分利用FPGA的并行性,所有数据的权值在同一个时钟周期中进行比较,此外,所有数据也在同一个时钟周期中进行静态Huffman编码。
[0008] 本发明整个流程只需要划分为6个主要模块(即6大步骤),每个模块只需要占用一个时钟周期,而且该周期内只处理一件事情,这6个主要模块之间不需要额外控制逻辑,顺序执行即可。
[0009] 本发明Huffman编码值采用流水线的输出方式,由于每个数据的编码值和码长是不固定的,所以本设计采用的是优化的流水线,此流水线分为三级,第一级为读取需要输出编码值的数据,第二级为取出该数据对应的静态Huffman编码值和码长,第三级为输出编码,该流水线能够保证在数据码长不固定的情况下,不断流(连续)输出编码值。
[0010] 由于采用上述方案,本发明具有如下的特点:循环一次可得出所有权值的排序结果。在排序的同时可对所有变量进行静态Huffman编码。在排序结束的时候即可得到所有变量的码长和编码值。不论输入变量的权值如何变化,整个静态Huffman编码过程需要的时钟周期固定。本发明大为提高程序运行的最高时钟频率以及降低FPGA中资源的利用率,为静态Huffman的编码提供了很好的一个设计方法。

附图说明

[0011] 通过参照并结合附图的详细描述,本发明变得更好理解,因而本发明更完整的理解和许多附带优点将易于明了,其中:
[0012] 图1为本发明的整体结构流程图;
[0013] 图2为优化的并行全比较排序算法流程图;
[0014] 图3为优化的并行全Huffman编码结构图;
[0015] 图4构造一棵二叉树实例;
[0016] 图5为继图4后的第二步构建的传统Huffman子树;
[0017] 图6为继图5后的第三步构建的传统Huffman子树;
[0018] 图7为继图6后的第四步构建完全的传统Huffman子树;
[0019] 图8并行全Huffman编码模块图。

具体实施方式

[0020] 以下结合附图所示实施例对本发明做进一步的说明。
[0021] 采用基于FPGA的并行全比较排序结构和Huffman并行全编码结构。由优化的并行全比较算法排序结构得到所有输入参数的权值排序,然后静态Huffman并行全编码结构会根据得到的权值排序结果,来对最小的两个权值进行编码和统计码长。最后会对得到的编码值进行流水线的输出。这样可以连续不断的输出编码值。
[0022] 在介绍本设计之前先简要介绍一下相关的传统Huffman编码的基本原理。
[0023] 传统Huffman编码步骤通常为:
[0024] i.每次从N权值集合中选出2个最小的权值,构建一棵二叉树,二叉树的左子树对应这两个中最小权值,右子树对应次小的权值。根结点为这两个权值相加的和。
[0025] ii.再把这个新的权值和剩下的权值,构成一个新的权值集合,然后重复步骤(i)。
[0026] iii.重复步骤(i)和步骤(ii),直到循环整个过程N-1次。得到一棵完整的传统的静态Huffman树。
[0027] 假如,现在有5个字符分别为A,B,C,D,E出现的频率(权值)分别为0.15,0.35,0.05,0.25,0.20,即权值集合为{0.15,0.35,0.05,0.25,0.20}。为了对这5个字符进行静态Huffman编码。首先,第一步先在权值集合中选出两个最小权值作为左右子树构造一棵二叉树。即选取0.05和0.15构成一棵二叉树,这两个左右子树的权值相加为其结点的权值即
0.05+0.15=0.20。如图4所示。
[0028] 虚线为新生成的结点,第二步,再把新生成为权值0.20的结点放入剩下的集合中,现在权值集合变为{0.20,0.35,0.25,0.20},再从这个集合中选出两个最小权值0.20和0.20,根据这两个最小权值继续构建新的Huffman子树。如图5所示。
[0029] 再次构建静态Huffman树,此时权值的集合为{0.4,0.35,0.25}。再次选出两个最小的权值0.35和0.25,具体如图6所示。
[0030] 经过这一步骤之后,权值的集合只剩下最后两个了即为{0.4,0.6}。再进行最后一次的构建Huffman的过程。图7所示。
[0031] 至此,一棵完整的静态Huffman树构建完成。根据编码规则左子树编码为“0”,右子树编码为“1”。这样每个字符对应的Huffman编码值为:A->100,B->11,C->000,D->01,E->10。同时,字符A的码长为3,B的码长为2,C的码长为3,D的码长为2,E的码长为2。图7所示。
[0032] 从上面的图和解析中,看出有2个实现过程对于Huffman编码至关重要,一个是:如何使用排序算法选出两个最小权值,另一个是:如何进行Huffman编码和统计其码长。下面将对这两个过程如何在本设计中实现以及跟其他算法实现的区别。
[0033] 排序算法部分:
[0034] 对上面的5个字符,分别使用常见的排序算法和本设计中给出的并行全比较模块中使用到的并行全比较算法性能上的对比。
[0035]
[0036] 编码部分:
[0037] 传统的Huffman编码,需要知道静态Huffman树的结构以及码长,才可以对其进行Huffman编码,而本设计在不需要构建Huffman树和不需要知道码长的情况下,在排序得时候并行得到Huffman编码值和码长。
[0038]
[0039] 实施例1
[0040] 本发明在排序的同时得到对应权值的码长和编码值,并且在一个时钟周期内对所有变量进行编码,在排序结束的时候即可得到所有变量(或者称为数据)的码长和编码值。无论输入变量的权值如何变化,整个静态Huffman编码过程需要的时钟周期固定。整个过程充分考虑FPGA的并行处理性,采用优化后的并行全比较算法,只需一个时钟周期便可得到所有变量权值的排序,该算法是基于序列中任意两个数并行比较实现,数据之间两两比较统一采用大于等于比较器,任意两个数之间只需要比较一次,这样两个数得到的比较结果(‘0’或者‘1’)互为相反数。开始为输入数据并统计权值的模块,等输入结束后,再对输入的数据进行优化的并行全比较排序,在得到排序结果的同时对其进行编码。最后编码值的输出采用流水线的方式,可以使输出过程不间断。
[0041] 整个电路优化全比较排序部分的硬件设计由6个主要模块组成。
[0042] 第1个主要模块为优化的并行全比较排序模块,采用优化的并行全比较排序算法,此种算法可以对全部需要比较的数据同时进行并行处理。一组数据,先进行两两比较,得到一个结果‘0’或者‘1’。这里原本是需要例化多个模块,但是考虑到后面的数据的比较结果可以从前面已经比较的结果取反得到(A已经与B进行比较,得到结果为0,表明B比A大,那么就不需要再对B与A进行比较了)。所以只需要例化原来一半的模块即可。由于所有的数据都是在硬件中同时进行的,只需要一个时钟周期就可以得到全部的比较结果。整个数据的处理流水进行,不需要额外的控制逻辑。优化的并行全比较排序模块如图2所示。
[0043] 根据上述优化的并行全比较算法得到权值的大小顺序之后,然后进入下面5个模块的处理,一个模块的处理需要一个时钟周期。
[0044] 第2个主要模块为得出半累加值模块,考虑到一个周期内,对N个变量的权值比较得到的一位结果全部相加,可能会造成时序上面的不满足,所以先对二分之N个一位的比较值相加。
[0045] 字符A对应的第1个半累加值为:half_sumA_1=sum1+sum2;
[0046] 字符A对应的第2个半累加值为:half_sumA_2=sum3+sum4;
[0047] 字符B对应的第1个半累加值为:half_sumB_1=!sum1+sum5;
[0048] 字符B对应的第2个半累加值为:half_sumB_2=sum6+sum7;
[0049] 同理,可得其他字符的半累加值。
[0050] 第3个主要模块为得出全累加值模块,根据上一个周期得到的2个二分之N个比较值相加的结果再相加,即为该数据对应的累加值。全累加值的大小为0~(N-1)。其中全累加值为‘0’表示该数据对应的权值是最小的,‘1’则为第二小,N-1则为最大值。
[0051] 字符A对应的全累加值为:all_sumA=half_sumA_1+half_sumA_2;
[0052] 字符B对应的全累加值为:all_sumB=half_sumB_1+half_sumB_2;
[0053] 同理,可得其他字符的全累加值。
[0054] 第4个主要模块为得到排序结果模块,根据上一个周期全累加值的结果可以得到,对应数据的权值大小排序,根据这个权值排序可以找出该权值所对应的数据。根据下表中每个字符的全累加值,可以得出相应的排序结果,全累加值越小,表明该字符对应的权值就越小。(其中灰色部分结果是根据大于等于比较器得到的,无颜色部分结果对灰色部分结果取反得到,这样可以减少大于等于比较器的使用量)
[0055]
[0056] 第5个主要模块为两个最小权值相加模块,这个周期根据前面得到的全累加值,选出该全累加值对应为‘0’和‘1’所代表的数据的权值相加,即得到选出的两个最小权值相加,然后把相加的值赋给这两个权值中全累加值为‘1’所对应的数据,再次代入大于等于比较器中比较。依次循环N-1次。
[0057] 根据全累加值的结果,字符C的权值最小,字符的A的权值次小。然后,把字符A和字符C的权值相加,假如为相加值名为AC。那么把AC的值赋给A,C赋值为1(这样C的权值最大,全累加值也最大,不会干扰下一轮最小权值的选择)。
[0058] 同时,跟这个过程并行执行的还有,Huffman的码长统计和编码过程。(假设所有字符编码值初始化为“0000”)。Huffman编码一栏中黑色加粗字体的为新编码的编码,没有被选出的字符维持现有的编码值。
[0059]
[0060]
[0061] 第6个主要模块为缓存一个周期模块,这相当于插入Buffer模块,考虑到前面的两个最小权值相加以后,调用多个module需要花费一个时钟周期。所以这个周期就是用来等待,大于等于比较器的比较结果。同时,也利于时序上面的提高。
[0062] 实施例2
[0063] 基于实施例1,再给出实施例2.
[0064] 如附图1所示,为静态Huffman编码的整体结构。一开始有一个输入数据并且统计权值的模块,等到输入结束以后,再对输入的数据进行优化并行全比较排序,在得到排序结果的同时可以对其进行静态Huffman编码。这两个主要的流程并行执行。整个过程可以根据输入变量的个数确定整个运行周期,假设需要对N个变量进行静态Huffman编码则整个流程占用的时钟周期为(N-1)*6+2个。即从输入数据结束到输出结果需要(N-1)*6+2个时钟周期。其中静态Huffman编码值的输入采用流水线的方式,此种方式可以使输出过程不间断。整个的基于可编程逻辑(FPGA)的静态哈夫曼(Static Huffman)并行全编码发明过程,有两处地方利用了FPGA的并行处理技术。图1左边的流程图中,为了快速高效得到所有权值的排序,采用了优化的并行全比较排序算法,该算法不仅仅只需使用大于等于比较器即可实现比较,而且只需使用一半数量的比较器就可完成。图1右边的流程图中,在得到排序结果的同时也对所有的变量进行静态Huffman编码,这样在整个排序算法过程结束的同时编码过程也结束了。不仅能做到时间的使用减少,而且还降低硬件资源的使用率。
[0065] 如附图2(即图1的左图)所示,为优化的并行全比较排序算法流程。整个算法拆分成6个主要模块去执行,每个模块执行时间为一个周期。一开始使用优化的并行全比较算法得出所有变量权值两两比较的结果,这个结果是一位的‘0’或者‘1’。这里使用到的比较器为大于等于比较器,例如数据0的权值大于等于数据9对应的权值,则该比较器输出结果为‘1’,后面数据9的权值就不需要跟数据0的权值再进行比较,可以少调用一次比较器,根据前面数据0比数据9得到的结果‘1’取反得到‘0’,这样可以大为减少例化的模块,同时也保证得到所有的比较结果。考虑到时序的原因,没有把一个数据跟其他所有数据对比的全部结果都一次性相加,而是先把其中的一半结果各自相加,存入到两个寄存器中,然后再把这两个寄存器的值相加,得到变量的全累加值,这个全累加值的大小范围为0~(N-1),根据前面优化的并行全比较算法这个全累加值是不会重复的,意思是每次全累加值的结果都会为0~(N-1)之间的某一个,所有的全累加值构成0~(N-1)的集合。根据这个全累加值可以得到这N个权值的排序。根据这个排序结果可以得出这N个权值的大小排序。然后从中选出两个最小权值,作为静态Huffman编码的叶子结点。最后缓冲一个时钟周期,这个周期内准备下一次需要比较的权值,同时多增加一个时钟周期也有利于时序的提高。
[0066] 如附图3(即图1的右图)所示,为并行全静态Huffman编码结构。根据得到的权值排序结果,可以知道最小两个权值所对应的数据是哪两个。然后对其进行静态Huffman编码和统计码长,再把这两个最小权值相加赋给第二小的这个数据所对应的权值。然后再进行下一轮的比较,如果在后面的比较当中再次出现这个数据,则这两个数据的码长再加1,对应的编码值左移一位然后再根据这次的比较结果最低位赋为‘0’或者‘1’。如此反复,直到最后一次排序。得到的最后一次排序结果时,由于这个根节点是所有数据的根节点,所以这最后一次排序的时候,所有数据的码长都会加1同时都会根据其所在的分支,左移一位然后最低位赋‘0’或者‘1’。整个静态Huffman编码结束。