1

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

这是一个示例比特流。该格式记录在Spartan-6 FPGA 配置手册中(从第 92 页开始)。

通常,数据中存在的模式分为几类,鉴于我正在使用的约束,我不确定其中哪一个最容易被利用:

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

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

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

给定约束条件,什么是适合此任务的压缩算法(不是库,除非您确定它适合!)?

4

3 回答 3

2

根据您的描述,我建议运行长度编码,然后是 Huffman 编码字节并运行。您将需要很少的内存来存储数据本身,主要用于累积频率和在适当位置构建 Huffman 树。小于 1K。

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

于 2013-05-28T15:06:04.870 回答
2

您应该考虑使用LZO 压缩库。它可能是现有最快的解压器之一,并且解压不需要内存。然而,压缩需要 64KB 的内存(或者对于一种压缩级别需要 8KB)。如果您只需要解压缩,它可能对您有用。

LZO 项目甚至提供了这个库的特殊缩减版本,称为miniLZO。据作者介绍,miniLZO 在 i386 上编译成小于 5KB 的二进制文件。由于您有 16KB 闪存,它可能正好适合您的限制。

LZO 压缩器目前由UPX(用于uecutables的 ltimate packer x)使用。

于 2013-05-28T07:15:12.230 回答
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 来检查您可能期望的压缩比,并在承诺实施嵌入式部分之前查看它是否足够好。

于 2013-05-28T10:59:14.847 回答