基于FPGA实现lzw算法难点分析及实现

1 LZW算法简介
数据压缩分为有损压缩和无损压缩。有损压缩是对压缩后的数据进行重构 (解压缩 ) ,重构后的数据与原来的数据有所不同,换来了大的压缩比。无损压缩指对压缩后的数据进行重构 ,重构后的数据与原来的数据完全相同。这里只介绍LZW无损压缩和解压缩算法。
LZW压缩算法是一种通用的无损压缩方法,该压缩算法是根据其发明人Lempel、Zif、Welch名字的首字母命名的。LZW压缩算法可以软件实现也可以硬件实现;软件压缩一般应用在对时间要求不高的场合,而对运行速度有特殊要求的情况下,对数据进行实时压缩一般都要用硬件实现。笔者主要研究基于FPGA实现LZW算法(包括压缩和解压缩),即用硬件电路来实现LZW算法。
2 LZW压缩原理
LZW算法采用了一种先进的串表(String Table)。将每个第一次出现的字符串放在串表中,并用一个代码(Code Word)来表示。压缩文件只存贮数字。而不存贮串从而可以使文件的压缩效率得到较大的提高。不管是在压缩还是解压缩的过程中,都能正确地建立相同串表,压缩或解压缩完成后,这个串表将被丢弃。
串表好比一部字典,把输入字串(单词)转换成字典中的所有的页码和页中的序号。解码就是据页码和页中的序号找到字串(单词)。使用同一部字典是正确还原的基础。(LZW算法基本原理不做介绍,可以参考网络资源)。
3 LZW压缩实现难点
FPGA实现LZW算法要解决以下5个问题:
1)字典容量选择
在实现LZW压缩与解压缩算法的时候,需要构建一个字典,用来存放压缩过程中形成的字符串表。LZW算法的字典是自适应生成的,在实际应用中,若无限制地增大字典的容量,虽然可能获得更好的压缩率,但进行字符串匹配时查找的时间会变长,并且随着编码的码字位数增加,有时可能会导致压缩效率降低,影响压缩速率,因此字典的容量要受一定的限制。
2)压缩速度
利用RAM来构造字典,由于RAM查找是根据地址的累加进行串行查找的,这种查找方法将会影响数据的输出速度,最终造成输入数据的溢出。例如,对于一个深度为512的字典,需要的查找时间为l~512个不等周期(若第N个地址查到,则需要N个时钟周期)。
3)压缩率
第一,设置字典的不同大小可以影响压缩率。当所设置的字典比较小的时候,字符串表在很短的时间内就会被填满,导致字典的匹配性不强,这样就对数据的压缩效果产生影响,使得压缩率不高。
第二,字典更新策略可以影响压缩率。由于字典的容量有限,随着压缩过程的进行,字典会被填满,若是简单的不再向字典中增加内容,那么后面的压缩率就会降低 ,而如果将字典全部清除重新建立字典,在字典建立初期压缩率也是很低的。
4)资源利用率
字典的建立使用FPGA片内资源来完成,大容量字典虽然会提高压缩比,但必须考虑到FPGA内部的资源(FPGA内部RAM资源)。
5)程序鲁棒性
FPGA设计过程中模块划分非常重要,好的模块划分能够大大减少逻辑所消耗的面积并优化功能的时序关键路径。对于系统时钟在200MHz的以上逻辑设计,如果只考虑逻辑功能,而不考虑最终的代码综合和实现,时序结果出现大量的时序违规,可以说这个设计是不可靠的。
4 LZW压缩方案
1)字典容量应该选择多大?
一般串表长度为1024、2048、4096个字节,这意味着一个串表中最多能存储1024、2048、4096个基本字符串。
2)如何提高压缩速度?
第一 ,提高系统时钟频率;第二,缩短压缩一个字节需要的时钟周期。为了解决这个问题,下面将提出一种基于CAM查询的实现方法。随着FPGA器件门数的增加和结构的改进以及IP库的不断丰富,基于FPGA的CAM实现已成为可能。
3)如何考虑压缩率?
第一,字典容量大小设置。第二,字典更新策略。
4)如何考虑资源利用率?
第一,字典容量大小设置。第二,字典维护算法设计尽量简单。字典的维护问题,由于字典的维护必须使用FPGA的内部逻辑来完成,就必须考虑到,过于复杂的字典管理虽然会提高压缩比,对于FPGA逻辑资源的占用和实时压缩的时间消耗而言是得不偿失的;
5)如何设计程序鲁棒性
第一,设计时考虑硬件结构;第二,查看时序报告解决关键路径。
综合考虑LZW压缩率、压缩速度、资源利用等问题,采用Xilinx FPGA实现LZW压缩算法。就是利用FPGA 内部BRAM来构造字典,字典容量设置为2048,字典的查找技术是LZW算法中的一个关键部分,关系到每进行一次数据匹配过程的效率。为提高字典的地址计算速度,提出一种基于CAM查询的实现方法(CAM基于内容寻址,通过硬件电路实现快速匹配)。
5 LZW压缩测试及性能
LZW算法测试主要分为软件测试、硬件测试、资源利用率、压缩率和压缩速度。软件测试也就是功能仿真,验证逻辑功能正确性;硬件测试是代码运行在实际的FPGA芯片,通过在线逻辑分析仪调试LZW算法验证逻辑正确性;资源利用率测试是指代码综合或实现后占用FPGA内部资源使用情况。
1)软件测试
使用modelsim仿真软件进行逻辑功能仿真。编写测试激励输入一帧图像数据送给LZW压缩模块,经过压缩后的数据再经过LZW解压缩模块输出。输入原始数据存入文件1.txt,LZW解压的数据存入文件2.txt,通过比较工具对这两个文件进行比较,两个文件的大小都是171520字节,0字节差异,完全匹配。
2)硬件测试
与软件测试方法一致也采用回环测试,硬件测试主要是把原始数据存储到FPGA BRAM中,经过LZW压缩模块和LZW解压缩模块,通过测试代码把解压数据与原始数据进行一一比较,如果数据一致,证明LZW算法逻辑功能正确;如果数据不一致,证明LZW算法逻辑功能错误;硬件测试结果表明数据一致,证明LZW算法逻辑功能正确,都是171520字节,0字节差异,完全匹配。
3)资源利用率
FPGA实现LZW压缩模块资源占用情况如下图所示。

图1 资源利用率
4)压缩率
软件测试时,把LZW压缩后的数据存储入文件3.txt,统计到136633.75字节,压缩率为79.68%。
5)压缩速率
压缩单个字节需要15个时钟周期(T = 5ns),工作速率12.72MB/s。
6 LZW算法结束语
基于xilinx FPGA实现LZW压缩算法。经过仿真验证与硬件验证 , 结果表明该算法的FPGA实现能获得20%左右的压缩比,工作速率12.72MB/s(如果需要更高的工作速率,只需要提高系统时钟即可,250MHz时钟,工作速率为15.89MB/s),FPGA资源使用率非常低,完全满足系统实时处理的需求。技术咨询请发邮件沟通:[email protected]
目前LZW算法改进后,压缩单个字节需要10个时钟周期,若周期T = 5ns,工作速率19.07MB/s;若周期T = 4ns,工作速率23.84MB/s。说明:FPGA资源占用率相对增加一些。

发布了0 篇原创文章 · 获赞 0 · 访问量 20

猜你喜欢

转载自blog.csdn.net/m0_46498597/article/details/104919346
今日推荐