搜索
您的当前位置:首页正文

“两只老虎”EDA课程设计(详细)

来源:榕意旅游网


课 程 设课程设计名称: 专 业 班 级 学 生 姓 名 : 学 号 : 指 导 教 师 : 课程设计时间:

1 设计任务及要求

设计任务:乐曲自动播放器。自行选择一首自己喜爱的经典乐曲,用FPGA设计实现一个该曲目的自动演奏电路。

要求:(1)根据设计题目要求编写相应程序代码

(2)对编写的VHDL程序代码进行编译和仿真 (3)利用实验箱完成硬件验证

(4)总结设计内容,完成课程设计说明书

与利用微处理器,以纯硬件完成乐曲演奏电路的逻辑要复杂得多。本实验设计项目作为“两只老虎”乐曲演奏电路的实现,组成每个乐曲的每个音符的发音频率值及持续的时间是乐曲能连续演奏所需要的两个基本要素。

(1) 音乐硬件演奏电路基本原理

硬件电路的发声原理,声音的频谱范围约在几十到几千赫兹,若能利用程序来控制FPGA芯片某个引脚输出一定频率的矩形波,接上扬声器就能发出相应频率的声音。乐曲中的每一音符对应着一个确定的频率,要想FPGA发出不同音符的音调,实际上只要控制它输出相应音符的频率即可。乐曲都是由一连串的音符组成,因此按照乐曲的乐谱依次输出这些音符所对应的频,就可以在扬声器上连续地发出各个音符的音调。而要准确地演奏出一首乐曲,仅仅让扬声器能够发生是不够的,还必须准确地控制乐曲的节奏,即乐曲中每个音符的发生频率及其持续时间是乐曲能够连续演奏的两个关键因素。

(2) 音符频率的获得

多个不同频率的信号可通过对某个基准频率进行分频器获得。由于各个音符的频率多为非整数,而分频系数又不能为小数,故必须将计算机得到的分频系数四舍五入取整。若基准频率过低,则分频系数过小,四舍五入取整后的误差较大。若基准频率过高,虽然可以减少频率的相对误差,但分频结构将变大。实际上应该综合考虑这两个方面的因素,在尽量减少误差的前提下,选取合适的基准频

率。本设计中选取1MHz的基准频率。数控分频器采用12位二进制计数器,乐曲中的休止符,只要将分频系数设为0,即初始值=4095,此时扬声器不会发声。

根据分频系数,可计算数控分频器得到的初始值。初始值的计算公式如下: 由于所设计的数控分频计采用12MHZ作为时钟源,并通过一次12分频给出频率为1MHZ的脉冲溢出信号,再对该1MHZ的溢出信号进行12位2进制码的带预置数进行计数,并给出一个频率随预置数变化的脉冲信号。由于该脉冲信号不具有驱动蜂鸣器的能力,故对此脉冲信号进行2分频以推动蜂鸣器发声,故最终输出信号的频率与预置数的关系如下:

其中fm为音阶对应的频率。

表1 简谱中的音名与频率的关系 音名 低音1 低音2 低音3 低音4 低音5 低音6 低音7

表2 各音阶频率对应的分频值 音名 分频系数 低音1 7644 低音2 6810 初始值 547 音名 分频系数 中音1 3822 初始值 音名 分频初始频率/Hz 261.63 293.67 329.63 349.23 391.99 440 493.88 音名 中音1 中音2 中音3 中音4 中音5 中音6 中音7 频率/Hz 532.25 587.33 659.25 698.46 783.99 880 987.76 音名 高音1 高音2 高音3 高音4 高音5 高音6 高音7 频率/Hz 1046.50 1174.66 1318.51 1396.92 1567.98 1760 1975.52 系数 值 4369 高音1 1911 6280 4786 高音2 1270 6921 1381 中音2 3405 低音3 6067 低音4 5727 低音5 5102 低音6 4545 低音7 4050

2124 中音3 3034 2464 中音4 2864 3089 中音5 2551 3646 中音6 2273 4141 中音7 2025 5157 高音3 1517 6674 5327 高音4 1432 6759 5640 高音5 1256 6935 5918 高音6 1137 7054 6166 高音7 1013 7178 (3) 乐曲节奏的控制

