您的位置:首页 > 其它

Verilog的VGA显示控制

2009-11-29 10:12 393 查看
from : 好友博客:http://www.edabc.net/blog/?uid-20-action-viewspace-itemid-591

一、[b]VGA时序[/b]

下面的图是本人画了一个晚上的结果,个人认为能够比较详细的阐述VGA的信号时序

module VGA(clk,rst_n,hsync,vsync,vga_r,vga_g,vga_b);
2
3
4
5input clk; //50MHz
6
7input rst_n; //复位信号
8
9output hsync; //行同步信号
10
11output vsync; //场同步信号
12
13// R、G、B信号输出
14
15output[1:0] vga_r;
16
17output[2:0] vga_g;
18
19output[2:0] vga_b;
20
21//--------------------------------------------------
22
23reg[10:0] x_cnt; //行坐标(这里包括了行同步、后沿、有效数据区、前沿)
24
25reg[9:0] y_cnt; //列坐标(这里包括了场同步、后沿、有效数据区、前沿)
26
27reg[5:0] Xcoloradd;
28
29reg[2:0] Ycoloradd;
30
31
32
33parameter
34
35 Left = 184,
36
37 PixelWidth = 100,
38
39 Top = 29;
40
41
42
43always @ (posedge clk or negedge rst_n)
44
45 if(!rst_n) x_cnt <= 10'd0;
46
47 else if(x_cnt == 11'd1040) x_cnt <= 10'd0; //行计数记到1040
48
49 else x_cnt <= x_cnt+1'b1;
50
51
52
53always @ (posedge clk or negedge rst_n)//产生行地址(ROM水平地址)
54
55 if(!rst_n) Xcoloradd <= 6'b000000;
56
57 else if(x_cnt >= Left && x_cnt <Left + PixelWidth) Xcoloradd <= 6'b000000;
58
59 else if(x_cnt >= Left + PixelWidth && x_cnt <Left + 2*PixelWidth) Xcoloradd <= 6'b000001;
60
61 else if(x_cnt >= Left + 2*PixelWidth && x_cnt <Left + 3*PixelWidth) Xcoloradd <= 6'b000010;
62
63 else if(x_cnt >= Left + 3*PixelWidth && x_cnt <Left + 4*PixelWidth) Xcoloradd <= 6'b000011;
64
65 else if(x_cnt >= Left + 4*PixelWidth && x_cnt <Left + 5*PixelWidth) Xcoloradd <= 6'b000100;
66
67 else if(x_cnt >= Left + 5*PixelWidth && x_cnt <Left + 6*PixelWidth) Xcoloradd <= 6'b000101;
68
69 else if(x_cnt >= Left + 6*PixelWidth && x_cnt <Left + 7*PixelWidth) Xcoloradd <= 6'b000110;
70
71 else if(x_cnt >= Left + 7*PixelWidth && x_cnt <Left + 8*PixelWidth) Xcoloradd <= 6'b000111;
72
73 else Xcoloradd <= 6'b110000;//背景颜色地址
74
75
76
77always @ (posedge clk or negedge rst_n)
78
79 if(!rst_n) y_cnt <= 10'd0;
80
81 else if(y_cnt == 10'd666) y_cnt <= 10'd0; //场同步记到666
82
83 else if(x_cnt == 11'd1040) y_cnt <= y_cnt+1'b1;//每计数完一行,场同步就加一
84
85
86
87always @ (posedge clk or negedge rst_n)//产生列地址(ROM垂直地址)
88
89 if(!rst_n) Ycoloradd <= 3'b000;
90
91 else if(y_cnt >= Top && y_cnt < Top + PixelWidth) Ycoloradd <= 3'b000;
92
93 else if(y_cnt >= Top + PixelWidth && y_cnt < Top + 2*PixelWidth) Ycoloradd <= 3'b001;
94
95 else if(y_cnt >= Top + 2*PixelWidth && y_cnt < Top + 3*PixelWidth) Ycoloradd <= 3'b010;
96
97 else if(y_cnt >= Top + 3*PixelWidth && y_cnt < Top + 4*PixelWidth) Ycoloradd <= 3'b011;
98
99 else if(y_cnt >= Top + 4*PixelWidth && y_cnt < Top + 5*PixelWidth) Ycoloradd <= 3'b100;

else if(y_cnt >= Top + 5*PixelWidth && y_cnt < Top + 6*PixelWidth) Ycoloradd <= 3'b101;

else Ycoloradd <= 3'b110;//背景颜色地址

//--------------------------------------------------

// signal port ROM

wire[7:0] color;

wire[5:0] coloradd;

六、后记

在这次程序中只在ROM中存储了一些随机的数,因此显示出来是一些小方格
如果ROM做的更大,完全可以存储一幅图像,显示在LCD中
不过由于由于用ROM做为显存,每次只能显示一幅静态的图像,而且没有加入字符库,不能显示字符
在下次的文章中,我将使用双口RAM,加上Nios II处理器,这样可以方便的显示各种字符
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: