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

    xiaoxiao2026-05-07  7

    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 clk or 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 clk or 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 clk or 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 clk or 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 clk or 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 or negedge 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 clk or 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开始,使得图像在显示屏的中心显示。

     

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

     

    相关资源:FPGA设计VGA显示切换 彩条横条动图
    最新回复(0)