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彩色液晶显示开发板。
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所示。
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
always@(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
always@(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