89美元Xilinx Spartan-6 LX9 开发板--基于FPGA的LCD远程更新

jomatch   2011-10-11 09:56 楼主

基于FPGA的LCD远程更新

0 前言

926收到S6_LX9_Microboard试用板,心情激动了好久,之后将Speedway的六个tutorial都试了一遍,按照pdf的内容提示,整个Lab过程很顺利,于是想着用S6_LX9_Microboard做些什么?几经周折,在OpenHW网站上看到一个可能能实现的项目《基于FPGALCD显示的远程更新》,于是有了下文。

总体而言,设计分为以下几步:

①对LCD12864液晶屏硬件控制调试

②使用MicroBlazeLCD12864进行调试

③网口调试,LwIP的使用

④联合LwIPMicroBlazeLCD12864进行测试

⑤总结

1 LCD液晶调试

硬件环境:S6_LX9_MicroboardLCD2864CA12864K)、数据线、LCD1602ROHS

软件环境:ISE13.1,使用VHDL语言进行开发,Quartus7.2

测试代码:Spartan3ELCD lab测试代码

花费时间:1天半

测试对象:12864液晶显示屏、1602液晶显示屏

12864液晶测试结果如图:

  IMAG0147.jpg

IMAG0148.jpg

1602液晶显示结果

基于FPGA的LCD远程更新

1602lcd的接口的3号管脚上测试输出为高电平,于是接了一个电阻到地上,就能正常显示了,在背板连接接口上,使用了和12864一样的接口模块

IMAG0143.jpg

FPGA一端信号接线,较为整齐和可扩展

IMAG0144.jpg

测试过程:在整个测试过程中,出现许多因粗心或觉得简单而导致出错的问题。

  • IMAG0149.jpg
  • IMAG0150.jpg

回复评论 (24)

第一个问题:管脚分配问题,需要注意S6_LX9_MicroboardPmod引脚在J4J5插座上只有8个引脚可以分配输入输出,如若不注意,则会出现LCD侧焊接线重焊的问题。解决方法是使用万用表的蜂鸣功能测试两端是否接通,从而分配管脚。

 

[ 本帖最后由 jomatch 于 2011-10-11 10:03 编辑 ]
点赞  2011-10-11 09:57

 列出对应表1

LCD管脚

FPGA管脚

LCD管脚

FPGA管脚

RS

F15

DB1

C17

RW

F14

DB2

D17

E

F16

DB3

C18

PSB

K13

DB4

D18

RST

F17

DB5

H12

[ 本帖最后由 jomatch 于 2011-10-11 10:05 编辑 ]
点赞  2011-10-11 10:03

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表。

对代码进行仿真,看看时序是否正确,结果如图,在仿真中,使用modelsimIsim软件均不出结果,只能用Quartus软件进行仿真,看看时序是否正常。

1.JPG

上图仿真结果可以看出,在819.201us时出现rs高电平,表明此时可以写数据了。

 

 

[ 本帖最后由 jomatch 于 2011-10-11 10:06 编辑 ]
点赞  2011-10-11 10:05

总体时序设计是:30H、功能设定;06H、进入设定点;0CH、开显示关光标;36H、扩充指令;80H、液晶屏第一个地址,之后开始写数据。

第三个问题:设备连接正常之后,LCD显示为满屏点阵,解决方案是在VOUTVO之间接个电位器,或者电阻,用VOUT驱动VO提高显示分辨率。

第四个问题:总算在LCD上出现一部分点阵了,可是显示仍不完整,怀疑输入的点阵数据有问题,其实正常,在不断的刷新液晶屏(3.3V5V切换)之后,显示正常,这就要求VHDL语言设计时,提供一个不断刷新的方式,也可以将设计之初分频的值改小一点,使得显示器能够快速显示结果。

参考内容:speedwaylab tutorialspeedway_lab.rar

speedway_lab.rar (5.91 MB)
(下载次数: 42, 2011-10-11 10:08 上传)

代码:LCD显示12864及1602代码.rar

LCD显示12864及1602代码.rar (1.27 MB)
(下载次数: 56, 2011-10-11 10:08 上传)

文献:bbs.eeworld.com.cn/viewthread.php?tid=299192

 

