FPGA线上课程平台|最全栈的FPGA学习平台|FPGA工程师认证培训
登录
首页-技术文章/快讯-技术分享-正文

FPGA毕业设计选题:基于图像压缩的实时处理系统

二牛学FPGA二牛学FPGA
技术分享
3小时前
0
0
1

Quick Start:最短路径跑通图像压缩实时处理

本小节提供一条从零到上板验证的最短路径,预期在4小时内完成环境搭建、工程建立、综合实现并观察到压缩后图像输出。以下步骤基于Xilinx Vivado 2022.2 + PYNQ-Z2开发板(可替换为其他Artix-7/ Zynq-7000系列板卡)。

  • 安装Vivado与SDK:从Xilinx官网下载Vivado HLx 2022.2 WebPACK或Design Edition(推荐Design Edition以包含所有IP核)。安装时勾选“Zynq-7000”器件支持。安装完成后启动Vivado,确认license有效。
  • 创建RTL工程:选择菜单 File → Project → New,输入工程名“img_compress_rtl”,选择器件xc7z020clg400-1(PYNQ-Z2默认)。点击Finish。
  • 添加顶层模块:在Sources面板右键Add Sources,选择“Add or create design sources”,创建文件“top.v”。在编辑器中粘贴以下最小化压缩核心代码(基于离散余弦变换DCT的JPEG-like压缩简化版):
module top (
    input  wire        clk,          // 100 MHz 系统时钟
    input  wire        rst_n,        // 异步复位,低有效
    input  wire [7:0]  pixel_in,     // 8位灰度像素输入
    input  wire        pixel_valid,  // 输入数据有效
    output reg  [7:0]  pixel_out,    // 压缩后像素输出
    output reg         pixel_ready   // 输出数据有效
);

// 简单实现:对每个8x8块做DCT并量化
// 此处为示意,完整实现见第4节
reg [2:0] state;
// ... 实际代码包含DCT核心、量化表ROM、ZigZag扫描等

endmodule
  • 添加约束文件:Add Sources → Add or create constraints,创建“top.xdc”。写入时钟和复位约束:
create_clock -period 10.000 [get_ports clk]
set_property PACKAGE_PIN H16 [get_ports clk]
set_property IOSTANDARD LVCMOS33 [get_ports clk]
set_property PACKAGE_PIN G15 [get_ports rst_n]
set_property IOSTANDARD LVCMOS33 [get_ports rst_n]
  • 综合与实现:在Flow Navigator中点击“Run Synthesis”,等待完成。若无错误,点击“Run Implementation”。实现完成后点击“Generate Bitstream”。预期无严重警告。
  • 导出硬件描述并启动SDK:File → Export → Export Hardware(勾选Include bitstream)。然后Launch SDK。在SDK中创建新应用工程,选择“Empty Application”,添加一个简单的C程序读取UART输入并写入像素值,观察输出。
  • 上板验证:将PYNQ-Z2通过USB连接PC,打开串口终端(115200 8N1)。在SDK中编程FPGA并运行应用程序。输入一组8x8像素值(例如全0、全255、或棋盘格),观察串口输出的压缩后数据。若输出数值在预期范围内(例如0-255且数值减小),则Quick Start成功。

验收点:串口输出无乱码,压缩后数据量减少(例如原64字节变为约32字节),且图像内容可辨识(若用棋盘格输入,输出仍保持基本模式)。

前置条件与环境

项目/推荐值说明替代方案
器件/板卡Xilinx Zynq-7020 (PYNQ-Z2)Artix-7 (Nexys Video), Kintex-7, Zynq-7010
EDA版本Vivado 2022.2 (Design Edition)Vivado 2020.1~2023.1(需注意IP兼容性)
仿真器Vivado Simulator (XSIM)ModelSim/QuestaSim, VCS
时钟/复位100 MHz 系统时钟,异步低有效复位50 MHz~200 MHz 均可,需调整约束
接口依赖UART (115200 bps) 用于图像数据输入输出HDMI输入输出、Camera Link、DDR3存储
约束文件XDC约束:时钟周期10ns,IO标准LVCMOS33根据板卡调整IO标准
图像源PC串口发送8x8灰度像素块(二进制或ASCII hex)摄像头模块(OV5640)、BMP文件预加载到BRAM
调试工具Vivado Logic Analyzer (ILA) 或 SDK串口打印ChipScope, SignalTap

目标与验收标准

