基于FPGA的数码管音乐流水灯设计

2019-03-29 07:56张鹏鸣
关键词:状态机数码管蜂鸣器

刘 玲, 刘 新, 张鹏鸣

(1. 沈阳师范大学 物理科学与技术学院, 沈阳 110034;2. 中国科学院 近代物理研究所, 兰州 730000)

现场可编程门阵列(Field Programmable Gate Arrays, FPGA)是一种可编程的电子器件[1], 可以利用硬件描述语言(Verilog或VHDL)改变内部逻辑结构来实现各种功能。与专用集成电路相比,FPGA具有速度快、串口多、逻辑简单、开发周期短等优势[2-3]。它可以在EDA开发平台中(如QUARTUS II)通过编程将芯片内部的逻辑门连接成电路,仿真通过后将硬件逻辑输出。这不仅能使设计的效率有所提高,而且还能降低外部印刷电路板的复杂性[4]。同时,FPGA技术在数据获取、信号处理、智能通讯、航天军工等领域都有广泛应用[5-9]。

近年来,人们对FPGA的设计研发产生了极大的兴趣。Jin等[10]用基于FPGA的数据获取系统实现了对环境信息和图像数据的实时感知和获取,建立了一种无线传感器网络节点的数字传输与处理系统。同时,Xu等[11]也通过FPGA技术改良了液晶触摸屏,提高了帧数并降低了处理器负担。此外,Arkani等[12]为分析随机时间间隔脉冲的随机过程,在FPGA设备上实现了一种双通道时间分析器数据采集系统。由此可见,传统的集成电路已经不能适应技术发展的要求,FPGA的应用具有一定的实用价值。

现如今,由于电子产品在日常生活中占据很大比例,导致电子市场竞争也愈发激烈。为了更快地满足用户要求,缩短研发周期就显得尤为重要。而FPGA恰恰能满足这一要求,特别是它的可编程性能够使产品具有很大的升级空间,不同于市面上流通的基于单片机的产品,一旦设计完成就不可更改,因此,应用FPGA的产品更受欢迎。随着生活水平提高,人们更加注重生活的品质,从美化城市的景观灯,儿童手中的电子玩具,再到住宅中的各种智能家电,无一不体现出FPGA在市场经济中的巨大潜在价值。虽已有很多人研究了音乐流水灯和带数码管显示的播放器[13],但对于音乐流水灯的研究,大都只能存放一首歌曲且无法控制流水灯的闪烁频率,而对带数码管显示的音乐播放器流水灯功能是如何设计的并不是十分清楚。因此,本文基于FPGA研发了一款电子产品----带数码管显示的音乐流水灯。

本文详细地介绍了如何用单一状态机控制音乐、流水灯、数码管3个模块, 通过按键控制各个状态之间的切换并在硬件上验证成功。 此产品可以应用在公共景观设施、汽车外部装饰及儿童玩具等领域。

1 总体设计思路

人们对于音乐和美的热爱是永不停歇的,音乐流水灯将视听完美地结合起来,并可以根据个人的喜好自定义歌曲,通过数码管上显示的数字可以知道当前是第几首歌,灯光的闪烁频率与歌曲切换都通过按键进行操作,更显人性化。图1所示为带数码管显示的音乐流水灯的总体设计思路图,共4个部分,状态机输出信号并同时传入LED模块,蜂鸣器模块以及数码管模块。

图1 原理框图Fig.1 The principle diagram

要想达到上述目标,需要注意以下几点:

1) 本装置所有模块的控制是通过一个状态机(Finite State Machine, FSM)实现的。当条件被满足的时候,状态机就会从一个状态转为另一个状态;没有条件被触发的时候,会保持原有状态不变。

2) 采用无源蜂鸣器,由于不带振荡源,直流信号无法令其鸣叫,因此只能用不同频率的方波驱动它。AC620开发板上的晶振输出时钟频率为50 MHz,根据每个音符对应的频率,利用公式求出对应的预设值,再按照歌曲的音调顺序,依次存入ROM中。

3) 由于AC620开发板上的led灯数量有限,因此采用不同的闪烁频率来区分不同的歌曲。

2 各模块设计方案

2.1 LED灯模块

改变计数器的分频值可以改变LED灯闪烁的快慢,当达到计数次数时输出一个tick1信号给移位寄存器,从而使LED灯依次点亮。当为第一首歌的时候,流水灯闪烁频率为5 Hz; 当前为第2首歌时,闪烁频率为2.5 Hz。FPGA输出低电平时,LED灯亮;输出为高电平时,LED灯灭。

2.2 蜂鸣器模块

本设计采用的是无源蜂鸣器,需要用2~5 kHz的方波来驱动。要想使蜂鸣器发出不同的音调,就是要改变蜂鸣器的驱动频率,在程序上体现为改变定时器的分频值(又称预重装值,counter_arr)。预重装值与频率的对应关系为

表1为50 MHz的时钟频率下,频率与预重装值的对应关系。根据歌曲中音符的先后顺序将预重装值输入到查找表当中,并与索引值一一对应。索引值的位宽取决于乐曲中音符的数量。查找表采用累加的方式遍历所有音符。当定时器计数达到分频值减1时,会清零并发送一个tick信号,令电平发生变化,从而达到使蜂鸣器发声的目的。本设计有2首歌曲,不同的状态对应不同的查找表。如果是歌曲比较多的设计,则可以将各个歌曲的音符分别存入不同的查找表中,然后根据状态的不同读取相应的arr值。图2为整个音乐模块的设计流程。

表1 各音调频率预重装值对应表Tab.1 The relationship between the tone frequency and counter_arr

图2 音乐模块设计图Fig.2 The design of music module

2.3 8位7段数码管模块

