实验四:图像灰度处理

实验四 图像处理实验报告

目录

  1. 实验目的
  2. 实验内容
  3. 实验体会
  4. 实验照片

实验目的

在实验三的基础上,将图片显示在显示器上,并进行灰度处理。


实验内容

原理描述

1. 图片的分辨率、尺寸和位深度
  • 分辨率:每英寸内有多少个像素点(如dpi、lpi、ppi),决定了图像细节度。
  • 尺寸:图片的像素长和宽,如640×480表示宽640像素、高480像素。
  • 位深度:每个像素用多少位(bit)表示,如24位能表示2^24种颜色。
2. 图片数据导入方法
  • 方法一:用Matlab将图片转为三维矩阵,提取RGB分量,按GRB565格式拼接,写入.coe文件。
  • 方法二:用BMP2Mif等工具将图片直接转为.coe文件。
  • 过程 :
    1. 用BMP2Mif生成.coe文件。
    2. 在Vivado生成ROM IP核,导入.coe。
    3. 设置RGB格式,VGA扫描显示图像。
3. VGA显示与灰度处理原理
  • 通过VGA协议分时扫描输出RGB信号。
  • 用IP核ROM存放图片像素数据,VGA扫描时顺序读出。
  • 灰度处理:将彩色像素转为灰度级像素,简化显示效果。

Verilog HDL设计源代码

