VGA接口时序练习之图像动态显示

来源:互联网 发布:格力空调代码含义 知乎 编辑:程序博客网 时间:2024/05/17 03:42

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

640/480

72

31

40

125

646

21

832

800/600

60

40

128

85

806

37

1056

800/600

56

36

72

125

806

21

1024

800/600

72

50

120

611

806

53

1040

 

2.垂直时序:

分辨率

刷新速率

像素频率

同步脉冲

后沿

有效时间

前沿

帧长

640/480

60

31

2

30

484

9

525

640/480

72

26

3

26

484

7

520

800/600

56

28

1

20

604

-1

625

800/600

60

26

4

21

604

-1

628

800/600

72

20

6

21

604

35

666

 

VGA行时序:

VGA场时序:


VGA颜色显示原理:

         通过三基色r,g,b的不同组合,显示出不同的颜色。


三基色示意图如下:


三基色颜色编码:

颜色

绿

R

0

0

1

1

0

0

1

1

G

0

0

0

0

1

1

1

1

B

0

1

0

1

0

1

0

1

 

代码部分:

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

分辨率:600*480

功能:每隔3s变化一次,a~e循环变换

a.全红

b.全白

c.2*2  4部分,分别是:红,蓝,绿,黄

d.3*3  9部分,分别是:红黄蓝绿黑紫白青粉

e.150*100矩形边框,边缘是20宽度的绿色框,其他为白色

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

 

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 clkor negedge rst_n)

    if(!rst_n)

        lcd_hs_cnt <=10'd0;

    else if(lcd_hs_cnt==LCD_HS_CNT)

        lcd_hs_cnt <=10'd0;

    else

        lcd_hs_cnt <= lcd_hs_cnt+ 1'b1;

       

reg lcd_hs;    

always@(posedge clkor negedge rst_n)

    if(!rst_n)

        lcd_hs <=1'b0;

    else if(lcd_hs_cnt<96)

        lcd_hs <=1'b0;

    else

        lcd_hs <=1'b1;

       

reg [9:0] lcd_vs_cnt;//场同步计数 

always@(posedge clkor negedge rst_n)

    if(!rst_n)

        lcd_vs_cnt <=10'd0;

    else if(lcd_hs_cnt==LCD_HS_CNT&& lcd_vs_cnt==LCD_VS_CNT)  

        lcd_vs_cnt <=10'd0;

    else if(lcd_hs_cnt==LCD_HS_CNT)

        lcd_vs_cnt <= lcd_vs_cnt+ 1'b1;

    else if(lcd_vs_cnt==LCD_VS_CNT)

        lcd_vs_cnt <= lcd_vs_cnt;

   

reg lcd_vs;        

always@(posedge clkor negedge rst_n)

    if(!rst_n)

        lcd_vs <=1'b0;

    else if(lcd_vs_cnt<2)

        lcd_vs <=1'b0;

    else

        lcd_vs <=1'b1;

 

reg [24:0]time_1s;         //1s计数器

always@(posedge clkor negedge rst_n)

    if(!rst_n)

        time_1s <=25'd0;

    else if(time_1s ==24_999_999)

        time_1s <=25'd0;

    else

        time_1s <= time_1s+ 1'b1;

       

reg [3:0]time_1s_cnt;      //计数1s的个数

always @(posedge clk ornegedge rst_n)

    if(!rst_n)

        time_1s_cnt<=4'd0;

    else if(time_1s_cnt==14)

        time_1s_cnt <=4'd0;

    else if(time_1s==24_999_999)

        time_1s_cnt <= time_1s_cnt+ 1'b1;

    else

        time_1s_cnt <= time_1s_cnt;    

       

reg [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)&& (lcd_vs_cnt<= 516));

end

 

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

reg [9:0]valid_area_c1;//画出矩形,长为:464-141=323,宽为:274-32=242

always@(*)begin

    valid_area_c1 = ((lcd_hs_cnt >=141)&& (lcd_hs_cnt<= 464)&& (lcd_vs_cnt>= 32)&& (lcd_vs_cnt<= 274));

end

 

reg [9:0]valid_area_c2;//画出矩形,长为:787-464=323,宽为:274-32=242

always@(*)begin

    valid_area_c2 = ((lcd_hs_cnt >=464)&& (lcd_hs_cnt<= 787)&& (lcd_vs_cnt>= 32)&& (lcd_vs_cnt<= 274));

end

 

reg [9:0]valid_area_c3;//画出矩形,长为:464-141=323,宽为:516-274=242

always@(*)begin

    valid_area_c3 = ((lcd_hs_cnt >=141)&& (lcd_hs_cnt<= 464)&& (lcd_vs_cnt>= 274)&& (lcd_vs_cnt<= 516));

end

   

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

reg [9:0]valid_area_d1;//画出矩形,长为:356-141=215,宽为:193-32=161

