基于FPGA的LCD远程更新
0 前言
总体而言,设计分为以下几步:
①对LCD12864液晶屏硬件控制调试
②使用MicroBlaze对LCD12864进行调试
③网口调试,LwIP的使用
④联合LwIP及MicroBlaze和LCD12864进行测试
⑤总结
1 LCD液晶调试
硬件环境:S6_LX9_Microboard、LCD2864(CA12864K)、数据线、LCD1602(ROHS)
软件环境:ISE13.1,使用VHDL语言进行开发,Quartus7.2
测试代码:Spartan3E的LCD lab测试代码
花费时间:1天半
测试对象:12864液晶显示屏、1602液晶显示屏
12864液晶测试结果如图:
1602液晶显示结果
在1602lcd的接口的3号管脚上测试输出为高电平,于是接了一个电阻到地上,就能正常显示了,在背板连接接口上,使用了和12864一样的接口模块
FPGA一端信号接线,较为整齐和可扩展
测试过程:在整个测试过程中,出现许多因粗心或觉得简单而导致出错的问题。
第一个问题:管脚分配问题,需要注意S6_LX9_Microboard的Pmod引脚在J4和J5插座上只有8个引脚可以分配输入输出,如若不注意,则会出现LCD侧焊接线重焊的问题。解决方法是使用万用表的蜂鸣功能测试两端是否接通,从而分配管脚。
LCD管脚 FPGA管脚 LCD管脚 FPGA管脚 RS F15 DB1 C17 RW F14 DB2 D17 E F16 DB3 C18 PSB K13 DB4 D18 RST F17 DB5 H12
NC |
E16 |
DB6 |
K12 |
DB0 |
G14 |
DB7 |
G13 |
第二个问题:程序编写问题,由于输入是时钟信号,输出为接至LCD的控制信号,由于时钟频率过高,导致示波器显示信号时总出问题,觉得程序可能有错,其实没问题。只需要对时钟进行分频即可。
IF RISING_EDGE(clock) THEN
IF clk_div='1' THEN
分频时钟clk_div的使用要与全局时钟clock同步,否则编译出错。
WHEN wr_y_addr_1=>
next_state<=wr_y_addr_2;
data<=("100" & cnt(8 DOWNTO 4));
上述代码为Y坐标地址块,data的输出范围为0X80H~0X9FH,之后的设定X坐标块
WHEN wr_x_addr_1=> --设定图形显示区X轴地址
next_state<=wr_x_addr_2;
en<='1';
data<=("1000" & cnt(9) & "000");--上半屏经0x80;下半屏0X88
在设定X坐标后,立刻设定rs为‘1’,则开始写数据。这的cnt为什么要设定为10位数据?原因是每次送入8位数据,需要送入1024次,即1024X8=128X64。由此在ROM的设定上,也要设计为1024深度,位宽为8位的ROM表。
对代码进行仿真,看看时序是否正确,结果如图,在仿真中,使用modelsim、Isim软件均不出结果,只能用Quartus软件进行仿真,看看时序是否正常。
上图仿真结果可以看出,在819.201us时出现rs高电平,表明此时可以写数据了。
总体时序设计是:30H、功能设定;06H、进入设定点;0CH、开显示关光标;36H、扩充指令;80H、液晶屏第一个地址,之后开始写数据。
第三个问题:设备连接正常之后,LCD显示为满屏点阵,解决方案是在VOUT与VO之间接个电位器,或者电阻,用VOUT驱动VO提高显示分辨率。
第四个问题:总算在LCD上出现一部分点阵了,可是显示仍不完整,怀疑输入的点阵数据有问题,其实正常,在不断的刷新液晶屏(3.3V与5V切换)之后,显示正常,这就要求VHDL语言设计时,提供一个不断刷新的方式,也可以将设计之初分频的值改小一点,使得显示器能够快速显示结果。
参考内容:speedway的lab tutorialspeedway_lab.rar
(下载次数: 42, 2011-10-11 10:08 上传)
代码:LCD显示12864及1602代码.rar
(下载次数: 56, 2011-10-11 10:08 上传)
文献:bbs.eeworld.com.cn/viewthread.php?tid=299192