基于FPGA的16×16点阵模块控制器设计
2018-10-29乔广欣李亚峻堃斌于宝
乔广欣,李亚峻*,李 松,杨 堃斌,于宝
(天津科技大学电子信息与自动化学院 天津300222)
LED点阵显示系统不仅能够静态显示字符和图像,而且能够动态显示文字、动画、视频等信息,具有亮度高、寿命长、价格低、视角大等优点,得到广泛应用。
常用的 LED 点阵显示系统由微控制器、LED点阵显示屏及其行列驱动电路组成。所用微控制器的种类有基于AVR单片机的ATmega128[1]和基于51单片机的 AT89C51[2]、基于 ARM 的以 Cortex-M0+为内核的 KW01-Zigbee[3]和以 Cortex-M3为内核的STM32F103[4]、基于 FPGA 的 Xilinx Virtex4 系列XC4VSX25[5]等。单片机与 ARM 的开发语言有汇编语言或C/C++语言,FPGA的开发语言有VHDL语言或 Verilog语言。本文用 VHDL语言编程,采用DIGILENT公司的便携式 Basys2开发板,其上嵌有Xilinx Spartan-3E系列FPGA器件XC3S100E[6]。
16×16点阵有32个引脚,不适合直接与微控制器相连,占用太多的引脚资源。实际上常将译码器、串并转换芯片组成行列驱动电路用于控制LED点阵显示,常见的有用3-8译码器74HC138或4-16译码器 74HC154轮询扫描点阵行,用移位寄存器74HC595锁存点阵列数据[1,4]。本文选用74HC138与74HC595驱动的点阵模块。
1 16×16点阵模块的硬件电路
16×16点阵的每一行接LED灯的正极,每一列接 LED灯的负极。点阵的 16行 H1—H16由两片74HC138组合控制,Hi=1时第 i行被选通;点阵的16列L1—L16由两片74HC595级联进行控制,Hi=1、Lj=0时,第i行第j列的LED灯被点亮。
1.1 点阵行驱动74HC138
74HC138是一个 3-8译码器,当使能信号E3E2E1=100时,A2A1A0从 000到 111依次取值,使输出端Y0—Y7依次输出低电平[7]。如图1所示,用2个74HC138组合能够实现4-16译码器,在输出端外接三极管(图 1中只示意性地画了一个)可以驱动16×16点阵的点阵行 H1—H16(高电平有效)。始终使 G=0,当 D=0时,74HC138-1使能,CBA从 000到 111依次取值,H1至H8行依次被选通;当 D=1时,74HC138-2使能,CBA从000到111依次取值,H9至H16行依次被选通。
图1 用74HC138控制点阵行Fig.1 Control of dot matrix row with 74HC138
1.2 点阵列驱动74HC595
74HC595是一个移位寄存器,可实现数据的串行输入/8位并行输出或者串行输出[8]。如图 2所示,将 74HC595-1的 SQH与 74HC595-2的 SI相连,也就是将两片74HC595级联,可实现16位数据的并行输出,用于控制16×16点阵的16列L1—L16。
图2 用74HC595控制点阵列Fig.2 Control of dot matrix column with 74HC595
74HC595有三个重要的输入引脚,SCK(数据输入时钟)、SI(数据输入)、RCK(输出锁存时钟),分别对应于点阵模块上的引脚名称为 CLK、DATA、LATCH。它们的工作时序如图 3所示,当RCK为低电平时,从SI串行输入的数据D0—D15在每个SCK的上升沿依次被载入移位寄存器。从第 8个 SCK的下降沿开始,数据将出现在74HC595-2的输入端SI。连续输入 16位数据后,在 RCK的上升沿 D0—D15被锁存到输出存储器中,立即更新点阵列 L16—L1上的信息。
图3 74HC595的时序图Fig.3 Timing diagram of 74HC595
2 点阵显示驱动模块
图4点阵显示驱动模块 disp_dot16×16实现的是点阵行控制信号的产生、16位点阵列数据的存取与串行输出。
图4 点阵显示驱动模块Fig.4 Dot matrix display driver module
2.1 点阵列数据的存储与调用
点阵列数据从 74HC595串行输入。由于74HC595只有一个输出存储器,只能存储一行数据。所以需要通过编程轮询扫描点阵的 H1—H16行,同时在 L1—L16列输入待显示的信息,利用人眼的视觉暂存现象实现16×16点阵图形的显示。
点阵图像的数据较多,适于用ROM或RAM存储起来,然后用查找表的方式输出。本设计直接调用Xilinx ISE软件开发环境提供的ROM IP核(romip模块) ,在其上存储了一幅16×16点阵的图像信息。在时钟clk_row的上升沿,根据ctrl_addr模块地址addr从romip模块中读取数据dout,地址addr自加1。
2.2 点阵行列控制器的VHDL程序设计
ctrl_addr模块的地址 addr不仅控制点阵列数据的存取,还控制ctrl_dot模块的点阵行选通信号dcba和点阵列数据data的更新。为了使74HC595正常工作,需要按照图 3所示的工作时序编写它的 VHDL控制程序,将16位并行数据data_line(15∶0)转换为串行数据输出给 data,同时产生 74HC595芯片所需的数据输入时钟clk_hc595和输出锁存时钟latch,它们分别与 16×16点阵模块的 DATA、CLK、LATCH端相连,如图2所示。点阵行列控制器的VHDL程序段用如下if语句编程实现。
g<='0'; --选通 74HC138
if rising_edge(clk)then
if latch_tmp='1' then -- ①
clk_hc595<='0';
if(addr_l=addr_tmp)then
data_tmp <= data_line;
addr_tmp:=addr_tmp+1;
latch_tmp<='0';
shift_f<='1';
else
dcba<=addr_l-1;
end if;
else
if shift_f='1' then -- ②
clk_hc595<='0';
data<=data_tmp(0) ;
data_tmp(14 downto 0)<=data_tmp
(15 downto 1);
shift_f<='0';
else -- ③
clk_hc595<='1';
if cnt=X"F" then
latch_tmp<='1';
cnt:=X"0";shift_f<='0';
else
cnt:=cnt+1;shift_f<='1';
end if;
end if;
end if;
latch<=latch_tmp;
end if;
① 装载新数据/选通点阵行。当 latch_tmp为 1时,使 clk_hc595为 0。当 addr_l与预设的 addr_tmp不一致时,说明地址未更新,点阵显示上一行的信息,继续检测。当检测到addr_l与addr_tmp相同时,说明有新数据到来,将新数据 data_line装载到data_tmp;addr_tmp自加 1,准备下一个数据的地址;使latch_tmp为0,移位标志位shift_f置1。
② 16位数据串行输出,先低位后高位。当latch_tmp为 0时,如果 shift_f为 1,则将 16位并行数据的最低位输出给 data,其他数据右移一位,实现数据从低位到高位的串行输出;使 clk_hc595为 0,shift_f为 0。
③ 产生时钟clk_hc595和输出锁存信号latch的上升沿。当latch_tmp为0时,如果shift_f为0,则使clk_hc595由 0变为 1,每移一位数产生一个clk_hc595时钟;当 cnt<15时,说明 16位数据未传完,使cnt自加1,shift_f为1,在下一个clk时钟的上升沿转到②继续串行输出。当计数器 cnt=15时,表明16位数据全部串行输出完毕,使latch_tmp由0变为 1,产生输出锁存信号 latch的上升沿,锁存数据。使cnt清零,shift_f为0,在下一个clk时钟上升沿转到①,等待下一次数据更新。
3 16×16点阵显示的硬件实现效果
对工程进行综合、实现、产生可编程文件,下载到Basys2开发板上,实现了如图5所示的显示效果。
图5 16×16点阵显示效果(津门)Fig.5 16×16 dot matrix display effect(Jinmen)
在存储器中存入更多幅图像信息,然后对地址模块 ctrl_addr进行更复杂的编程控制,即可实现图像的动态显示,使一幅幅图像切换显示,使点阵显示信息向左或向右移,等等。
4 结 论
本文着重介绍了点阵行列控制器的 VHDL程序设计,用 if嵌套语句编程实现了数据的存储调用与串行输出、控制 74HC138驱动点阵行选通、控制74HC595驱动点阵列,从而在点阵屏上显示出预设的图像信息。