FPGA-TFT(VGA)驱动代码分享

来源:互联网 发布:淘宝运费模板怎么写 编辑:程序博客网 时间:2024/05/16 12:12

module TFT(

    clk9M,      /*TFT系统时钟输入*/

    rst_n,      /*系统复位*/

    data_in,    /*16位待显示数据输入*/

    hcount,     /*TFT行扫描计数器 525*/

    vcount,     /*TFT场扫描计数器 286*/

    tft_rgb,    /*TFT数据输入 5/6/5*/

    tft_hs,     /*TFT行同步信号*/

    tft_vs,     /*TFT场同步信号*/

    tft_clk,        /*TFT像素时钟*/

    tft_de,     /*TFT数据使能*/

    tft_pwm     /*TFT背光控制*/       

    );

   

    /*输入端口定义*/

    input clk9M;            /*TFT系统时钟输入*/

    input rst_n;            /*系统复位*/

    input[15:0]data_in;    /*16位待显示数据输入*/

   

    /*输出端口定义*/

    output[9:0]hcount; /*TFT行计数器525*//*一行已扫描点数*/

    output[9:0]vcount; /*TFT场计数器286*//*一场已扫描行数*/

    output[15:0]tft_rgb;/*TFT数据输入 5/6/5*/

    outputtft_hs;          /*TFT行同步信号*/

    outputtft_vs;          /*TFT场同步信号*/

    outputtft_clk;     /*TFT像素时钟*/

    outputtft_de;          /*TFT数据使能*/

    outputtft_pwm;     /*TFT背光控制*/

   

    /*内部寄存器定义*/

    reg[9:0]hcount_r;  /*行扫描计数器*/

    reg[9:0]vcount_r;  /*场扫描计数器*/

   

    /*内部连线定义*/

    wirehcount_ov;     /*行扫描计数完成标志*/

    wirevcount_ov;     /*场扫描计数完成标志*/

    wire dat_ack;           /*有效显示标定*/

   

    /*TFT行场扫描时序*/

    parametertft_hs_end = 10'd40,  /*行消隐结束*/     

                 hdat_begin = 10'd42,   /*行数据开始*/

                 hdat_end   =10'd522,  /*行数据结束*/

                 hpixel_end = 10'd524,  /*行扫描结束*/

                 tft_vs_end = 10'd9,        /*场消隐结束*/

                 vdat_begin = 10'd11,   /*场数据开始*/

                 vdat_end   =10'd283,  /*场数据结束*/

                 vline_end = 10'd285;  /*场扫描结束*/

   

    assign hcount= hcount_r - hdat_begin;      /*一行已扫描点数*/

    assign vcount= vcount_r - vdat_begin;      /*一场已扫描行数*/

   

    assigntft_clk = clk9M;     /*TFT像素时钟9M*/

    assign tft_de   = dat_ack;  /*TFT使能等于有效区标定*/

    assigntft_pwm = rst_n;     /*TFT背光设置*/

   

    /*TFT驱动->行扫描*/

    always@(posedgeclk9M,negedge rst_n)begin

        if(!rst_n)begin                    /*如果复位*/

            hcount_r<= 10'd0;          /*行扫描计数器清零*/

        end

        elseif(hcount_ov)begin         /*如果行扫描完成*/

            hcount_r<= 10'd0;          /*行扫描计数器清零*/

        end

        elsebegin                          /*如果没复位行扫描也没结束*/

            hcount_r<= hcount_r + 1'b1;  /*行扫描计数器自加*/

        end

    end

   

    assignhcount_ov = (hcount_r == hpixel_end);    /*判断行扫描是否完成*/

   

    /*TFT驱动->场扫描*/

    always@(posedgeclk9M,negedge rst_n)begin

        if(!rst_n)begin                 /*如果复位*/

            vcount_r<= 10'd0;          /*场扫描计数器清零*/

        end

        elseif(hcount_ov)begin         /*如果行扫描完成*/

            if(vcount_ov)begin          /*如果场扫描完成*/

                vcount_r<= 10'd0;      /*场扫描计数器清零*/

            end

            elsebegin                      /*如果行扫描完成同时场扫描没完成*/

                vcount_r<= vcount_r + 1'b1;    /*场扫描计数器自加*/

            end

        end

        else    begin                           /*如果行扫描没完成*/

            vcount_r<= vcount_r;       /*场扫描计数器等待行扫描完成*/

        end

    end

   

    assignvcount_ov = (vcount_r == vline_end); /*判断场扫描是否完成*/

   

    /*如果行和场扫描计数器在图像有效显示区域时序范围内则数据使能信号有效*/

    assigndat_ack = ((hcount_r >= hdat_begin)&&(hcount_r <=hdat_end))&&

                          ((vcount_r >= vdat_begin)&&(vcount_r<= vdat_end));

    /*行同步信号在行同步头扫描完成后有效*/                   

    assign tft_hs= (hcount_r > tft_hs_end);

    /*场同步信号在场同步头扫描完成后有效*/

    assign tft_vs= (vcount_r > tft_vs_end);

    /*二选一多路器 如果dat_ack有效输入图片信息否则输入0*/

    assigntft_rgb = (dat_ack)?data_in:16'h0000;

  

endmodule