本毕业设计项目的核心目标是:在FPGA上实现一个基于离散余弦变换(DCT)和量化表的图像压缩实时处理系统,能够对8x8像素块进行压缩,并在100 MHz时钟下达到至少每秒60帧(640x480分辨率)的吞吐率。具体验收标准如下:

  • 功能点1:8x8 DCT变换。输入8x8灰度像素块,输出DCT系数矩阵。验证方式:用已知测试向量(如全0块应输出全0系数;全1块应只有直流分量非零)比对仿真结果。
  • 功能点2:量化与ZigZag扫描。使用标准JPEG量化表(亮度表)对DCT系数进行量化,然后按ZigZag顺序输出。验证方式:量化后系数应在预期范围内,且高频系数多为0。
  • 功能点3:实时流水线。系统采用全流水架构,每个时钟周期可处理一个像素(输入到输出延迟固定)。验证方式:在仿真中施加连续像素流,观察输出ready信号是否每个周期都有效。
  • 性能指标:Fmax ≥ 100 MHz。综合后时序报告显示所有路径slack为正。资源占用:LUT ≤ 5000,BRAM ≤ 20个(36Kb),DSP ≤ 16个。
  • 验收方式:上板测试时,通过串口发送一个640x480的灰度图像(分块发送),接收压缩后的数据流,在PC端用软件解压并显示,PSNR ≥ 30 dB(相对于原图)。

实施步骤

3.1 工程结构与模块划分

推荐采用层次化设计,顶层模块top例化以下子模块:

  • input_buffer:8x8像素缓冲,使用双端口BRAM实现,支持边输入边处理。
  • dct_2d:二维DCT核心,采用行列分解法(先对行做一维DCT,转置后再对列做一维DCT)。
  • quantizer:量化模块,包含量化表ROM(预存JPEG标准亮度表),对每个DCT系数做除法。
  • zigzag:ZigZag扫描模块,将8x8矩阵按ZigZag顺序输出为一维序列。
  • output_ctrl:输出控制,添加FIFO缓冲以匹配输出速率。

工程目录建议

img_compress_rtl/
├── rtl/
│   ├── top.v
│   ├── input_buffer.v
│   ├── dct_2d.v
│   ├── dct_1d.v
│   ├── quantizer.v
│   ├── zigzag.v
│   └── output_ctrl.v
├── sim/
│   ├── tb_top.v
│   └── test_vectors.hex
├── constraints/
│   └── top.xdc
└── ip/
    └── (如需Xilinx FIFO IP)

3.2 关键模块实现

一维DCT模块:采用Loeffler快速算法,需要8个乘法器和若干加法器。使用流水线寄存器,延迟约12个时钟周期。关键代码片段:

// 一维8点DCT,Loeffler算法
module dct_1d (
    input  wire        clk,
    input  wire [7:0]  x [0:7],   // 输入8个像素
    output reg  [15:0] y [0:7]    // 输出8个DCT系数(有符号)
);

// 内部变量
reg [15:0] stage1 [0:7];
// ... 实现蝶形运算

always @(posedge clk) begin
    // 第一阶段:加法和减法
    stage1[0] <= x[0] + x[7];
    stage1[1] <= x[1] + x[6];
    // ...
end

// 后续阶段包含乘法(与cos常数相乘)
// 注意:乘法结果需要截位,保持16位精度
endmodule

注意点:乘法器使用DSP48E1资源,需在综合选项中设置“USE_DSP = yes”。量化除法使用移位加查找表实现(除以量化系数),避免使用除法器。

3.3 时序、CDC与约束

系统所有模块使用同一时钟域(100 MHz),无需跨时钟域处理。但需注意:

  • 输入缓冲BRAM:使用双端口BRAM,一个端口写(输入),一个端口读(DCT模块),读时钟与写时钟相同,但需处理地址冲突。建议采用“写指针-读指针”比较,当缓冲满时停止输入。
  • 复位同步:外部异步复位需先经过两级同步器再进入各模块,避免亚稳态。
  • 约束文件:除了时钟约束,还需对输入输出延迟约束(set_input_delay / set_output_delay),确保与外部UART接口时序匹配。

常见坑与排查

  • 坑1:DCT输出符号溢出。输入8位无符号像素(0-255),DCT系数范围可达约±2048,需使用有符号16位寄存器。若使用8位,会截断导致严重失真。
  • 坑2:量化表ROM初始化错误。ROM使用.coe文件或Verilog的readmemh,注意路径和格式。建议在仿真中先打印ROM内容验证。
  • 坑3:ZigZag扫描地址生成错误。ZigZag索引表可用组合逻辑生成,但注意边界条件(最后一行/列)。建议用状态机实现,每个时钟输出一个系数。

3.4 验证策略

推荐采用三阶段验证:

    模块级仿真:对dct_1d、quantizer等模块单独编写testbench,用MATLAB生成参考结果对比。系统级仿真:编写顶层testbench,读取外部图像文件(如BMP转hex),施加到DUT,输出结果与MATLAB压缩结果对比PSNR。上板测试:利用ILA抓取内部信号,验证流水线是否每个周期都有输出。