verilog 复制代码
module vga_tu(
    input clock, 
    output reg [3:0] red,    // R
    output reg [3:0] green,  // G
    output reg [3:0] blue,   // B
    output hsync,            // 行同步信号
    output vsync             // 场同步信号
);
    reg [9:0] hcount;     // 行计数
    reg [9:0] vcount;     // 场计数
    wire hcount_ov;       // 是否完成一行
    wire vcount_ov;       // 是否完成一场
    wire dat_act;         // 是否在显示区域
    reg vga_clk;          // VGA时钟分频
    reg clk_tmp;

    // VGA时序参数
    parameter hsync_end = 10'd95,
              hdat_begin = 10'd143,
              hdat_end = 10'd783,
              hpixel_end = 10'd799,
              vsync_end = 10'd1,
              vdat_begin = 10'd34,
              vdat_end = 10'd514,
              vline_end = 10'd524;

    // 时钟分频
    always @(posedge clk_tmp) 
        vga_clk <= ~vga_clk;
    always @(posedge clock)
        clk_tmp <= ~clk_tmp;

    // 行扫描
    always @(posedge vga_clk) begin
        if (hcount_ov)
            hcount <= 10'd0;
        else
            hcount <= hcount + 10'd1;
    end
    assign hcount_ov = (hcount == hpixel_end);

    // 场扫描
    always @(posedge vga_clk) begin
        if (hcount_ov) begin
            if (vcount_ov)
                vcount <= 10'd0;
            else
                vcount <= vcount + 10'd1;
        end
    end
    assign vcount_ov = (vcount == vline_end);

    assign dat_act = ((hcount >= hdat_begin) && (hcount < hdat_end)) &&
                     ((vcount >= vdat_begin) && (vcount < vdat_end));
    assign hsync = (hcount > hsync_end);
    assign vsync = (vcount > vsync_end);

    // 判断是否在图片显示区域
    wire now_show;
    assign now_show = ((hcount <= 199 + hdat_begin) && (hcount >= 0) && (vcount <= 125 + vdat_begin) && (vcount >= 0));

    // 导入IP核
    reg [14:0] addra;
    wire [15:0] douta;
    blk_mem_gen_0 your_instance_name (
        .clka(vga_clk),    
        .addra(addra),       // 像素点计数
        .douta(douta)        // 图片颜色信息
    );

    // R灰度处理
    wire [15:0] R_grey;
    assign R_grey = {douta[15:11], douta[15:11], 1'b0, douta[15:11]};

    // 图片显示及灰度处理
    always @(posedge vga_clk) begin
        if(dat_act) begin         // 在显示区域
            if(now_show) begin    // 在图片显示区域
                red   <= R_grey[15:12];
                green <= R_grey[10:7];
                blue  <= R_grey[4:1];
                if(addra == 25200 - 1)   // 图片大小为250x600
                    addra <= 0;
                else
                    addra <= addra + 1;
            end
        end
    end
endmodule

XDC文件配置

xdc 复制代码
set_property PACKAGE_PIN D8 [get_ports {blue[3]}]
set_property PACKAGE_PIN D7 [get_ports {blue[2]}]
set_property PACKAGE_PIN C7 [get_ports {blue[1]}]
set_property PACKAGE_PIN B7 [get_ports {blue[0]}]
set_property PACKAGE_PIN A6 [get_ports {green[3]}]
set_property PACKAGE_PIN B6 [get_ports {green[2]}]
set_property PACKAGE_PIN A5 [get_ports {green[1]}]
set_property PACKAGE_PIN C6 [get_ports {green[0]}]
set_property PACKAGE_PIN A4 [get_ports {red[3]}]
set_property PACKAGE_PIN C5 [get_ports {red[2]}]
set_property PACKAGE_PIN B4 [get_ports {red[1]}]
set_property PACKAGE_PIN A3 [get_ports {red[0]}]
set_property PACKAGE_PIN E3 [get_ports clock]
set_property PACKAGE_PIN B11 [get_ports hsync]
set_property PACKAGE_PIN B12 [get_ports vsync]
set_property IOSTANDARD LVCMOS33 [get_ports {blue[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports {blue[2]}]
set_property IOSTANDARD LVCMOS33 [get_ports {blue[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {blue[0]}]
set_property IOSTANDARD LVCMOS33 [get_ports clock]
set_property IOSTANDARD LVCMOS33 [get_ports vsync]
set_property IOSTANDARD LVCMOS33 [get_ports {green[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports {green[2]}]
set_property IOSTANDARD LVCMOS33 [get_ports {green[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {green[0]}]
set_property IOSTANDARD LVCMOS33 [get_ports {red[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports {red[2]}]
set_property IOSTANDARD LVCMOS33 [get_ports {red[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {red[0]}]
set_property IOSTANDARD LVCMOS33 [get_ports hsync]

下板测试

  • 灰度处理前:
  • 灰度处理后:

实验体会

  • 学会了导入IP核,以及图片数据在FPGA中的读取与VGA显示原理。
  • 掌握了使用BMP2Mif等工具一键生成.coe文件,极大方便了图片数据的转换和导入。
  • 实验过程中需不断试错、调参和验证,培养了耐心和工程实操能力。
  • 抓住课堂时间高效完成实验,有助于巩固理论知识,提高实践效率。

相关推荐
XMAIPC_Robot2 小时前
基于 i.MX95 平台在新一代工业控制器中的应用 — 工业车载平板、半导体设备主控方案解析
arm开发·人工智能·机器学习·fpga开发·rk3588+fpga·i.mx95
szxinmai主板定制专家3 小时前
基于 AM62x + Artix-7 的低功耗 ARM+FPGA 平台在轨道交通车门控制中的应用
arm开发·人工智能·fpga开发·zynq·am62x
幻智星科技3 小时前
我砍掉了FPGA里的ARM核项目反而提前交付了
arm开发·网络协议·fpga开发·硬件架构
逐光者9333 小时前
Verilog 三段式状态机:原理、模板与实战
fpga开发
XMAIPC_Robot3 小时前
NXP i.MX95 + FPGA 异构计算平台 — 工业多域融合 AI 加速嵌入式控制解决方案
人工智能·分布式·fpga开发·能源·rk3576+fpga
FPGA小迷弟16 小时前
用 Claude Code 重构遗留系统:从评估到落地的完整指南
fpga开发·dsp开发·fpga·1024程序员节·sdr·无线电
专注仿真1 天前
Vivado FPGA 开发实战项目:从入门到上板
fpga开发
NamoAmitabha1281 天前
BSP,板级支持包--deepseek
单片机·嵌入式硬件·fpga开发
szxinmai主板定制专家1 天前
ARM 还是 x86?CODESYS 数控机床控制器选型、FPGA 取舍与实时性真相
arm开发·人工智能·fpga开发·zynq·1024程序员节·codesys
星夜离尘562 天前
FPGA 小数据字如何纠错:完整实现并验证扩展 Hamming (13,8) SECDED
fpga开发