天天看點

VGA接口時序練習之圖像動态顯示

vga練習之動态顯示圖案

vga接口應用,并在電腦顯示屏上顯示

功能:每隔3s變化一次,a~e循環變換

a.全紅

b.全白

c.2*2  4部分,分别是:紅,藍,綠,黃

d.3*3  9部分,分别是:紅黃藍綠黑紫白青粉

e.150*100矩形邊框,邊緣是20寬度的綠色框,其他為白色

分辨率:600*480

vga支援的規格:

1.水準時序:

分辨率

重新整理速率

像素頻率

同步脈沖

後沿

有效時間

前沿

幀長

640/480

60

25

96

45

646

13

800

72

31

40

125

21

832

800/600

128

85

806

37

1056

56

36

1024

50

120

611

53

1040

2.垂直時序:

2

30

484

9

525

26

3

7

520

28

1

20

604

-1

625

4

628

6

35

666

vga行時序:

VGA接口時序練習之圖像動态顯示

vga場時序:

VGA接口時序練習之圖像動态顯示

vga顔色顯示原理:

         通過三基色r,g,b的不同組合,顯示出不同的顔色。

三基色示意圖如下:

VGA接口時序練習之圖像動态顯示

三基色顔色編碼:

顔色

r

g

b

代碼部分:

/******************************

********************************/

module vga_test4(clk,rst_n,lcd_data,lcd_hs,lcd_vs);

input clk;  

//25mhz

input rst_n;

output lcd_vs;//場同步信号

output lcd_hs;//行同步信号

output

[7:0]lcd_data;//lcd_data[1:0]是b,

//lcd_data[4:2]是g,lcd_data[7:5]是r

parameter lcd_hs_cnt

= 799,

              lcd_vs_cnt

= 524;

reg

[9:0] lcd_hs_cnt;//行同步計數

always@(posedge clk

or negedge rst_n)

    if(!rst_n)

        lcd_hs_cnt <=

10'd0;

    else

if(lcd_hs_cnt==lcd_hs_cnt)

        lcd_hs_cnt <= lcd_hs_cnt

+ 1'b1;

reg lcd_hs;    

        lcd_hs <=

1'b0;

if(lcd_hs_cnt<96)

1'b1;

[9:0] lcd_vs_cnt;//場同步計數 

        lcd_vs_cnt <=

if(lcd_hs_cnt==lcd_hs_cnt

&& lcd_vs_cnt==lcd_vs_cnt)  

        lcd_vs_cnt <= lcd_vs_cnt

if(lcd_vs_cnt==lcd_vs_cnt)

        lcd_vs_cnt <= lcd_vs_cnt;

reg lcd_vs;        

        lcd_vs <=

if(lcd_vs_cnt<2)

[24:0]time_1s;         

//1s計數器

        time_1s <=

25'd0;

if(time_1s ==

24_999_999)

        time_1s <= time_1s

[3:0]time_1s_cnt;      

//計數1s的個數

always

@(posedge clk or

negedge rst_n)

        time_1s_cnt<=

4'd0;

if(time_1s_cnt==14)

        time_1s_cnt <=

if(time_1s==24_999_999)

        time_1s_cnt <= time_1s_cnt

        time_1s_cnt <= time_1s_cnt;    

[9:0]valid_area;   

//畫出矩形,長為:787-141=646,寬為:516-32=484

always@(*)begin

    valid_area =

((lcd_hs_cnt >=141)

&& (lcd_hs_cnt

<= 787)

&& (lcd_vs_cnt

>= 32)

<= 516));

end

//c:2*2 4部分,将646*484分成4部分

[9:0]valid_area_c1;

//畫出矩形,長為:464-141=323,寬為:274-32=242

    valid_area_c1 =

<= 464)

<= 274));

[9:0]valid_area_c2;

//畫出矩形,長為:787-464=323,寬為:274-32=242

    valid_area_c2 =

