paper @mesnet. com. cn(投稿专用) 2007 年第 10 期 Microcontrollers & Embedded Systems 29
基 于 N i o s 的 液 晶 显 示 器 控 制 方 法 研 究
■福州大学 苏寒刚 杨秀芝
摘 要
Altera 公司的 Nios 嵌入式软核处理器在嵌入式应用中得到了广泛的应用 ,而液晶显示器 (LCD) 也越来
越多地在仪器仪
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
等应用中作为显示模块 ,因此 ,用 Nios 来编写 LCD 的驱动是极为必要的。本文介绍
用 Nios 控制 LCD 的两种方法 : 一是自定义硬件模块方式 ,即用 HDL 语言编写硬件模块 ,实现 Nios 与
LCD 之间的通信 ;二是利用 Nios 自带的输入输出 PIO 核控制方式 ,即利用 Nios 自带 PIO 核与通用 I/ O
口通信的特性控制 LCD。可以看出 ,Nios 是一个性价比较高的微处理器软核 ,与其他处理器相比具有很
高的灵活性。
关键词 Nios LCD 控制 SM G240128A
引 言
随着信息化的发展 ,基于 Nios 的嵌入式系统开发成
为国内当前研究的热点 ,它具有成本低廉、设计灵活、可裁
减、可扩充以及软硬件在系统可编程的特点。通常 ,Nios
只带有 Character LCD(16 ×2 ,opt rex 16207) 的驱动 ,如果
要换成带汉字显示的图形 LCD ,则要开发相应的组件和
驱动[ 1 ] 。当然 ,对 Nios 来说这是很容易实现的 ,但同时也
是 十 分 重 要 的。本 文 以 SM G240128A ( 简 称 为
“240128A”) 为例介绍 Nios 驱动 LCD 的方法。
用 Nios 控制 240128A 有两种方式 :一是通过自定义
硬件模块方式将 Nios 的 Avalon 从端口与 240128A 连接 ,
Nios 可通过该模块直接与 240128A 通信 ;二是利用 Nios
自带的输入输出 PIO 核控制 240128A。
1 自定义方式
SOPC(片上可编程系统) 技术具有很高的灵活性 ,充
分体现在 SOPC Builder 不但自带了一些标准的组件 (如
并行输入/ 输出 PIO 核) 供用户使用 ;而且同时也提供了
一个组件编辑器 ,用来创建和编辑用户自己的 SOPC
Builder 组件 ,灵活地实现与外设通信。一个典型的 SOPC
Builder 组件应包含以下几部分 :
①硬件文件 ,描述组件硬件的 HDL 模块。
②软件文件 ,一个定义组件寄存器映像的 C 语言头
文件 ,软件控制组件所需的驱动程序。
③组件描述文件 ( class. ptf ) ,定义组件的结构 ,为
SOPC Builder 提供将组件集成到系统的信息。组件编辑
器自动创建这个文件 ,它是基于所提供的硬件、软件及在
编辑器 GUI 中指明的参数而创建的[2 ] 。
本文的自定义方式就是利用 HDL 语言描述一个自
定义的硬件模块 ,然后通过组件编辑器将其封装成一个
SOPC Builder 元件 ,再编写 C 语言的驱动程序 ,在 Nios II
IDE 环境下运行便可实现 LCD 正常显示。
自定义硬件模块的内部结构定义如下 :将读请求信号
read_n、写请求信号 write_n、1 位地址信号 address 分别与
R_D、W_R、C_D 直连 ;writedata 为 Avalon 从端口写入的
8 位数据端口。readdata 为 Avalon 从端口读出的 8 位数
据端口。ZDB 为双向三态数据端口 ,Nios 与 LCD 之间的
双向数据通信可用 Verilog 语言描述如下 :
assign dbz = write_n ? 8’bz : writedata ;
/ / write_n 为 0 时 dbz = writedata ,否则 dbz输出呈高阻态
assign readdata = dbz ;
/ / dbz 输出呈高阻态时可将数据输入到 readdata 端口
当写请求信号 write_n (低电平) 有效时 ,writedata 数
据可以输出到 dbz ;当读请求信号 read_ n (低电平) 有效
时 ,写请求信号 write_ n 是无效的 ,dbz 输出呈高阻态 ,此
时数据可以从 dbz 输入到 readdata ,即可完成数据的双向
通信。
Nios 处理器与 240128A 之间的具体通信过程如下 :
当 Nios 要向 LCD 写数据时 ,Nios 发出的写请求信号通过
Avalon 从端口传到模块的 write_n 端口 ,再从模块的 W_
R 端口传到 LCD 的写请求 ( WR) 信号端口 ,同时 8 位数据
30 2007 年第 10 期 adv @mesnet. com. cn (广告专用)
写到模块的 writedata 端口 ,再从模块的 ZDB 端口输出到
LCD 的数据端口 ;当 Nios 要从 LCD 读状态时 ,Nios 发出
的读请求信号通过 Avalon 从端口传到模块的 read_ n 端
口 ,再从模块的 R_D 端口传到LCD 的读请求 ( RD) 信号端
口 ,于是 LCD 将 8 位的状态信息通过数据端口传到模块
的 ZDB 端口 ,再从模块的 readdata 端口输出到 Avalon 从
端口。以上过程中 1 位地址信号 address 与 C_D 直连 (内
部连接 ,图 1 中未表示) ,用来控制 LCD 的 C/ D 端口。当
address 为 0 时 ,对数据操作 ;为 1 时 ,对指令操作[ 1 ,3 ] 。具
体原理框图如图 1 所示。
图 1 自定义方式 Nios 与 240128A 连接框图
当上述定义的硬件模块添加进 Nios 系统后 ,再编写
C 语言驱动程序 ,便可实现对 LCD 的基本操作了。对
240128A 的基本操作有 :读状态、写命令、写数据。读状态
只需 1 条命令就可以了 : state = IORD ( SM G_ LCD _
BASE ,1) 。state 为读入的状态值 , SM G_LCD_BASE 为
LCD 的基地址。1 为偏移地址 ,表示读入的为指令。同
理 ,向 LCD 写入命令可表示为 IOWR(SM G_LCD_BASE ,
1 ,command) ,写入数据表示为 IOWR( SM G_LCD_BASE ,
0 ,dat) 。由于 LCD 速度比 Nios (此处为 50 M Hz) 的速度
慢几个时钟周期 ,所以在写数据/ 指令后 ,要有延时 ,等
LCD 完成操作后再进行下一步操作 ,通常设计延时 1μs
以上就够了[ 3 ] 。每次向 LCD 操作时都要判断其状态是否
准备好 ,写完数据后要把对应的指令功能代码也写进去 ,
LCD 才能正确识别。写 1 字节数据流程如图 2 所示。
240128A 初始化流程如图 3 所示 ,由于显示文字是调
用字库 ,所以初始化时设为纯图形模式。我们注意到 ,
240128A 为 240 ×128 点阵的黑白显示器 ,可以用 1 个字
节表示 8 个点 ,对应位 1 表示黑点 ,0 表示白点 ,定义一个
数组 disp_data[128 ] [ 30 ] (每个元素为 8 位无符号字符型
变量) ,就可对应 1 帧显示屏上所有点 ,向数组写入数据就
可以实现图形显示。譬如当要显示某点时 ,根据该点在
240128A 中 x 和 y 坐标值可对应到数组 disp_data 具体元
素的对应位 ,写入要显示的值 ,再送到 240128A 相应地址
中即可显示。对于文字的显示 ,可先将字库文件下载到
Flash 存储器中。譬如 ,英文 8 ×16 点阵文件 ASC16 和汉
字 16 ×16 点阵文件 HZK16 ;当需要显示文字时 ,直接调
字库显示即可。
2 利用 PIO 核控制方式
并行输入/ 输出 PIO 核提供 Avalon 从端口和通用I/ O
端口之间的寄存器映射接口。I/ O 端口既可与片内用户
逻辑连接 ,又可与 FP GA 的外围器件连接。每个 PIO 可
提供 32 个 I/ O 端口 , 4 个 32 位存储器映像的寄存器。
Nios 处理器可以通过这 4 个寄存器控制 PIO 并与 PIO 通
信。它们分别是 :
数据寄存器 读取数据寄存器将返回输入端口值 ,将
数据写至数据寄存器时 ,其结果是将数据送往输出端口 ;
方向寄存器 控制每个双向 PIO 口的实际方向 ,只
有当 PIO 被配置成双向模式时 ,此寄存器才存在 ;
中断屏蔽寄存器 使能或禁止相应 PIO 输入端口中断 ,
只有当硬件配置成可产生 IRQ 中断时 ,此寄存器才存在 ;
边沿捕获寄存器 记录是否捕获到边沿信息 ,只有当
硬件配置为边沿捕获模式时 ,此寄存器才存在[1 ] 。
此处由于要实现双向数据通信 ,所以将 PIO 核硬件
配置为三态双向模式 ,而中断屏蔽寄存器和边沿捕获寄存
器可以不用设置 ,也就不存在了。
要利用 PIO 核直接控制 ,需要在 SOPC Builder 中将
一个 PIO 核添加进 Nios 系统 ,并将该核设置为 11 位三态
双向模式 ,其高 3 位用来作为 240128A 的控制位 ,低 8 位
作为数据位。240128A 与 Nios 连接框图如图 4 所示。
图 2 向 240128A写 1 字节数据 图 3 240128A 初始化流程
paper @mesnet. com. cn(投稿专用) 2007 年第 10 期 Microcontrollers & Embedded Systems 31
图 4 SMG240128A 与 Nios 连接框图
由于状态位和数据位都在同一个 PIO 的端口中 (即
对应数据寄存器的低 11 位) ,所以操作时应分别对高 3 位
和低 8 位操作 ,才能实现对 LCD 的读写控制。读状态流
程如图 5 所示。
向 LCD 写命令的流程如图 6 所示 ,写数据同样可以
通过上述方法实现。需要注意的是 :当向 LCD 写命令/ 数
据时 ,应将数据/ 命令与相应的状态位合在一起通过 11 位
的 PIO 口写入 LCD ,操作结束后应使读、写无效 ,以免
LCD 写入了错误的数据/ 命令。还有一种方法是利用两
个 PIO 核实现对 LCD 的控制 ,即一个核用来控制状态 ,一
个核用来传输数据。后面显示的方法与自定义方式是一
样的 ,这里不再重复。
图 5 读LCD 状态流程 图 6 向LCD 写命令流程
以上两种方法都能很好地实现 LCD 的显示 ,但在实
现 LCD 控制上有比较大的不同 : PIO 方式是靠改写 PIO
口数据高 3 位来实现 LCD 控制的 ,Nios 与 PIO 核之间的
通信是隐藏了 ; 而自定义方式中 , 读/ 写 LCD 是利用
Avalon总线周期读/ 写有效时产生的低电平来实现的。两
种方法的优缺点是 : PIO 方式是利用 Nios 自带 PIO 核实
现的 ,无需增加硬件模块 ,但每次对 LCD 读/ 写操作都要
修改 PIO 方向寄存器 ,而且数据与指令要分别操作 ,因此
C 语言编写的驱动程序要复杂些 ;自定义方式需自己添加
硬件模块 ,但对 LCD 读/ 写操作只需一条指令就可以了 ,
因此 C 语言编写的驱动程序要简单些。
结 语
通过使用两种方法实现 Nios 对液晶显示器的控制可
以看出 : Nios 是一个性价比较高的微处理器软核 ,既可以
利用其自带的软核 ,又可以采用用户自定义的方式完成与
外部设备通信 ,与其他处理器或控制电路相比 ,具有设计
方便、修改简单且具有在线编程和灵活性高等优点。一般
的 MCU ,如 51 单片机或 ARM 处理器是硬核 ,其功能不
能根据应用的需要来更改 ;而 Nios 处理器是软核 ,可以根
据不同的应用场合定制功能最合适的处理器 ,而且还可以
在一块 FP GA 中同时定制多个 Nios 处理器 ,以提高效率。
我们相信 ,基于 Nios 的 SOPC 技术将拥有广阔的发展空
间 ,其应用会越来越广泛。
参考文献
[ 1 ] 徐光辉 ,程东旭 ,黄如. 基于 FP GA 的嵌入式开发与应用
[ M ] . 北京 : 电子工业出版社 ,2006.
[2 ] 李兰英. Nios II 嵌入式软核 SOPC 设计原理及应用[ M ] . 北
京 : 北京航空航天大学出版社 ,2006.
[ 3 ] 杭州康芯公司. SM G240128A 液晶显示器使用手册 ,2003.
(收修改稿日期 :2007205203)
嵌入式系统应用技术选编( 1)
《单片机与嵌入式系统应用》编辑部 主编
北京航空航天大学出版社出版 书号 :978 - 7 - 81124 - 235 - 5
本书选编了 2006 年《单片机与嵌入式系统应用》期刊中的部分文章 ,共 310 篇。其中 ,122 篇全文刊登 ,其余 188 篇仅刊登摘
要。全文部分内容包括 : ①专题论述 ; ②综合应用 ; ③软件技术 ; ④网络与通信 ; ⑤总线技术 ; ⑥可靠性与安全性 ; ⑦PLD 与 SoC 设
计 ; ⑧实用技术 ; ⑨典型应用。摘要部分除上述 9 部分内容外 ,还包括 DSP 部分。
本书选编的内容都是近年来单片机与嵌入式系统应用领域的一些热点和新兴技术 ,有助于减少该领域中的一些重复劳动 ,提
高嵌入式系统应用水平 ,是从事单片机与嵌入式系统应用开发的技术人员案头的重要参考资料。