FPGA|CPLD|ASIC论坛
直播中

jyaxz

11年用户 429经验值
擅长:嵌入式技术
私信 关注
[经验]

【Sipeed TangNano9K开发板试用体验】+RGB驱动测试

RGB驱动测试

1、硬件连接原理
1.1 RGB LCD连接关系
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image020.jpg
2.jpg
     RGB-LCD驱动信号为3.3V,采用16位色565模式驱动,引脚分配关系如下表。
  
序号
  
  
RGB-LCD
  
  
PIN
  
  
1
  
  
R3
  
  
PIN75
  
  
2
  
  
R4
  
  
PIN74
  
  
3
  
  
R5
  
  
PIN73
  
  
4
  
  
R6
  
  
PIN72
  
  
5
  
  
R7
  
  
PIN71
  
  
6
  
  
G2
  
  
PIN70
  
  
7
  
  
G3
  
  
PIN69
  
  
8
  
  
G4
  
  
PIN68
  
  
9
  
  
G5
  
  
PIN57
  
  
10
  
  
G6
  
  
PIN56
  
  
11
  
  
G7
  
  
PIN55
  
  
12
  
  
B3
  
  
PIN54
  
  
13
  
  
B4
  
  
PIN53
  
  
14
  
  
B5
  
  
PIN51
  
  
15
  
  
B6
  
  
PIN42
  
  
16
  
  
B7
  
  
PIN41
  
  
17
  
  
CLK
  
  
PIN35
  
  
18
  
  
HSYNC
  
  
PIN40
  
  
19
  
  
HVYNC
  
  
PIN34
  
  
20
  
  
DEN
  
  
PIN33
  
  
21
  
  
XR
  
  
PIN32
  
  
22
  
  
YD
  
  
PIN31
  
  
23
  
  
XL
  
  
PIN63
  
  
24
  
  
YU
  
  
PIN50
  
1.2 Button连接关系

3.jpg
按键共有2个,也是1.8V

  
序号
  
  
KEY
  
  
PIN
  
  
1
  
  
KEY1
  
  
PIN3
  
  
2
  
  
KEY2
  
  
PIN4
  
1.3 时钟输入
4.jpg
有源晶振为27MHz,通过PIN52脚输入。


2、屏幕安装方法说明:
     LCD显示器为4.3寸,型号JST-4300QWA-V01,采用FPC-40-0.5mm的连接器,在LCD的排线上标有明确的标号1脚和40脚,这整好和开发板上的FPC座的引脚对应。我们按照引脚的对应关系插入,扣好FPC连接器的黑色卡扣,排线就安装完成了。如下图所示
1.jpg

3、RGB屏驱动时序
包括两种驱动模式,分别为行、场同步模式,另一种是DE同步模式。在行、场同步模式时,要求数据使能信号DE为低电平;在DE同步模式时,行、场同步信号需要为高电平。
3.1 行、场同步模式
RGB显示器是逐行填充数据,填充一行后再填充下一行,直到整个屏幕的所有像素点都填充完成。如下图所示。
5.jpg

行扫描周期包括同步脉冲,显示后沿,实际有效像素,显示前沿。如下图所示,行扫描的频率是以像素点填充时钟为基础的。
6.jpg

场扫描周期同行扫描类似,同样包括同步脉冲,显示后沿,有效图像,显示前沿,所不同的是,场扫描频率是以行扫描周期为基础的,也就是说,扫描完一个行周期,才增加一个场扫描时钟。
7.jpg

3.2 DE同步模式
8.jpg

如图所示,只要DE信号有效,就填充整个显示区域,同时需要考虑增加显示后沿和显示前沿。
3.3 我们实际使用的屏幕的驱动时序

我们采用的4.3寸屏时序,如小表。
9.jpg

从表中我们可以获得驱动RGB所需的时序信息。

4、 RGB显示屏的驱动程序