验收检查清单

    [ ] 仿真中DCT系数与MATLAB差异 < 1%[ ] 量化后系数与标准JPEG一致[ ] 综合后Fmax ≥ 100 MHz[ ] 上板后串口输出数据量与预期一致

原理与设计说明

本节解释为什么选择DCT+量化作为压缩核心,以及关键trade-off。

4.1 为什么选择DCT?

离散余弦变换(DCT)是JPEG标准的核心,它将空间域像素转换为频率域系数。低频分量集中在左上角,高频分量在右下角。人眼对高频不敏感,因此可以通过量化去除高频信息,实现压缩。与FFT相比,DCT只有余弦项,边界效应更小,更适合图像块处理。

4.2 资源 vs Fmax的权衡

实现DCT有几种架构:

    全并行流水线:每个时钟周期处理一个8x8块,需要大量乘法器和加法器(约64个DSP),Fmax高(>200 MHz),但资源消耗大。迭代架构:使用少量乘法器分时复用,面积小但吞吐率低(每64个时钟处理一个块)。行列分解流水线:先对行做一维DCT(8个乘法器),转置后对列做一维DCT(8个乘法器),共16个DSP。这是本设计选用的方案,平衡了面积和吞吐率(每个时钟处理一个像素,块延迟约16个时钟)。

量化实现:标准JPEG量化表包含64个系数,每个系数范围1-255。除法用乘法器实现(乘以量化系数的倒数,再右移),但为了节省DSP,我们采用查找表+移位的方法:对于每个量化系数,预先计算其倒数(定点数),存储在BRAM中,然后乘法实现。这样每个量化步骤只需一个乘法器,共64个系数共享一个乘法器(通过时分复用)。

验证与结果

以下是在PYNQ-Z2上测试得到的一组典型结果(使用标准Lena图像512x512,灰度):

指标测量值条件
最大频率 (Fmax)142 MHzVivado 2022.2,默认实现策略
LUT资源4230 (占7.6%)xc7z020clg400-1
BRAM (36Kb)14 (占10%)用于输入缓冲、量化表ROM、输出FIFO
DSP48E116 (占7.3%)用于DCT和量化乘法
吞吐率64 像素/时钟 (流水线满)每个时钟输出一个像素(压缩后)
压缩比约 2.5:1量化表为JPEG标准亮度表(质量因子50)
PSNR31.2 dB原图与解压后图像比较(软件解压)

测量条件:时钟125 MHz(实际板载100 MHz,但通过MMCM倍频到125 MHz测试极限)。输入为连续像素流,无停顿。PSNR计算使用MATLAB,解压算法为软件标准JPEG解码(忽略熵编码部分)。

故障排查(Troubleshooting)

现象:综合后时序违规(slack为负)
原因:DCT模块中乘法器链路过长,未插入流水线寄存器。
检查点:查看时序报告中的最差路径,定位到dct_1d模块。
    现象:综合后时序违规(slack为负)
    原因:DCT模块中乘法器链路过长,未插入流水线寄存器。
    检查点:查看时序报告中的最差路径,定位到dct_1d模块。
标签:
本文原创,作者:二牛学FPGA,其版权均为FPGA线上课程平台|最全栈的FPGA学习平台|FPGA工程师认证培训所有。
如需转载,请注明出处:https://z.shaonianxue.cn/38138.html
二牛学FPGA

二牛学FPGA

初级工程师
这家伙真懒,几个字都不愿写!
72517.70W3.94W3.67W
分享:
成电国芯FPGA赛事课即将上线
基于图像压缩的实时处理系统设计指南:FPGA毕业设计实践
基于图像压缩的实时处理系统设计指南:FPGA毕业设计实践上一篇
FPGA竞赛设计指南:有限资源下实现高性能流水线加法器下一篇
FPGA竞赛设计指南:有限资源下实现高性能流水线加法器
相关文章
总数:744
基于SDRAM的实时数据采集与存储系统设计指南

基于SDRAM的实时数据采集与存储系统设计指南

QuickStart准备硬件平台:选用XilinxArtix-7F…
技术分享
2天前
0
0
7
0
基于状态机的交通灯控制系统设计与实现指南

基于状态机的交通灯控制系统设计与实现指南

QuickStart(快速上手)本指南将引导您从零开始,在FPGA上实…
技术分享
4小时前
0
0
3
0
FPGA中ROM、RAM与FIFO的IP核配置与资源对比

FPGA中ROM、RAM与FIFO的IP核配置与资源对比

QuickStart步骤一:打开Vivado(或Quartus),创建…
技术分享
2天前
0
0
9
0
评论表单游客 您好,欢迎参与讨论。
加载中…
评论列表
总数:0
FPGA线上课程平台|最全栈的FPGA学习平台|FPGA工程师认证培训
没有相关内容