OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 28|回复: 0

[XILINX] tft lcd 1024*600 hv同步模式 老是不对

[复制链接]

21

主题

51

帖子

0

精华

初级会员

Rank: 2

积分
133
金钱
133
注册时间
2016-9-5
在线时间
22 小时
发表于 5 天前 | 显示全部楼层 |阅读模式
1金钱

module lcd_driver(
    input                lcd_pclk,    //时钟
    input                rst_n,       //复位,低电平有效

    input                clk_200m,

    //RGB LCD接口
    output  reg          lcd_de,      //LCD 数据使能信号
    output  reg          lcd_hs,      //LCD 行同步信号
    output  reg          lcd_vs,      //LCD 场同步信号
    output  reg          lcd_bl,      //LCD 背光控制信号
    output               lcd_clk,     //LCD 像素时钟
    output  reg          lcd_rst,     //LCD复位
    output  reg  [23:0]  lcd_rgb      //LCD RGB888颜色数据
    );

// 7' 1024*600   
parameter  H_SYNC_7016   =  11'd20;     //行同步
parameter  H_BACK_7016   =  11'd140;    //行显示后沿
parameter  H_DISP_7016   =  11'd1024;   //行有效数据
parameter  H_FRONT_7016  =  11'd160;    //行显示前沿
parameter  H_TOTAL_7016  =  11'd1344;   //行扫描周期

parameter  V_SYNC_7016   =  11'd3;      //场同步
parameter  V_BACK_7016   =  11'd20;     //场显示后沿
parameter  V_DISP_7016   =  11'd600;    //场有效数据
parameter  V_FRONT_7016  =  11'd12;     //场显示前沿
parameter  V_TOTAL_7016  =  11'd635;    //场扫描周期



//reg define
reg  [10:0]  h_cnt  ;
reg  [10:0]  v_cnt  ;
reg  [10:0]  pixel_xpos;  //当前像素点横坐标  
reg          de_reg;
//main code

//RGB LCD 采用DE模式时,行场同步信号需要拉高

assign  lcd_clk = lcd_pclk;   //LCD像素时钟


always @ (posedge lcd_pclk or negedge rst_n) begin
    if (!rst_n) begin
        lcd_bl  <= 1'b1;
        lcd_rst <= 1'b1;
        lcd_de  <= 1'b0;
    end else begin
        lcd_bl  <= 1'b1;
        lcd_rst <= 1'b1;
        lcd_de  <= 1'b0;
    end
end


//行场信号的启动边沿是同时动作的
//行计数器对像素时钟计数
always@ (posedge lcd_pclk or negedge rst_n) begin
    if(!rst_n)
        h_cnt <= 11'd0;
    else begin
        if(h_cnt == H_TOTAL_7016 - 1'b1)
            h_cnt <= 11'd0;
        else
            h_cnt <= h_cnt + 1'b1;           
    end
end

//场计数器对行计数
always@ (posedge lcd_pclk or negedge rst_n) begin
    if(!rst_n)
        v_cnt <= 11'd0;
    else begin
        if(h_cnt == H_TOTAL_7016 - 1'b1) begin
            if(v_cnt == V_TOTAL_7016 - 1'b1)
                v_cnt <= 11'd0;
            else
                v_cnt <= v_cnt + 1'b1;   
        end
    end   
end


always @ (posedge lcd_pclk or negedge rst_n) begin
    if (!rst_n) begin
        lcd_hs  <= 1'b1;  
    end else if(    h_cnt == ( H_TOTAL_7016 - 1 )   ) begin
        lcd_hs  <= 1'b0;  
    end else if(    h_cnt == ( H_SYNC_7016 - 1  )  ) begin
        lcd_hs  <= 1'b1;  
    end
end

always @ (posedge lcd_pclk or negedge rst_n) begin
    if (!rst_n) begin
        lcd_vs  <= 1'b1;  
    end else if( (v_cnt == ( V_TOTAL_7016 - 1 ))&&( h_cnt == H_TOTAL_7016 - 1'b1 )  ) begin
        lcd_vs  <= 1'b0;  
    end else if(    v_cnt == ( V_SYNC_7016 - 1  )&&( h_cnt == H_TOTAL_7016 - 1'b1 ) ) begin
        lcd_vs  <= 1'b1;  
    end
end





//==下面都是搞输出RGB24值的计算

                                  
//请求像素点颜色数据输入  
always@ (posedge lcd_pclk or negedge rst_n) begin
    if(!rst_n)       
                de_reg<=1'b0;
        else if(  (h_cnt >= H_SYNC_7016 + H_BACK_7016 - 1'd1 ) && (h_cnt < H_SYNC_7016 + H_BACK_7016 + H_DISP_7016 - 1'd1 )&&
                  (v_cnt >= V_SYNC_7016 + V_BACK_7016) && (v_cnt < V_SYNC_7016 + V_BACK_7016 + V_DISP_7016)
            )
                de_reg <= 1'b1;
        else
                de_reg <= 1'b0;
end
                                  




parameter WHITE = 24'hFFFFFF;  //白色
parameter BLACK = 24'h000000;  //黑色
parameter RED   = 24'hFF0000;  //红色
parameter GREEN = 24'h00FF00;  //绿色
parameter BLUE  = 24'h0000FF;  //蓝色


//像素点x坐标
always@ (posedge lcd_pclk or negedge rst_n) begin
    if(!rst_n) begin
        pixel_xpos <= 11'd0;
    end else if(de_reg)
        pixel_xpos <= h_cnt + 2'd2 - H_SYNC_7016 - H_BACK_7016 ;
    else
        pixel_xpos <= 11'd0;
end

//根据当前像素点坐标指定当前像素点颜色数据,在屏幕上显示彩条
always @(posedge lcd_pclk or negedge rst_n) begin
    if(!rst_n)
        lcd_rgb <= BLACK;
    else begin
        if((pixel_xpos >= 11'd0) && (pixel_xpos < H_DISP_7016/5*1))
            lcd_rgb <= WHITE;
        else if((pixel_xpos >= H_DISP_7016/5*1) && (pixel_xpos < H_DISP_7016/5*2))   
            lcd_rgb <= BLACK;
        else if((pixel_xpos >= H_DISP_7016/5*2) && (pixel_xpos < H_DISP_7016/5*3))   
            lcd_rgb <= RED;   
        else if((pixel_xpos >= H_DISP_7016/5*3) && (pixel_xpos < H_DISP_7016/5*4))   
            lcd_rgb <= GREEN;               
        else
            lcd_rgb <= BLUE;      
    end   
end


ila_0 your_instance_name (
        .clk( clk_200m ), // input wire clk


        .probe0(lcd_hs), // input wire [0:0]  probe0  
        .probe1(lcd_vs), // input wire [0:0]  probe1
        .probe2(h_cnt), // input wire [10:0]  probe2
        .probe3(v_cnt), // input wire [10:0]  probe3
        .probe4(lcd_rgb) // input wire [23:0]  probe4
);


endmodule,,,,有朋友调试过吗?  原子提供的是DE模式的,是可以的,,但是我想要HV模式的,,原子官方有吗?  折腾一周了,还是不行

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-4-3 02:42

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表