基于DE2的LCD图形显示设计

 DE2是Altera公司针对大学教学及研究机构推出的FPGA多媒体开发平台。DE2开发平台选用的FPGA是CycloneII系列FPGA中的EP2C35F672C6,通过对DE2的学习,我们能够迅速理解和掌握实时多媒体工业产品设计的技巧,并进行系统设计的验证。DE2平台的设计和制造完全按照工业产品标准进行,可靠性很高。本文利用处理器FPGA与液晶显示模块的图形显示的编程技术,并以点阵为320×RGB×240的TFT LCD模块D036THEA1为例,研究了FPGA与液晶显示模块的图形显示技术。其关键是对驱动芯片D036THEA1的各引脚和时序进行控制。在电路控制部分中,使用QUARTUS II 6.0开发工具来完成软件设计、仿真。所有功能全部用硬件描述语言Verilog HDL编程实现,并下载到DE2实验开发板上CycloneII系列EP2C35F672C6目标芯片上,使用40脚扁平电缆直接把DE2和TFT LCD模块D036THEA1连接起来.运行验证满足TFT LCD模块D036THEA1的图形显示。图形数据可以从外接摄像头获取或者从FPGA芯片内产生图形数据,本设计采用FPGA作为TFT LCD的控制,性能稳定,也可以灵活显示参数以适应各种不同TFT LCD的控制。

目前,电子产品的生命周期越来越短,许多消费类电子产品的生命周期只有一年左右的时间,因而必须缩短产品的开发周期。可编程逻辑器件【1】与固定逻辑器件相比,可大大缩短开发周期。而随着集成电路制造工艺的进步,可编程逻辑器件的设计水平不断提高,其成本已经降低到可以在消费类电子产品中大量使用的程度。从当前技术发展的趋势来看,可编程逻辑器件将逐渐代替大部分的固定逻辑器件。因此可编程逻辑器件应用是值得我们掌握的一门技术。

1.2 目的和意义    

   软核处理器的出现以及可编程逻辑器件的片上存储器容量的增大,使的可编程逻辑器件可以覆盖数字电子领域中的所有应用。Altera公司推出的可编程芯片系统以及NiosII软核处理器【2】进一步明确了这个概念。DE2开发平台是Altera公司针对大学及研究机构推出的一款多媒体开发平台。通过使用DE2开发板可以做FPGA的开发设计及验证。

本课题来源是科研与教学。是用于工业电子.国防.科研领域和日常生活中不可缺少的一部分。通过对其的了解而进一步认识现代社会人们所需要具备的技能。深入学习努力钻研从而更好地运用到社会上去。

1.3国内外研究现状及发展趋势

嵌入式系统的将先进的计算机技术、半导体技术、电子技术和各个行业的具体应用相结合后的产物,这一点就决定了他并然是一个技术密集、资金密集、高度分散和不断创新的知识集成系统。

FPGA并非是近年来才有的,FPGA—词于1984年就已经出现,至今已经超过20年以上时间,不过过去十年时间内FPGA都未受到太多的重视,原因是FPGA的功耗用电、电路密度、频率效能、电路成本都不如ASIC,在这十多年时间内,FPGA多半只用在一些特殊领域,例如芯片业者针对新产品测试市场反应,即便初期产品未达量产规模,业能先以FPGA制成产品测试。或者有些芯片设计公司承接了小型的设计项目,在量产规模不足下业一样使用FPGA,或如*、军方的特殊要求,不期望使用开放、标准性的芯片与电路,业会倾向使用FPGA。

不过如前所述的,在愈来愈多芯片无法用开设掩膜模式投产后,这些芯片一样要上市,就只好以FPGA模式来生产。所幸FPGA也受益于摩尔定律,在工艺技术不断提升下,晶体管愈来愈缩密化,原来相较ASIC逊色的电路密度过低、频率效能过低、电路成本过高等问题,在新一代FPGA上,早已拉近与ASIC间的表现差距。

液晶显示模块(LCM)采用的是Toppoly公司的TFTLCD模D036THEA1,可以接受RGB格式或YUV格式的8位串行数据,支持NTSC时序或PAL时序,点阵为320×240,有效显示面积为72.96×54.72mm,通过3线串行接口与LCM内部的寄存器交换数据来实现显示控制和功能选择。下图7所示为TRDB_LCM彩色液晶显示开发板。

基于DE2的LCD图形显示设计

 

TRDB_LCM可以用40脚电缆直接与DE2相连,引脚定义见下表1。

 

引脚编号

名称

方向

含义

1~10

NC

N/A

未连接

11

VCC5

N/A

5V电源

12

GND

N/A

13~20

NC

N/A

未连接

21

DIN6

输入

LCD数据线第6位

22

DIN7

输入

LCD数据线第7位

23

DIN4

输入

LCD数据线第4位

