原图片(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的一半..........