1 module VGAcolorbar(clk,rst,hsync,vsync,vga_r,vga_g,vga_b );
2 input clk;
3 input rst;
4 output hsync;
5 output vsync;
6 output [2:0] vga_r;
7 output [2:0] vga_g;
8 output [1:0] vga_b;
9
10 reg clk2;
11 reg [9:0] x_cnt;//行坐标
12 reg [9:0] y_cnt;//列坐标
13
14 initial begin
15 clk2 = 0;
16 end
17
18 always @(posedge clk) clk2 <= ~clk2; //2分频,输入时钟25M
19
20 always @(posedge clk2 or negedge rst) //列扫描
21 if(!rst)
22 x_cnt <= 10'd0;
23 else if(x_cnt == 10'd799)
24 x_cnt <= 10'd0;
25 else
26 x_cnt <= x_cnt+1'b1;
27
28 always @(posedge clk2 or negedge rst) //行扫描
29 if(!rst)
30 y_cnt <= 10'd0;
31 else if(y_cnt == 10'd524) //扫描到524行
32 y_cnt <= 10'd0;
33 else if(x_cnt == 10'd799)
34 y_cnt <= y_cnt+1'b1;
35
36 reg hsync_r,vsync_r;//行,场同步信号
37
38 always @(posedge clk2 or negedge rst)
39 if(!rst)
40 hsync_r <= 1'b1;
41 else if(x_cnt == 10'd0)
42 hsync_r <= 1'b0;
43 else if(x_cnt == 10'd96)
44 hsync_r <= 1'b1;
45
46 always @(posedge clk2 or negedge rst)
47 if(!rst)
48 vsync_r <= 1'b1;
49 else if(y_cnt == 10'd0)
50 vsync_r <= 1'b0;
51 else if(y_cnt == 10'd2)
52 vsync_r <= 1'b1;
53
54 assign hsync = hsync_r;
55 assign vsync = vsync_r;
56 reg valid_yr;//有效标志位
57
58 always @(posedge clk2 or negedge rst)
59 if(!rst)
60 valid_yr <=1'b0;
61 else if(y_cnt == 10'd32)
62 valid_yr <= 1'b1; //32-512之间显示
63 else if(y_cnt == 10'd512)
64 valid_yr <= 1'b0;
65
66 wire valid_y = valid_yr;
67 reg valid_r;//有效显示标志区
68
69 always @(posedge clk2 or negedge rst)
70 if(!rst)
71 valid_r <= 1'b0;
72 else if((x_cnt == 10'd141) && valid_y)
73 valid_r <= 1'b1;
74 else if((x_cnt == 10'd781) && valid_y)
75 valid_r <= 1'b0;
76
77 wire valid = valid_r;
78 wire [9:0] x_dis;//横坐标显示有效区域相对坐标0-639
79 wire [9:0] y_dis;//纵坐标显示有效区域相对坐标0-479
80
81 assign x_dis = x_cnt - 10'd142;
82 assign y_dis = y_cnt - 10'd33;
83 //VGA色彩信号
84 reg [7:0] vga_rgb;
85
86 always @(posedge clk2)
87 if(!valid)
88 vga_rgb<=8'd0;
89 else begin
90 case(x_dis)
91 10'd0:begin
92 if(y_dis >= 10'd0 && y_dis < 10'd30) vga_rgb <=8'd0;
93 else if(y_dis >= 10'd30 && y_dis < 10'd60) vga_rgb <=8'd16;
94 else if(y_dis >= 10'd60 && y_dis < 10'd90) vga_rgb <=8'd32;
95 else if(y_dis >= 10'd90 && y_dis < 10'd120) vga_rgb <=8'd48;
96 else if(y_dis >= 10'd120 && y_dis < 10'd150) vga_rgb <=8'd64;
97 else if(y_dis >= 10'd150 && y_dis < 10'd180) vga_rgb <=8'd80;
98 else if(y_dis >= 10'd180 && y_dis < 10'd210) vga_rgb <=8'd96;
99 else if(y_dis >= 10'd210 && y_dis < 10'd240) vga_rgb <=8'd112;
100 else if(y_dis >= 10'd240 && y_dis < 10'd270) vga_rgb <=8'd128;
101 else if(y_dis >= 10'd270 && y_dis < 10'd300) vga_rgb <=8'd144;
102 else if(y_dis >= 10'd300 && y_dis < 10'd330) vga_rgb <=8'd160;
103 else if(y_dis >= 10'd330 && y_dis < 10'd360) vga_rgb <=8'd176;
104 else if(y_dis >= 10'd360 && y_dis < 10'd390) vga_rgb <=8'd192;
105 else if(y_dis >= 10'd390 && y_dis < 10'd420) vga_rgb <=8'd208;
106 else if(y_dis >= 10'd420 && y_dis < 10'd450) vga_rgb <=8'd224;
107 else vga_rgb <= 8'd240;
108 end
109 10'd40,10'd80,10'd120,10'd160,10'd200,10'd240,10'd280,10'd320,10'd360,
110 10'd400,10'd440,10'd480,10'd520,10'd560,10'd600:vga_rgb <= vga_rgb+1'b1;
111 default: ;
112 endcase
113 end
114
115 assign vga_r = vga_rgb[7:5];
116 assign vga_g = vga_rgb[4:2];
117 assign vga_b = vga_rgb[1:0];
118 endmodule