FPGA纯verilog实现 LZMA 数据压缩,提供工程源码和技术支持

目录

  • 1、前言
  • 2、我这儿已有的FPGA压缩算法方案
  • 3、FPGA LZMA数据压缩功能和性能
  • 4、FPGA LZMA 数据压缩设计方案
    • 输入输出接口描述
    • 数据处理流程
      • LZ检索器
      • 数据同步
      • LZMA 压缩器
    • 为输出LZMA压缩流添加文件头
  • 5、vivado仿真
  • 6、福利:工程代码的获取

1、前言

说到FPGA的应用,数据压缩算法的硬件加速器无疑是经典应用之一,用FPGA压缩图片、视频、普通数据等都具有并行执行的独特优势,关于FPGA压缩图片和视频,我之前的博客有相关设计,今天讲讲用FPGA实现对普通数据进行LZMA 压缩算法的实现;本工程源码的功能就是:基于 FPGA 的流式的 LZMA 压缩器,用于通用无损数据压缩:输入原始数据,输出标准的 LZMA 格式,LZMA 是一种常用的数据压缩算法。“.7z” 和 “.xz” 格式默认使用的算法是 LZMA。“.zip” 格式也支持 LZMA 算法。 LZMA 的压缩率通常高于 GZIP/DEFLATE 和 BZIP;

2、我这儿已有的FPGA压缩算法方案

我这里有图像的JPEG解压缩、JPEG-LS压缩、H264编解码、H265编解码以及其他方案,后续还会出更多方案,我把他们整合在一个专栏里面,会持续更新,专栏地址:
直接点击前往

3、FPGA LZMA数据压缩功能和性能

3.1:纯 RTL 设计,在各种 FPGA 型号上都可以部署;
3.2:极简的流式输入/输出接口 ,输入待压缩数据,输出LZMA压缩流。
3.3:LZMA 字典大小: 131072 字节。哈希匹配搜索引擎包含 4096个哈希值 × 8个哈希entry
3.4:压缩率高,详情如下:
使用一个 512KB data 作为待压缩数据,比较该压缩器与其它压缩方案,结果见下表。
在这里插入图片描述
3.5:FPGA 资源占用小,具体如下:
在 Xilinx 7 系列上占 2275 LUTs 和 55 BRAM36K;
在 Altera Cyclone IV 系列上占 3484 LUTs and 1.8 Mbits BRAM;
3.6:性能如下:
3.6.1:平均输入一个字节需要 13 周期;
3.6.2:在 Xilinx Artix7 的速度最慢的FPGA (-1 速率级别) 上达到 118 MHz ,平均性能约为 118/13 = 9MB/s;
3.6.3:在 Xilinx Zynq Ultrascale+ 的速度最慢的FPGA (-1 速率级别) 上达到 250 MHz ,平均性能约为 250/13 = 19MB/s;
3.6.4:在 Altera Cyclone IV E 的速度最慢的FPGA (8 速率级别) 上达到 83 MHz ,平均性能约为 83/13 = 6.3MB/s;
3.6.5:当前版本的压缩率和FPGA资源消耗都足够好,但性能还不够让我满意 (7ZIP的LZMA快速压缩在个人计算机上使用单线程,性能约为约为5~10MB/s)。因此,当前版本可能仅适用于某些嵌入式应用。我将来会优化它的性能。

4、FPGA LZMA 数据压缩设计方案

FPGA LZMA 数据压缩设计方案框图如下:
在这里插入图片描述
其中的哈希列表和数据缓冲buffer在模块中的位置如下:
在这里插入图片描述

输入输出接口描述

输出接口是精简的、无握手的、8-bit 位宽的 AXI-stream master ,用来输出 LZMA 压缩流。
在这里插入图片描述
所有信号都在 clk 的上升沿改变或被采样
o_valid=1 时, o_data 有效;
o_data 是输出的 LZMA 压缩流中的一个字节;
o_last 用来界定 LZMA 压缩流的边界。当 o_valid=1 且 o_last=1 ,说明当前字节是一个LZMA压缩流的最后一个字节;
当 o_last=1 时,一定有 o_valid=1;

输出接口是精简的、无握手的、8-bit 位宽的 AXI-stream master ,用来输出 LZMA 压缩流。
所有信号都在 clk 的上升沿改变或被采样;
o_valid=1 时, o_data 有效;
o_data 是输出的 LZMA 压缩流中的一个字节;
o_last 用来界定 LZMA 压缩流的边界。当 o_valid=1 且 o_last=1 ,说明当前字节是一个LZMA压缩流的最后一个字节;
当 o_last=1 时,一定有 o_valid=1;

数据处理流程

LZ检索器

详见计方案框图;
输入数据首先给到LZ检索器进行数据处理;
LZ检索器在代码中的位置如下:可以看到,由纯verilog代码实现;
在这里插入图片描述

数据同步

LZ模块输出的数据需要做数据同步 处理,使用一个纯verilog编写的同步fifo实现,这个比较简单,不必多说,在代码中的位置如下:
在这里插入图片描述

LZMA 压缩器

LZMA 压缩器是整个代码的核心,采用标准的LZMA 算法实现,只不过将该算法用verilog代码实现了,在代码中的位置如下:
在这里插入图片描述

为输出LZMA压缩流添加文件头

为了让输出的LZMA流被各种解压软件识别,我们需要使用“容器格式”(即添加文件头或文件尾)。注意,“.zip”、“.xz”、“.7z” 都是容器格式。它们比较复杂,这里我们不介绍它们。
这里只介绍一种非常简单的容器格式 : “.lzma” 格式。它的格式是:
.lzma" 格式 = 13字节文件头 + LZMA压缩流
其中,13字节文件头是固定的:
0x5E, 0x00, 0x00, 0x02, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
当我们将完整的 “.lzma” 格式的数据 (13字节文件头+LZMA压缩流) 保存到 “.lzma” 文件后,就可以用各种官方压缩软件来解压它 。

