Embedded FPGA码流的数据压缩

Embedded FPGA码流的数据压缩,embedded,compression,fpga,lossless-compression,Embedded,Compression,Fpga,Lossless Compression,我正在寻找一种好的压缩算法,用于将数据从闪存芯片解压缩到FPGA(a,在开发板上)。它必须快速解压,并且不需要大量工作内存,因为CPU(an)的时钟频率为8 MHz,只有2 KiB的RAM和16 KiB的程序闪存,其中一些已经在使用中。压缩速度不是特别重要,因为压缩在计算机上只运行一次,并且压缩算法不需要对任意输入工作 手册中记录了格式(从第92页开始) 一般来说,数据中存在的模式分为几个类别,考虑到我正在处理的约束条件,我不确定哪一个最容易利用: 数据被整体组织成一组已知格式的数据包。比特流

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

手册中记录了格式(从第92页开始)

一般来说,数据中存在的模式分为几个类别,考虑到我正在处理的约束条件,我不确定哪一个最容易利用:

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

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

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

什么是适当的<强>压缩算法< /强>(不是一个库,除非你确信它适合!)对于这个任务,考虑到约束条件,

你应该考虑使用。它可能是目前最快的解压器之一,解压不需要内存。然而,压缩需要64KB的内存(或者其中一个压缩级别需要8KB)。如果你只需要解压,它可能只适合你

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

LZO压缩机目前使用的是(<代码> u <代码> Lord<代码> P<代码> AcKER,用于E<代码> xEcutabes)。

您应该考虑使用。它可能是目前最快的解压器之一,解压不需要内存。然而,压缩需要64KB的内存(或者其中一个压缩级别需要8KB)。如果你只需要解压,它可能只适合你

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


LZO压缩器目前由(
u
ltimate
p
acker for e
x
ecutables)使用。

您尝试过内置位流压缩吗?这可以在非完整设备上很好地工作。这是一个bitgen选项,FPGA支持开箱即用,因此它对您的micro没有资源影响

实现压缩的方式如下所述:

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


似乎有一张海报是在一个相对受限的嵌入式系统上成功实现的。您可以使用7zip来检查您可能期望的压缩比,并查看它是否足够好,然后再执行嵌入部分。

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

实现压缩的方式如下所述:

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


似乎有一张海报是在一个相对受限的嵌入式系统上成功实现的。您可以使用7zip来检查您可能期望的压缩比,并查看它是否足够好,然后再执行嵌入部分的实现。

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


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

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


您应该制作运行长度的柱状图,以帮助确定为运行长度分配多少位。

我知道内置压缩,但它非常弱。我想知道是否有可能做得更好!我知道内置的压缩功能,但它相当弱。我想知道是否有可能做得更好!我敢肯定即使是迷你们也会太大。我总共有16KB的闪存,但AVR代码密度没有i386高,而且我还有大量代码花在了其他事情上(比如)。我很确定即使是miniLZO也会太大。我总共有16KB的闪存,但AVR代码密度没有i386高,而且我还有大量代码花在其他事情上(比如)。你需要在目标系统上编写压缩算法还是解压缩算法?(或两者都有?)仅对目标进行解压缩。压缩可以在生成比特流的计算机上处理。好的,在这种情况下,Mark的初始建议似乎适用,因为LZ4解码算法几乎不需要RAM(只有几个变量)。其编码大小通常约为150字节或更小。压缩部分将产生小的块,小到足以保持在你的t限制