1 引言
随着微电子技术的发展 和半导体制造工艺的提高,工业生产、家用电器中的监测控制、信号处理等集成电路设计已经进入了片上系统(System On Chip)时代。在传统的集成电路设计中,需要考虑大量的外围电路 ,而且由于 PCB板中的IC芯片之间的连线延时,以及本身的体积和重量等因素的限制,整机系统的性能受到了很大的制约。FPGA可以把整个数字系统集成在一个芯片上,功能密度高、体积小、功耗低 、可靠性高,因此获得了广泛的应用。而且同 ASIC相比,FPGA成本低廉,设计灵活 ,成为了集成电路设计的发展趋势。
但是对于复杂的系统 ,比如有很多种状态机,或者有很多外设的系统,纯粹用基于硬件的 FPGA来实现还是 比较困难的,因此通常是把一个微处理器嵌入到FPGA芯片中,用来控制各种状态的切换、协调各个外设之间的同步以及实现对任务的调度。
Nios是 Altera公司推出的嵌入在其 FPGA内部的软核处理器,它的可配置程度很高,可以将外部存储器(包括 ROM,RAM),液晶显示屏,以太网控制器,CDR驱动器 ,USB接口甚至红外适配器 等外部设备连接在一起 ,协调它们之间的多机协同和数据共享 ,必要的时候还可以在Nios核中加入实时操作系统 ,来实现对多任务的调度。而且 Nios价格便宜 ,设计灵活 ,因此正在获得越来越广泛的使用,目前已经在蓝牙一以太网接入,远程信号采集等方面得到了应用。
本文以LCD控制为例 ,来研究 Nios是怎样实现对外设进行控制的。液晶显示屏以其显示直观 ,设计灵活的特点被用作各种便携式系统的前端 ,将Nios技术与液晶屏结合,在实现对 LCD 控制的同时,还可以在芯片上实现其它的系统功能,体积更小,更适合便携式系统的要求,而且使得设计具有较强的伸缩性 。
2 Nios嵌入式软核处理器
Nios处理器是 Altera公司推出的一个 32/16位精简指令集处理器软核 ,它是用户可配置的通用RISC嵌入式处理器,同时也是一个非常灵活和强大的处理器。在Altera公司提供的 SOPC软件中加载 Nios核和相应的外围接口以及与定义相应的自定义指令,然后对设计进行综合,下载到FPGA中就可以方便的设计计一个具有特定功能的嵌入式处理器 。
图 1 典型的 Nios系统
如图 1所示是一个典型的 Nios系统 ,它的主要端口包括全局输入时钟 ,复位信号,外部设备片选信号,读使能,写使能,数据地址总线以及和计算机通信的 UART端口。由于Nios是在FPGA片内实现的,因此它既可以通过FPGA的引脚连到外部和其它的设备相连接,也可以直接连到FPGA片内的其他模块上。同样,FPGA片内未被使用的资源仍然可以被配置成为其它的模块使用,从而实现系统的集成 ,使SOC成为可能。
嵌入式设计者利用 SOPCBuilder系统开发工具能够很容易地创建自己的处理器 系统 。SOPCBuilder可用于集成一个或多个可配置的带有许 多标准外围设备的 NiosCPU,并利用自动形成的 Avalon交换结构总线将这些系统连接在一起。
3 液晶屏控制器的选择
这里 ,我们使用的是一块 320X240的液晶显示模块 ,而且已经集成了SED1330作为液晶显示屏的控制器。SED1330控制器是由日本 EPSON公司生产的一款液晶显示屏控制器 。与同类产品相比,功能较强 。其主要特点有 :
有较强功能的 I/O缓冲器 ; 指令功能丰富; 四位数据并行发送 ; 图形和文本方式混合显示 。
SED130的控制指令集见表 1。
4 FPGA与LCD的接口电路
由于选用了专门的液晶显示器控制芯片 ,而且液晶显示屏已经和控制器集成在了一起 ,因此对于用户来说 ,整体设计大大简化 ,外围电路相对来说就比较简单,只要考虑 Nios和接口电路之间的连接即可。
这里有两种方案可以考虑。第一种是把液晶显示模块看成外部存储器 ,利用 Ext-Shared-Bus的数据和地址总线对其进行控制;第二种是把LCD接口当作普通的外部设备 PIO进行操作 ,LCD的数据以及读 、写使能 ,片选信号等都包括在PIO总线 内。 一般来说,对于不太复杂的系统,把外部设备看作是普通PIO是比较简便的方法 ,所以这里我们采用第二种方案 。NIOS和LCD 模块的接口电路如图2所示。
图 2 Nios和 LCD模块的接口电路
图中pio的低8位和控制器的数据端口连接,负责将控制指令和显示数据送到控制器的数据线上。用lcd-pio的 高几位分别作为写使能,读使能,命令/数据切换和片选信号。可以使 lcd-pio[12]输出固定电平 ,使 Cs一直处于使能状态。 A0负责指令寄存器和数据寄存器的选择 ,当 A0=1时,选择指令寄存器;当 A0=0时,选择数据寄存器。读、写使能分别和led-pio[9..8]相连接。Nios须通过对这些引脚的联合控制来实现对缓冲器通道的选择 。缓冲器通道选择如表 2所示。
因为片选信号始终为0,即始终处于使能状态 ,所以写指令地址为 0x600,写数据地址为 0x200。
表 2 缓冲器通道选择
5 控制软件的设计
系统硬件上电复位后 ,软件 根据用户的需要自动对各项控制器指令代码及其参数进行设置,从而完成对液 晶模块的参数(如液晶的行数 、列数 、扫描频率 、光标的位置等)以及显示方式等一系列的初始化过程。在对系统进行正确的初始化 以后,可 以通过Nios将数据直接送至 SED1330显示缓冲区,控制器就可以控制液晶屏显示出用户所需要的数据。同时用户也可以根据自己的需要在主程序运行的过程中改变数据显示的形式,只需 在表 2中选择相应的指令代码以及参数即可。系统的软件设计流程如图3所示。
图3 软件控制流程图
初始化的作用是根据液晶显示器的结构对液晶模块进行参数设置。设置系统指令及其参数的方法如下:根据用户硬件电路的设计,先将指令代码送 到 SED130控制器 的命令口地址; 然后把该指令 的参数依次送到数据口地址,经过系统指令及其参数的设置后,就可以把数据送到数据口地址了。简要的初始化子程序如下 。
Void nr_pio_lcdinit(np_pio*lcdPio)
static int beenInitialized;
//每次运行之前都清除已初始化标志位
if(beenInitialized)
return;
if(!lcdPio)
lcdPio=(np_pio*)0x480;
lcd=lcdPio;
//如果已经初始化了,就返回;否则就将pio的指针指向 lcd_pio 的地址(因为对于一个Nios软核来说,可能不止led一个外设 , 可能还有诸如button_pio,led_pio之类的其它外设端口,所以每 个外设的 pio都有自己对应的唯一地址 ,这个地 址是SOPc Builder在生成Nios核的时候自动生成的,当然也可以手动指定 ),这里是把 0x480这个外设地址赋值给lcdPio这个结构指针
nr_delay(15);
//nr_delay是一个系统函数 ,用于产生延迟,相对于FPGA来说 ,LCD外设是低速设备
nr_pio_lcdwritecommand(LCD_COM_RESET);
//重置LCD设置 ,nr_pio_lcdwritecommand是一个子函数 ,用来往lcd端口写入命令
nr_delay(1);
nr_pio_lcdwritecommand(LCD_CMD_FUNC|LCD_INTERFACE
|LCD_NUMROWS);
//设置界面参数 ,定义 8位的数据线宽度 ,5X7的显示字体
nr_delay(1);
nr_pio_ledwritecommand(LCD_CMD_ONOFF);
//打开LCD显示
nr_delay(1);
nr_pio_lcdwritecommand(LCD_CMD_CLEAR);
//清除 LCD上的内容 ,因为液晶屏上电之后,屏幕上的显示是随机的。所以控制程序开始就需要清屏 ,使显示屏上的液晶点全灭 。接着初始化一些显示参数
nr_delay(1);
nr_pio_lcdwritecommand(LCD_CMD_MODES|LCD_ MOVE);
//设置默认模式 ,包 括图形,文本显示方式 ,以及光标移动方向等等
nr_delay(1);
nr_pio_lcdon(1);
//打开液晶显示屏
beenInitialized = 1:
//初始化完毕,置标志位
}
在上面的程序 中,LCD_COM_RESET,LCD_CMD_FUNC,LCD_INTERFACE等等都是预先定义好的宏,用来作为设置以及控制参数。由于篇幅所限,这里只能给 出部分的程序 ,虽然只介绍了初始化的子程序 ,但是其它的子程序 的方法都是类似的。只要先发送写命令地址 ,就可以往数据总线上发送控制命令;先发送写数据地址 ,就可以往数据总线上发送数据 ,控制字的参数也是当作数据来发送的。
6 结论
本文介绍了一种基于 Nios嵌入式软核处理器的液晶显示屏控制方案 ,同传统的液晶显示控制(如 DSP)相比,有以下几个特点 :
(1)相对于DSP来说 ,LCD控制器属于低速设备 。所 以在设计硬件接口和软件程序时,一般都是在硬件上设置 WSGR状态寄存器 。本方案的接口是以 PIO的方式在软核内部实现,在软件上用 nr_delay函数实现延迟 。
(2)Nios只占用FPGA片内的一少部分资源,剩下的硬件资源仍然可以用来设计其它的模块,这样将 CPU与 PLD的功能集于一身 ,既简化了电路板设计,又不存在接口速率的瓶颈问题 ,有利于系统的集成。
可以看出,Nios是一个性价比较高的微处理器软核,可以方便地把用户自定义逻辑加入到系统中 ,采用这种方法,可以和不同的外部设备通讯,体现了SOPC嵌入式系统的灵活性。因此,SOPC是一种很好的开发方法 ,能够有效地增强系统的灵活性,缩短系统的开发周期,必将对现有的设计方式产生新的变革。