基于VHDL语言的8×8点阵模块控制器设计
2018-09-26杨斌李亚峻乔广欣李松李毅
杨斌 李亚峻 乔广欣 李松 李毅
摘要:介绍了LED点阵显示模块的硬件连接、MAX7219的初始化与工作时序,用VHDL语言编程实现了时钟分频、数据的存储与调用、MAX7219控制器的设计。将Basys2开发板与点阵模块相连,将程序下载到FPGA上,实现了8×8点阵的显示,验证了设计的正确性,该设计具有实际应用价值。
关键词:现场可编程门阵列;VHDL语言;MAX7219芯片;点阵显示
中图分类号:TP273 文献标识码:A 文章编号:1007-9416(2018)05-0006-03
LED点阵显示系统不仅能够静态显示字符和图像,而且能够动态显示文字、动画、视频等信息,在广告、信息发布、体育比赛、工业等各个领域都有广泛应用。
LED点阵显示控制器的种类不少,包括单片机[1]、ARM[2, 3]、FPGA[4],等等。本文采用DIGILENT公司的Basys2便携式开发板,它是完整的即用型硬件系统,适于从基本逻辑器件到复杂控制器的电路设计,其上嵌有Xilinx Spartan-3E系列FPGA器件[5]。
8×8点阵有16个引脚,如果直接与微处理器相连占用引脚资源太多,实际多用译码器、串并转换芯片控制点阵。本文采用的8×8点阵模块由一片MAX7219驱动。
1 基于MAX7219的8×8点阵模块
1.1 8×8点阵模块的硬件连接
图1所示为MAX7219芯片的主要引脚。它只有三个输入端DIN、CS、CLK,可以与所有通用的微处理器相连,所以由MAX7219驱动的8×8点阵模块克服了点阵引脚过多的问题。
MAX7219芯片的输出端DIG0~DIG7连到8×8点阵H1~H8行,SEG DP、SEG A~G连到8×8点阵L1~L8列,DOUT作为串行输出可用于级联扩展。MAX7219中含有BCD编码器(本文未用到)、多路扫描回路(对DIG0~DIG7以不低于800Hz的频率自动轮询扫描)、段驱动器(驱动SEG DP、SEG A~G8段)和8×8 SRAM静态随机存储器(用于存储数据)。
1.2 MAX7219的初始化与数据的存取
在DIN端输入串行的16位数据,数据中包含如表1所示的信息。
MAX7219芯片的寄存器分为控制寄存器和数据寄存器两种。
控制寄存器有五个,分别是译码模式、亮度、扫描限、掉电和显示检测,寄存器地址依次为9、A、B、C、F,每个寄存器初始化的所有可能设置详见MAX7219说明文档[6]。本设计的初始化设定值如下:0900,译码模式设为不译码,数据存储器中的8位数据直接输出给8×8点阵的8列;0A08,设为中等亮度;0B07,扫描限设为8个,对8×8点阵的8行轮询扫描;0C01,设为正常工作模式,不掉电;0F00,设为正常工作模式,关显示检测。
数据寄存器由片上的8×8 SRAM 实现。寄存器地址从1到8,对应于MAX7219芯片的DIG0~DIG7引脚、对应于8×8点阵的H1~H8行。SRAM的数据宽度为8,其中存储的数据值对应于MAX7219芯片的SEG DP、SEG A~SEG G引脚、对应于8×8点阵的L1~L8列。地址nH中存储的数据值就是8×8点阵第n行待显示的信息。
在VHDL程序设计中,将MAX7219的初始化设定值与8×8点阵中待显示的信息存储在ROM IP核(romip模块)中,数据的存储格式如下:
memory_initialization_radix=16;
memory_initialization_vector=
0900, 0A08, 0B07, 0C01, 0F00,
0146, 02C9, 0349, 0446, 0549, 0649, 07E6, 0800;
图2所示的ctrl_addr模块用于产生romip模块所需的地址addr,使addr自加1(如图3所示),按照地址依次从romip模块中取出这13个16位并行数据dout,输入到MAX7219控制器模块。
2 MAX7219控制器设计
2.1 MAX7219的工作时序
如图4所示,当数据锁存信号CS为低电平时,从DIN串行输入的数据D15~D0在每个时钟CLK上升沿依次被移入内部的16 位移位寄存器。连续输入16位数据后,在CS上升沿,根据这16位数据的D11~D8位地址将其D7~D0位的值锁存到相应的控制寄存器或数据寄存器中。
2.2 MAX7219控制器的VHDL程序设计
为了使MAX7219正常工作,需要按照图4所示的工作时序用VHDL语言编写MAX7219的控制程序ctrl_dot.vhd,图5为其输入输出端口信息。
ctrl_dot模块实现的是在输入时钟clk的每个上升沿,将16位并行数据data(15:0)转换为串行数据输出给din,同时产生MAX7219芯片所需的数据锁存信号load_cs和时钟信号clk_max7219,分别与8×8点阵模块的DIN、CS、CLK端相连,控制8×8点阵模块显示。用if语句编程实现的主要程序段及解读如下。
if rising_edge(clk) then
if (loadcs_tmp='1') then -- ①
clk_max7219<='0';
if (data/=data_cmp) then
data_cmp <= data; --用于判斷数据是否更新
data_tmp <= data; --装载新数据
loadcs_tmp<='0'; shift_f<='1';
end if;
else
if shift_f='1' then -- ②允许移位
din<=data_tmp(15); --高位输出给din
data_tmp(15 downto 1)<=data_tmp(14 downto 0); --低15位左移一位
clk_max7219<='0'; shift_f<='0';
else --③
clk_max7219<='1'; --产生时钟clk_max7219的上升沿
if cnt cnt:=cnt+1; shift_f<='1'; else --16位移完 cnt:=X"0"; shift_f<='0'; loadcs_tmp<='1'; --产生load_cs的上升沿,锁存数据 end if; end if; end if; load_cs<=loadcs_tmp; end if; ①当loadcs_tmp为1时,使clk_max7219为0;当检测到输入值data与原数据data_cmp不同时,用data值更新data_cmp(准备下一次比较的数据)和data_tmp(装载新数据);使loadcs_tmp为0,移位标志位shift_f置1,允许数据移位。当data与data_cmp相同时,表明数据未更新,loadcs_tmp为1,保持在①状态继续检测数据是否更新。 ②当loadcs_tmp为0、shift_f为1时,将data_tmp的最高位输出给din,其他位左移一位,实现16位并行数据data_tmp的逐位左移串行输出,先高位后低位;使clk_max7219为0、shift_f为0。 ③当loadcs_tmp为0、shift_f为0时,使clk_max7219由0变为1,din每移一位产生一个clk_max7219时钟。当cnt<15时,16位数据未传完,cnt自加1,使shift_f为1,在下一个clk时钟上升沿返回到②继续串行输出。当cnt=15时,表明16位数据全部串行输出完毕,使cnt清零,shift_f为0;使 loadcs_tmp由0变为1,产生数据锁存信号的上升沿,锁存数据,在下一个clk时钟上升沿返回到①检测数据是否更新。 3 时钟分频模块设计 时钟分频模块clkdiv_50M将Basy2开发板上提供的50MHz时钟分频,需保证提供给ctrl_dot的时钟clk_16data与提供给ROM IP核的时钟clk_rom匹配,只有當ctrl_dot中的16位数据全部串行输出后才允许更新data。通过分析ctrl_dot.vhd程序可知,16位数据传输至少需要34个clk_16data周期,所以clk_16data的时钟频率必须高于34倍的clk_rom时钟频率。 4 基于MAX7219的8×8点阵显示效果 将时钟分频模块clkdiv_50M、ROM地址模块ctrl_addr、ROM IP核romip和MAX7219驱动模块ctrl_dot连接起来,添加引脚约束文件后,进行综合、实现、产生可编程文件,下载到Basys2开发板上,显示出如图7所示的效果。 5 结语 本文着重介绍了MAX7219控制器的VHDL程序设计。将MAX7219的寄存器地址、初始化设定值和点阵待显示信息组成16位数据存入ROM IP核中,然后用if嵌套语句编程实现了16位并行数据的串行输出,从而控制MAX7219驱动LED点阵显示。 本文将大量数据存入ROM中提高了编程效率。另外,一个8×8点阵模块只需一片MAX7219芯片,无论从软件编程还是从硬件实现来看,都比用译码器与74HC595的组合驱动更实用,有更广泛的应用价值。 参考文献 [1]朱海洋,欧阳明星,张俊武.基于Android控制的LED点阵显示设计与实现[J].液晶与显示,2016,31(11):1064-1069. [2]赵婷婷,王先全,姜增晖,王培懿.基于ARM的LED点阵自动调光控制系统的设计[J].仪表技术与传感器,2016,(8):63-66,96. [3]文瑾,施连敏.基于KW01-Zigbee MCU无线LED点阵屏控制系统的设计与实现[J].福州大学学报(自然科学版),2017,45(1):32-36.