FPGA比特流的数据压缩

时间:2013-05-28 07:02:14

标签: embedded compression fpga lossless-compression

我正在寻找一种好的压缩算法,用于解压缩来自闪存芯片的数据以加载到FPGA(Xilinx Spartan6-LX9开发板上的Mojo)。它必须快速解压缩并且不需要大量工作内存来执行此操作,因为CPU(ATmega16U4)的时钟频率为8 MHz,并且只有2 KiB的RAM和16 KiB的程序闪存,其中一些已经在使用中。压缩速度不是特别重要,因为压缩只能在计算机上运行一次,压缩算法不需要对任意输入起作用。

Here is an example bitstream.格式记录在the Spartan-6 FPGA Configuration手册中(从第92页开始)。

一般来说,数据中存在的模式属于几个类别,并且我不确定在我使用的约束条件下哪些模式最容易被利用:

  • 数据整体组织成一组已知格式的数据包。比特流的某些部分有点"刻板" (例如,它总是通过写入某些寄存器开始和结束),其他命令将以可预测的顺序出现。

  • 有些字节比其他字节更常见。到目前为止,00和FF是最常见的,但设置了少量位的其他字节(例如,80,44,02)也很常见。

  • 00和FF字节的运行非常频繁。其他模式有时会出现在本地范围内(例如,16字节序列将重复几次),但不是全局的。

在给定约束的情况下,对于此任务,适当的压缩算法(不是库,除非您确定它适合!)是什么?

3 个答案:

答案 0 :(得分:2)

您是否尝试过内置的比特流压缩?这对非完整设备非常有效。这是一个bitgen选项,FPGA支持开箱即用,因此它对您的micro没有资源影响。

此处描述了实现压缩的方式:

http://www.xilinx.com/support/answers/16996.html

comp.arch.fpga讨论了其他可能性:

https://groups.google.com/forum/?fromgroups#!topic/comp.arch.fpga/7UWTrS307wc

似乎一张海报在相对受限的嵌入式系统上成功实施了LZMA。您可以使用7zip检查您可能期望的压缩率,并在提交嵌入式部件的实现之前查看它是否足够好。

答案 1 :(得分:2)

根据您的描述,我建议使用游程编码,然后使用Huffman编码字节和运行。您需要对数据本身的内存非常少,主要用于累积频率和构建霍夫曼树。不到1K。

您应该制作运行长度的直方图,以帮助确定分配给运行长度的位数。

答案 2 :(得分:1)

您应该考虑使用LZO compression library。它可能是现存最快的解压缩器之一,并且解压缩不需要内存。但是,压缩需要64KB的内存(或者其中一个压缩级别需要8KB)。如果您只需要解压缩,它可能适合您。

LZO项目甚至提供了这个名为miniLZO的库的特殊缩减版本。根据作者的说法,miniLZO在i386上编译为小于5KB的二进制文件。由于你有16KB的闪存,它可能只适合你的约束。

LZO压缩器目前由UPXu ltimate p acker用于e x可执行文件。