24

DIN5

输入

LCD数据线第5位

25

DIN2

输入

LCD数据线第2位

26

DIN3

输入

LCD数据线第3位

27

DIN0

输入

LCD数据线第0位

28

DIN1

输入

LCD数据线第1位

29

VCC33

N/A

3.3V电源

30

NC

N/A

未连接

31

VSYNC

输入

垂直同步输入

32

NC

N/A

未连接

33

SCL

输入

3线串行接口时钟

34

DCLK

输入

LCD数据时钟

35

GRESTB

输入

低电平有效的全局复位信号

36

SHDB

输入

关断控制,低电平有效

37

CPW

N/A

保留引脚

38

SCEN

输入

3线串行接口使能

39

SDA

输入/输出

3线串行接口数据

40

HSYNC

输入

水平同步输入

表1  TRDB_LCM的引脚

TRDB_LCM的3线串行接口时序图如图8所示。SCEN为低电平时,3线串行接口有效,完成一次读/写寄存器的地址,第7位确定是读还是写,SDA为高电平则为读,SDA为低电平则为写,第8个时钟周期SDA变为高阻状态,最后8位为读或者写的数据。

场序彩色显示的原理【10】如图1所示,主要是将一场的时间分成3个子场,在每个子场的时间内分别把图像的R、G、B信号写入显示屏,并依次点亮红绿蓝三色光源,利用人眼的视觉暂留特性实现彩色图像的显示。在R、G、B各子场时间内显示屏显示的都是单色图像信息,而在一场时间当中R、G、B信息分别显示一次,所以我们看到的仍是一幅全彩色图像。如图9所示。

基于DE2的LCD图形显示设计

module I2S_Controller(    //     Host Side

                                          iCLK,

                                          iRST,

                                          iDATA,

                                          iSTR,

                                          oACK,

                                          oRDY,

                                          oCLK,

                                          //     Serial Side

                                          I2S_EN,

                                          I2S_DATA,

                                          I2S_CLK     );

//     Host Side

input                    iCLK;

input                    iRST;

input                    iSTR;

input      [15:0]     iDATA;

output                  oACK;

output                  oRDY;

output                  oCLK;

//     Serial Side

output                  I2S_EN;

inout                    I2S_DATA;

output                  I2S_CLK;

//     Internal Register and Wire

reg                       mI2S_CLK;

reg         [15:0]     mI2S_CLK_DIV;

reg                       mSEN;

reg                       mSDATA;

reg                       mSCLK;

reg                       mACK;

reg         [4:0]       mST;

parameter     CLK_Freq    =     50000000;    //     50   MHz

parameter     I2S_Freq      =     20000;          //     20   KHz

//     Serial Clock Generator

[email protected](posedge iCLK or negedge iRST)

begin

       if(!iRST)

       begin

              mI2S_CLK  <=   0;

              mI2S_CLK_DIV       <=   0;

       end

       else

       begin

              if( mI2S_CLK_DIV  < (CLK_Freq/I2S_Freq) )

              mI2S_CLK_DIV       <=   mI2S_CLK_DIV+1;

              else

              begin

                     mI2S_CLK_DIV       <=   0;

                     mI2S_CLK         <=   ~mI2S_CLK;

              end

       end

end

//     Parallel to Serial

[email protected](negedge mI2S_CLK or negedge iRST)

begin

       if(!iRST)

       begin

              mSEN   <=   1'b1;

              mSCLK <=   1'b0;

              mSDATA     <=   1'bz;

              mACK  <=   1'b0;

              mST              <=   4'h00;

       end

       else

       begin

              if(iSTR)

              begin

                     if(mST<17)

                     mST       <=   mST+1'b1;

                     if(mST==0)

                     begin

                            mSEN   <=   1'b0;

                            mSCLK <=   1'b1;

                     end

                     else if(mST==8)

                     mACK  <=   I2S_DATA;

                     else if(mST==16 && mSCLK)

                     begin

                            mSEN   <=   1'b1;

                            mSCLK <=   1'b0;     

                     end

                     if(mST<16)

                     mSDATA     <=   iDATA[15-mST];

              end

              else

              begin

                     mSEN   <=   1'b1;

                     mSCLK <=   1'b0;

                     mSDATA     <=   1'bz;

                     mACK  <=   1'b0;

                     mST              <=   4'h00;

              end

       end

end

assign    oACK          =     mACK;

assign    oRDY          =     (mST==17)   ?     1'b1       :      1'b0;

assign    I2S_EN        =     mSEN;

assign    I2S_CLK            =     mSCLK &    mI2S_CLK;

assign    I2S_DATA  =     (mST==8)     ?     1'bz :

                                          (mST==17)   ?     1'bz :

                                                                      mSDATA     ;

assign    oCLK           =     mI2S_CLK;

endmodule