Hint: this post is also available in English.

注意:本文使用谷歌翻译翻译成中文。点击查看英文版本

介绍

在上个世纪,CRT仍然是计算机显示器最常用的技术。 类似这样的说法是很常见的:LCD可能会发展并产生更好的图像,但它永远不会取代CRT。 CRT在图像质量方面客观上更为优越,LCD仅适用于要求绝对轻薄和低功耗的应用[1]。 几十年后,我们都知道到底发生了什么。我想从今天的角度重新回顾一下上个世纪的液晶屏,它们真的那么糟糕吗?在2019年使用那种屏幕会是什么样的?

上个世纪的LCD

上个世纪,便携式PC上使用了几种不同类型的显示器。 最初的便携式PC通常带有CRT显示器,如Compaq Portable(1983)或IBM 5155(1984)。当然,显然CRT太重而无法在这些便携式设备上使用。 之后他们转向TN LCD,如IBM 5140(1986)和Toshiba T1000(1987)。这些TN显示器的对比度和可视角都非常糟糕。后来一些公司在如Toshiba T3200(1987)和IBM PS/2 P70(1991)上试验了另外一种技术:气体等离子屏幕。气体等离子屏幕可以提供极高的对比度,但颜色限于不同亮度的橙色,并且生产非常昂贵。最后,在90年代初,业界转向了STN LCD和TFT LCD屏幕。STN屏幕提供了不太差的对比度(通常为1:5到1:50),以及十几级灰度显示能力。鉴于这些笔记本电脑主要用于商业用途,STN屏幕足够好。但如果想要彩色显示怎么办?有两种选择,CSTN和Color TFT。第一台带有彩色TFT屏幕的笔记本电脑是NEC PC9801NC,于1990年问世。TFT屏幕提供了更高的对比度和更低的响应时间,但有一个缺点:制造成本很高。另外一边,CSTN基本上是STN屏幕和彩色滤光片。制造成本低但性能有限。因此,STN和CSTN继续主导市场,并广泛应用于低端笔记本电脑。今天我们仍然可以看到在纽约地铁列车上使用CSTN屏幕。

1553187809967-IBM_Portable_PC_5155_-_Retrosystems_2010.jpg

