FPGA 驱动触摸屏(TFT)

合集下载

FPGA驱动OLED动态显示(Verilog代码)——OLED初始化

FPGA驱动OLED动态显示(Verilog代码)——OLED初始化

FPGA驱动OLED动态显⽰(Verilog代码)——OLED初始化/*--------------------------------------------------------------*\Filename : initial_control.vAuthor : CwangDescription :Revision History : 2017-10-16Revision 1.0Email : wangcp@Company : Micro nano instituteCopyright(c) 2017,Micro nano institute,All right resered\*---------------------------------------------------------------*/module initial_control(clk_1m,rst_n,initial_start,spi_write_done,spi_write_start,spi_data,initial_done,res_oled //OLED的RES脚⽤来复位,低电平复位);input clk_1m;input rst_n;input initial_start;input spi_write_done;output spi_write_start;output [9:0] spi_data;output initial_done;output reg res_oled;//--------------------------------------//复位OLEDparameter RES100MS = 20'd100000;reg [19:0] count;reg res_done;always @(posedge clk_1m or negedge rst_n)beginif(!rst_n)begincount <= 20'd0;res_oled <= 1'b0;res_done <= 1'b0;endelseif(count == RES100MS)beginres_oled <= 1'b1;res_done <= 1'b1;count <= RES100MS;endelsebegincount <= count + 1'b1;res_oled <= 1'b0;res_done <= 1'b0;endend//--------------------------------------reg [7:0] i;reg start;reg [9:0] data;reg isdone;//--------------------------------------------------------always@(posedge clk_1m or negedge rst_n)beginif(!rst_n)begini <= 8'd0;start <= 1'b0;isdone <= 1'b0;data <= {2'b11,8'd0};endelsebeginif(initial_start && res_done)begincase(i)//------------------------------------------------------------------------------------- 8'd0:if(spi_write_done) begin start <= 1'b0; i <= i + 1'b1;endelse begin data <= {2'b00,8'hae}; start <= 1'b1;end8'd1:if(spi_write_done) begin start <= 1'b0; i <= i + 1'b1;endelse begin data <= {2'b00,8'h00}; start <= 1'b1;end 8'd2:if(spi_write_done) begin start <= 1'b0; i <= i + 1'b1;endelse begin data <= {2'b00,8'h10}; start <= 1'b1;end8'd3:if(spi_write_done) begin start <= 1'b0; i <= i + 1'b1;endelse begin data <= {2'b00,8'h40}; start <= 1'b1;end8'd4:if(spi_write_done) begin start <= 1'b0; i <= i + 1'b1;endelse begin data <= {2'b00,8'h81}; start <= 1'b1;end8'd5:if(spi_write_done) begin start <= 1'b0; i <= i + 1'b1;endelse begin data <= {2'b00,8'hCF}; start <= 1'b1;end8'd6:if(spi_write_done) begin start <= 1'b0; i <= i + 1'b1;endelse begin data <= {2'b00,8'hA1}; start <= 1'b1;end8'd7:if(spi_write_done) begin start <= 1'b0; i <= i + 1'b1;endelse begin data <= {2'b00,8'hC8}; start <= 1'b1;end8'd8:if(spi_write_done) begin start <= 1'b0; i <= i + 1'b1;endelse begin data <= {2'b00,8'hA6}; start <= 1'b1;end8'd9:if(spi_write_done) begin start <= 1'b0; i <= i + 1'b1;endelse begin data <= {2'b00,8'hA8}; start <= 1'b1;end8'd10:if(spi_write_done) begin start <= 1'b0; i <= i + 1'b1;endelse begin data <= {2'b00,8'h3F}; start <= 1'b1;end8'd11:if(spi_write_done) begin start <= 1'b0; i <= i + 1'b1;endelse begin data <= {2'b00,8'hD3}; start <= 1'b1;end8'd12:if(spi_write_done) begin start <= 1'b0; i <= i + 1'b1;endelse begin data <= {2'b00,8'h00}; start <= 1'b1;end8'd13:if(spi_write_done) begin start <= 1'b0; i <= i + 1'b1;endelse begin data <= {2'b00,8'hD5}; start <= 1'b1;end8'd14:if(spi_write_done) begin start <= 1'b0; i <= i + 1'b1;endelse begin data <= {2'b00,8'h80}; start <= 1'b1;end8'd15:if(spi_write_done) begin start <= 1'b0; i <= i + 1'b1;endelse begin data <= {2'b00,8'hD9}; start <= 1'b1;end8'd16:if(spi_write_done) begin start <= 1'b0; i <= i + 1'b1;endelse begin data <= {2'b00,8'hF1}; start <= 1'b1;end8'd17:if(spi_write_done) begin start <= 1'b0; i <= i + 1'b1;endelse begin data <= {2'b00,8'hDA}; start <= 1'b1;end 8'd18:if(spi_write_done) begin start <= 1'b0; i <= i + 1'b1;endelse begin data <= {2'b00,8'h12}; start <= 1'b1;end8'd19:if(spi_write_done) begin start <= 1'b0; i <= i + 1'b1;endelse begin data <= {2'b00,8'hDB}; start <= 1'b1;end 8'd20:if(spi_write_done) begin start <= 1'b0; i <= i + 1'b1;endelse begin data <= {2'b00,8'h40}; start <= 1'b1;end8'd21:if(spi_write_done) begin start <= 1'b0; i <= i + 1'b1;endelse begin data <= {2'b00,8'h20}; start <= 1'b1;end8'd22:if(spi_write_done) begin start <= 1'b0; i <= i + 1'b1;endelse begin data <= {2'b00,8'h02}; start <= 1'b1;end8'd23:if(spi_write_done) begin start <= 1'b0; i <= i + 1'b1;endelse begin data <= {2'b00,8'h8D}; start <= 1'b1;end8'd24:if(spi_write_done) begin start <= 1'b0; i <= i + 1'b1;endelse begin data <= {2'b00,8'h14}; start <= 1'b1;end8'd25:if(spi_write_done) begin start <= 1'b0; i <= i + 1'b1;endelse begin data <= {2'b00,8'hA4}; start <= 1'b1;end8'd26:if(spi_write_done) begin start <= 1'b0; i <= i + 1'b1;endelse begin data <= {2'b00,8'hA6}; start <= 1'b1;end8'd27:if(spi_write_done) begin start <= 1'b0; i <= i + 1'b1;endelse begin data <= {2'b00,8'hAF}; start <= 1'b1;end//--------------------------------------------------------------------------------8'd28:begindata <= {2'b11,8'd0}; isdone <= 1'b1; i <= i + 1'b1;end8'd29:beginisdone <= 1'b0; i <= 8'd0;endendcaseendendendassign spi_data = data;assign spi_write_start = start;assign initial_done = isdone;endmodule注释:1、以上初始化数据是针对驱动芯⽚SSD1306,128*64的OLED;2、应该先复位OLED;3、初始化之后应该将⽚选CS置⾼,如8'd28:data <= {2'b11,8'd0};。

常见液晶驱动控制芯片详解

常见液晶驱动控制芯片详解

常见液晶驱动控制芯片详解前言因此各位朋友在选择LCD液晶模块的时候,在考虑到串行,还是并行的方式时,可根据其驱动控制IC的型号来判别,当然你还需要看你选择的LCD模块引脚定义是固定支持并行,还是可选择并行或串行的方式。

一、字符型LCD驱动控制IC市场上通用的8×1、8×2、16×1、16X2、16X4、20X2、20X4、40X4等字符型LCD,基本上都采用的KS0066 作为LCD 的驱动控制器。

二、图形点阵型LCD驱动控制IC2.1、点阵数122X32—SED1520。

2.2、点阵数128×64。

(1)RA8816,支持串行或并行数据操作方式,内置中文汉字字库。

(2)KS0108/RA8808,只支持并行数据操作方式,也是最通用的12864点阵液晶的驱动控制IC。

(3)ST7565,支持中行或并行数据操作方式。

(4)S6B0724,支持中行或并行数据操作方式。

(5)RA6963,支持并行数据操作方式。

2.3、其他点阵数如192×64、240×64、320X64、240X128 的一般都是采用RA6963驱动控制芯片。

2.4、点阵数320X240,通用的采用RA8835 内置ASCII字库,以及RA8806驱动IC内置ASCII和中文等字库。

这里列举的只是一些常用的,当然还有其他LCD 驱动控制IC,在写LCD 驱动时要清楚是哪个型号的IC,再到网上去寻找对应的IC 数据手册吧。

后面我将慢慢补上其它一些常见的。

三、12864 液晶的奥秘CD1601/1602和LCD12864 都是通常使用的液晶,有人以为12864是一个统一的编号,主要是12864 的液晶驱动都是一样的,其实12864只是表示液晶的点阵是128*64点阵,而实际的12864 有带字库的,也有不带字库的:有5V电压的,也有3.3V工作电压:归根到底的区别在于驱动控制芯片,常用的控制芯片有RA8816、KS0108/RA8808、RA6963等等。

TFT控制方案 FPGA

TFT控制方案 FPGA

广州致远电子有限公司TFT 控制器方案基于Actel FPGA 实现类别内容关键词 TFT ,Actel FPGA摘 要TFT 诞生于80年代末,在1995年之后被广泛的应用,随着TFT 价格的下降,应用范围出现了前所未有的变化,可以适用于医疗、电梯、数控机床、汽车电子、消费类电子等行业。

修订历史版本日期原因V0.00 2009/11/30 创建文档V1.00 2010/05/10 文档修订销售与服务网络(一)广州周立功单片机发展有限公司地址:广州市天河北路689号光大银行大厦12楼F4 邮编:510630电话:(020)38730916 38730917 38730972 38730976 38730977 传真:(020)38730925 网址:广州专卖店地址:广州市天河区新赛格电子城203-204室 电话:(020)87578634 87569917 传真:(020)87578842南京周立功地址:南京市珠江路280号珠江大厦2006室 电话:(025)83613221 83613271 83603500 传真:(025)83613271北京周立功地址:北京市海淀区知春路113号银网中心A 座1207-1208室 (中发电子市场斜对面) 电话:(010)62536178 62536179 82628073 传真:(010)82614433重庆周立功地址:重庆市石桥铺科园一路二号大西洋国际大厦(赛格电子市场)1611室 电话:(023)68796438 68796439 传真:(023)68796439杭州周立功地址:杭州市天目山路217号江南电子大厦502室 电话:(0571)89719480 89719481 89719482 89719483 89719484 89719485 传真:(0571)89719494成都周立功地址:成都市一环路南二段1号数码同人港401室(磨子桥立交西北角)电话:(028)85439836 85437446 传真:(028)85437896深圳周立功地址:深圳市深南中路 2070号电子科技大厦C 座4楼D 室电话:(0755)83781788(5线) 传真:(0755)83793285武汉周立功地址:武汉市洪山区广埠屯珞瑜路158号12128室(华中电脑数码市场)电话:(027)87168497 87168297 87168397 传真:(027)87163755上海周立功地址:上海市北京东路668号科技京城东座7E 室 电话:(021)53083452 53083453 53083496 传真:(021)53083491西安办事处地址:西安市长安北路54号太平洋大厦1201室 电话:(029)87881296 83063000 87881295 传真:(029)87880865销售与服务网络(二)广州致远电子有限公司地址:广州市天河区车陂路黄洲工业区3栋2楼邮编:510660传真:(020)38601859网址:(嵌入式系统事业部)(工控网络事业部)(楼宇自动化事业部)技术支持:CAN-bus:电话:(020)22644381 22644382 22644253 邮箱:can.support@ iCAN及数据采集:电话:(020)28872344 22644373 邮箱:ican@MiniARM:电话:(020)28872684 28267813邮箱:miniarm.support@ 以太网:电话:(020)22644380 22644385邮箱:ethernet.support@无线通讯:电话:(020) 22644386邮箱:wireless@ 串行通讯:电话:(020)28267800 22644385 邮箱:serial@编程器:电话:(020)22644371邮箱:programmer@ 分析仪器:电话:(020)22644375 28872624 28872345 邮箱:tools@ARM嵌入式系统:电话:(020)28872347 28872377 22644383 22644384 邮箱:arm.support@楼宇自动化:电话:(020)22644376 22644389 28267806 邮箱:mjs.support@mifare.support@销售:电话:(020)22644249 22644399 22644372 22644261 28872524 28872342 28872349 28872569 28872573 38601786维修:电话:(020)22644245目录1. TFT简介 (1)2. 原理概述 (2)2.1方案简介 (2)2.2基于Actel FPGA的TFT控制器方案 (2)2.2.1低成本、多功能、低分辨率显示方案 (2)2.2.2低成本、多功能、高分辨率显示方案 (3)2.2.3高性能、低分辨率显示方案 (4)2.2.4多功能、高分辨率显示方案 (4)3. 典型应用 (6)4. 免责声明 (7)1. TFT简介在1970年,Fergason制造了第一台具有实用性的LCD,从此之后,用户产品的界面发生了巨大改变,变得更加的美观、实用,在一定场合下逐渐取代传统的数码管、LED的显示。

Digilent VmodTFT 4.3 英寸彩色 TFT LCD 触摸屏说明书

Digilent VmodTFT 4.3 英寸彩色 TFT LCD 触摸屏说明书
Power-Up Sequence
The LCD has a specific power-up sequence that needs to be followed for proper operation.
The VmodTFT should only be attached to the system board once the signals driven by the system board are defined.
In analog mode, the backlight intensity is set by the voltage divider formed by R7 and R10. Valid values are 0.7V (dimmest) to 1.4V (brightest).
In digital mode, the FPGA can drive this pin with a PWM signal of 100Hz-50kHz.
VmodTFT Reference Manual
layers form plates X and Y. Each plate has electrodes on opposite sides and a constant resistance.
Figure 3 AC Characteristics
Figure 2 Video Timing
Video data is sent on a parallel interface synchronous to CLK. The table below lists the timing parameters of this interface. “Data” refers to the combined pixel data from the R, G, and B pins.

使用单片机ram加速刷新tft屏幕的方法

使用单片机ram加速刷新tft屏幕的方法

使用单片机ram加速刷新tft屏幕的方法在嵌入式系统应用中,我们有时会需要用到TFT(薄膜晶体管)屏幕来显示图像或文本。

TFT屏幕的刷新率决定了显示的流畅度,而单片机(MCU)的RAM(随机存取存储器)大小则影响了刷新率的上限。

以下是一个使用单片机RAM加速刷新TFT屏幕的方法:1. **了解RAM和TFT屏幕的关系**:TFT屏幕的刷新率与单片机RAM 的大小直接相关。

RAM越大,可以缓存的像素数据越多,从而可以更快地刷新屏幕。

2. **优化数据传输**:尽量减少从单片机RAM到TFT屏幕的数据传输。

可以通过在RAM中预存多行或一整屏的像素数据来实现。

这样,当需要刷新屏幕时,直接从RAM中读取数据,而不是从其他存储器或处理器缓存中。

3. **多线程处理**:在条件允许的情况下,可以考虑使用多线程。

一个线程专门用于处理显示逻辑,持续从RAM中读取数据并写入TFT 屏幕;另一个线程则可以处理其他任务,如用户输入或数据处理。

4. **优化数据结构**:考虑使用最适合你应用的数据结构来存储像素数据。

例如,如果你需要频繁地读取和写入像素数据,使用数组可能更为高效。

5. **使用DMA(直接内存访问)**:如果单片机支持DMA(直接内存访问),那么可以使用DMA来传输像素数据到TFT屏幕。

DMA可以在后台进行数据传输,从而释放CPU资源用于其他任务。

6. **硬件加速**:一些高级的单片机或TFT屏幕控制器可能提供硬件加速功能,这可以在特定情况下进一步提高刷新率。

7. **软件优化**:编写优化的驱动代码来控制TFT屏幕。

确保你的代码在读写像素数据时是高效的,并尽量减少不必要的中断或上下文切换。

8. **考虑硬件升级**:如果你的应用对刷新率有特别高的要求,而单片机的RAM大小成为瓶颈,那么可能需要考虑升级到具有更大RAM 或更高级处理能力的单片机。

9. **测试和调试**:在实施上述优化后,进行彻底的测试以确保一切工作正常,并且刷新率达到了预期。

TFT LCD驱动芯片的研究与设计

TFT LCD驱动芯片的研究与设计

西安电子科技大学硕士学位论文TFT LCD驱动芯片的研究与设计姓名:唐华申请学位级别:硕士专业:微电子学与固体电子学指导教师:吴玉广200601012TFTLCD驱动芯片的研究与设计图1.1液晶屏显示原理如上所述,在LcD屏上外加电压,液晶分子排列会改变,LcD将根据电压的有无和大小,控制液晶分子排列方向,使面板达到显示效果。

若上、下偏光板吸收轴方向成900,唯一一个方向振动的光能否通过LCD屏,取决于是否外加电压,而光通过与否则决定了“白”和“黑”,这样在LcD上可显示出图像。

当然,白和黑的中间色是由外加电压的中间电位决定的,电压不同透光率不同,显示的明暗程度就不同。

若加上彩色滤光膜(cF),则可显示彩色影像。

1.2TFTLCD的发展在众多平板显示器的激烈竞争中,肝LcD能够脱颖而出,成为新一代的主流显示器决不是偶然,是人类科技发展和思维模式发展的必然。

液晶先后避开了困难的发光问题,利用液晶作为光阀的优良特性把发光显示器件分解成两部分,即光源和对光源的控制。

作为光源,无论从发光效率、全彩色,还是寿命,都已取得了辉煌的成果,而且还在不断深化之中。

自LCD发明以来,背光源在不断地进步,由单色到彩色,由厚到薄,由侧置荧光灯式到平板荧光灯式。

在发光光源方面取得的最新成果都会为LcD提供新的背光源。

随着光源科技的进步,会有更新更好的光源出现并为LcD所应用。

余下的就是对光源的控制,把半导体大规模集成电路的技术和工艺移植过来,研制成功了薄膜晶体管(TFD生产工艺,实现了对液晶光阀的矩阵寻址控制,解决了液晶显示器的光阀和控制器的配合,从而使波晶显示的优势得以实现。

液晶显示器包括无源矩阵液晶显示器口M-LcD)与有源矩阵液晶显示器(AM.LcD)。

sTN与TN液晶显示器均同属于无源矩阵液晶显示器。

90年代,有源矩阵液晶显示器技术获得了飞速发展,特别是薄膜晶体管液晶显示器(TFT.LCD)。

它作为sTN的换代产品具有响应速度快、不闪烁等优点,广泛应用到便携式计算机及工作站、电视、摄录像机和手持式视频游戏机等产品中。

开题报告---基于FPGA的TFT LCD驱动电路设计

开题报告---基于FPGA的TFT LCD驱动电路设计
3.设计拟的资料是台湾Himax公司的FTF_LCD驱动IC的资料。以HX8292这颗芯片为例。它的datasheet里面给我们参考了做液晶设计的几种方案来适合这颗IC,并且给出了时序信号的大小,电源电压的大小都做了详细的分析,给这次设计带来了很大的方便与参考。作为TFT_LCD这个工业设计,驱动IC占据着举足轻重的地位。IC的基本了解也是我们作为设计人员的基本任务。
对于文献[5]讲的基于FPGA研究了液晶显示的驱动方法,参照液晶显示的逻辑和时序标准设计了可选择分辨率的通用液晶驱动,用Verilog硬件描述语言编写了通用液晶显示驱动控制器,可以实现不同分辨率的清晰动态显示,在不需要修改核心代码的情况下,普遍适用于多种分辨率图像切换显示。经实验验证,该通用液晶显示控制器占用资源少,能够满足液晶显示时序控制的要求,通用性好,可移植性强,在系统外扩高速存储设备后即可作为嵌入式系统的一部分驱动标准高分辨率液晶显示器。
4.设计拟应用的文献综述
在文献[1]中概述了中国TFT_LCD产业的发展,分别阐述了TFT_LCD产业,世界TFT_LCD产业的发展,以及中国的现状和对中国未来TFT_LCD的展望。从80年代开始,经历过几次大的投资浪潮之后,中国大陆已经成为全世界最大的TN_LCD生产基地和主要的STN_LCD生产基地。2003年又开始大规模涉足TFT_LCD产业,以京东方科技集团股份有限公司收购韩国现代三条TFT_LCD生产线和所有LCD业务以及京东方和上广电又分别投资在大陆建设2条第五代TFT_LCD生产线为标志,中国正在步入世界液晶强国之列。
2.设计拟解决的工程实际问题
实际工程应用中,中小尺寸TFT_LCD模块一般都已经集成了驱动芯片和背光模组,使用者只需按照规格提供电源电压,扫描时序,并按照时序要求向TFT_LCD模块输送显示数据即可实现正常显示。采用FPGA作为控制芯片,可以缩短开发周期,并且可以在线编程,解决客诉问题,并且能更好的分析原因。

FPGA的触摸屏控制系统-5页文档资料

FPGA的触摸屏控制系统-5页文档资料

FPGA的触摸屏控制系统1 概述触摸屏操作简单,控制方便,越来越成为手机及平板电脑的主流输入和显示设备。

目前,世界上常用的触摸屏有电阻式触摸屏和电感式触摸屏。

由于电阻式触摸屏具备结构简单、制造便捷、各项功能易被大多数设备所兼容的特点,故本系统选用电阻式触摸屏作为输入设备。

FPGA具有性能高速、控制精准、实时性好的特点,当把FPGA设置为ASIC,性能和效率将大大提升,功耗得到大幅降低。

2 总体设计本系统选用FPGA为主控制器,从触摸数据采集模块中读取触摸点数据,对数据进行处理得到相应点的坐标值,然后在显示器上显示相应的数据,同时LED指示完成相应的操作,系统的总体框图如图1。

图1 触摸屏控制系统框图触摸屏接受外部触摸信号,触摸坐标点的偏置电压随着屏幕水平和垂直方向的滑变电阻而变化。

触摸屏控制器主要完成触摸屏和FPGA控制器间的数据传输,对触摸数据进行实施采样,一旦发生触摸操作,即将中断信号发送至FPGA,由FPGA进行数据采集,发送指令启动AD转换,并将转换信号传输至FPGA控制器,完成数据转换。

显示控制器接受FPGA发送的控制数据,在TFT屏幕上进行显示。

在这里,FGPA选用ALTERA公司的EP2C8Q208,触摸屏控制器选用四线式电阻控制器XPT2046,便于实现触摸点压力测量,TFT控制器选用通用的LCD控制器ILI9325。

3 硬件电路设计系统电源需要5V、3.3V和1.2V电压,由于TFT背光需要较高的亮度,故采用5V供电;3.3V电压主要提供给TFT显示控制器、触摸屏控制器、FPGA芯片IO接口、SDRAM等,选用LM1085稳压芯片;1.2V作为FPGA芯片核心工作电压,采用AMS117-1.2稳压芯片。

为保证系统稳定工作,在各电源输入输出部分均使用滤波电容。

FPGA系统由时钟电路、复位电路和FPGA芯片构成。

本系统选用50MHz 晶振作为FPGA的工作时钟,晶振输出的时钟信号送至FPGA的第23引脚,即CLK0。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

FPGA 驱动触摸屏(TFT)发表于2010 年09 月07 日由hulin 1,830 views可视化的操作已经广泛的深入我们的生活方方面面了,自己在做一些项目和实验都要用到可视化。

我这儿把ALTERA公司的飓风二系列中的ep2c5接上触摸屏,本来是R[7:0],G[7:0]和B[7:0]。

也就是一个像素的数据量就是3字节,但由于很多DSP或者单片机数据总线格式一般是16bit和32bit。

本人在这儿使用16bit,根据人的视觉感受,我们把24bit抽取出16bit。

格式为pixdata[15:0]={R[7:3],G[7:2],B[7:3]}取其每个色相的高位(取R高5位,取G高6位,取B高5位,组成RBG565格式)。

虽然在每一个像素都有色相不全,但是这样基本能显示所有的图片。

FPGA的程序模块根据TFT LCD的显示控制时序编写Verilog代码,以实现显示图片的功能。

其时序如图:一、FPGA LCD显示模块的Verilog代码:module TftControl(// inputsreset,tftcs,clk,R_in,G_in,B_in,//outputshsync,vsync,R,G,B,pixclk,tften,startpicture,pictureclk);//inputsinput reset;input tftcs;input clk;input [4:0] R_in;input [5:0] G_in;input [4:0] B_in;//outputs output hsync;output vsync;output [4:0] R;output [5:0] G;output [4:0] B;output startpicture; output pictureclk;output pixclk;output tften;wire hsync;wire vsync;wire startpicture;reg tften;reg [4:0] R;reg [5:0] G;reg [4:0] B;reg pixclk;reg pictureclk;reg [10:0] pix_count;reg [10:0] line_count;reg [2:0] counter;// 320 by 240 VGA timing parameters// horizontal timing parametersparameter hsync_end = 30; //sync pulse, 320×240 = 96parameter hblank_begin = 68; // = sync + back porch, 320×240 = 68parameter hblank_end = 388; // = sync + back porch + h_resolution, 320×240 = 388parameter hline_end = 408; // = sync + back porch + h_resolution + front porch, 320×240 = 408// vertical timing parametersparameter vsync_end = 3; //sync pulse, 320×240 = 3parameter vblank_begin = 18; // = sync + back porch, 320×240 = 18parameter vblank_end = 258; // = sync + back porch + v_resolution, 320×240 = 258parameter vframe_end = 262; // = sync + back porch + v_resolution + front porch, 320×240 = 262// these are all the syncs and blanks for the video timingassign hsync = (pix_count < hsync_end) ? 1′b0 : 1′b1;assign vsync = (line_count < vsync_end) ? 1′b0 : 1′b1; // active indicates that the color value should be output, or black when not activeassign startpicture= ((line_count > (vblank_begin-1)) && (line_count < (vblank_end)) && (pix_count > (hblank_begin –1)) && (pix_count < (hblank_end))) ? 1′b1 : 1′b0;always @ (posedge clk)beginif (!reset)begincounter<=0;tften<=1;endelse if(!tftcs)begintften<=0;counter<=counter+1;pixclk<=counter[2];R <= (startpicture) ? R_in : 5′h00; // red color value output to video DACG <= (startp icture) ? G_in : 6′h00; // green color value output to video DACB <= (startpicture) ? B_in : 5′h00; // blue color value output to video DACpictureclk<=(startpicture) ? counter[2]:1′bz ;endelsebegintften<=1;R <= 5′hzz; // red color value output to video DACG <= 6′hzz; // green color value output to video DACB <= 5′hzz; // blue color value output to video DACendend// the heart of the time base these two counters, the pixel and line countersalways @ (posedge pixclk)beginif (!reset)beginpix_count <= 11′h0;line_count <= 11′h0;endelsebeginif(pix_count == (hline_end-1))beginpix_count <= 11′h0;if(line_count == (vframe_end-1))beginline_count <= 11′h0;endelsebeginline_count <= line_count + 1′b1;endendelsebeginpix_count <= pix_count + 1′b1;endendendendmodule触摸屏输入由于面板上的触摸屏产生的输出信号不是直接的数字电平,其产生的为模拟电压。

通过压力传感电阻把触摸笔在面板上的位置通过传感电阻转换成不同的电压值通过+X,+Y,-X,-Y四个脚输出模拟信号。

如图所示:电阻式触摸屏专用控制器ADS7843的应用就构成了集文字图形笔输入控制、编辑和无线传送于一体的无线掌上电脑产品。

ADS7843是BURR-BROWN公司专用于4线电阻式触摸屏的12位模/数采样转换器,单一电源供电、完全降功耗模式、转换速度快。

ADS7843大量用在电池供电PDA(personaldigitalassistants)和手持便携式装置中。

通过FPGA IO 脚对ADS7843进行接口控制就能获取触摸屏位置转换信号,FPGA作为液晶显示控制器就能将显示缓冲区数据送到液晶屏上正确显示。

二、FPGA触摸输入Verilog程序:module TouchControl(mclk,rst,csn,dclk,din,dout,busy,tint,datareg,datax1,datax2,datay1,datay2,LCD_POWERON,dout_en);input mclk,rst,dout,busy,tint;output csn,dclk,din;output [11:0]datareg,datax1,datax2,datay1,datay2;output wire LCD_POWERON=1′bz;output dout_en;reg [10:0] clkcnt;always @ (posedge mclk or negedge rst)if(!rst)clkcnt<=11′d0;elseclkcnt<=clkcnt+1′b1;wire clk_32=clkcnt[9];reg csn,flagxy,startflag;reg [1:0] cnty;reg [3:0] cmdx,waitdin,waitdin2;reg [7:0] cmd;reg [9:0] tintflag;reg din;reg [19:0] endcnt;wire dclk=(!cs n)?clk_32:1′b0;always @ (negedge clk_32 or negedge rst)if(!rst)beginstate<=6′d0;csn<=1′b1;cmdx<=4′d0;din<=1′b0;waitdin<=4′d0;flagxy<=1′b0;cnty<=2′d0;waitdin2<=4′d0;startflag<=1′b0;endcnt<=20′d0;endelsecase(state)6′d0:beginstate<=6′d1;end6′d1:beginif(!tint)state<=6′d2;elsestate<=state;end6′d2:begincmd<=8′b10010000;state<=3′d3;end6′d3:begincsn<=1′b0;if(cmdx!=4′d7)begindin<=cmd[7];cmd<=(cmd<<1);cmdx<=cmdx+1′b1;state<=state;endelsedin<=cmd[7];cmdx<=4′d0;case(cnty)2′d0:begincmd<=8′b11010000;cnty<=2′d1;state<=6′d4;end2′d1:begincmd<=8′b10010000;cnty<=2′d2;state<=6′d4;end2′d2:begincmd<=8′b11010000;cnty<=2′d3;state<=6′d4;end2′d3:begincnty<=2′d0;state<=6′d5;endendcaseendend6′d4:beginif(waitdin!=4′d15)beginwaitdin<=waitdin+1′b1;din<=1′b0;state<=state;endelsebeginwaitdin<=4′d0;din<=1′b0;state<=3′d3;endend6′d5:beginif(waitdin2!=4′d15)beginwaitdin2<=waitdin2+1′b1;state<=state;endelsebeginwaitdin2<=4′d0;csn<=1′b1;state<=6′d6;//if(!startflag) begin state<=6′d1;startflag<=1′b1;end//else begin state<=6′d1;startflag<=1′b0;endendend6′d6:beginif(endcnt==20′d10000)beginendcnt<=20′d0;state<=6′d1;endelsebeginendcnt<=endcnt+1′b1;state<=state;endendendcasereg [11:0] datareg,datax1,datax2,datay1,datay2;reg [3:0] readcnt,statedin,readxy;reg dout_en;always @ (posedge dclk or negedge rst)if(!rst)begindatareg<=12′d0;datax1=12′d0;datax2=12′d0;datay1=12′d0;datay2=12′d0;readcnt<=4′d0;statedin<=4′d0;readxy<=4′d0;dout_en<=1′b1;endelsebegincase(statedin)4′d0:begindout_en<=1′b1;if(busy)begin datareg<=12′d0;statedin<=4′d1; endelsestatedin<=statedin;end4′d1:begincase(readcnt)4′d0:begin datareg[11]<=dout;readcnt<=4′d1;statedin<=statedin;end4′d1:begin datareg[10]<=dout;readcnt<=4′d2;statedin<=st atedin;end4′d2:begin datareg[9] <=dout;readcnt<=4′d3;statedin<=statedin;end4′d3:begin datareg[8] <=dout;readcnt<=4′d4;statedin<=statedin;end4′d4:begin datareg[7] <=dout;readcnt<=4′d5;statedin<=stated in;end4′d5:begin datareg[6] <=dout;readcnt<=4′d6;statedin<=statedin;end4′d6:begin datareg[5] <=dout;readcnt<=4′d7;statedin<=statedin;end4′d7:begin datareg[4] <=dout;readcnt<=4′d8;statedin<=statedin;e nd4′d8:begin datareg[3] <=dout;readcnt<=4′d9;statedin<=statedin;end4′d9:begin datareg[2] <=dout;readcnt<=4′d10;statedin<=statedin;end4′d10:begin datareg[1]<=dout;readcnt<=4′d11;statedin<=statedin;end4′d11:begin datareg[0]<=dout;readcnt<=4′d0;statedin<=4′d2;endendcaseend4′d2:begincase(readxy)4′d0:begin datay1<=datareg;readxy<=4′d1;statedin<=4′d0;end4′d1:begin datax1<=datareg;readxy<=4′d2;statedin<=4′d0;end4′d2:begin datay2<=datareg;readxy<=4′d3;statedin<=4′d0;end4′d3:begin datax2<=datareg;readxy<=4′d0;statedin<=4′d0;dout_en<=1′b0;end endcaseendendcaseendendmodule。

相关文档
最新文档