• FPGA project : TFT_LCD


    实验目标:

    驱动TFT_LCD显示十色彩条。

    重点掌握的知识:

    1,液晶显示器,简称LCD(Liquid Crystal Display),相对于上一代CRT显示器(阴极射线管显示器)LCD显示器具有功耗低、体积小、承载的信息量大及不伤眼的优点,因而它成为了现在的主流电子显示设备,其中包括电视、电脑显示器、手机屏幕及各种嵌入式设备的显示器。薄膜晶体管型。

    2,两种工作时序:

     

     值得注意的事:

    有效图像,与行场同步信号时序上要对齐。需要对行场同步信号打一拍,或者直接使用时序逻辑赋值。在时序图上有更直观的说明。

    模块框图:

    时序图:

    代码:

    1. module axis(
    2. input wire clk_9Mhz ,
    3. input wire rst_n ,
    4. input wire [15:0] rgb ,
    5. output reg hsync ,
    6. output reg vsync ,
    7. output reg [9:0] axis_h ,
    8. output reg [8:0] axis_v ,
    9. output wire [15:0] rgb_tft ,
    10. output wire tft_clk ,
    11. output wire tft_bl
    12. );
    13. // wire signal define
    14. wire hsync_0 ;
    15. wire vsync_0 ;
    16. // parameter
    17. parameter TOTAL_H = 10'd525 ,
    18. TOTAL_V = 9'd286 ,
    19. SYNC_H = 10'd41 , // 同步synchronization
    20. SYNC_V = 9'd10 ;
    21. /*****************************************************************************************/
    22. assign hsync_0 = (axis_h >= 0 && axis_h <= (SYNC_H - 1'b1)) ? 1'b1 : 1'b0 ;
    23. assign vsync_0 = (axis_v >= 0 && axis_v <= (SYNC_V - 1'b1)) ? 1'b1 : 1'b0 ;
    24. // output signal
    25. assign tft_clk = clk_9Mhz ;
    26. assign tft_bl = rst_n ;
    27. always @(posedge clk_9Mhz or negedge rst_n) begin
    28. if(~rst_n)
    29. axis_h <= 10'd0 ;
    30. else if(axis_h == TOTAL_H - 1'b1)
    31. axis_h <= 10'd0 ;
    32. else
    33. axis_h <= axis_h + 1'b1 ;
    34. end
    35. always @(posedge clk_9Mhz or negedge rst_n) begin
    36. if(~rst_n)
    37. axis_v <= 9'd0 ;
    38. else if((axis_h == TOTAL_H - 1'b1) && (axis_v == TOTAL_V - 1'b1))
    39. axis_v <= 9'd0 ;
    40. else if(axis_h == TOTAL_H - 1'b1)
    41. axis_v <= axis_v + 1'b1 ;
    42. else
    43. axis_v <= axis_v ;
    44. end
    45. always @(posedge clk_9Mhz or negedge rst_n) begin
    46. if(~rst_n) begin
    47. hsync <= 1'b0 ;
    48. vsync <= 1'b0 ;
    49. end else begin
    50. hsync <= hsync_0 ;
    51. vsync <= vsync_0 ;
    52. end
    53. end
    54. assign rgb_tft = rgb ;
    55. endmodule
    1. module pixel(
    2. input wire clk_9Mhz ,
    3. input wire rst_n ,
    4. input wire [9:0] axis_h ,
    5. input wire [8:0] axis_v ,
    6. output wire tft_de ,
    7. output reg [15:0] rgb
    8. );
    9. // parameter
    10. parameter TOTAL_H = 10'd525 ,
    11. TOTAL_V = 9'd286 ,
    12. SYNC_H = 10'd41 , // 同步synchronization
    13. SYNC_V = 9'd10 ,
    14. BACK_H = 10'd2 ,
    15. BACK_V = 9'd2 ,
    16. VALI_H = 10'd480 ,
    17. VALI_V = 9'd272 ,
    18. FRON_H = 10'd2 , // 前沿front
    19. FRON_V = 9'd2 ;
    20. parameter RED = 16'hF800 ,
    21. ORANGE = 16'hFC00 ,
    22. YELLOW = 16'hFFe0 ,
    23. GREEN = 16'h07e0 ,
    24. QING = 16'h07FF ,
    25. BLUE = 16'h001F ,
    26. PURPLE = 16'hF81F ,
    27. BLACK = 16'h0000 ,
    28. WHITE = 16'hFFFF ,
    29. GRAY = 16'hD69A ;
    30. // wire signal define
    31. wire valid_rgb ;
    32. reg valid_rgb_reg1 ;
    33. always @(posedge clk_9Mhz or negedge rst_n)
    34. if(~rst_n)
    35. valid_rgb_reg1 <= 1'b0 ;
    36. else
    37. valid_rgb_reg1 <= valid_rgb ;
    38. assign valid_rgb = (axis_h >= (SYNC_H+BACK_H) && (axis_h <= (SYNC_H+BACK_H+VALI_H-1'b1))
    39. && (axis_v >= (SYNC_V+BACK_V) && (axis_v <= (SYNC_V+BACK_V+VALI_V-1'b1)))) ? 1'b1 : 1'b0 ;
    40. // output signal
    41. always @(posedge clk_9Mhz or negedge rst_n) begin
    42. if(~rst_n)
    43. rgb <= WHITE ;
    44. else if(valid_rgb)begin
    45. if((axis_h >= (SYNC_H+BACK_H)) && (axis_h <= (SYNC_H+BACK_H+VALI_H/10-1'b1)))
    46. rgb <= RED ;
    47. else if((axis_h >= (SYNC_H+BACK_H+VALI_H/10)) && (axis_h <= (SYNC_H+BACK_H+VALI_H/10*2-1'b1)))
    48. rgb <= ORANGE ;
    49. else if((axis_h >= (SYNC_H+BACK_H+VALI_H/10*2)) && (axis_h <= (SYNC_H+BACK_H+VALI_H/10*3-1'b1)))
    50. rgb <= YELLOW ;
    51. else if((axis_h >= (SYNC_H+BACK_H+VALI_H/10*3)) && (axis_h <= (SYNC_H+BACK_H+VALI_H/10*4-1'b1)))
    52. rgb <= GREEN ;
    53. else if((axis_h >= (SYNC_H+BACK_H+VALI_H/10*4)) && (axis_h <= (SYNC_H+BACK_H+VALI_H/10*5-1'b1)))
    54. rgb <= QING ;
    55. else if((axis_h >= (SYNC_H+BACK_H+VALI_H/10*5)) && (axis_h <= (SYNC_H+BACK_H+VALI_H/10*6-1'b1)))
    56. rgb <= BLUE ;
    57. else if((axis_h >= (SYNC_H+BACK_H+VALI_H/10*6)) && (axis_h <= (SYNC_H+BACK_H+VALI_H/10*7-1'b1)))
    58. rgb <= PURPLE ;
    59. else if((axis_h >= (SYNC_H+BACK_H+VALI_H/10*7)) && (axis_h <= (SYNC_H+BACK_H+VALI_H/10*8-1'b1)))
    60. rgb <= BLACK ;
    61. else if((axis_h >= (SYNC_H+BACK_H+VALI_H/10*8)) && (axis_h <= (SYNC_H+BACK_H+VALI_H/10*9-1'b1)))
    62. rgb <= WHITE ;
    63. else if((axis_h >= (SYNC_H+BACK_H+VALI_H/10*9)) && (axis_h <= (SYNC_H+BACK_H+VALI_H-1'b1)))
    64. rgb <= GRAY ;
    65. else
    66. rgb <= WHITE ;
    67. end else
    68. rgb <= WHITE ;
    69. end
    70. assign tft_de = valid_rgb_reg1 ;
    71. endmodule

     

    1. module top(
    2. input wire sys_clk ,
    3. input wire sys_rst_n ,
    4. output wire tft_de ,
    5. output wire tft_clk ,
    6. output wire tft_bl ,
    7. output wire hsync ,
    8. output wire vsync ,
    9. output wire [15:0] rgb_tft
    10. );
    11. // 例化间连线
    12. wire clk_9Mhz ;
    13. wire rst_n ;
    14. wire [15:0] rgb ;
    15. wire [ 9:0] axis_h ;
    16. wire [ 8:0] axis_v ;
    17. pll_9Mhz pll_9Mhz_insert(
    18. .sys_rst_n ( sys_rst_n ) ,
    19. .areset ( ~sys_rst_n ) ,
    20. .inclk0 ( sys_clk ) ,
    21. .c0 ( clk_9Mhz ) ,
    22. .locked ( rst_n )
    23. );
    24. axis axis_insert(
    25. .clk_9Mhz ( clk_9Mhz ) ,
    26. .rst_n ( rst_n ) ,
    27. .rgb ( rgb ) ,
    28. .hsync ( hsync ) ,
    29. .vsync ( vsync ) ,
    30. .axis_h ( axis_h ) ,
    31. .axis_v ( axis_v ) ,
    32. .tft_clk ( tft_clk ) ,
    33. .tft_bl ( tft_bl ) ,
    34. .rgb_tft ( rgb_tft )
    35. );
    36. pixel pixel_insert(
    37. .clk_9Mhz ( clk_9Mhz ) ,
    38. .rst_n ( rst_n ) ,
    39. .axis_h ( axis_h ) ,
    40. .axis_v ( axis_v ) ,
    41. .tft_de ( tft_de ) ,
    42. .rgb ( rgb )
    43. );
    44. endmodule
    1. `timescale 1ns/1ns
    2. module test_top();
    3. reg sys_clk ;
    4. reg sys_rst_n ;
    5. wire hsync ;
    6. wire vsync ;
    7. wire [15:0] rgb_tft ;
    8. wire tft_de ;
    9. wire tft_clk ;
    10. wire tft_bl ;
    11. top top_inst(
    12. .sys_clk ( sys_clk ) ,
    13. .sys_rst_n ( sys_rst_n ) ,
    14. .tft_de ( tft_de ) ,
    15. .tft_clk ( tft_clk ) ,
    16. .tft_bl ( tft_bl ) ,
    17. .hsync ( hsync ) ,
    18. .vsync ( vsync ) ,
    19. .rgb_tft ( rgb_tft )
    20. );
    21. parameter CYCLE = 20 ;
    22. initial begin
    23. sys_clk = 1'b1 ;
    24. sys_rst_n = 1'b0 ;
    25. #(CYCLE) ;
    26. sys_rst_n = 1'b1 ;
    27. end
    28. always #(CYCLE / 2) sys_clk = ~sys_clk ;
    29. endmodule

    仿真波形: 

     

  • 相关阅读:
    分布式ID(8):分布式ID生成方法
    图像分割经典论文调研:DeepLabV3、DeepLabV3+、DenseASPP
    【Linux进阶之路】动静态库
    C++哪些函数不能成为虚函数
    RedisJson 横空出世!
    2022杭电多校九 1003-Fast Bubble Sort(倍增+单调栈)
    红队专题-从零开始VC++C/S远程控制软件RAT-MFC-超级终端
    C++排序问题,关于代码的修改补充
    C# OpenCvSharp 实现迷宫解密
    Python学习笔记
  • 原文地址:https://blog.csdn.net/Meng_long2022/article/details/133524403