【问题标题】:Data compression for FPGA bitstreamFPGA比特流的数据压缩
【发布时间】:2013-05-28 07:02:14
【问题描述】:

我正在寻找一种好的压缩算法,用于从闪存芯片解压缩数据以加载到 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 字节的序列会重复几次),但不会出现在全局范围内。

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

【问题讨论】:

  • 您是否需要在目标系统上编写压缩算法或解压缩算法? (或两者兼而有之?)
  • 只在目标上解压。可以在生成比特流的计算机上处​​理压缩。
  • 好的,在这种情况下,Mark 的初步建议似乎适用,因为 LZ4 解码算法几乎不需要 RAM(只有几个变量)。它的编码大小通常约为 150 字节或更少。压缩部分必须生成小块,小到足以保持在目标系统的限制范围内。
  • @Cyan:LZ4 解压缩似乎要求您能够查看最多 64KB 的解压缩数据。这是我不必使用的大量内存!
  • 不,它不需要它。它只是“可以”做到这一点,但它不需要。如果你的数据被切割成小的独立块,它就会使用它。

标签: embedded compression fpga lossless-compression


【解决方案1】:

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

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

LZO 压缩器目前由 UPX 使用(ultimate packer 用于 executables)。

【讨论】:

  • 我很确定即使是 miniLZO 也会太大。我总共有 16 KB 的闪存,但 AVR 代码密度没有 i386 高,而且我有大量代码花在其他事情上(比如LUFA)。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    您是否尝试过内置的比特流压缩?这可以在非完整设备上很好地工作。它是一个 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 来检查您可能期望的压缩比,看看它是否足够好,然后再提交嵌入部分的实现。

    【讨论】:

    • 我知道内置压缩,但它很弱。我想知道是否有可能做得更好!
    猜你喜欢
    • 2012-11-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-31
    • 1970-01-01
    • 2021-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多