4.1  顶层
  1. module TOP
  2. (
  3.         input                Reset_Button,
  4.             input          User_Button,
  5.             input          XTAL_IN,

  6.         output        LCD_CLK,
  7.         output        LCD_HYNC,
  8.         output        LCD_SYNC,
  9.         output        LCD_DEN,
  10.         output        [4:0]        LCD_R,
  11.         output        [5:0]        LCD_G,
  12.         output        [4:0]        LCD_B
  13. );


  14.         wire        CLK_SYS;
  15.         wire        CLK_PIX;

  16. /*
  17.     This program uses external crystal oscillator and PLL to generate 33.33mhz clock to the screen
  18.     If you use our 4.3-inch screen, you need to modify the PLL parameters (tools - > IP core generator)
  19.     to make CLK_ Pix is between 8-12mhz (according to the specification of the screen)
  20. */

  21.     Gowin_rPLL chip_pll
  22.     (
  23.         .clkout(CLK_SYS), //output clkout      //108M
  24.         .clkoutd(CLK_PIX), //output clkoutd   //9M
  25.         .clkin(XTAL_IN) //input clkin
  26.     );


  27.         VGAMod        D1
  28.         (
  29.                 .CLK                (        CLK_SYS     ),
  30.                 .nRST                (        Reset_Button),

  31.                 .PixelClk        (        CLK_PIX                ),
  32.                 .LCD_DE                (        LCD_DEN                 ),
  33.                 .LCD_HSYNC        (        LCD_HYNC         ),
  34.                     .LCD_VSYNC        (        LCD_SYNC         ),

  35.                 .LCD_B                (        LCD_B                ),
  36.                 .LCD_G                (        LCD_G                ),
  37.                 .LCD_R                (        LCD_R                )
  38.         );

  39.         assign                LCD_CLK                =        CLK_PIX;

  40. endmodule
4.2 时钟

时钟采用系统提供的锁相环IP,输入时钟27MHz,输出有两组,一组为系统时钟108MHz,另一组为9Mhz,这个时钟是提供给RGB屏刷新使用。
10.jpg

点击确定后会在工程下面创建出锁相环的Verilog代码。
4.3 RGB条形驱动