[ 本帖最后由 jomatch 于 2011-10-11 10:10 编辑 ]
点赞  2011-10-11 10:06
很有速度, 期待更多内容与大家分享!
点赞  2011-10-11 10:13

回复 6楼 maylove 的帖子

谢谢坛子的支持,下次等周末了,呵呵
点赞  2011-10-11 10:14
不错不错 支持下
点赞  2011-10-11 10:31

楼主很给力

:carnation:
http://shop34182318.taobao.com/ https://shop436095304.taobao.com/?spm=a230r.7195193.1997079397.37.69fe60dfT705yr
点赞  2011-10-11 10:42
楼主第一次做就这么好   很佩服啊
点赞  2011-10-11 11:20
坛子给的板子
逆水行舟,不进则退。
点赞  2011-10-12 09:32
写写microblaze的学习过程
点赞  2011-10-14 21:41
1.JPG
2.JPG
3.JPG
4.JPG
5.JPG
[ 本帖最后由 jomatch 于 2011-10-14 21:52 编辑 ]
  • 1.JPG
点赞  2011-10-14 21:47

顶顶顶顶,支持支持!

一个为理想不懈前进的人,一个永不言败人! http://shop57496282.taobao.com/ 欢迎光临网上店铺!
点赞  2011-10-18 13:55

回复 14楼 eeleader 的帖子

谢谢版主的支持,有时间大家一起学习
点赞  2011-10-22 08:46
快要到试用结束的日子了,今天争取将microblaze控制LCD显示部分展示出来
点赞  2011-10-22 11:58
1.JPG
[ 本帖最后由 jomatch 于 2011-10-22 14:41 编辑 ]
点赞  2011-10-22 14:36
1.JPG
2.JPG
3.JPG
4.JPG
5.JPG
6.JPG
8.JPG
9.JPG
11.JPG
13.JPG
15.JPG
[local]12[/local]
17.JPG
19.JPG
21.JPG
22.JPG
25.JPG
27.JPG
29.JPG
31.JPG
32.JPG
33.JPG




3.JPG
3.JPG
3.JPG


[ 本帖最后由 jomatch 于 2011-10-22 14:55 编辑 ]
点赞  2011-10-22 14:52
设计软件程序,这里调用了网友的一部分程序,设计了自己的main函数:
int main (void)
{

         Xuint32 status;

          // Clear the screen
          xil_printf("%c[2J",27);
          xil_printf("16x2 LCD Driver by Virtex-5 Resource\r\n");
          xil_printf("http://www.fpgadeveloper.com\r\n");


          // Initialize the Timer
          status = XTmrCtr_Initialize(&DelayTimer,XPAR_AXI_TIMER_0_DEVICE_ID);
          if (status != XST_SUCCESS){
            xil_printf("Timer failed to initialize\r\n");
            return XST_FAILURE;
          }
          XTmrCtr_SetOptions(&DelayTimer, 1, XTC_DOWN_COUNT_OPTION);

          // Initialize the GPIO driver for the LCD
          status = XGpio_Initialize(&GpioOutput,XPAR_LCD_GPIO_0_DEVICE_ID);
          if (status != XST_SUCCESS){
            xil_printf("GPIO failed to initialize\r\n");
            return XST_FAILURE;
          }
                while (1) {
                        DIP_Read = XGpio_ReadReg(XPAR_DIP_SWITCHES_BASEADDR, 0);
                        XGpio_WriteReg(XPAR_LEDS_4BITS_BASEADDR, 0, DIP_Read);
          // Set the direction for all signals to be outputs
          XGpio_SetDataDirection(&GpioOutput, 1, 0x00);
          XromLCDInit();
          XromWriteCmd(0x00000000,1);
          XromWriteData(0x00000054);

                }

}
点赞  2011-10-22 15:01
这里main函数的核心为while之后部分,
在这里使用了SWITCHES及LEDS两个设备,用于测试程序是否下载进bit系统里,从而判断lcd程序是否在运行。而LCD的程序则是,先进行初始化XromLCDInit,之后写一个地址信号,说明此时可以写数据到LCD上了,之后就可以写数据了。
点赞  2011-10-22 15:06
12下一页
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复