基于FPGA的点阵式液晶显示控制模块的设计.docx
- 文档编号:25163500
- 上传时间:2023-06-05
- 格式:DOCX
- 页数:27
- 大小:107.86KB
基于FPGA的点阵式液晶显示控制模块的设计.docx
《基于FPGA的点阵式液晶显示控制模块的设计.docx》由会员分享,可在线阅读,更多相关《基于FPGA的点阵式液晶显示控制模块的设计.docx(27页珍藏版)》请在冰豆网上搜索。
基于FPGA的点阵式液晶显示控制模块的设计
摘要:
随着人们生活水平的提高,对显示器的要求也随之提高了。
液晶作为一种新兴的显示器,以其节电、低辐射、体积小、散热小等优点,迅速成为最受欢迎的显示器之一。
并且它不仅能把想要知道的数据以数字形式表示出来,它甚至可以很直观方便的以汉字与图表的形式表示出来,后者的功能是一般的七段LED数码管所不能实现的。
而且液晶显示器是纯数字设备因此与此连接的设备也是数字的,从而可以减少在数模转换过程中的信号损失和干扰,其次不需要进行时钟频率、向量的调整。
而基于FPGA控制的液晶显示器以其快速性和稳定性的优势受到了越来越多的研究。
本设计我们采用的液晶的型号是GDM12864,在理解其显示原理和引脚结构的基础上,把该液晶分为8页,这样可以只用其中的一部分来进行显示。
我们主要设计的是显示模块部分的编程,为了简化设计,把该部分分为控制显示程序和字库的调用模块。
字库对于编写控制模块的程序,我们要用到QuartusII软件来编译和仿真程序。
QuartusII软件自带的仿真器支持波形文件作为激励。
关键字:
液晶FPGAQuartusII控制
一引言
1.1课题的来源、意义
近年来越来越多的设备上都是用液晶进行显示的,它与传统的CRT显示器相比最大的优点就是耗电更量低并且体积更小。
一般说来,液晶的耗电量还不到CRT显示器的一半,而体积还不到后者的1/4。
而相比较于LED数码管,它可以显示的信息要更丰富。
我们都知道,LED数码管只能显示数字,这对于普通设备上的简单显示也就足够了,但对于稍微复杂的字母汉字以及图像的显示,就完全不能和液晶显示器相比了。
所以单从人机交互的方面考虑,液晶无疑是最理想的,从而液晶显示器成为了现在工业仪表和工业控制等领域的主流显示器。
由于用普通的原理图方式来设计和管理包含上万甚至几十万、上百万个晶体管的集成电路是十分复杂甚至不可能实现的,而这正是FPGA芯片的优点所在。
而且近几年用综合工具把可综合风格的HDL模块转换成具体电路发展非常迅速,大大提高了复杂数字系统的设计生产率。
所以FPGA产品已经从最初的通信行业扩展到消费电子、军事航天、汽车电子等行业。
而传统的用于控制液晶显示的单片机或DSP由于运算速度方面不是令人满意,显示显示效果并不理想。
研究人员因而把目标转移到FPGA芯片上来。
1.2课题的研究意义和发展现状
1.2.1课题的研究意义
现代计算机与通信系统的电子设备中广泛使用了数字信号处理的专用集成电路。
它们主要用于数字信号的传输所必须的滤波、变换、编码、解码、加密、解密、校验、压缩、解压等,对于处理这些以大量的数学运算为基础的处理,传统的C、Pascal、Fortran、Basic语言或汇编语言这几种常用的编程语言都可以。
如果只研究算法,只在通用的计算机上运行程序或利用通用的CPU来设计专用的微处理器嵌入系统,掌握上述语言就足够了。
如果需要设计和制造能进行快速计算的硬件逻辑专用电路,必须学习数字电路的基本知识和硬件描述语言。
因为现代复杂数字逻辑系统的设计都是借助于EDA工具完成的,无论电路系统的仿真和综合都需要掌握硬件描述语言。
近年来数字信号处理(DSP)系统的研究人员一直在致力于研究出更快的算法来实现对信号的即时处理。
当产生比较可靠的算法后,就通过各种编程语言及仿真软件来仿真实现。
但随着信息技术的快速发展以及人们对设备的智能化、微型化、低功耗方面的要求的提高,很多工程项目都要求系统的实时响应。
所以我们的处理系统在接受到信号后必须在毫秒甚至微秒级的时间内处理完成并送到的相应的输出模块中。
这时通用的微处理器或专用与信号处理的微处理器显然是无法实现的。
对于这些复杂的运算,只能用专用的高速硬线逻辑电路即FPGA器件来实现。
在FPGA的高速大规模集成电路的基础上实现对数字信号的实时处理。
而现代专用集成电路的设计是通过电子设计自动化(EDA)工具实现的。
1.2.2课题的发展前景
FPGA可以用硬件描述语言(HDL)的程序设计硬件,其好处主要体现在:
理解容易,电路的调试速度快,维护简单,有很多易于掌握的仿真、综合和布局布线工具,还有可以用C语言配合HDL来做逻辑设计的布线前后的仿真并验证功能是否正确。
CPLD能完成任何数字器件的功能。
上至高性能CPU,下至简单的74系列电路,都可用CPLD实现。
这些器件如同一张白纸或是一堆积木,可以通过原理图或硬件描述语言自由设计一个数字系统。
再通过QuartusII等软件仿真,还可以事先验证设计的正确性。
在完成PCB以后,还可以利用在线修改能力,随时修改设计而不必改动硬件电路。
使用CPLD器件,可以大大缩短设计时间,支持可重复擦写,减少PCB面积,提高系统的可靠性。
PLD的这些优点使得它在90年代后得到飞速发展。
二点阵式液晶显示控制模块的原理介绍
2.1点阵式液晶显示控制模块基本原理
2.1.1显示控制模块的基本原理
该模块通过对FPGA芯片编程,并通过调用显示ROM文件中的字库,把相应的二进制显示代码逐条送到显示驱动电路,再经放大后送到点阵式液晶显示出来。
2.1.2显示控制模块的原理框图
我们根据2.1.1对点阵式液晶显示控制模块的描述,设计如图2-1的原理框图。
显示驱动控制器
控制信号控制信号驱动时序
显示数据
显示数据
显示数据
图2–1点阵式液晶显示控制模块框图
图中FPGA是用来做主控制芯片的,相当于一个微控制器。
显示ROM中包含有要显示的字库或图形的代码,FPGA就是通过显示控制电路查询并调用其二进制代码,送到点阵式液晶进行显示。
显示ROM与FPGA是两个分别独立的部分,所以对于相同的FPGA控制程序,只需改变要显示的ROM中的字库就可以改变显示内容,而不必对FPGA做另外的修改。
通过这种方式控制设计的硬件的好处在于易于理解、易于维护、调试电路速度快、有很多易于掌握的仿真、综合和布局布线工具,还可以用C语言配合HDL来做逻辑设计的布线前和布线后仿真并验证功能是否正确。
2.2系统硬件介绍
2.2.1GDM12864图形点阵式液晶的介绍
一、GDM12864的硬件组成
DB0~DB78
RETVEE
D/I,R/W3
CS2
CS1
图2–2点阵式液晶主要硬件构成原理图
如上面图2–2所示,是GDM12864的原理图。
其中IC3为行驱动器,IC1和IC2分别为左半个和右半个液晶的列驱动器。
三、GDM12864的工作时序
RS
R/W
E
ADDRESSNN+1N+2
OutputAddressNAddressN+1
register
BusyWireBusyReaddataBusyReaddata
DB0-DB7CheckaddresscheckaddressNcheckaddressN+1
图2-3GDM12864引脚时序图
输入输出缓冲寄存器(I/O)
输入缓冲控制器控制决定芯片是否可用。
如果CS1和CS2是上升沿,输入或输出数据不会动作,因此内部数据不变。
但是RSTB和ADC却可以照常运行,不受其影响。
输入寄存器
输入寄存器用来连接不同运行频率的嵌入式微处理器(MPU)而且输入寄存器还用来暂时存储没写入显示ROM的数据。
当CS1和CS2是正值时,R/W和RS选择输入寄存器,来自MPU的数据写到输入寄存器,并送到显示RAM。
锁存器的数据在使能信号E的下降沿自动写入显示数据RAM。
输出寄存器
当CS1和CS2是上升沿并且RS=H,被存储的显示RAM的数据送到输出寄存器,输出寄存器存储显示RAM的临时数据。
当CS1和CS2是上升沿并且R/W=H,RS=L时,数据总线的数值就能读出了。
重置
打开电源时对RSTB终端设置一个较低的值,系统能够被初试化。
当RSTB是0时,系统从MPU接受指令,接下来的程序就可以运行了。
忙碌标记
忙碌标记决定KS0108B是否运行。
当忙碌标记是高电平时,KS0108B在内部运行,当忙碌标记是低电平时,KS0108B就可以就收数据或命令了。
显示开关触发器
显示开关触发器决定晶振的开关。
当触发器置0时,选择性和非选择性的电压都会体现在输出端子部分;当触发器置1时,不管显示RAM的数据是什么,非选择性电压都会传输到输出端子。
显示开关触发器能够通过指令改变状态。
当RSTB是低电平时,显示数据就会消失,触发器的状态就会通过读指令输出到DB5。
X页寄存器
X页寄存器表明内部消失数据RAM的页数。
计数功能取消,相应的地址被指令置1。
Y地址计数器
Y地址计数器指定内部显示RAM的数据地址。
该地址被指令置1并且伴随读写显示数据自动加1。
[1]
四、GDM12864的主要参数指标
GDM12864是一种图形点阵液晶显示器,它主要由行驱动器和列驱动器以及128×64全点阵液晶显示器组成,可完成图形显示,也可以显示8×4个的(16×16点阵)汉字。
主要技术参数和性能指标:
1。
电源:
VDD为+5V。
模块内自带-10V负压,用于LCD的驱动电压;
2。
显示内容:
128(列)×64(行)像素点;
3。
全屏幕点阵;
4。
七种指令;
5。
与CPU接口采用8位数据总线并行输入输出和8条控制线;
6。
占空比:
1/64;
7。
工作温度:
-10~+55,存储温度:
-20~+60;
2.2.2FPGA芯片的介绍
在本设计中我们采用ALTERA公司MAX7000系列的FPGA芯片。
该系列有四个专用输入,它们可以作为每个宏单元和I/O引脚的高速、全局控制信号,如时钟(clock)、清除(Clear)和输出使能(OutputEnable)等。
MAX7000的逻辑阵列块(LAB)有16个宏单元组成,多个LAB通过可编程连线阵列(PIA)和全局总线;连在一起。
全局总线有所有的专用输入、I/O引脚和宏单元的提供信号。
LAB的输入信号有:
①来自通用逻辑输入的PIA的36个信号;②用于寄存器的辅助功能的全局控制信号;③从I/O引脚到寄存器的直接输入通道,用于实现高密度的MAX7000器件的快速建立时间。
在MAX7000中逻辑阵列实现组合逻辑,给每个宏单元提供5个乘积项。
乘积项选择矩阵分配这些乘积项作为到或门和异或门的主要输入逻辑,以实现组合逻辑函数,或把这些乘积项作为宏单元组中触发器的辅助输入,即清除(Clear)、置位(Preset)、时钟(Clock)和时钟使能(ClockEnable)控制。
每个宏单元的一个乘积项可以反向后回会送到逻辑阵列。
这个可共享的乘积项能够连接到同一个LAB中任何其他乘积项上。
根据设计的逻辑需要,QuartusII开发环境将自动优化乘积项的分配。
作为寄存器功能,每个宏单元的触发器可以单独地编程为具有可编程时钟控制的D触发器、T触发器、SR触发器或JK触发器。
另外,只要需要,也可将触发器旁路,实现组合逻辑工作方式。
每个触发器也支持异步清除和异步置位功能,乘积项现在矩阵分配乘积项去控制这些操作。
虽然乘积项驱动触发器的置位和复位信号是高电平有效,但是,在逻辑阵列中将信号反向可得到低电平有效控制。
此外,每一个触发器的复位功能可以由低电平有效的、专用的全局复位引脚GCLRn提供。
所有与I/O引脚有关的MAX7000的宏单元都具有快速输入功能。
这些宏单元的触发器有的直接来自I/O引脚输入通道,它旁路了PIA和组合逻辑。
这些直接输入通道允许触发器作为具有快速输入建立时间(3us)的输入寄存器。
[2]
2.2.3VerilogHDL介绍
Verilog是专门为复杂数字系统的设计仿真而开发的,本身就非常适合复杂数字逻辑电路和系统的仿真和综合。
由于Verilog在其门级描述的底层,也就是在晶体管开关的描述方面比VHDL有更强的功能。
采用Verilog输入法的最大优点是其与工艺无关。
对于设计出实际的电路,工程师在设计功能和验证逻辑阶段,只需要利用系统设计时对芯片的要求,而不必过多考虑门级及工艺实现的具体细节。
逻辑校验与具体工艺库的匹配、布线及时延计算可利用计算机的超强能力并在EDA工具的帮助下来实现,并最终把人们从繁琐的设计中解放出来。
三液晶显示控制模块的程序设计
3.1QuartusII软件的简单介绍
对于编写控制模块的程序,我们要用到QuartusII软件来编译和仿真程序。
QuartusII软件自带的仿真器支持波形文件作为激励,其常见的格式主要有基本图形波形文件(VWF)、压缩的二进制型的VWF(CVWF)、基于文本的输入文件(VEC)、MAX+PLUSII软件图形波形文件(SCF)、基于文本的输出文件(TBL)、Tcl/TK脚本,但是对于Verilog和VHDl的测试文件只能用第三方的仿真器进行仿真了。
QuartusII软件可以非常方便地实现从波形文件到HDL测试文件的转换。
对于编写测试文件不熟悉的,还可以先让QuartusII软件图形方法产生激励文件,再转换成HDL测试文件,输入到第三方仿真器进行仿真。
而且还可以让软件生成测试的模板,再手动加入激励。
此外QuartusII软件支持断点功能,可根据仿真的需要预先设置断点,而且还可以在仿真结果中加入自动输出的设计引脚并检查实际的仿真结构是否与预设的结果一致。
3.2模块的原理框图
显示数据
数据
地址
图3-1显示控制模块的原理框图
如上面3-1框图所示,该控制模块通过地址递增调用ROM模块中的字库文件,并把相应的16进制文件传输到显示控制模块中,再通过控制模块把要显示的数据送到液晶屏上,就可以显示汉字了。
在这里为了设计的简便,我们不打算用整块液晶来显示汉字,而是只用其中的一部分来显示。
这就要用到对液晶的分页,我们只用其中的两个页进行显示。
下面图3-2是液晶分页后的结构。
D0
I
D7
D0
I
D7
图3-2显示存储器结构
3.3主显示控制模块的设计
(一)介绍将要用到的引脚:
clock:
主控制时钟;
db:
输出数据;
cs:
片选信号;
e:
使能信号;
rs:
寄存器的选择信号;
rw:
读写控制信号;
data_in:
从ROM中输入数据;
en:
流动显示使能信号;
rom_address:
ROM地址;
以上这些信号都是设计程序所必须的,它们都是主要的输入输出引脚。
(二)程序的初始化部分
由于每次通过数据线传送的ROM数据是两个16进制的,所以对于data_in,我们选择8位的就可以了。
同样,向液晶传送数据的db引脚,也应该是8位的。
对于片选信号,由于只是左半个液晶和有半个液晶,因此需要选两位。
而对于要传送ROM地址的rom_address,由于数据有几百个,所以选用10位的。
该控制模块系统有五个状态的有限状态机,因此state只需要四位。
这五个状态位分别为:
空闲状态“Idle=4’b0000”,写页面地址状态“Xpage=4’b0001”,写列地址状态“Yline=4’b0010”,写数据状态“data=4’b0100”,显示状态“Display=4’b1000”。
当状态机处于Xpage时,寄存器的选择信号为0,读写信号也为0,按照上文介绍的指令格式“10111P2P1P0”,把页面地址传输到数据总线上。
当状态机处于Yline状态时,寄存器的选择信号和读写信号也同时为0,并将列地址“01C5C4C3C2C1C0”传输到数据总线上,在列地址中的C5~C0指代0~63的列地址。
当状态机处于Data状态时,寄存器的选择信号为1,读写信号为0,这样可将ROM模块中的数据传输到数据总线上。
当全部把这8个页面扫描完一遍时,状态机进入Display状态,此时寄存器的选择信号和读写信号又同时变为变为0,并将指令“00111111”传输到数据总线上。
所以程序的初始化部分为:
modulexianshi(clock,db,cs,e,rs,rw,data_in,en,rom_address);
inputclock,en;
input[7:
0]data_in;
output[1:
0]cs;
outputrs,rw,e;
output[7:
0]db;
output[9:
0]rom_address;
regd;
reg[2:
0]n;
reg[3:
0]state;
reg[1:
0]cnt1;//计算器产生使能信号e
reg[9:
0]cnt2;//列计数
reg[9:
0]cnt3;//移位分频
reg[7:
0]cnt4;//移位地址差
regen1,rs,rw;
reg[7:
0]db;
reg[9:
0]rom_address;
parameterIdle=4'b0000;
parameterXpage=4'b0001;
parameterYline=4'b0010;
parameterData=4'b0100;
parameterDisplay=4'b1000;
(三)分频程序的设计
和FPGA相比较而言,液晶是慢速设备。
如果液晶处于“忙”的状态,则液晶对所有操作都会无效,所以每次要对液晶写操作之前都必须通过其状态寄存器判断液晶是否处于“忙”的状态。
但是在本设计中,由于对输出的控制简单,我们采取延时的办法来实现对液晶的判断,即在每次对液晶写操作以后延时一段时间再进行下一次的写操作,用这种方法同样可以使每次操作都有效。
在这里我们对液晶采用一个较低的时钟频率,也就相当于给液晶加延时了。
为了不另外再加一个晶振,这个低频时钟就可以对FPGA的晶振频率分频。
根据经验数据表明,对晶振四分配就足够了,而且也不会影响液晶的刷新。
四分频的程序代码为:
always@(posedgeclock)//对clock四分频产生使能信号e;
cnt1<=cnt1+1;
always@(cnt1)
if(cnt1==0)d<=1;
elsed<=0;
assigne=d;
通过对上面的程序用QuartusII软件编译仿真无错误后就可以生成一个如图3-2四分频的波形文件,从图中我们可以很明显看出,四个clock时钟周期的时间正好等于一个e的时钟周期的时间。
可以证明四分频的程序是正确的。
图3-3四分频的波形图
(四)液晶屏的刷新显示程序
对于液晶屏,我们是采用逐行扫描的刷新方式实现显示的。
这里主要是当液晶屏的一行显示满后,就对下一行扫描。
主要程序代码为:
always@(posedged)//列计数
if(state==Data)
beginif(cnt3<63)cnt2=cnt2+1;
elsecnt2=0;
end
always@(posedged)//行计数
if(cnt3==63)n<=n+1;
(五)移位程序的设计
在本设计中,我们要实现被显示的内容能够在液晶屏上从左到右逐行移动,这就需要移位时钟的控制。
通过移位时钟使ROM中的数据逐行在液晶屏上滚动显示。
相应的移位时钟的程序代码为:
if(cnt3==63)n<=n+1;
always@(posedged)
if(en)cnt3<=cnt3+1;
elsecnt3<=0;
always@(posedged)
if(en)
beginif(cnt3==1023)en1<=~en1;
end
elseen1<=0;
always@(posedgeen1)
if(en)cnt4<=cnt4+1;
elsecnt4<=0;
(六)状态机的设计
状态机的三要素为:
状态、输入、输出。
状态机当前所处的状态是由一组触发器构成的状态寄存器来记忆的。
如果说一个整体寄存器由n个触发器构成,那么这个寄存器就可以存储2n个状态。
所有触发器的时钟端都连接在同一个触发时钟上,从而所有的状态的改变都只能发生在时钟的跳变沿时刻。
如前面所述,本设计的状态机包含五个状态,当状态机处于不同状态时,相应的寄存器选择信号和读写控制信号跟着作相应的变化,进而控制液晶屏的显示。
该功能的程序代码为:
always@(posedged)//状态机设计
if(!
en1)state<=Idle;
else
case(state)
Idle:
begin
rs<=0;rw<=0;
if(en1)state<=Xpage;
elsestate<=Idle;
end
Xpage:
begin
rs<=0;rw<=0;db<=184+n;
state<=Yline;
end
Yline:
begin
rs<=0;rw<=0;db<=64;
state<=Data;
end
Data:
begin
rs<=1;rw<=0;
if((n==3)||(n==4))db<=data_in;//在第三、四页显示汉字
elsedb<=0;
if((n==7)&&(cnt2==63))state<=Display;
elseif(cnt2<=63)state<=Data;
elsestate<=Xpage;
end
Display:
begin
rs<=0;rw<=0;db<=63;
end
endcase
always@(cnt2,n,cnt4)//存储器的地址计数
if(n==3)rom_address<=343+cnt2-cnt4;//343和478是第三、四行数据
elseif(n==4)rom_address<=478+cnt2-cnt4;//在ROM中存储的起始地址
elserom_address<=0;
为了使设计简便,我们把液晶屏分为了8页,每一页都是64字节×8位。
我们也把要显示的字库的像素做成是16×16的,所以,我们只需要在液晶的三、四页显示就足够了。
(七)显示模块的综合仿真
如图3-4是我们把以上各段程序综合成一段程序后仿真出来的波形文件的截图。
从图中可以看出输出数据与地址线上的数据相对应。
图3-4液晶控制的仿真结果
3.3ROM模块的设计
ROM模块根据控制模块“rom_address”传送过来的地址,查询出相应的显示数据再通过“data_in”传送到控制模块。
这样就完成了从ROM模块中的数据的调用。
而且对于液晶显示,我们不用考虑像LED一样的共阴与共阳,只要把液晶的哪个像素接上高电平,哪个像素就可以发光了。
ROM中最主要的部分就是对字库数据的定义和读取。
而对于字库,我们先考虑字库的生成。
对于要显示的汉字,首先要通过字模提取软件把要显示的“河北大学”四个字的16进制数提取出来。
首先通过字模提取软件提取“河”的字库,如图2-5所示,16×16像素的汉字已经可以显示地很清晰了,同时我们通过该软件获得相应的字库的16进制代码:
DB08h,20h,84h,20h,46h,7Fh,60h,80h
DB41h,00h,47h,0F0h,44h,20h,44h,20h
DB44h,20h,4Fh,0F0h,44h,02h,40h,01h
DB7Fh,0FEh,0C0h,00h,40h,00h,00h,00h
图2-5
汉字“北”的16×16像素的显示图片如图2-6。
并同样得到16进制的字库代码
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 FPGA 阵式 液晶显示 控制 模块 设计