AC620开发板上的数码管是段式显示共阳极的数码管,需要给其低电平才能使其点亮,共有8个这样的数码管。数码管工作的方式采用动态显示的方式。将所有位数码管段选线并联在一起,位选线控制哪一位数码管有效。这样能有效地减少IO口,避免资源的浪费。本设计以12.5 MHz的频率进行扫描,利用发光管的余晖与眼睛视觉暂留现象,让人觉得相应的数码管都在同时发光。由于开发板上是一个8位8段的数码管,以级联的方式连接2个74HC595芯片,构成16位的移位寄存器并将串行的信号变为并行的信号输出到段选和位选口,这样仅用3个IO口即可控制全部数码管。

表2 数码管编码译码表Tab.2 Code decoding table of digital tube

在代码设计方面:首先,需要一个分频计数器产生驱动时钟;其次,74HC595内部可以看做由一个8位串行移位器和一个8位寄存器组成,当数据全部存入移位寄存器之后,产生一个stcp信号,存入寄存器,接着才会输出数据。由于有2个这样的芯片,经过16次移位之后才会储存一次数据。因此需要编写一个查找表来表示这一过程。最后,需要将数码管显示的数字与段码一一对应,它们的对应关系如表2。

只要确定好数码管段选与位选的段码值,即可以在相应的数码管上输出数据。本设计在位选数据线上为8′b0000_0001,即数码管7被选中。当为mode1时,段选数据线上为8′b1111_1001;当为mode2时,段选数据线上为8′b1010_0100;当为idle时,段选数据线上为8′b1111_1111。此处需要注意,移位是从第7位开始,段码需要从第7位倒着输入。

2.4 状态机模块

图3 状态机的状态转换图Fig.3 State transition diagram

对于本设计来说,需要3个状态来实现歌曲的切换,分别是:idle,mode1,mode2。状态机的设计如图3所示。其中KEY[0]、KEY[1]的管脚连接的是AC620板子上的按键1,按键2。KEY[0]=0代表按键1被按下,输出低电平,电路导通;KEY[0]=1代表按键1没被按下,输出高电平,电路截止。KEY[1]与之同理。状态机要实现的功能及现象如下:

对于led模块:当按下按键1,状态变为mode1时,led灯会以很快的频率滚动闪烁;当按下按键2,状态变为mode2时,led灯以一个较慢的频率闪烁;当状态变为idle时,led灯全灭。

对于音乐模块:当为mode1状态时,播放第1首歌曲;当为mode2状态时,播放第2首;为idle状态时,不播放音乐。

对于数码管模块:当为mode1时,数码管显示数字“1”;mode2状态时,数码管显示“2”;当为idle状态时,无显示。

值得注意的是,要保证按键1按下后,状态继续保持为mode1而不回到idle状态,仅有KEY[0]=0这个条件是不够的,还需要判断按键1的前一状态。(prekey[0]=1表示按键1的前一状态为抬起,prekey[0]=0表示按键1的前一状态为按下。)那么如何定义按键1的前一状态呢?需要编写一个D触发器,通过非阻塞赋值的方式将KEY[0]的值赋给prekey[0],这样在同一个周期中,prekey[0]的值就等于KEY[0]的旧值。为了实现设定的功能,需要定义当按键的前一状态与现在的状态不同时,状态机才会切换状态,否则则保持系统的前一状态不变。除此之外,因为本设计由按键控制,这样编写也可以消除按键抖动。

3 顶层设计与验证

将相应的代码按功能整合到一起,进行封装例化。例化后的模块像零件一样,按照正确的顺序连接,被顶层调用,从而构成一个清晰的系统。部分仿真波形图如图4所示。

图4 部分仿真波形图Fig.4 Simulating waveform

由波形图可知,当前选中的是数码管7。图中state的值为1时,说明进入到mode1中,7号数码管上的显示为11111001,对应在数码管上则显示数字“1”;当state的值为2时,则为mode2状态,数码管值为10100100,对应在数码管上的结果为数字“2”。只有当state的值发生改变时,数码管的数字才发生改变,否则则保持当前显示结果不变,与预期结果相符。

最后,将配置文件烧写到FPGA中,进行板级验证,验证结果如图5所示。

(a)—歌曲1显示结果; (b)—歌曲2显示结果图5 LED和数码管显示结果Fig.5 Displaying results of LED and Digital tube

图5(a):按键1按下,数码管显示数字“1”,LED灯快速闪烁,播放乐曲《生日快乐歌》,图5(b):按键2按下,数码管显示数字“2”,LED灯闪烁变慢,播放乐曲《两只老虎》,整个设计测试成功。

4 结 论

本文研究了一种基于FPGA的带数码管显示的音乐流水灯控制系统。利用Verilog语言进行编译,一个状态机控制led灯闪烁、音乐播放以及数码管的同步输出,代码简洁高效,若想增加新的状态或其他功能模块,便于修改,复用性好。同时,本文提供的一种消除按键抖动设计思路,可应用于其他的控制系统。此外,AC620开发板上有多个接口,利用SOPC技术搭建外设,可实现更多的功能,从而本设计有更多优化升级的空间。总之,本装置以FPGA为核心,代码简单,系统稳定,可移植性强,应用范围广,具有一定的市场投资价值。

猜你喜欢
状态机数码管蜂鸣器
电动自行车产品车速提示音检测现状和整改技术研究(2)
微课教学设计之“数码管动态显示”
掌控板制作简易钢琴
基于有限状态机的交会对接飞行任务规划方法
Arduino编程
MC9S08FL16单片机数码管静态显示分析
单片机控制的四位数码管动态显示编程
单片机驱动蜂鸣器的程序设计
基于Spring StateMachine的有限状态机应用研究
丰田凯美瑞240V车间隙警告蜂鸣器异常鸣响