查看: 2250|回复: 2

基于FPGA的VGA驱动,真彩色!

[复制链接]
  • TA的每日心情
    奋斗
    2014-2-9 10:11
  • 签到天数: 16 天

    连续签到: 1 天

    [LV.4]偶尔看看III

    发表于 2014-11-4 16:56:39 | 显示全部楼层 |阅读模式
    分享到:
    很多开发板都是用IO 去驱动VGA,导致很多用户初次认识VGA是数字信号,其实VGA是模拟信号,最好的图像入门,需要弄清楚基本的图像知识。
    本贴提供adv7125的VGA驱动例程,附带简单说明,如有兴趣,可跟帖回复问题。
    module vga_control_module
    (
        VGA_CLK, RSTn,
        VGA_X, VGA_Y,
        VGA_ACT,
        VGA_R, VGA_G, VGA_B
    );

    input  VGA_CLK, RSTn;
    input[11:0] VGA_X, VGA_Y;
    input VGA_ACT;
    output[7:0] VGA_R, VGA_G, VGA_B;

    //Pattern Generator
    reg[7:0] VGA_Rr, VGA_Gr, VGA_Br;
    always @ (posedge VGA_CLK or negedge RSTn)
    begin
            if (!RSTn)
                    VGA_Rr <= 0;
            else
            begin
                    VGA_Rr <= (VGA_X < 10'd200) ? 8'd255:
                           //   (VGA_Y>=10'd100 && VGA_Y<=10'd200) ? 10'd896:
                           //   (VGA_Y>=10'd200 && VGA_Y<=10'd300) ? 8'd64:
                           //   (VGA_Y>=10'd300 && VGA_Y<=10'd400) ? 8'd128:
                            //  (VGA_Y>=10'd400 && VGA_Y<=10'd500) ? 10'd255:
                              0;           
            end
    end

    always @ (posedge VGA_CLK or negedge RSTn)
    begin
            if (!RSTn)
                    VGA_Gr <= 0;
            else
            begin  
                    VGA_Gr <= (VGA_X>10'd300 && VGA_X < 10'd500) ? 8'd255:
                                  //    (VGA_X>=10'd100 && VGA_X<=10'd200) ? 8'd0:
                                 //     (VGA_X>=10'd200 && VGA_X<=10'd300) ? 8'd32:
                                   //   (VGA_X>=10'd300 && VGA_X<=10'd400) ? 8'd64:
                                   //   (VGA_X>=10'd400 && VGA_X<=10'd500) ? 8'd128:
                                    //  (VGA_X>=10'd500 && VGA_X<=10'd600) ? 8'd255:
                                    //  (VGA_X>=10'd600 && VGA_X<=10'd700) ? 10'd896:
                              0;
            end
    end

    always @ (posedge VGA_CLK or negedge RSTn)
    begin
            if (!RSTn)
            VGA_Br <= 0;
            else
            begin                  
                    VGA_Br <= (VGA_X>10'd600 && VGA_X < 10'd800) ? 8'd255:
                                     // (VGA_Y>=10'd100 && VGA_Y<=10'd200) ? 8'd255:
                                     // (VGA_Y>=10'd200 && VGA_Y<=10'd300) ? 8'd128:
                                      //(VGA_Y>=10'd300 && VGA_Y<=10'd400) ? 8'd64:
                                      //(VGA_Y>=10'd400 && VGA_Y<=10'd500) ? 8'd32:
                            0;
            end
    end
    assign VGA_R = VGA_Rr;
    assign VGA_G = VGA_Gr;
    assign VGA_B = VGA_Br;

    endmodule


    module sync_module
    (   
        VGA_CLK, RSTn,//VGA_CLK 点频 =H_TOTAL * V_TOTAL *Frame
        VGA_HS,  VGA_VS,//VGA的行场同步信号
        VGA_BLANKn, VGA_SYNCn,        //复合消影脉冲与同步电平控制,ADV7125
        VGA_X, VGA_Y,// 显示行与场坐标
        VGA_ACT,//显示有效区域指示电平
        DAC_CLK//点频信号输出,提供给DAC驱动
    );

    input  VGA_CLK, RSTn;
    output VGA_HS,  VGA_VS;
    output VGA_BLANKn, VGA_SYNCn;
    output[11:0] VGA_X, VGA_Y;      //  
    output VGA_ACT;     // When the VGA is ready to displayy that means in the active area Set to 1
    output DAC_CLK;

    /**************** 800*600@60HZ ********************//*按照标准时序参考,也可根据具体应用修改部分参数*/
    //Horizontal parameter
    parameter H_FRONT = 40;     //  d
    parameter H_SYNC  = 128;    //  a
    parameter H_BACK  = 88;     //  b
    parameter H_ACT   = 800;    //  c
    parameter H_BLANK = H_FRONT + H_SYNC + H_BACK;
    parameter H_TOTAL = H_BLANK + H_ACT;

    //Vertical parameter
    parameter V_FRONT = 1;     //  r
    parameter V_SYNC  = 4;    //  o
    parameter V_BACK  = 23;     //  p
    parameter V_ACT   = 600;    //  q
    parameter V_BLANK = V_FRONT + V_SYNC + V_BACK;
    parameter V_TOTAL = V_BLANK  + V_ACT;

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

    //ADV7125   
    assign DAC_CLK = VGA_CLK;
    assign VGA_BLANKn = VGA_HS && VGA_VS;
    assign VGA_SYNCn = 1'b0;        //If the SOG is not enable, SYNC should be set to 0;

    //Horizontal Generator
    reg[11:0] H_Count;
    reg VGA_HSr;
    reg[11:0] VGA_Xr;//X address
    reg VGA_HACT; //Horizontal 有效显示区域                                       
    always @ (posedge VGA_CLK or negedge RSTn)
    begin
            if(!RSTn)
            begin
                    VGA_HSr <= 1'b0;
                    VGA_HACT <= 1'b0;
                    VGA_Xr <= 12'd0;
                    H_Count <= 12'd0;
            end
            else
            begin
                    if (H_Count == H_TOTAL)
                            H_Count <= 12'd0;
                    else
                            H_Count <= H_Count + 1'b1;

                    // Generate SYNC
                    if (H_Count <= H_SYNC)
                            VGA_HSr <= 1'b0;
                    else
                            VGA_HSr <= 1'b1;

                    //        Define the active area                             
                    if ((H_Count > (H_SYNC+H_BACK))&&(H_Count <= (H_SYNC+H_BACK+H_ACT)))
                    begin
                            VGA_HACT <= 1'b1;
                            VGA_Xr <= H_Count - (H_SYNC+H_BACK+1);                // X Address range 0-H_ACT
                    end
                    else
                    begin
                            VGA_HACT <= 1'b0;
                            VGA_Xr <= 12'd0;
                    end
            end
    end
    assign VGA_HS = VGA_HSr;
    assign VGA_X  = VGA_Xr;

    //Vertical Generator
    reg[11:0] V_Count;
    reg VGA_VSr;
    reg[11:0] VGA_Yr;
    reg VGA_VACT;                                       
    always @ (posedge VGA_CLK or negedge RSTn)
    begin
            if(!RSTn)
            begin
                    VGA_VSr <= 1'b0;
                    VGA_VACT <= 1'b0;
                    VGA_Yr <= 12'd0;
                    V_Count <= 12'd0;
            end
            else
            begin
                    if (V_Count == V_TOTAL)
                            V_Count <= 12'd0;
                    else if(H_Count == H_TOTAL)
                            V_Count <= V_Count + 1'b1;

                    // Generate SYNC
                    if (V_Count <= V_SYNC)
                            VGA_VSr <= 1'b0;
                    else
                            VGA_VSr <= 1'b1;

                    //        Define the active area        
                    if ((V_Count > (V_SYNC+V_BACK))&&(V_Count <= (V_SYNC+V_BACK+V_ACT)))
                    begin
                            VGA_VACT <= 1'b1;
                            VGA_Yr <= V_Count - (V_SYNC+V_BACK);                // Y Address range 0-V_ACT
                    end
                    else
                    begin
                            VGA_VACT <= 1'b0;
                            VGA_Yr <= 12'd0;
                    end
            end
    end        

    assign VGA_VS = VGA_VSr;
    assign VGA_Y  = VGA_Yr;
    assign VGA_ACT = VGA_HACT&&VGA_VACT;
    endmodule


    vga_RGB.rar (3.31 MB, 下载次数: 2)
    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    2020-9-28 10:10
  • 签到天数: 1018 天

    连续签到: 1 天

    [LV.10]以坛为家III

    发表于 2014-11-4 17:22:37 | 显示全部楼层
    无图无真相啊!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2014-2-9 10:11
  • 签到天数: 16 天

    连续签到: 1 天

    [LV.4]偶尔看看III

     楼主| 发表于 2014-11-4 17:49:39 | 显示全部楼层
    小菜儿 发表于 2014-11-4 17:22
    无图无真相啊!

    有硬件平台下载进去就ok
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条



    手机版|小黑屋|与非网

    GMT+8, 2024-11-24 03:56 , Processed in 0.154220 second(s), 20 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.