在进行VGA显示图片之前先得了解VGA的时序。
VGA时序很简单,就是行扫描和列扫描。在这里就不讲其时序了。
1 设计思路:
先把一幅图片的数据通过软件 BmpToMif.exe 提前出来。如图所示:
上面是提取数据的设置。因为我用的是21EDA开发板,板子上配的是r ,g, b三色,所以在提前数据是三位。
显示器上显示的图片和实际对比的图片:
图上可以看出基本上是一致的。
2 设计的顶层原理图:
通过调用rom,把数据显示出来。
3 原代码:
`timescale 1ns/1ps
//
//
//
//
//
//
//
//
//
//
module tupian (
clk,
rst_n,
hsync,
vsync,
vga_r,
vga_g,
vga_b,
addr
);
input clk;
input rst_n;
output hsync;
output vsync;
output vga_r;
output vga_g;
output vga_b;
output [14:0] addr;
reg [14:0] addr;
reg [10:0] x_cnt; //行坐标
reg [9:0] y_cnt; //列坐标
always @ (posedge clk or negedge rst_n)
begin
if(!rst_n)
x_cnt <= 11'd0;
else if(x_cnt == 11'd1039)
x_cnt <= 11'd0;
else
x_cnt <= x_cnt + 1'd1;
end
always @ (posedge clk or negedge rst_n)
begin
if(!rst_n)
y_cnt <= 10'b0;
else if(y_cnt == 10'd665)
y_cnt <= 10'b0;
else if(x_cnt ==11'd1039 )
y_cnt <= y_cnt + 1'b1;
end
wire valid;
assign valid = (x_cnt >= 11'd187) && (x_cnt <= 11'd987) && (y_cnt >= 10'd31) && (y_cnt <= 10'd631);
//---------------有效显示区坐标--------------------
wire [9:0] xpos;
wire [9:0] ypos;
assign xpos = x_cnt-11'd187;
assign ypos = y_cnt-10'd31;
//-------------------同步信号产生-------------------
reg hsync_r,vsync_r;
always @ (posedge clk or negedge rst_n)
begin
if(!rst_n)
hsync_r <= 1'b1;
else if(x_cnt == 11'd0)
hsync_r <= 1'b0; //产生hsync信号
else if(x_cnt == 11'd120)
hsync_r <= 1'b1;
end
always @ (posedge clk or negedge rst_n)
begin
if(!rst_n)
vsync_r <= 1'b1;
else if(y_cnt == 10'd0)
vsync_r <= 1'b0; //产生vsync信号
else if(y_cnt == 10'd6)
vsync_r <= 1'b1;
end
assign hsync = hsync_r;
assign vsync = vsync_r;
//-----------------显示图像-----------------------
always @ (posedge clk )
begin
if((ypos >= 9'd100 && ypos <= 9'd255)&&(xpos >= 10'd65 && xpos <= 10'd244))
addr <= (ypos-100)*180 + (xpos-65);
else addr<=0;
end
endmodule
图片文件mif:
-- Copyright (C) 2006 Laputa Develop Group
-- PicToMif is a freeware, which can be spread freely,
-- as long as not being used in commerce.
-- Memory Initialization File (.mif) generated by PicToMif can
-- be used in Quartus to initialize the roms or rams.
WIDTH=3;
DEPTH=28080;
ADDRESS_RADIX=UNS;
DATA_RADIX=BIN;
CONTENT BEGIN
0 : 000;
1 : 111;
2 : 111;
3 : 111;
4 : 111;
5 : 111;
6 : 111;
7 : 111;
8 : 111;
9 : 111;
10 : 111;
11 : 111;
12 : 111;
13 : 111;
14 : 111;
由于很多,只贴出一部分,具体整个工程 下载地址:
http://download.csdn.net/detail/a14730497/4452591