嵌入式处理器Nios II与液晶显示模块的接口及应用
扫描二维码
随时随地手机看文章
液晶显示器(LCD)由于具有工作电压低、功耗低、体积小、显示信息量大、寿命长、不产生电磁辐射污染、可以显示复杂的文字及图形等优点,液晶显示器已被广泛应用于各种仪器仪表、电子设备及控制领域中,成为测量结果显示和人机对话的重要工具。液晶显示器按其功能可分为笔段式和点矩阵式液晶显示器,后者又可以分为字符点阵式和图形点阵式液晶显示器。图形点阵式液晶显示器不仅可显示数字、字符等内容,还能显示汉字和任意图形。
本文是以240*128点阵型液晶显示模块MGL240128T为例。研究嵌入式Nios II软核处理器与液晶显示模块的接口和图形显示的编程技术。
1 Nios II软核处理器和SOPC设计
在2004年,Alter推出了Nios II系列32位RSIC嵌入式处理器。Nios II软核处理器是Alter的第二代FPGA嵌入式处理器,比第一代Nios具有更高水平的效率和性能。Nios II核平均占甩不到50%的FPGA资源,而计算性能增长了1倍。Nios II嵌入式处理器性能超过200 DMIPS,采用32位指令、32位数据和地址、32位通用寄存器和32个外部中断源;支持用户的专用指令多达256个,这使得设计者能够细致地调整系统硬件以满足性能目标。Nios II支持60多个外设选项,开发者能够选择合适的外设,获得最合适的处理器、外设和接口组合,而不必支付根本不使用的硅片功能。
目前。FPGA(现场编程逻辑门阵列)芯片密度已达到百万门级,在一片FPGA芯片上可以实现如DSP、MCU、PCI总线控制和各种控制算法等复杂的功能。由于FPGA芯片密度的不断提高和新的EDA开发工具的使用,利用FPGA器件实现SOC已成为可能,这项技术称为嵌入式SOPC(可编程单芯片系统)。SOPC技术既具有基于模板级设计的特征,又具有基于ASIC的系统级芯片设计的特征,具有了可重构性、高效自动化的设计方法。Alter推出的Nios II正是为设计者提供了FPGA优化的灵活的嵌入式处理器,以及为SOPC设计了一套综合解决方案。
Nios II处理器具有完善的软件开发套件.包括编译器、集成开发环境(IDE)、m C调试器、实时操作系统(RTOS)和TCP/IP协议栈。设计者能够用Altera Quartus II开发软件中的SOPC Builder系统开发工具很容易地创建用户定制的CPU和外设,获得恰好满足需求的处理器系统。利用SOPC Builder开发工具创建专用的处理器系统,需要进行SOPC的嵌入式处理器芯片和软件设计。SOPC Builder工具通过加载NioslI核和外围接口的定义配置一个高集成度的SOPC系统的嵌入式处理器芯片。
图1所示是一个实现液晶显示的SOPC系统的NioslI处理器,主要端口包括全局输入时钟、复位信号、外部设备片选信号、读使能、写使能、数据地址总线以及和计算机通信的UART端口。由于NioslI是在FPGA片内实现的,因此它既可以通过FPGA的引脚连到外部和其它的设备相连接,也可以直接连到FPGA片内的其他模块上。同样,FPGA片内未被使用的资源仍然可以被配置成为其它的模块使用,从而实现系统的集成,使SOC成为可能。
2 Nios II与液晶显示模块的接口
MGLS240128T液晶显示模块的引脚说明如表1所示,可显示各种字符及图形,该模块对液晶显示的控制和驱动都由模块内部的控制器T6963C芯片及电路来完成,因此它与外部的连接只有8位数据线和6条控制线及电源。外部CPU通过这些数据线和控制线来设置所需要的显示方式,其它功能均由模块自动完成。控制器T6963C最大的特点是具有独特的硬件初始设置功能,初始化在上电时就已基本设置完成。它还具有很强的软件控制能力,外部的处理器通过接口写入液晶模块的指令来实现模块控制。软件控制主要集中于显示功能的设置上。T6963C的控制指令如表2所示。T6963C的指令可带一个或多个参数,每条指令的执行都是先送入参数(如有参数),再送入指令。
嵌入式处理器NioslI把液晶显示模块接口看着普通的外部设备PIO进行操作,因此液晶显示模块的数据以及读写片选信号都包括在Nios II上的PIO总线中。其接口电路如图2所示。其中LCD_DB[7..0]为8位数据线,负责将控制指令和显示数据输入到液晶显示模块中;LCD_CD为指令,数据切换;LCD_CS为为片选信号;LCD_RD为读使能;LCD_WR为写使能。
3 Nios II处理器的软件开发
利用SOPC Builder开发工具创建专用的处理器系统的硬件后,SOPC Builder还为编写操作这些片上硬件的软件代码提供了一个Nios II集成开发环境(IDE),这个软件开发环境包括语言的头文件、外围接口的驱动以及实时操作系统的内核,可完成整个软件工程的编缉、编译、调试和下载等过程,极大地提高了软件的开发效率。
由于该液晶显示模块的控制和驱动都是由模块内部的控制器T6963C芯片及电路来完成的,因此通过Nios II处理器将数据直接送入T6963C显示缓冲区RAM的指定地址,控制器T6963C就可以控制液晶屏上相应位置显示出所需要的数据。Nios II处理器的软件采用模块化结构,主要包括显示初始化、图形显示、清屏等模块。
在进行显示之前。先调用显示初始化模块,实现对屏幕的初始化,即设置文本和图形缓冲区的起始地址以及显示方式。在显示一屏新的图形时,需要对屏幕清屏。清屏是将显示RAM区域中的所有单元清零。它需要用T6963C连续写的功能,并要先设定RAM区域的首地址。由于RAM 区共有240/8*128=3840个字节,所以循环清零需执行3840次。在介绍图形显示程序之前先给出三函数:写命令、写数据和画点函数。
void LCD_Write_Command(UCHAR m_Command) //写命令
{ IOWR_ALTERA_AVALON_PIO_DIRECTION(LCD_DB_BASE,0xff); //数据总线:输出
IOWR_ALTERA_AVALON_PIO_DATA(LCD_CD_BASE,1);//选择命令
IOWR_ALTERA_AVALON_PIO_DATA(LCD_CS_BASE,0);//片选拉低
IOWR_ALTERA_AVALON_PIO_DATA(LCD_WR_BASE,0);//写信号有效
IOWR_ALTERA_AVALON_PIO_DATA(LCD_DB_BASE,m_Command);
IOWR_ALTERA_AVALON_PIO_DATA(LCD_WR_BASE,1);//写信号无效
IOWR_ALTERA_AVALON_PIO_DATA(LCD_CS_BASE,1);//片选无效 1
void LCD_Write_Data(UCHAR m_Data) 写数据
{IOWR_ALTERA_AVALON_PIO_DIRECTION(LCD_DB_BASE,0xff);//数据总线:输出
IOWR_ALTERA_AVALON_PIO_DATA(LCD_CD_BASE,0);//选择数据
IOWR_ALTERA_AVALON_PIO_DATA(LCD_CS_BASE,0);//片选拉低
IOWR_ALTERA_AVALON_PIO_DATA(LCD_WR_BASE,0);//写信号有效
IOWR_ALTERA_AVALON_PIO_DATA(LCD_DB_BASE,m_Data);
IOWR_ALTERA_AVALON_PIO_DATA(LCD_WR_BASE,1);//写信号无效
IOWR_ALTERA_AVALON_PIO_DATA(LCD_CS_BASE,1);//片选无效
}
void Draw_Point(UCHAR x,UCHAR y) //画点
{ unsigned int m_Addr;
unsigned char n,t1,t2,t;
n=x/8 ;m_Addr=GASAH*256+GASAL+y*ZIFU_NUM+n;
t1= m_Addr&0xff;t2=m_Addr/256;
LCD_Write_Data(UCHAR t1);
LCD_Write_Data(UCHAR t2);
LCD_Write_Command(0x24);
If(y>=0x80) n=0xf0;else n=0xf8;
t=x%8;t=(~t)&0x07;t=n|t;
LED_Write_Command(t);
}
在液晶显示屏上显示的各种曲线实际上是由若干段直线组成。所以直线的绘制就是曲线绘制的子程序。直线绘制的算法有多种多样,为了避免复杂的浮点运算,这里采用了Bresenham画线算法的整数数字增量分析法。该算法的基本思路是回避计算斜率k=(y1-y2)/(x2-x1)过程中的除法运算,应用dy=y1-y2 和dx=x2-x1之间的关系,根据直线的起点和终点的坐标不同,直线的走向和斜率将不同,即k的大小和正负将不同,因此绘制直线时将斜率 的取值分为四种情况进行绘图。下面给出从点(x1,y1)到点(x2,y2)画线的Nios II应用程序。
void Draw_Line(UCHAR x1,UCHAR y1,UCHAR x2,UCHAR y2)
{ UCHAR u1,v1,u2,v2;
signed int dx=x2-x1;
signed int dy=y2-y1;
UCHAR k;
If(dx*dy>=0)
{ if (abs(x1-x2)>= abs(y1-y2))
//斜率在[0,1]范围内
{ k=1; u1=x1;v1=y1;u2=x2;v2=y2;}
else { k=2;u1=y1;v1=x1;u2=y2;v2=x2;}
//斜率在(1,∞)范围内 }
else { if(abs(x1-x2)>=abs(y1-y2))
//斜率在[-1,0]范围内
{ k=3;u1=x1;v1=y1;u2=x2;v2=2*y1-y2;}
else {k=4;u1=y1;v1=x1;u2=2*y1-y2;v2=x2;}
//斜率在(-∞,-1)范围内 }
int u,v,uEnd,p=2*abs(v1-v2)-abs(u1-u2);
int twoDv=2*abs(v1-v2,twoDvDu=2*(abs(v1-v2)-abs(u1-u2));
if(u1>u2) {u=u2;v=v2;uEnd=u1;}
else {u=u1;v=v1;uEnd=u2;}
switch(k)
{
case 1: Draw_Point(u,v);break;
case 2: Draw_Point(v,u);break;
case 3: Draw_Point(u,2*y1-v);break;
case 4: Draw_Point(v,2*y1-u);break;
default :break;}
while(u { u++;
if(p<0) {p+=twoDv;}
else {v++;p+=twoDvDu;}
switch(k)
{case 1: Draw_Point(u,v);break;
case 2: Draw_Point(v,u);break;
case 3: Draw_Point(u,2*y1-v);break;
case 4: Draw_Point(v,2(y1-u);break;
default:break;}
}
}
4 结束语
在FPGA中使用软核处理器Nios II比硬核的优势在于:硬核实现没有灵活性,通常无法适应最新技术的发展;而基于Nios II处理器的方案是基于HDL源码构建的,可配置的程度很高。Nios II处理器可以将外部存储器、液晶显示屏、以太网控制器、RS-232通信和USB接口等外部设备连接在一起,进行外设的协调工作和数据共享,并能够根据系统的性能要求添加多个Nios II处理器,实现多CPU内核;还可以在Nios II核中加入实时操作系统,实现多任务的调度。