本帖最后由 芯航线跑堂 于 2017-2-7 23:21 编辑
八、4.3寸RGB显示屏控制器设计
各种常见显示屏极其接口介绍 在嵌入式系统中,经常会使用到液晶显示屏来显示相关信息,从早期的1602字符点阵到如今的4K LED显示屏,显示技术经历了巨大的变革。根据应用领域不同,也有很多不同的屏幕接口,如8080接口、RGB接口、MIPI接口等,每种接口都有各自的特性,应用于不同的场合,交叉较少。我们在使用时,也是需要根据实际需求合理选择合适接口的显示屏。 相信很多电子生刚开始学习单片机时,接触到的就是51单片机。在51单片机上,使用最广泛的显示设备就是1602、12864字符点阵。这两种液晶显示屏使用的是Intel 8080的总线, 51单片机使用外扩8080总线或者IO模拟该总线对液晶屏进行读写,以实现数据显示。 后来,当我们学习了较为高级的单片机,如MSP430、STM32后,我们接触到了彩色液晶显示屏。单片机经常使用的彩色液晶显示屏通常都是内部设计了有显示缓存存储器的,只要把要显示的内容写入到显存中,显示屏就会自动的依次读取每个像素点对应的显存内容并驱动液晶像素点显示对应颜色。彩色液晶显示屏模型和12864液晶屏较为类似,只不过能够显示彩色图像,而12864只能显示黑白内容。这类彩色液晶显示屏常使用16位的总线接口,该接口也与Intel 8080总线接口兼容,我们在使用的时候,只需要将彩色液晶显示屏当做一个RAM进行读写即可将需要显示的内容显示在屏幕对应的位置。比较典型的一种使用方法,是使用STM32的FSMC总线,将这样的液晶显示屏映射为一块存储区,直接使用FSMC总线对该存储区进行读写即可。 随着学习的进一步深入,部分同学接触到了嵌入式ARM处理器,如ARM9、ARM11、Cortex-A8等等,这些处理器往往运行成熟的操作系统,如WindowsCE、Linux等等。而且它们都能驱动很多的大屏幕,如市面上最早流行的2440的开发板,基本标配都有一块4.3寸480*272分辨率的RGB显示屏,而有些甚至支持到了7寸800*480分辨率。这些屏幕,使用普通的MCU是无法驱动的,因为这些屏幕本身不含显存,需要驱动器能够带有显存,并按照RGB时序准确的将显存中的数据送到屏幕上显示,而一般的单片机由于工作速度、总线带宽、存储容量有限,很难支持如此高的数据刷新速率。而ARM处理器由于性能较高,而且使用外部大容量DDR存储器作为运行内存,因此能够支持这样一类的屏幕。 以下为一款常用的4.3寸TFT显示屏(AT043TN24 V.1)的接口时序图: 相信之前学习过VGA时序的朋友一眼就能看出来,是的,这款屏幕的接口和VGA接口时序非常的相似,甚至说是一样的。区别只是在于时间参数有所不同。看到这里,相信大家心里瞬间就有了信心,VGA都能够理解,这样一个和VGA接口极度相似的接口,又有什么搞不定的呢?而事实就是,我们后面设计该显示屏的驱动的时候,就只是在之前VGA控制器的基础上进行了简单的一些时序参数的修改,就能够直接用来驱动这样一款4.3寸TFT液晶显示屏了。
4.3寸RGB接口TFT显示模组介绍:市面上我们最常买到的4.3寸屏都是以模组的形式提供的,各大厂家生产的模组,其接口引脚顺序都是兼容的。而且接口时序也都是标准的。以下为AT043TN24 V.1这个模组的接口顺序:
其中,1、2号脚为背光灯的供电脚,TFT屏背光使用串联LED供电,要求供电电压为18.6V到21V,恒流,电流范围为36mA到44mA之间。 3、4、29、36号脚为TFT的供电电源或GND脚,用于给TFT提供必要的工作电压。 5~12、13~20、21~28分别为像素颜色数据的红绿蓝分量输入脚,每个颜色分量共8位,即该液晶显示屏最高可现实2^24中颜色。 30脚为像素时钟脚,驱动器与TFT屏的数据和控制信号全部需要同步于该像素时钟信号。 31脚为现实开关脚,使用该脚可直接控制TFT屏的显示开关。 32、33为行、场同步信号,实现对图像数据的行、列同步。用来控制TFT屏的刷新。这些信号与VGA时序含义完全一致,因此只要理解了VGA接口原理。 34脚为数据使能脚,即在显示有效区域,打开该信号以使能信号输入,在非有效区域,关闭该信号以禁止像素数据输入,以免影响到消隐。 37~40脚为4线制电阻触摸接口,在设计含有触摸功能的显示组件时,常把触摸屏的4根信号线先焊接到TFT屏的FPC对应的焊盘上,然后通过TFT屏的这4个脚送往触摸控制器(如XPT2046)。当然,也可以不使用这4个脚,而是直接将触摸屏的4根连线直接连接到触摸控制器上,这取决于应用需求。 RGB接口TFT屏扫描方式 RGB接口的TFT屏扫描方式和VGA类似,也是使用行列扫描的方式。在介绍TFT屏扫描原理之前,我们还是再来回顾下VGA显示器的扫描原理。 在VGA标准兴起的时候。常见的彩色显示器一般由CRT(阴极射线管)构成,色彩是由RGB(红、绿、蓝)三基色组成。显示是用逐行扫描的方式解决。阴极射线枪发出电子束打在涂有荧光粉的荧光屏上,产生RGB三基色,合成一个彩色像素,扫描从屏幕的左上方开始,从左到右,从上到下进行扫描,每扫完一行,电子束都回到屏幕的左边下一行的起始位置。在这期间,CRT对电子束进行消隐。每行结束时,用行同步信号进行行同步;扫描完所有行,用场同步信号进行场同步,并使扫描回到屏幕的左上方。同时进行场消隐,预备下一场的扫描。 随着显示技术的发展,出现了液晶显示器,液晶显示器的成像原理与CRT不同,液晶显示器是通过对液晶像素点单元施加电压与否,来实现液晶单元的透明程度,并添加三色滤光片、分别使R、G、B这3中光线透过滤光片,最后通过3个像素点合成一个彩色像素点,从而实现彩色显示。但是由于液晶显示技术后于CRT显示技术诞生,因此在液晶显示器诞生的时候,为了能够兼容传统的显示接口,因此液晶显示器通过内部电路实现了对VGA接口的完全兼容。因此,我们在使用显示器时,只要该显示器带有标准的VGA接口,我们就不用去关系其成像原理,直接使用标准的VGA时序即可驱动。 而RGB接口的TFT屏,扫描方式与VGA完全一致,不同之处只是在于,VGA显示器是接收模拟信号,而TFT屏则省略了这一过程,直接接受数字信号。例如,驱动VGA时,我们首先产生对应像素的颜色数字信号编码,然后使用数模转换电路将数字转换为模拟信号,然后通过VGA线缆将模拟信号传输到VGA显示器上进行显示。而TFT屏则直接省略了数模转换这一过程,直接接受传输线缆传输过来的数字信号,并进行显示。因此在控制器设计端,并没有任何区别。 4.3寸RGB显示屏时序分析上一节我们讲了,RGB接口的TFT屏其驱动时序与VGA非常类似,而区别仅仅在于时序参数不同,接下来我们就来看下TFT屏的时序参数。下图是该屏接口的行扫描、场扫描的时序图。
行扫描时序要求(单位:输出一个像素的时间间隔,即像素时钟): Thp(行同步头):41 Thb:2 Thd(行图像):480 Thf:2 Th:525
场扫描时序要求(单位:输出一行Line的时间间隔): Tvp(场同步头):10 Tvb:2 Tvd(场图像):272 Tvf:2 Tv:286
类比VGA工业标准,480*272分辨率RGB屏标准所要求的频率如下: 时钟频率 9MHz(像素输出的频率) 行频率 31469 Hz 场频率 59.94Hz(每秒图像刷频率) 同VGA 工业标准显示模式类似,RGB接口的行同步、列同步也都为负极性,即同步脉冲要求是负脉冲。
下图为480*272分辨率RGB屏的图像显示扫描示意图,在设计时,可用两个计数器进行计数(行、场扫描计数器),行计数器的驱动时钟为9MHz,场计数器的驱动时钟为行计数器的溢出信号。计数的同时控制行、场同步信号输出。并在适当的时候送出数据,就能显示相应的图像。注意消隐器件送出的数据应该为0x0000。显示器的刷新频率为9MHz/525/286 = 59.94Hz,等于VGA工业标准场帧频59.94Hz 芯航线FPGA学习套件VGA电路介绍芯航线FPGA学习套件提供了一款4.3寸TFT触摸显示组件,该组件使用了一片AT043TN24模组,并安装了4线制触摸屏。下图为芯航线4.3寸TFT触摸显示组件示意图: 本模组实现了对电阻触摸屏的模拟信号采样电路。并将TFT屏的24位颜色数据转化为16位数据,然后通过34针排针接口,最后与芯航线FPGA主板相连。 在前面介绍中提到,该屏幕的颜色数据支持24位输入,即每种颜色有8位表示。而我们常见的数字系统,常使用16位色进行显示图像,因此,这里为了节约FPGA引脚,只选取了24位颜色数据中的16根数据线。为了保证精简数据线后,图像颜色能够不失真,因此分别选取R、G、B数据线的高5、6、5位,组成新的16位数据线,屏24位数据线和芯航线TFT触摸显示屏组件16位数据线对应关系如下所示:
芯航线4.3寸触摸显示组件RGB接口三基色信号R、G、B共用16位(分别是R为5位、G为6位、B为5位),因此可以显示65536种颜色。RGB数据的格式如下表所示:
以下为常见的几种颜色对应的数据编码:
小结 通过以上介绍,我们了解了实现RGB接口屏驱动的行列扫描方法,即使用两个计数器分别进行行、场计数,根据计数值确定像素数据内容和行、场同步信号的电平状态。同时,也知道了要显示不同的颜色,只需要给D0~D15不同的数据,即可显示不同的颜色。
RGB TFT 控制器设计第一步,设计行扫描计数器行扫描计数器即每个像素时钟自加1,一旦加满到524(刚好525个时钟周期),计数器清零并重新技术,该部分代码可如下设计:
第二步,设计场扫描计数器 由于场扫描计数器是在每次一行扫描完成后加1的,即场扫描计数器的自加条件是行扫描计数器溢出。所以,场扫描计数器的自加条件为行扫描完成,即 “hcount_r==10'd524”,场扫描计数器代码如下所示:
第三步,产生行同步信号和场同步信号 根据480*272分辨率RGB屏接口标准时序,我们知道每一个完整的帧都包含了数据段和消隐段,在消隐段期间,行同步信号和列同步信号有一段行同步头和场同步头,在同步期间,对应行同步信号或者场同步信号为低电平,因此我们可以根据行、场计数器的值来确定行、场同步信号的电平状态。对于行同步信号,其行同步头为一行扫描的前41个像素时钟周期,因此行同步信号可用如下的简单方式控制:
对于场同步信号,其场同步头为一行扫描的前10个像素时钟周期,因此行同步信号可用如下的简单方式控制:
第四步,输出数据 TFT控制器的设计目的是为了驱动TFT显示屏显示需求的图像内容,因此需要设计数据输出部分,这里,数据来源可以为其它部分产生的图像信号,如摄像头数据、BMP图片数据。我们在驱动TFT时,只需要保证在扫描正确的像素点时,其它部分产生的图像信号能够与该像素点位置对应上,则不需要对图像数据再进行二次处理,但是,在行、场消隐期间,需要保证输出到TFT屏的RGB数据线上的数据全部为0,因此可以设置一个二选一多路器,只有在非消隐期间,TFT控制器才直接输出其他部分输入的图像数据,而消隐器件则强制输出全0。 我们可以首先产生一个图像数据有效标志信号,然后使用该标志信号控制TFT输出数据的内容,即切换二选一多路器的通道,从而实现消隐器件数据全0的功能。 图像数据有效标志信号产生代码如下所示:
dat_act即为图像数据有效标志信号。 消隐强制输出0二选一多路器代码如下所示:
其中,TFT_RGB是输出到VGA接口上的数据,而data_in则是其他模块传递过来的正确的图像数据。
第五步,输出正确的行列扫描位置为了使其他模块能够根据当前扫描位置正确的输出图像数据,因此需要将TFT控制器的实时扫描位置输出,以供其他模块使用。
完整TFT控制器设计 以上为我们根据直观思维设计的驱动电路,在代码中,直接使用了数字作为运算和比较的内容,这样不利于修改。因此,为了实现易于修改的控制器设计,方便后期简单修改后兼容其他分辨率,对代码进行优化,使用参数化设计。将代码中使用到的一些与时序相关的数字直接使用parameter这样的参数进行定义,这样在以后需要修改时间参数时,只需要修改parameter定义的内容即可,不需要再深入到代码中一个一个修改。这里不再一一介绍如何修改,只贴出最终设计修改完成的代码,请用户自行比对领悟。
相较于之前的VGA控制器设计,可以看到,代码方面除了一些时序参数有所改变,其他没有任何变化,只是新增了3个输出信号: TFT_CLK, //TFT像素时钟 TFT_DE, //TFT数据使能 TFT_PWM //TFT背光控制 而TFT_DE直接与dat_act信号相连,TFT_PWM则直接与复位输入相连,TFT_CLK直接与驱动器工作时钟也就是像素时钟相连。并未对整个控制器设计产生较大改变。 设计完成后,在Quartus II15.1中综合出来的电路符号如下所示:
每个端口的功能如下表所示:
TFT控制器仿真验证本小节对设计的TFT控制器进行仿真验证,通过仿真查看行场同步信号是否满足设计需求。 Testbench设计 Testbench的设计思路非常简单,只需要产生一个25MHz的时钟信号,然后在data_in端口上给一个固定的数据编码,为了与消隐时候的强制输出全0相区分,因此只需要是data_in上的数据不为0即可。testbench内容如下所示:
仿真结果分析TFT_HS信号:
由图可见,TFT_HS在0~41这一行扫描段内为低电平,即行同步头,其他时间为高电平,行扫描一次,行扫描计数器计数最大值为524,即刚好525个像素时钟周期,与设计一致,因此可知行扫描信号满足时序设计要求。
TFT_VS信号: 由图可见,VGA_VS信号在0~10这一段场扫描时间内为低电平,即场同步头,其他时间为高电平。场扫描一次,场扫描计数器计数最大值为285,即刚好286个行扫描周期,与设计一致,满足480*272分辨率时序标准,因此可知场扫描信号满速时序设计要求。
其他信号本文不再进行详细分析比对,在进行板级调试中,如果发现显示效果不对,则可根据实际显示效果,判断错误位置,如行同步信号错误、场同步信号错误等。 TFT控制器板级验证 在上一节,我们简述了TFT控制器的设计思路并给出了具体的TFT控制器设计过程,同时通过仿真验证了设计的合理性。本节,我们将对该TFT控制器进行板级验证,通过板级验证来进一步确定我们设计的正确性。 板级验证需求TFT的板级验证,主要验证以下三个方面: 能够正确的全屏点亮屏幕,显示稳定 能否正确的显示颜色,即按照需求制定需要显示的颜色 能否正确的定位坐标,即实现在指定的位置显示对应的数据
板级验证电路设计为此,我们设计一个测试工程,该工程中我们测试上述提到的8种颜色,通过颜色的位置,不但能确定是否能够正确输出指定颜色的图像,还能间接确定是否能够精确指定像素位置。 因此,我们对屏幕进行划分,将屏幕划分成4行2列总共八个像素阵列,每个阵列分别显示一种颜色。据此,我们可以首先定义每种颜色的具体数据编码,然后再定义每个像素阵列的基本显示颜色,这里首先使用localparam定义每种颜色的具体数据编码:
紧接着,我们需要知道TFT当前扫描的位置是在哪一个位置区间,换一种说法,我们需要通过TFT当前的扫描位置得到当前扫描的是哪一个像素阵列,然后给待显示数据赋予对应的颜色值即可。这里我们先定义每个像素块处于扫描中的条件。 产生每一列的处于扫描状态标志信号,屏幕每行总共480个像素点,我们将屏幕划分成了2列,因此 (a) 当行扫描范围在0~239这一段像素内时,第0列处于活跃阶段; (b) 当扫描范围在240~479这一段像素内时,第1列处于活跃阶段。 因此可得:
2、 产生每一行的处于扫描状态标志信号,屏幕每列总共272个像素点,我们将屏幕划分成了4列,因此 (a) 当行扫描范围在0~67这一段像素内时,第0行处于活跃阶段; (b) 当行扫描范围在68~135这一段像素内时,第1行处于活跃阶段; (c) 当行扫描范围在136~203这一段像素内时,第2行处于活跃阶段; (d) 当行扫描范围在204~272这一段像素内时,第3行处于活跃阶段, 因此可得:
3、 产生扫描每一个像素块的标志信号:
然后,我们就可以根据当前被扫描的像素块范围来确定需要给TFT输出什么颜色,这里采用一个多路器即可实现:
添加PLL时钟分频单元 通过以上步骤,我们就完成了简易TFT控制器测试电路的主要电路设计。在前面我们曾经提到,TFT控制器的像素时钟为9MHz,而我们芯航线FPGA开发板设计的是50MHz的晶振,因此需要使用锁相环对时钟进行分频得到9MHz的时钟,以供TFT控制器使用。具体PLL配置请参考《芯航线FPGA数字系统设计教程+实例解析》“FPGA 设计思想与验证方法视频教程实验精讲手册”部分的“十六、 PLL 锁相环介绍与简单应用”小节。 完整的测试电路代码实现完整的测试电路代码如下所示:
板级验证引脚分配,TFT控制器测试工程引脚分配表如下所示:
芯航线FPGA学习套件主板与“4.3寸触摸显示组件”的连接如下所示: 最终测试效果如下图所示: 通过照片可知,TFT控制器设计能够稳定正确的刷新TFT显示屏并控制正确的显示位置,因此设计无误。 后续,我们就可以使用该控制器再结合一定的图像信号产生电路实现更多更负责的显示系统设计。当然,也可能根据具体的使用环境,再对本控制器进行设计微调。
如有更多问题,欢迎加入芯航线 FPGA技术支持群交流学习:472607506 小梅哥 芯航线电子工作室
|