/*
2017.9.19 gy DE2
vga 640x480 60hz
ADV7123 D/A
输入时钟50MHz 低电平复位
时序:
水平同步参数h 行扫描
同步 后沿 有效视屏 前沿 总
时间us 3.8 1.9 25.4 0.6 31.7
计数 96 48 640(l) 16 800
垂直同步参数v 列扫描
同步 后沿 有效视屏 前沿 总
行数 2 33 480(w) 10 525
时间us = 行数X扫描一行所需要的时间
像素时钟25MHz yue=800x525x60
总时间 =31.7usX525X60 yue=1s
计一个数的时间为 1/25MHz or 3.8/96
*/
module vga(
clk,rst_n, //input
vga_sync,vga_blank,vga_clk, //output ADV7123
vga_r,vga_g,vga_b,vga_hs,vga_vs //output VGA
);
input clk,rst_n;
output reg [9:0] vga_r,vga_g,vga_b;
output reg vga_clk,vga_hs,vga_vs;
output vga_blank,vga_sync;
//-------------------分频-------------------------
always @(posedge clk or negedge rst_n)
if (!rst_n)
vga_clk<=1'b0;
else vga_clk<=~vga_clk;
//---------------下面的时钟为vga_clk--------------
//---------------时序参数800x525------------------
parameter H_SYNC=10'd96;
parameter H_BACK=10'd48;
parameter H_LENGTH=10'd640;
parameter H_FRONT=10'd16;
parameter V_SYNC=10'd2;
parameter V_BACK=10'd33;
parameter V_WIDTH=10'd480;
parameter V_FRONT=10'd10;
reg [9:0] x,y;
//不用SOG(sync on green 同步信号只在绿色信号中出现)
assign vga_sync=1'b0;
//---------------------计数-----------------------
always@(posedge vga_clk or negedge rst_n)
begin
if(!rst_n) x<=10'd0;
else if(x==800) x<=0;
else x<=x+1'b1;
end
always@(posedge vga_clk or negedge rst_n)
begin
if(!rst_n) y<=10'd0;
else if(y==525) y<=0;
else if(x==800) y<=y+1'b1;
end
//------------通过计的数字输出同步信号---------
always@(posedge vga_clk or negedge rst_n)
begin
if(!rst_n) vga_hs<=1'b1;
else if(x==0) vga_hs<=1'b0;
else if(x==H_SYNC) vga_hs<=1'b1;
end
always@(posedge vga_clk or negedge rst_n)
begin
if(!rst_n) vga_vs<=1'b1;
else if(y==0) vga_vs<=1'b0;
else if(y==V_SYNC) vga_vs<=1'b1;
end
//----------通过横纵坐标x,y计算出显示的区域---
reg [9:0] vga_x,vga_y;
always@(posedge vga_clk)
begin
vga_x=x-H_SYNC-H_BACK;
vga_y=y-V_SYNC-V_BACK;
end
//---------------进行同步时消隐------------------
assign vga_blank=vga_x<H_LENGTH && vga_y<V_WIDTH;
//----------通过vga_x,vga_y显示相应颜色----------
parameter
haha0=16'h0000,
haha1=16'h3FF0,
haha2=16'h2020,
haha3=16'h2020,
haha4=16'h3FF0,
haha5=16'h0400,
haha6=16'h0A7F,
haha7=16'h1242,
haha8=16'h2242,
haha9=16'hC242,
haha10=16'h2242,
haha11=16'h1242,
haha12=16'h0A7F,
haha13=16'h0400,
haha14=16'h0400,
haha15=16'h0000;//哈 pctolcd
reg [3:0] w;
always @(posedge vga_clk or negedge rst_n)
if (!rst_n)
hei;
else if(300<=vga_x&&vga_x<332&&220<=vga_y&&vga_y<236)
begin
if(w==15) w<=0;
w<=w+1'b1;
case(w)
4'd0:if(haha0[236-vga_y]) hei; else bai;
4'd1:if(haha1[236-vga_y]) hei; else bai;
4'd2:if(haha2[236-vga_y]) hei; else bai;
4'd3:if(haha3[236-vga_y]) hei; else bai;
4'd4:if(haha4[236-vga_y]) hei; else bai;
4'd5:if(haha5[236-vga_y]) hei; else bai;
4'd6:if(haha6[236-vga_y]) hei; else bai;
4'd7:if(haha7[236-vga_y]) hei; else bai;
4'd8:if(haha8[236-vga_y]) hei; else bai;
4'd9:if(haha9[236-vga_y]) hei; else bai;
4'd10:if(haha10[236-vga_y]) hei; else bai;
4'd11:if(haha11[236-vga_y]) hei; else bai;
4'd12:if(haha12[236-vga_y]) hei; else bai;
4'd13:if(haha13[236-vga_y]) hei; else bai;
4'd14:if(haha14[236-vga_y]) hei; else bai;
4'd15:if(haha15[236-vga_y]) hei; else bai;
default:hei;
endcase
end
else
huang;
//----------------设置颜色------------------------
task hei;
begin
vga_r=10'b0;
vga_g=10'b0;
vga_b=10'b0;
end
endtask
task bai;
begin
vga_r=10'b1111111111;
vga_g=10'b1111111111;
vga_b=10'b1111111111;
end
endtask
task huang;
begin
vga_r=10'b1111111111;
vga_g=10'b1111111111;
vga_b=10'b0;
end
endtask
//----------------------结束-----------------------
endmodule