(IBM 5155, credit: Soupmeister, license: CC-BY-SA-2.0, source: https://www.flickr.com/photos/29012094@N07/5235790747)

1553187853643-Toshiba_T1100_In_Betrieb.jpg

(Toshiba T1100 featuring a monochrome TN screen, credit: Johann H. Addicks, license: GFDL, source: http://www.addicks.net/gallery/Irgendwo/Toshiba_T1100_In_Betrieb)

1553187923375-nyctrainscreen.jpg

(纽约MTA列车上的CSTN屏幕。Credit: Transit +PLUS)

正如标题所说,该项目只讨论CSTN屏幕,也就不会再关心早期的TFT,单色TN和单色STN屏幕了。

CSTroN

我已经确定要看看CSTN屏幕的效果了,接下来的问题是怎么做。当然,找到一台带有CSTN屏幕的笔记本电脑并不难。只要使用带CSTN屏幕的笔记本电脑,我就可以了解使用CSTN屏幕是什么感觉。所以,我自己买了一台上世纪的笔记本电脑,处理器为AMD 5x86-P133。鉴于它的性能,我可以测试的东西基本上只限于DOS游戏。当然,有很多令人惊叹的DOS游戏,我也喜欢在那台笔记本电脑上玩那些游戏。然而,我也希望在该屏幕上玩一些现代的3D游戏并观看YouTube视频,看看效果。但这根本不可能。

或者是吗?

笔记本电脑限制了我可以在屏幕上显示的内容,所以我只需要摆脱那台笔记本电脑,只留下屏幕。然后,我可以尝试在该屏幕上添加标准VGA甚至HDMI端口,并连接我可能想要的任何现代设备。

实际上,将笔记本电脑屏幕转换为VGA/HDMI显示器是一种非常普遍的改装。通常的做法是购买与屏幕匹配的LCD驱动板,并将屏幕挂在电路板上。这些驱动板在eBay和AliExpress(淘宝)等地方都很容易找到。也可以用FPGA驱动LCD本身:使用解码器芯片将HDMI或VGA解码为像素流,通过LVDS将屏幕传输到屏幕,完成。

我这边的情况又是怎么样呢?几十年前确实有过VGA CSTN LCD驱动板,但现在已经很难找到了。FPGA是我唯一的选择。好吧,我会用我心爱的ML505 FPGA开发板做到这一点。

1535734239785-8502611535374271031.jpg

(完成的CSTroN,显示系统属性。当然,这可能是你在CSTN屏幕上通常看不到的东西。)

驱动CSTN

我们来谈谈CSTN屏幕的一些基础知识。与所有其他矩阵显示器一样,​​像素按行和列的矩阵组织。通过在所选行/列和取消选择的行/列上应用正确的交流电压,可以控制每个像素的状态,并且一次最多一行。通过逐行输出图像,以高刷新率刷新整个屏幕,生成图像。基本上所有的点阵屏幕都是这样的。包括常见的点阵LED屏幕。相比LED,LCD处理起来要复杂得多,因为它们需要交流电压而不是直流电压。交流电流也就意味着,反向电流也可以打开像素(与LED的情况不同),因此驱动电压需要“被偏置”,使得点亮的像素具有更高的Vrms,而不该被点亮的像素就有较低的Vrms。

幸运的是,我不需要处理这些偏置的交流电压。它们将由显示模块处理(开关电源调节器会产生高直流电压用于驱动。直流电压通过串联分压器,然后由电压跟随器缓冲,产生偏置的直流电压。这些电压进入行和列驱动器,根据输入的像素数据,调制成正确的交流波形并驱动液晶显示器。我需要注意的只是需要输入显示模块的像素数据。

在公共DPI TFT LCD上,像素数据每时钟一个像素地通过数据总线发送。两条称为水平同步和垂直同步的专用线将在一条线的末端和一帧的末端产生脉冲。像素一样连续写入LCD。通常选择像素时钟频率使得传输全帧需要1/60秒,因此刷新率将为60Hz。数据总线的宽度只是LCD面板的颜色深度。常用值为16位(对于RGB565),18位(对于RGB666)或24位(对于RGB888)。 DPI接口是所有TFT LCD接口的基础,LVDS只是通过LVDS差分对传输的串行DPI,而MIPI DSI只是DPI封装成数据包并通过MIPI DSI总线传输。对于SPI / i80总线LCD,它们具有集成控制器芯片,可从主机控制器接收命令,并在内部生成类似DPI或DPI的信号,以驱动行和列驱动器。您可能会注意到这与VGA信号非常相似,只是模拟RGB信号已被数字RGB信号取代。这使得在这两个信号之间进行转换非常简单:使用DAC将DPI转换为VGA,并使用ADC将VGA转换为DPI。这基本上就是Raspberry Pi的VGA扩展板的工作原理。

乍一看,CSTN的信号非常类似于TFT(取自SX21V001数据表[2],它是640 * RGB * 480 CSTN屏幕):

1553188039337-571641552850940452.png

这是在以整个帧的比例查看时。 CL1每行都有脉冲,这意味着它的工作方式类似于水平同步信号。 FLM每帧脉冲,这意味着它像垂直同步信号一样工作。并且有16条数据线......图中有一个明显的错误,在第一行和第二行期间,UD0-UD7发出Y1和Y2代替X1和X2,LD0和LD7发出Y241和Y242。所以在这里我们可以看到,16条数据线,而不是一起发送一个像素,用于分别传输上下屏幕的像素数据。这使得屏幕实际上看起来像是从主机角度连接在一起的两个640 * 240屏幕。他们这样做是由于所有STN屏幕必须使用的偏置电压寻址方法的限制:对比度与行数成反比(垂直分辨率上升将导致对比度下降)。通过划分上下屏幕,有效行数减半,提高了对比度。但这并不是CSTN / STN与TFT LCD相比的唯一奇怪之处:

1553188063917-5679501552850989561.png

我不确定为什么他们在这里将水平轴称为Y...但无论如何,这里CL2就像一个像素时钟。但UD和LD总线不是每时钟输出1个像素,而是用于表示无符号整数亮度的不同所有位,每个位代表一个像素。这意味着每个像素可以是开或关,但不是任何中间值。 每个子像素1位(1 bpc,每通道位),给出3 bpp(每像素位)颜色深度(8色)。

1553188116656-4002311552850173512.JPG

但是等等……我们知道CSTN的颜色深度很差,通常像4096种颜色或32768种颜色,绝对不是8种颜色!嗯,屏幕驱动程序最多只能支持8种颜色,但我们还能做些什么:PWM。PWM是调暗LED的常用方法,它也可用于调暗LCD。 例如,要显示50%灰度,您只需在帧之间交替打开和关闭像素。 通常,这种技术称为FRC,术语PWM指的是在一帧内交替像素的技术。FRC在LCD控制器内实现,而PWM在LCD驱动器内实现(意味着需要LCD模块支持)。我目前还不知道是否存在任何支持PWM的CSTN LCD(我怀疑一些后来的HPA型CSTN LCD支持PWM,但我无法找到它们的数据手册)。但无论如何,这是支持更高色深的方法。 4 bpc就是4096种颜色,5 bpc则是32768种颜色。

1553188152871-484911552850414534.JPG

不过,代价是什么呢?这种方法会造成屏幕闪烁。通常需要更高的刷新率来补偿这一点,同时也就意味着更高的功耗。我使用的LCD具有120Hz的典型刷新率,而我则是进一步把它超频到了240Hz使用。

实现

鉴于CSTN的奇怪驱动要求,以下是一些挑战:

  • 输入视频信号的刷新率为60Hz。输出视频刷新率应至少为120Hz。
  • 输入视频信号是单扫描像素流(从左上到右下的像素)。输出视频是双扫描像素流(从左上到中右,从左中到右下,同时)的像素。
  • 控制器应具有FRC实现,以显示深度高于面板原始深度的图像。

前两个挑战基本上意味着输出流永远不能与输入流完全同步。在这种设计中必须使用帧缓冲器。输入流和输出流将同时写入和读取不同的位置。

对于第三个挑战,我将使用一种称为GLDP LUT:灰度级显示模式查找表,如[3]中所述。基本上,它是一个带有两个输入的查找表:需要显示的颜色(信号宽度与颜色深度有关,例如4 bpc表示此信号需要4位宽)。以及当前帧计数器。它产生一个输出:像素数据应该发送到显示器。它的宽度应该与显示器的原生颜色深度相匹配,这里它应该是1位。

这是计划的架构:

1553188200215-7029771552850751297.PNG

无论如何,对于实现,第一步总是只显示一些纯色。这可以相当容易地完成,因为实际上并不需要担心它可能具有的所有奇怪之处:所有像素只显示相同的颜色,实际上像素的位置并不重要,这里的主要目标 只是编写一个可以生成正确波形的模块。您可以在此处找到驱动程序模块的最终版本: https://github.com/zephray/CSTroN/blob/master/rtl/lcdc.v.

1553188235179-849161552850769643.JPG

基本测试通过后,我们可以开始进行灰度显示。它主要是一个试错过程,试图产生一个具有最小可见闪烁的LUT。我最终使用两个不同但等效的LUT,以棋盘图案应用于屏幕,意味着相邻像素都不会使用相同的LUT。这可以极大地减少可见的闪烁。你可以在这里找到GLDP LUT:https://github.com/zephray/CSTroN/blob/master/rtl/gldp_lut.v

1553188343452-800-11.jpg

现在所有的显示部分都已完成,下一步将实现帧缓冲。对于640 * 480 RGB555帧缓冲,大小约为600KB。数字不是很大,但绝对比我的FPGA内部存储容量大。板载DDR2存储器用于此设计。Xilinx MIG用作DDR2控制器。设计中有两个FIFO,一个是读FIFO,另一个是写FIFO。一个仲裁器将决定下一个DDR事务是读还是写。还使用双缓冲,输入流将始终写入后缓冲区,输出流将始终从前后方读取。输入帧完成后,交换前后缓冲区。完成的仲裁代码在这里:https://github.com/zephray/CSTroN/blob/master/rtl/sequencer.v.

最后,剩下的就是视频输入。我重复使用了我之前项目中的相同代码,基本上它只是一个视频ADC,将VGA信号转换为DPI信号。代码可以在以下位置找到:https://github.com/zephray/CSTroN/blob/master/rtl/vga_input.v

结论

可以在这里找到一个简单的演示: Youtube 或者在这里: Bilibili

作为我的第三个基于FPGA的项目,我觉得还是十分有趣的一个项目。项目里接触到了Xilinx MIG和DDR2内存,以及一些基本的流水线。如果要改进这个项目的话,可能的改进包括实现更好的基于delta-sigma的FRC调制,并研究一些后来的CSTN技术,如SHARP的HPA(高性能寻址)。

谢谢阅读。

参考

Li, W., & Guo, Q. (2000). Liquid Crystal Display Application Technology. Beijing: Electrical Industry Press.

HITACHI (1999). SX21V001-Z4 Customer’s Acceptance Specifications.

Hsueh, Y., & Lee, J. (2008). Image improvement method for LCD frame rate controller. 2008 IEEE International Symposium on Consumer Electronics. doi:10.1109/isce.2008.4559534