一般乐曲最小的节拍为1/4拍,若将1拍的时间定为1秒,则只需要输出4Hz的1/4拍的时长(0.25秒),对于其它占用时间较长的节拍(必为1/4拍的整数倍)则只需要将该音符连续输出相应的次数即可。

计数时钟信号作为输出音符快慢的控制信号,时钟快时输出节拍速度就快,演奏的速度也就快,时钟慢时输出节拍的速度就慢,演奏的速度自然降低,由于最后的蜂鸣器前需加一个二分频的程序,因此计数器的时钟信号应为4Hz的2倍,即8Hz。

(4) 乐谱的发生

本设计将乐谱中的音符数据存储在LPM-ROM中,若某音在逻辑中停留了4个时钟节拍,即1秒的时间,相应地,该音符就要在LPM-ROM中连续的四个地址上都存储。当一个4Hz的时钟来时,相应地就从LPM-ROM中输出一个音符数据。

(5) 选择模块

选择模块将用一个4位数的控制信号控制乐谱模块数据的选择性,用vhdl语言描述。

2设计原理及总体框图

(1)音符的发音频率设定及实现

音符的频率可由一个数控分频器SPEAKERA获得,由其CLK端输入一个有较高频率

的信号,通过SPEAKERA分频后由SPKOUT输出。由于直接从数控分频器中出来的输出信号是脉宽极窄的,为了有利于驱动扬声器,需另加一个D触发器以均衡其占空比,但这时的频率将是原来的1/2.SPEAKERA对clk输入信号的分频比由11位预置数Tone[10..0]决定。SPKOUT的输出频率就有了对应关系。例如,在TONETABA模块中若取Tone[10..0]=1036,将对应法音符为“3”音的信号频率。

(2)音符的持续时间

音符的持续时间需根据乐曲的速度及每个一怒的节拍数来确定,图中模块

TONETABA的功能首先是为SPEAKERA提供决定所发音符的分频预置数,而此数在SPEAKER输入口停留的时间即为次音符的节拍值。

模块TONETABA是乐曲简谱码对应的分频预置数查表电路,其中设置“两只老虎”乐曲

全部音符所对应的分频预置数,共11个,每一音符的停留时间由音乐节拍和音调发生器模块NOTETABS的clk输入频率决定,这11个值的输出由对应于TONETABA中Index[3..0]的值ToneIndex[3..0]的输出值与持续时间由模块NOTETABS决定。在NOTETABS中设置了一个8位二进制计数器(计数最大值为138),这个计数器的技术频率选为4Hz,即每一个计数值停留时间为0.25S,恰为当全音符设为1s时,四四拍的4分音符持续时间。例如,NOTETABS在以下的VHDL逻辑描述中,“两只老虎”乐曲的第一个音符为“5”,此音在逻辑中停留了1个时钟节拍,即0.25S时间,相应地,所对应的“”音符分频预置值为在SPEAKERA的输入端开始连续自然地演奏起来了。

设计的总体框图如下:

3 程序设计

VHDL程序如下:

(1) SONGER.VHD是设计电路的顶层设计 LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL; ENTITY Songer IS

PORT(CLK12MHZ:IN STD_LOGIC; CLK8HZ:IN STD_LOGIC;

CODE1:OUT INTEGER RANGE 0 TO 15;

HIGH1:OUT STD_LOGIC; SPKOUT:OUT STD_LOGIC); END;

ARCHITECTURE one OF Songer IS COMPONENT NoteTabs PORT(clk:IN STD_LOGIC;

ToneIndex:OUT INTEGER RANGE 0 TO 15); END COMPONENT; COMPONENT ToneTaba