其中的RGB驱动时序是按照前面介绍的行场扫描时序调整的
  1. module VGAMod
  2. (
  3.     input                   CLK,
  4.     input                   nRST,

  5.     input                   PixelClk,

  6.     output                  LCD_DE,
  7.     output                  LCD_HSYNC,
  8.     output                  LCD_VSYNC,

  9.         output          [4:0]   LCD_B,
  10.         output          [5:0]   LCD_G,
  11.         output          [4:0]   LCD_R
  12. );

  13.     reg         [15:0]  PixelCount;
  14.     reg         [15:0]  LineCount;

  15.         //pluse include in back pluse; t=pluse, sync act; t=bp, data act; t=bp+height, data end
  16.         localparam      V_BackPorch = 16'd12;
  17.         localparam      V_Pluse         = 16'd11;
  18.         localparam      HightPixel  = 16'd272;
  19.         localparam      V_FrontPorch= 16'd4;
  20.        
  21.         localparam      H_BackPorch = 16'd43;
  22.         localparam      H_Pluse         = 16'd10;
  23.         localparam      WidthPixel  = 16'd480;
  24.         localparam      H_FrontPorch= 16'd4;   

  25.     localparam      Width_bar   =   35;
  26.     reg         [15:0]  BarCount;
  27.    

  28.     localparam      PixelForHS  =   WidthPixel + H_BackPorch + H_FrontPorch;         
  29.     localparam      LineForVS   =   HightPixel + V_BackPorch + V_FrontPorch;

  30.     always @(  posedge PixelClk or negedge nRST  )begin
  31.         if( !nRST ) begin
  32.             LineCount       <=  16'b0;   
  33.             PixelCount      <=  16'b0;
  34.             end
  35.         else if(  PixelCount  ==  PixelForHS ) begin
  36.             PixelCount      <=  16'b0;
  37.             LineCount       <=  LineCount + 1'b1;
  38.             end
  39.         else if(  LineCount  == LineForVS  ) begin
  40.             LineCount       <=  16'b0;
  41.             PixelCount      <=  16'b0;
  42.             end
  43.         else
  44.             PixelCount      <=  PixelCount + 1'b1;
  45.     end

  46.         reg                        [9:0]  Data_R;
  47.         reg                        [9:0]  Data_G;
  48.         reg                        [9:0]  Data_B;

  49.     always @(  posedge PixelClk or negedge nRST  )begin
  50.         if( !nRST ) begin
  51.                         Data_R <= 9'b0;
  52.                         Data_G <= 9'b0;
  53.                         Data_B <= 9'b0;
  54.             BarCount <=9'd0;
  55.             end
  56.         else begin
  57.                         end
  58.         end

  59.         //注意这里HSYNC和VSYNC负极性
  60.     assign  LCD_HSYNC = (( PixelCount >= H_Pluse)&&( PixelCount <= (PixelForHS-H_FrontPorch))) ? 1'b0 : 1'b1;
  61. //    assign  LCD_VSYNC = ((( LineCount  >= 0 )&&( LineCount  <= (V_Pluse-1) )) ) ? 1'b1 : 1'b0;                //这里不减一的话,图片底部会往下拖尾?
  62.         assign  LCD_VSYNC = ((( LineCount  >= V_Pluse )&&( LineCount  <= (LineForVS-0) )) ) ? 1'b0 : 1'b1;
  63.     //assign  FIFO_RST  = (( PixelCount ==0)) ? 1'b1 : 1'b0;  //留给主机H_BackPorch的时间进入中断,发送数据
  64. //    assign  LCD_HSYNC = 1'b0;
  65. //    assign  LCD_VSYNC = 1'b0;
  66.     assign  LCD_DE = (  ( PixelCount >= H_BackPorch )&&
  67.                         ( PixelCount <= PixelForHS-H_FrontPorch ) &&
  68.                         ( LineCount >= V_BackPorch ) &&
  69.                         ( LineCount <= LineForVS-V_FrontPorch-1 ))  ? 1'b1 : 1'b0;
  70. //                                                这里不减一,会抖动
  71.     assign  LCD_R   =  (PixelCount
  72.                 (PixelCount<(Width_bar*(BarCount+1)) ? 5'b00001 :   
  73.                 (PixelCount<(Width_bar*(BarCount+2)) ? 5'b00010 :   
  74.                 (PixelCount<(Width_bar*(BarCount+3)) ? 5'b00100 :   
  75.                 (PixelCount<(Width_bar*(BarCount+4)) ? 5'b01000 :   
  76.                         (PixelCount<(Width_bar*(BarCount+5)) ? 5'b10000 :  5'b00000 )))));

  77. assign  LCD_G =(PixelCount<(Width_bar*(BarCount+5)))? 6'b000000 :
  78.                (PixelCount<(Width_bar*(BarCount+6)) ? 6'b000001 :   
  79.                (PixelCount<(Width_bar*(BarCount+7)) ? 6'b000010 :   
  80.                (PixelCount<(Width_bar*(BarCount+8)) ? 6'b000100 :   
  81.                (PixelCount<(Width_bar*(BarCount+9)) ? 6'b001000 :   
  82.                (PixelCount<(Width_bar*(BarCount+10)) ? 6'b010000 :  
  83.                (PixelCount<(Width_bar*(BarCount+11)) ? 6'b100000 : 6'b000000 ))))));

  84.   assign  LCD_B=(PixelCount<(Width_bar*(BarCount+11)))? 5'b00000 :
  85.                 (PixelCount<(Width_bar*(BarCount+12)) ? 5'b00001 :   
  86.                 (PixelCount<(Width_bar*(BarCount+13)) ? 5'b00010 :   
  87.                 (PixelCount<(Width_bar*(BarCount+14)) ? 5'b00100 :   
  88.                 (PixelCount<(Width_bar*(BarCount+15)) ? 5'b01000 :   
  89.                 (PixelCount<(Width_bar*(BarCount+16)) ? 5'b10000 :  5'b00000 )))));

  90. endmodule
5、实际显示效果

回帖(2)

jyaxz

2022-3-12 13:47:40
最后实际有张图片,在编辑状态下可以显示出来,但是发布后就不在显示了
举报

jf_11136503

2022-4-15 08:05:08
受到警告
提示: 作者被禁止或删除 内容自动屏蔽
举报

更多回帖

发帖
×
20
完善资料,
赚取积分