((lcd_hs_cnt >=464)

[9:0]valid_area_c3;

//畫出矩形,長為:464-141=323,寬為:516-274=242

    valid_area_c3 =

>= 274)

//d:3*3 9部分,将646*484分成9部分

[9:0]valid_area_d1;

//畫出矩形,長為:356-141=215,寬為:193-32=161

    valid_area_d1 =

<= 356)

<= 193));

[9:0]valid_area_d2;

//畫出矩形,長為:571-356=215,寬為:354-193=161

    valid_area_d2 =

((lcd_hs_cnt >=356)

<= 571)

[9:0]valid_area_d3;

//畫出矩形,長為:787-571=216,寬為:516-354=162

    valid_area_d3 =

((lcd_hs_cnt >=571)

[9:0]valid_area_d4;

    valid_area_d4 =

>= 193)

<= 354));

[9:0]valid_area_d5;

    valid_area_d5 =

[9:0]valid_area_d6;

    valid_area_d6 =

[9:0]valid_area_d7;

    valid_area_d7 =

>= 354)

[9:0]valid_area_d8;

    valid_area_d8 =

//e:150*100邊框

[9:0]valid_area_e; 

    valid_area_e =

((lcd_hs_cnt >=389)

<= 539)

>= 224)

<= 324));

[9:0]valid_area_e1;

    valid_area_e1 =

(((lcd_hs_cnt >=

389)

&& (lcd_hs_cnt <=

409))

|

                         ((lcd_hs_cnt

>= 519)

<= 539))

                          ((lcd_vs_cnt

<= 244))

                         ((lcd_vs_cnt

>= 304)

<= 324)));

[7:0]lcd_data; 

        lcd_data <=

8'h0;

if(valid_area)begin

        if(time_1s_cnt>=0

&& time_1s_cnt<=2)      

//a

            lcd_data <=

8'b111_000_00;  

//全紅

        else

if(time_1s_cnt>=3

&& time_1s_cnt<=5) 

//b

8'b111_111_11; 

//全白

if(time_1s_cnt>=6

&& time_1s_cnt<=8) 

//c

            if(valid_area_c1)

                lcd_data <=8'b111_000_00; 

//紅

            else

if(valid_area_c2)  

                lcd_data <=8'b000_000_11; 

//藍

if(valid_area_c3)

                lcd_data <=8'b000_111_00; 

//綠

            else   

                lcd_data <=8'b111_111_00; 

//黃

if(time_1s_cnt>=9

&& time_1s_cnt<=11) 

//d

            if(valid_area_d1)

                lcd_data <=8'b111_000_00;//紅

if(valid_area_d2)

                lcd_data <=8'b111_111_00;//黃

if(valid_area_d3)

                lcd_data <=8'b000_000_11;//藍

if(valid_area_d4)

               lcd_data <=8'b000_111_00;//綠

if(valid_area_d5)

                lcd_data <=8'b000_000_00;//黑

if(valid_area_d6)

                lcd_data <=8'b111_000_11;//紫

if(valid_area_d7)

                lcd_data <=8'b111_111_11;//白

if(valid_area_d8)

                lcd_data <=8'b000_111_11;//青

                lcd_data <=8'b000_111_10;//粉(不知)

if(time_1s_cnt>=12

&& time_1s_cnt<=14) 

//e

            if(valid_area_e)

                if(valid_area_e1)

                    lcd_data <=8'b000_111_00;//綠

                else

                    lcd_data <=8'b111_111_11;//白

                lcd_data <=8'b111_111_11;//白         

    end

8'h0;              

//black

endmodule

ps:行邊沿從141開始,場邊沿從32開始,使得圖像在顯示屏的中心顯示。

在電腦顯示屏上的顯示結果如下:

VGA接口時序練習之圖像動态顯示
VGA接口時序練習之圖像動态顯示
VGA接口時序練習之圖像動态顯示
VGA接口時序練習之圖像動态顯示

繼續閱讀