PORT(Index:IN INTEGER RANGE 0 TO 15; CODE:OUT INTEGER RANGE 0 TO 15; HIGH:OUT STD_LOGIC;

Tone:OUT INTEGER RANGE 0 TO 16#7FF#); END COMPONENT; COMPONENT Speakera PORT(clk:IN STD_LOGIC;

Tone:IN INTEGER RANGE 0 TO 16#7FF#; SpkS:OUT STD_LOGIC); END COMPONENT;

SIGNAL Tone:INTEGER RANGE 0 TO 16#7FF#; SIGNAL ToneIndex:INTEGER RANGE 0 TO 15; BEGIN

u1:NoteTabs PORT MAP(clk=>clk8HZ,ToneIndex=>ToneIndex); u2:ToneTaba

MAP(Index=>ToneIndex,Tone=>Tone,CODE=>CODE1,HIGH=>HIGH1); u3:Speakera PORT MAP(clk=>CLK12MHZ,Tone=>Tone,SpkS=>SPKOUT); END;

(2) TONETABA.VHD是乐曲简谱码对应的分频预置数查表电路。 LIBRARY IEEE;

PORT

USE IEEE.STD_LOGIC_1164.ALL; ENTITY ToneTaba IS

PORT(Index:IN INTEGER RANGE 0 TO 15; CODE:OUT INTEGER RANGE 0 TO 15; HIGH:OUT STD_LOGIC;

Tone:OUT INTEGER RANGE 0 TO 16#7FF#); END;

ARCHITECTURE one OF ToneTaba IS BEGIN

Search:PROCESS(Index) BEGIN

CASE Index IS

WHEN 0 =>Tone<=2047;CODE<=0;HIGH<='0'; WHEN 1 =>Tone<=773;CODE<=1;HIGH<='0'; WHEN 2 =>Tone<=912;CODE<=2;HIGH<='0'; WHEN 3 =>Tone<=1036;CODE<=3;HIGH<='0'; WHEN 4 =>Tone<=1110;CODE<=4;HIGH<='0'; WHEN 5 =>Tone<=1197;CODE<=5;HIGH<='0'; WHEN 6 =>Tone<=1290;CODE<=6;HIGH<='0'; WHEN 7 =>Tone<=1372;CODE<=1;HIGH<='1'; WHEN 8 =>Tone<=1410;CODE<=2;HIGH<='1'; WHEN 9 =>Tone<=1480;CODE<=3;HIGH<='1'; WHEN 10 =>Tone<=1542;CODE<=4;HIGH<='1'; WHEN OTHERS=>NULL; END CASE; END PROCESS; END;

(3) SPEAKERA.VHD是设计电路的数控分频器: LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL; ENTITY Speakera IS PORT(clk:IN STD_LOGIC;

Tone:IN INTEGER RANGE 0 TO 16#7FF#; SpkS:OUT STD_LOGIC); END;

ARCHITECTURE one OF Speakera IS SIGNAL PreCLK:STD_LOGIC; SIGNAL FullSpkS:STD_LOGIC; BEGIN

DivideCLK:PROCESS(clk)

VARIABLE Count4:INTEGER RANGE 0 TO 15; BEGIN PreCLK<='0';

IF Count4 > 11 THEN PreCLK<='1';Count4:=0;

ELSIF clk'EVENT AND clk='1' THEN Count4:=Count4+1; END IF; END PROCESS;

GENSpkS:PROCESS(PreCLK,Tone)

VARIABLE Count11:INTEGER RANGE 0 TO 16#7FF#; BEGIN

IF PreCLK'EVENT AND PreCLK='1' THEN IF Count11=16#7FF# THEN Count11:=Tone; FullSpkS<='1';

ELSE Count11:=Count11+1; FullSpkS<='0'; END IF; END IF; END PROCESS;

DelaySpkS:PROCESS(FullSpkS) VARIABLE Count2:STD_LOGIC; BEGIN

IF FullSpkS'EVENT AND FullSPKS='1'THEN Count2:=NOT Count2; IF Count2 ='1'THEN SpkS<='1'; ELSE SpkS<='0'; END IF; END IF; END PROCESS; END;

(4) NOTETABS模块决定音乐的输出值与持续时间: LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL; ENTITY NoteTabs IS PORT(clk:IN STD_LOGIC;

ToneIndex:OUT INTEGER RANGE 0 TO 15); END;

ARCHITECTURE one OF NoteTabs IS

SIGNAL Counter:INTEGER RANGE 0 TO 35; BEGIN

CNT8:PROCESS(clk) BEGIN

IF Counter=35 THEN Counter<=0; ELSIF (clk'EVENT AND clk='1')THEN Counter<=Counter+1; END IF; END PROCESS;

Search:PROCESS(Counter)

BEGIN CASE Counter IS

WHEN 00 =>ToneIndex<=1; WHEN 01 =>ToneIndex<=2; WHEN 02 =>ToneIndex<=3; WHEN 03 =>ToneIndex<=1; WHEN 04 =>ToneIndex<=1; WHEN 05 =>ToneIndex<=2; WHEN 06 =>ToneIndex<=3; WHEN 07 =>ToneIndex<=1; WHEN 08 =>ToneIndex<=3; WHEN 09 =>ToneIndex<=4; WHEN 10 =>ToneIndex<=5; WHEN 11 =>ToneIndex<=5; WHEN 12 =>ToneIndex<=3; WHEN 13 =>ToneIndex<=4; WHEN 14 =>ToneIndex<=5; WHEN 15 =>ToneIndex<=5; WHEN 16 =>ToneIndex<=5; WHEN 17 =>ToneIndex<=6; WHEN 18 =>ToneIndex<=5; WHEN 19 =>ToneIndex<=4; WHEN 20 =>ToneIndex<=3; WHEN 21 =>ToneIndex<=1; WHEN 22 =>ToneIndex<=5; WHEN 23 =>ToneIndex<=6; WHEN 24 =>ToneIndex<=5; WHEN 25 =>ToneIndex<=4; WHEN 26 =>ToneIndex<=3; WHEN 27 =>ToneIndex<=1;

WHEN 28 =>ToneIndex<=1; WHEN 29 =>ToneIndex<=5; WHEN 30 =>ToneIndex<=1; WHEN 31 =>ToneIndex<=1; WHEN 32 =>ToneIndex<=1; WHEN 33 =>ToneIndex<=5; WHEN 34 =>ToneIndex<=1; WHEN 35 =>ToneIndex<=1; WHEN OTHERS=>NULL; END CASE; END PROCESS; END;

4 编译及仿真

在这次EDA课程设计过程中,用的是MAX+plus II,它是一种集成的开发环境,提供了一种与结构无关的设计环境,设计者无需精通器件的内部结构,而只需要用自己熟悉的设计输入方式去表达设计内容,MAX+plus II便会自动把这些设计转换成最终结构,所需的格式。并且MAX+plus II使用方便,具有强大的编程,设计,仿真功能。 顶层设计仿真波形图如下:

5 硬件调试与结果分析

本实验器件选用EP1K30TC144-1,利用GW48-CK实验开发系统,并使用其中结构图NO.1.引脚排列如下:

Clk8hz>chip=zuhe;input pin=54 Clk12mhz>chip=zuhe;input pin=126 Code10>chip=zuhe;output pin=33 Code10>chip=zuhe;output pin=32 Code10>chip=zuhe;output pin=31 Code10>chip=zuhe;output pin=30 High1>chip=zuhe;output pin=81 SPKOUT>chip=zuhe;output pin=99

引脚锁定后再通过编译器对文件重新编译以便将引脚信息编入下载文件中。然后再将文件下载到实验箱当中,观察实验结果,试验箱开始循环播放“两只老虎”乐曲。

心得体会

通过两周的课程设计,我对EDA的设计有了进一步的认识,对MAX PLUSII的设计步骤也有了更进一步的了解。 这种基于FPGA的音乐硬件演奏电路的设计与实现,不仅通过VHDL层次化和模块化设计方法,同时采用数控分频和定制LPM-ROM的设计思想,更好的优化了乐曲演奏数字电路的设计,在此基础上不必变化顶层文件架构可随意变更乐曲,有效缩短了产品开发周期、减少了设计芯片的数量、降低了功耗、提高了设计的灵活性、可靠性和可扩展性通过课程设计,感觉还是学到了不少的实践动手能力。本次课程设计使我对EDA设计的能力和兴趣有很大提高,受益良多,对自己以后的发展也会起到一定的作用。

因篇幅问题不能全部显示,请点此查看更多更全内容

Top