0
点赞
收藏
分享

微信扫一扫

FPGA实现HDMI显示图片(1)

原图片(480*480):

rgb.m(获取图片的RGB数据存在.coe文件里面)

src = imread('00743.jpg');
r = src(:,:,1);
g = src(:,:,2);
b = src(:,:,3);
data_r = reshape(r', 1,230400);
data_g = reshape(g', 1,230400);
data_b = reshape(b', 1,230400);%注意是先处理列!!!
fid=fopen('rgb_init.coe', 'wt');%打开文件
fprintf(fid, 'MEMORY_INITIALIZATION_RADIX=16;\n');
fprintf(fid, 'MEMORY_INITIALIZATION_VECTOR=\n');
for i = 1 : 230400-1
    fprintf(fid, '%x%x%x,\n', r(i),g(i),b(i));%使用%x表示十六进制数
end
fprintf(fid, '%x%x%x,\n', r(230400),g(230400),b(230400));%%输出结尾,每个数据后面用逗号或者空格或者换行符隔开,最后一个数据后面加分号
fclose(fid);%%关闭文件

然后把数据存在rom(480*480_24)里面;相对于上一个工程,只需要修改这个:

vga_pic.v

`timescale  1ns/1ns
//=======================================================================

// Filename           : vga_pic.v
// Author             : Ritian73
// Created On         : 2022-03-02 23:51
// Last Modified      : 
// Description        : 
//                      
//                      
//=======================================================================

module  vga_pic
(
    input   wire            vga_clk     ,   //输入工作时钟
    input   wire            sys_rst_n   ,   //输入复位信号,低电平有效
    input   wire    [11:0]  pix_x       ,   //输入VGA有效显示区域像素点X轴坐标
    input   wire    [11:0]  pix_y       ,   //输入VGA有效显示区域像素点Y轴坐标

    output  reg     [23:0]  pix_data        //输出像素点色彩信息
);
reg [17:0]addra;
wire [23:0]douta;
//********************************************************************//
//****************** Parameter and Internal Signal *******************//
//********************************************************************//
//parameter define
parameter   H_VALID =   12'd1920 ,   //行有效数据x
                   V_VALID =   12'd1080 ;   //场有效数据y

parameter   RED     =   24'hff0000,   //红色
            ORANGE  =   24'hff7d00,   //橙色
            YELLOW  =   24'hffff00,   //黄色
            GREEN   =   24'h00ff00,   //绿色
            CYAN    =   24'h0000ff,   //青色
            BLUE    =   24'h00ffff,   //蓝色
            PURPPLE =   24'hff00ff,   //紫色
            BLACK   =   24'hff0000,   //黑色
            WHITE   =   24'hff7d00,   //白色
            GRAY    =   24'hffff00;   //灰色

/*
//pix_data:输出像素点色彩信息,根据当前像素点坐标指定当前像素点颜色数据
always@(posedge vga_clk or negedge sys_rst_n)
    if(sys_rst_n == 1'b0)
        pix_data    <= 23'd0;
    else    if((pix_x >= 0) && (pix_x < (H_VALID/10)*1))
        pix_data    <=  RED;
    else    if((pix_x >= (H_VALID/10)*1) && (pix_x < (H_VALID/10)*2))
        pix_data    <=  ORANGE;
    else    if((pix_x >= (H_VALID/10)*2) && (pix_x < (H_VALID/10)*3))
        pix_data    <=  YELLOW;
    else    if((pix_x >= (H_VALID/10)*3) && (pix_x < (H_VALID/10)*4))
        pix_data    <=  GREEN;
    else    if((pix_x >= (H_VALID/10)*4) && (pix_x < (H_VALID/10)*5))
        pix_data    <=  CYAN;
    else    if((pix_x >= (H_VALID/10)*5) && (pix_x < (H_VALID/10)*6))
        pix_data    <=  BLUE;
    else    if((pix_x >= (H_VALID/10)*6) && (pix_x < (H_VALID/10)*7))
        pix_data    <=  PURPPLE;
    else    if((pix_x >= (H_VALID/10)*7) && (pix_x < (H_VALID/10)*8))
        pix_data    <=  BLACK;
    else    if((pix_x >= (H_VALID/10)*8) && (pix_x < (H_VALID/10)*9))
        pix_data    <=  WHITE;
    else    if((pix_x >= (H_VALID/10)*9) && (pix_x < H_VALID))
        pix_data    <=  GRAY;
    else
        pix_data    <=  BLACK;*/

always@(posedge vga_clk or negedge sys_rst_n)
    if(sys_rst_n == 1'b0)begin
        pix_data    <= 24'd0;      
        end
     else if((pix_x >= 720) && (pix_x < 1920 - 720) && (pix_y >= 300) && (pix_y < 1080 - 300)) begin
        pix_data <= douta;
        
     end
     else
        pix_data    <= 24'hffffff;
 always@(posedge vga_clk or negedge sys_rst_n)
    if(sys_rst_n == 1'b0)begin
        addra        <=18'b0;
    end
    else if((pix_x >= 720) && (pix_x < 1920 - 720) && (pix_y >= 300) && (pix_y < 1080 - 300))
        addra     <= addra +1'b1;
    else if(addra == 18'd230400)
        addra        <=18'b0;   
    else
        addra        <=addra;   
 
Rom_24_230400 Rom_24_230400 (
  .clka(vga_clk),    // input wire clka
  .addra(addra),  // input wire [17 : 0] addra
  .douta(douta)  // output wire [23 : 0] douta
);
endmodule

效果图:

 这里要设置成镜像才是对的(重新导入数据时间有点久,俺就偷懒了)

 480*480*24bit的数据差不多占了Block Ram的一半..........

举报

相关推荐

0 条评论