基于FPGA和UART的乐曲演奏系统设计
2019-02-11吕兆承傅小兰李营罗靖宇
吕兆承, 傅小兰, 李营, 罗靖宇
( 淮南师范学院 电子工程学院, 安徽 淮南 232038 )
0 引言
目前,具有乐曲演奏功能的电子产品大多采用单片机微处理器来实现乐曲演奏,但这些产品因受硬件资源的限制,难以对原设计进行变更或升级[2].FPGA技术是一种新型的电路设计技术,其通过软件编程设计硬件电路,可极大地提高电路设计的效率和可靠性,被广泛使用在5G通信、大数据处理、人工智能、工业控制等领域[3].目前,有学者尝试性地将FPGA技术运用于乐曲演奏中.例如:崔智军等[4]在FPGA器件上设计了一个具有简易触摸屏的电子琴电路,并实现了触摸控制弹奏和自动播放乐曲的功能.王丽君等[5]采用VHDL编程技术设计了一种基于FPGA的简易电子琴,该电子琴具有手动弹奏、自动演奏和简谱码显示等功能.基于上述研究,本文利用Altera的FPGA芯片,在Quartus平台下,采用top-down设计方法,设计一款基于UART通信接口的乐曲硬件演奏电路,并通过嵌入式逻辑分析仪SignalTap II对系统的有效性进行仿真验证.
1 系统设计
该演奏系统主要包括串口调试工具、UART串口接收模块、乐曲演奏模块和蜂鸣器,其总体结构框图如图1所示.串口调试工具的功能主要是控制指令的发送;UART串口接收模块的功能主要是控制指令的接收,并将接收到的控制指令发送至乐曲演奏模块;乐曲演奏模块的功能主要是输出使乐曲能连续演奏所需的基本数据;蜂鸣器的功能主要是演奏乐曲.其中UART串口接收模块和乐曲演奏模块在FPGA中实现.由此可以看出,该系统只需很少的外围器件即可演奏音乐,从而可提高系统的可靠性.
图1 演奏系统的结构框图
2 UART串口接收模块设计
2.1 UART的工作原理
UART串口的通信主要由两根信号线来实现,一根用于串口发送,另外一根负责串口接收.数据在传输过程中不需要时钟,只需通信双方在数据传输过程中约定好一个特定的波特率即可,典型的波特率有9 600、19 200、115 200 bps等.数据的传输有起始位、停止位、中间位.起始位表示数据传输的开始,停止位表示数据传输的结束,中间位的个数可以根据需要设定,并可以设定奇偶校验位(可选)[6].UART的数据传输格式如图2所示.数据格式为1位起始位、8位数据位、1位停止位,无校验位.
图2 UART的数据传输格式
2.2 UART串口接收模块程序的设计
根据UART通信原理,本文将UART串口接收模块划分为波特率发生器、数据接收模块,如图3所示.波特率发生器的功能是产生与UART通信同步的时钟,通过该功能UART串口接收模块可方便地按照UART通信的时序要求进行数据接收或者发送.数据接收模块的主要功能是接收和转换数据.数据接收模块在完成接收数据后,输出结束标志信号[7].本文将UART串口接收模块的端口定义为:
1) clk为系统时钟输入端,输入频率为50 MHz;
2) rst_n为系统复位信号输入端,低电平有效;
3) uart_rx为接收模块串行数据接收端;
4) out_rx_dara为接收模块并行数据输出端;
因为是连续运动,着陆过程还会继续,但碰撞时间已经记录下来,做分析处理,将本文的改进算法与一般碰撞检测算法进行对比,可得到如下的检测效果,如表2:
5) rx_bps_start为数据接收标志信号,高电平表示接收数据.
图3 UART串口接收模块的RTL级视图
2.3 仿真测试
本文用Quartus自带的嵌入式逻辑分析仪SignalTap II来捕获和显示信号,并用其来分析系统硬、软件之间的互相作用[8].使用SignalTap II的一般流程为:新建调试文件,添加信号,设置信号触发,设置时钟相关参数,下载仿真.UART串口接收模块的仿真结果如图4所示.由图4可以看出:串行数据接收端uart_rx上的数据序列为0100011001,其起始位为“0”,数据位为“10001100”,停止位为“1”(最后一位).在数据接收标志信号rx_bps_start和波特率时钟计数器bit_cnt的控制下,UART串口只采集输入数据(串行数据)的中间8位有效位,并将其逐位存储到寄存器shift_data中.当UART串口接收到所有(9个)的波特率时钟之后,寄存器shift_data将接收到的数据并行输出给数据输出端out_rx_data.因UART串口在数据通信时首先发送的是最低位数据,因此接收的数据为“00110001”.由表4中的数据栏可以看到,当UART串口接收完数据后,其数据接收标志信号rx_bps_start为“0”,数据输出端out_rx_data为“00110001”,与串行数据接收端uart_rx接收的数据一致.这表明,UART串口接收模块的功能正常.
图4 UART串口接收模块的仿真时序
3 乐曲演奏模块设计
3.1 乐曲演奏的原理和实现
组成乐曲的每个音符的频率值(音调)及其持续的时间(音长)是乐曲能够连续演奏所需的两个基本数据.①音调.因乐曲都是由一连串的音符组成,当演奏电路按照乐曲的乐谱依次输出这些音符所对应的频率时,蜂鸣器即可连续地发出音符的音调[9].这些音符的频率是通过对基准频率进行分频得到的.②音长.音长是由乐曲的速度及每个音符的节拍数来确定的.为了实现节拍,需选择一个时钟频率来控制音长.如:若将全音符的持续时间设为1 s,只需提供一个4 Hz的时钟频率即可产生四分音符的时长;对于节拍较长的音符,如二分音符,则连续读取2次即可.因此,只要控制好输出到蜂鸣器的激励信号(包括频率的高低和持续时间)就可以使蜂鸣器发出连续的乐曲声[10].
根据上述乐曲演奏的原理,本文将乐曲演奏模块划分为4个子模块:音符数据ROM模块、地址发生器模块、乐谱码查表模块、数控分频器模块.
3.2 音符数据ROM模块
音符数据ROM模块的功能是存放乐曲中的音符数据.该功能是利用Quartus软件自带的IP核LPM-ROM来实现的,即将乐谱中相应的音符按照一定的规则放在一个连续的地址上.将音符转换为代码的规则为:采用8位二级制数表示音符,低4位用1(do)、2(re)、3(mi)、4(fa)、5(sol)、6(la)、7(si)代表音阶中的7个基本音级,高4位用1、2、3分别表示每个音级的低音、中音和高音,休止符用0表示.本文选用的ROM的容量为8×512 bits,并选择3首乐曲(《两只老虎》《送别》和《布娃娃和小熊跳舞》)分别储存在ROM中,各乐曲的地址值分别为0~71、88~215、240~367.
3.3 地址发生器模块
本文将一个9位二进制计数器(计数最大值为512)作为音符数据ROM模块的地址发生器,以此实现按节拍读取乐谱.该模块每收到1次时钟信号,计数器就会计数1次;计数结果停留的时间越长,该音符演奏的时间就越长.
3.4 乐谱码查表模块
乐谱码查表模块中包含乐曲全部音符所对应的频率,如表1所示.表1中的计算结果是四舍五入所得,因此与每个音符的实际频率相比会出现小于1 Hz的误差.
表1 简谱中的音符与频率的关系
3.5 数控分频器模块
数控分频器模块的功能是通过对某个基准时钟频率进行分频,获得与各个音符所对应的频率输出.
3.6 乐曲演奏模块程序的设计
图5为乐曲演奏模块的RTL级视图.乐器演奏模块的端口定义如下:
1) clk为系统时钟输入端,输入频率为50 MHz;
2) rst_n为系统复位信号输入端;
3) key_cnt为控制信号输入端,用来选择ROM中不同的地址段.选择第1首乐曲,key_cnt的值为“8’h30”,计数器从位置0~71循环计数,由此实现乐曲的循环演奏;
4) beep为驱动蜂鸣器的输出信号.
图5 乐曲演奏模块的RTL级视图
为了实现乐曲的播放,首先需要将曲谱数据存储到音符数据ROM模块中,然后按照一定的节拍从ROM中读出曲谱.在时钟的驱动下,音符数据ROM模块依次输出该曲谱的音符数据并发送至乐谱码查表模块;乐谱码查表模块输出音符的相应频率,并将此频率输送至数控分频器模块;数控分频器模块通过对50 MHz时钟进行分频,输出此音符所对应的发声频率,由此驱动蜂鸣器发出连续的乐曲声.当乐曲被演奏完一遍后,乐曲演奏模块能自动从头开始循环演奏.乐曲演奏模块根据key_cnt取值,选择的地址段不同,演奏不同的乐曲.乐曲演奏的实现过程如图6所示.
3.7 仿真测试
图7为乐曲演奏模块的时序仿真图.图7中输入的控制信号key_cnt为“30”,演奏的乐曲为《两只老虎》.其中第1个音符是中音do,它的输出频率是523 Hz,占了2个状态的时间(不包括0时刻之前的状态);第2个音符是中音re,它的输出频率是587 Hz,占了2个状态的时间;第3个音符是中音mi,它的输出频率是659 Hz,占了2个状态的时间;第4个音符是中音do,占了4个状态的时间.对照《两只老虎》乐曲的乐谱可知,仿真结果正确.
图6 乐曲演奏流程
图7 乐曲演奏模块的仿真时序
4 系统调试
测试完SignalTap II后,还需进行硬件测试.本设计采用芯航线AC620开发板(Altera Cyclone IV EP4CE10F17C8N)进行系统的调试和功能验证.调试过程为:首先打开串口调试工具助手,配置串口通信参数;然后根据用户需求发送控制指令给FPGA,FPGA根据此命令控制乐曲演奏器播放不同的乐曲.经测试,系统可实现智能化控制演奏过程,表明本文系统符合设计要求.
5 结语
本文在EDA开发平台上,利用FPGA技术设计了一款基于UART数据传输的乐曲演奏电路.测试结果表明:通过PC机串口调试助手发送控制指令给FPGA,FPGA可以准确地接收相应指令,并确定出与该指令相对应的乐曲,然后通过蜂鸣器即可完成音乐播放.本文方案稳定可靠,使用便捷,因此具有很好的实用性.另外,本系统在实际运行中可根据外设和处理器的不同需要,通过调整波特率和改变数据帧的格式设置等即可将本系统运用于不同的数字演奏系统.