5、vivado仿真

vivado仿真设计框图如下:
在这里插入图片描述
其中,随机数据包生成器 (tb_random_data_source.v) 将生成四种不同特征的数据包 (均匀分布的随机字节、非均匀分布的随意字节、随机连续变化的数据和稀疏数据) ,这些数据包将被发送到待测设计 (lzma_compressor_top) 进行压缩。
tb_save_result_to_file.v 模块将压缩后的结果存储到文件。每个 LZMA压缩流都会存储在一个独立的 “.lzma” 文件中 (该模块也负责附加13字节的文件头)。

vivado仿真代码架构如下:
在这里插入图片描述
vivado仿真打印结果如下:
在这里插入图片描述
仿真波形如下:
在这里插入图片描述
仿真后生成的zip压缩文件保存的路径如下:
在这里插入图片描述
然后可以用LZMA解压软件或者Windows自带的字节软件将其解压打开看,LZMA解压软件在资料包中,如下:
在这里插入图片描述
如果你喜欢用iverilog平台仿真,可以直接点击上图中的bat文件仿真;

6、福利:工程代码的获取

福利:工程代码的获取
代码太大,无法邮箱发送,以某度网盘链接方式发送,
资料获取方式:文章末尾的V名片。
网盘资料如下:
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/55785.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[C++从入门到精通] 9.inline、const、mutable、this和static

📢博客主页:https://loewen.blog.csdn.net📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!📢本文由 丶布布原创,首发于 CSDN,转载注明出处🙉📢现…

UI自动化测试之Jenkins配置

背景: 团队下半年的目标之一是实现自动化测试,这里要吐槽一下,之前开发的测试平台了,最初的目的是用来做接口自动化测试和性能测试,但由于各种原因,接口自动化测试那部分功能整个废弃掉了,其中…

Spring 事务管理

目录 1. 事务管理 1.1. Spring框架的事务支持模型的优势 1.1.1. 全局事务 1.1.2. 本地事务 1.1.3. Spring框架的一致化编程模型 1.2. 了解Spring框架的事务抽象(Transaction Abstraction) 1.2.1. Hibernate 事务设置 1.3. 用事务同步资源 1.3.1…

Agent:OpenAI的下一步,亚马逊云科技站在第5层

什么是Agent?在大模型语境下,可以理解成能自主理解、规划、执行复杂任务的系统。Agent也将成为新的起点,成为各行各业构建新一代AI应用必不可少的组成部分。 对此,初创公司Seednapse AI创始人提出构建AI应用的五层基石理论&#…

Python数据分析实战-dataframe指定多列去重(附源码和实现效果)

实现功能 Python数据分析实战-利用df.drop_duplicates(subset[,])对dataframe指定多列去重 实现代码 import pandas as pddata{state:[1,1,2,2,1,2,2],pop:[a,b,c,d,b,c,d]} framepd.DataFrame(data)frameframe.drop_duplicates(subset[pop,state]) print(frame) 实现效果 本…

rv1109/1126 rknn 模型部署过程

rv1109/1126是瑞芯微出的嵌入式AI芯片,带有npu, 可以用于嵌入式人工智能应用。算法工程师训练出的算法要部署到芯片上,需要经过模型转换和量化,下面记录一下整个过程。 量化环境 模型量化需要安装rk的工具包: rockchip-linux/rk…

每日一题——两数之和

题目 给出一个整型数组 numbers 和一个目标值 target,请在数组中找出两个加起来等于目标值的数的下标,返回的下标按升序排列。 (注:返回的数组下标从1开始算起,保证target一定可以由数组里面2个数字相加得到&#xff0…

Ceph入门到精通-远程开发Windows下使用SSH密钥实现免密登陆Linux服务器

工具: win10、WinSCP 服务器生成ssh密钥: 打开终端,使账号密码登录,输入命令 ssh-keygen -t rsa Winscp下载 Downloading WinSCP-6.1.1-Setup.exe :: WinSCP window 生成密钥 打开powershell ssh-keygen -t rsa 注意路径 …

ArcGIS Pro简介下载安装地址

ArcGIS Pro简介 ArcGIS Pro是一款功能强大的地理信息系统(GIS)软件,由Esri开发。它为用户提供了一种直观、灵活且高效的方式来处理、分析和可视化地理数据。ArcGIS Pro具有现代化的用户界面和工作流程,使用户能够更好地利用地理信…

【DDPM扩散模型】DDPM扩散模型公式推导

🔥 🔥 【参考】轻松学习扩散模型(diffusion model),被巨怪踩过的脑袋也能懂——原理详解pytorch代码详解(附全部代码) 纸上得来终觉浅,绝知此事要躬行。

Python实现GA遗传算法优化Catboost回归模型(CatBoostRegressor算法)项目实战

说明:这是一个机器学习实战项目(附带数据代码文档视频讲解),如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 遗传算法(Genetic Algorithm,GA)最早是由美国的 John holland于20世…

IDEA项目实践——创建Java项目以及创建Maven项目案例、使用数据库连接池创建项目简介

系列文章目录 IDEA上面书写wordcount的Scala文件具体操作 IDEA创建项目的操作步骤以及在虚拟机里面创建Scala的项目简单介绍 目录 系列文章目录 前言 一 准备工作 1.1 安装Maven 1.1.1 Maven安装配置步骤 1.1.2 解压相关的软件包 1.1.3 Maven 配置环境变量 1.1.4 配…