always@(*)begin

    valid_area_d1 = ((lcd_hs_cnt >=141)&& (lcd_hs_cnt<= 356)&& (lcd_vs_cnt>= 32)&& (lcd_vs_cnt<= 193));

end

 

reg [9:0]valid_area_d2;//画出矩形,长为:571-356=215,宽为:354-193=161

always@(*)begin

    valid_area_d2 = ((lcd_hs_cnt >=356)&& (lcd_hs_cnt<= 571)&& (lcd_vs_cnt>= 32)&& (lcd_vs_cnt<= 193));

end

 

reg [9:0]valid_area_d3;//画出矩形,长为:787-571=216,宽为:516-354=162

always@(*)begin

    valid_area_d3 = ((lcd_hs_cnt >=571)&& (lcd_hs_cnt<= 787)&& (lcd_vs_cnt>= 32)&& (lcd_vs_cnt<= 193));

end

 

reg [9:0]valid_area_d4;//画出矩形,长为:356-141=215,宽为:193-32=161

always@(*)begin

    valid_area_d4 = ((lcd_hs_cnt >=141)&& (lcd_hs_cnt<= 356)&& (lcd_vs_cnt>= 193)&& (lcd_vs_cnt<= 354));

end

 

reg [9:0]valid_area_d5;//画出矩形,长为:571-356=215,宽为:354-193=161

always@(*)begin

    valid_area_d5 = ((lcd_hs_cnt >=356)&& (lcd_hs_cnt<= 571)&& (lcd_vs_cnt>= 193)&& (lcd_vs_cnt<= 354));

end

 

reg [9:0]valid_area_d6;//画出矩形,长为:787-571=216,宽为:516-354=162

always@(*)begin

    valid_area_d6 = ((lcd_hs_cnt >=571)&& (lcd_hs_cnt<= 787)&& (lcd_vs_cnt>= 193)&& (lcd_vs_cnt<= 354));

end

 

reg [9:0]valid_area_d7;//画出矩形,长为:356-141=215,宽为:193-32=161

always@(*)begin

    valid_area_d7 = ((lcd_hs_cnt >=141)&& (lcd_hs_cnt<= 356)&& (lcd_vs_cnt>= 354)&& (lcd_vs_cnt<= 516));

end

 

reg [9:0]valid_area_d8;//画出矩形,长为:571-356=215,宽为:354-193=161

always@(*)begin

    valid_area_d8 = ((lcd_hs_cnt >=356)&& (lcd_hs_cnt<= 571)&& (lcd_vs_cnt>= 354)&& (lcd_vs_cnt<= 516));

end

 

//e:150*100边框

reg [9:0]valid_area_e; 

always@(*)begin

    valid_area_e = ((lcd_hs_cnt >=389)&& (lcd_hs_cnt<= 539)&& (lcd_vs_cnt>= 224)&& (lcd_vs_cnt<= 324));

end

 

reg [9:0]valid_area_e1;

always@(*)begin

    valid_area_e1 = (((lcd_hs_cnt >=389) && (lcd_hs_cnt <=409)) |

                         ((lcd_hs_cnt>= 519)&& (lcd_hs_cnt<= 539))|

                          ((lcd_vs_cnt>= 224)&& (lcd_vs_cnt<= 244))|

                         ((lcd_vs_cnt>= 304)&& (lcd_vs_cnt<= 324)));

end

 

reg [7:0]lcd_data; 

always@(posedge clkor negedge rst_n)

    if(!rst_n)

        lcd_data <=8'h0;

    else 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

            lcd_data <=8'b111_111_11; //全白

        else 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; //

            else if(valid_area_c3)

                lcd_data <=8'b000_111_00; //绿

            else   

                lcd_data <=8'b111_111_00; //

        else if(time_1s_cnt>=9&& time_1s_cnt<=11) //d

            if(valid_area_d1)

                lcd_data <=8'b111_000_00;//

            else if(valid_area_d2)

                lcd_data <=8'b111_111_00;//

            else if(valid_area_d3)

                lcd_data <=8'b000_000_11;//

            else if(valid_area_d4)

               lcd_data <=8'b000_111_00;//绿

            else if(valid_area_d5)

                lcd_data <=8'b000_000_00;//

            else if(valid_area_d6)

                lcd_data <=8'b111_000_11;//

            else if(valid_area_d7)

                lcd_data <=8'b111_111_11;//

            else if(valid_area_d8)

                lcd_data <=8'b000_111_11;//

            else

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

        else 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;//

            else

                lcd_data <=8'b111_111_11;//         

    end

    else

        lcd_data <=8'h0;              //black

 

endmodule

 

ps:行边沿从141开始,场边沿从32开始,使得图像在显示屏的中心显示。

 

在电脑显示屏上的显示结果如下:

 

0 0
原创粉丝点击