1、11南 昌 大 学 实 验 报 告学生姓名: 学 号: 专业班级: 实验类型: 验证 综合 设计 创新 实验日期: 2010 实验六 乐曲播放器设计一、实验目的1) 使用层次化设计方法,实现乐曲播放器的设计。乐曲选取梁祝中化蝶部分。2) 学会建立 .mif 格式文件以及如何定制 LPM_ROM 元件;3) 学会读音乐简谱。 4) 熟悉实验设备和软件,掌握实验操作。 二、实验内容和要求使用数控分频器设计硬件乐曲演奏电路,乐曲选取梁祝中化蝶部分。三、设计思想主系统由 3 个模块组成,顶层文件名为 SONG.vhd,其内部有三个功能模块:NOTETABS.vhd(类似于人的手指) 、TONETABA
2、.vhd(类似于琴键)SPEAKERA.vhd(类似于琴弦或音调发生器) 。图 1、RTL Viewer 得到的演奏电路结构图工作原理:(1)音符的频率可以由上图中的 SPEAKERA 获得,这是一个数控分频器。由期 CLK 端输入一具有较高频率(6MHZ)的信号,通过 SPEAKERA 分频后由 SPKOUT 输出,由于直接从数控分频器中出来的输出信号是脉宽极窄的脉冲式信号,为了有利于驱动扬声器,需另加一个 D 触发器以均衡其占空比,但这时的频率将是原来的 1/2.SPEAKER 对 CLK 输入信号的分频比由 11 位预置数 TONE 决定。SPKOUT 的输出频率将决定每一音符的音调,这
3、样,分频计数器的预置值TONE 与 SPKOUT 的输出频率就有了对应关系。例如在 TONETABA 模块中若取 TONE=1036,将发出音符为“3”音的信号频率。实际上,只要各个音符间的相对频率关系不变,演奏出的乐曲听起来都不会“走调“ 。在 TONETABA 模块我用了如下代码以保持各个音符间的相对频率关系不变:CASE INDEX IS22WHEN “0000“ = TONE TONE TONE TONE TONE TONE TONE TONE TONE TONE TONE TONE TONENULL;-INDEX 为 0001 时,CODE=1,HIGH-0 表示低音 1,TONE=
4、773分频比为 COUNT11-TONE=2047-773=1274- INDEX 为 1000 时,CODE=1,HIGH-1 表示中音 1,TONE=1410分频比为 COUNT11-TONE=2047-1410=637- INDEX 为 1111 时,CODE=1,HIGH-1 表示高音 1,TONE=1728分频比为 COUNT11-TONE=2047-1728=3191247=2*637=2*2*319 表示每两个八度音之间的频率相差一倍(2)音符的持续时间需根据乐曲的速度 及每个音符的节拍数来确定 ,模块 TONETABA RA 的功能首先是 SPEAKERA 提供决定所发音符的分
5、频预置数,而此数在 SPEAKERA 输入口停留的时间即为此音符的节拍值。模块 TONETABA 是乐曲简谱码对应的分频预置数的查表电路,其中设置了“梁祝”乐曲全部音符所对应的分频预置数,共 13 个,每一音符的停留时间由音乐节拍和音调发生器模块 NOTETABS 的 CLK 的输入频率决定,在此为 4HZ。这 13 个值的输出由对应于 TONETABA 的四位输入值 INDEX 确定,而 INDEX 最多有 16 种可选值。输向 TONETABA中 INDEX 的值 TONEINDEX 的输出值与待续时间由模块 NOTETABS 决定。(3)在 NOTETABS 中设置了一个九位二进制计数器
6、(计数最大值为 138) ,作为音符数据 ROM 的地址发生器。这个计数器的计数频率选为 4HZ,即每一个计数值的停留时间为0.25 秒,恰为当全音符设为 1 秒时,四四拍的 4 分音符持续时间。例如,NOTETABS 在33以下的 VHDL 逻辑描述中, “梁祝”乐曲的第一个音符为“3” ,此音在逻辑 中停留了 4个时钟节拍,即 1 秒时间,相应地,所对应的“3”音符分频预置数为 1036,在SPEAKERA 的输入端停留了 1 秒。随着 NOTETABS 中的计数器按 4HZ 的时钟速率作加法计数时,即随地址值递增时,音符数据 ROM 中的音符数据从 ROM 中通过TONEINDEX 端口
7、输向 TONETABA 模块, “梁祝”乐曲就开始连续自然地演奏起来了。四、试验程序LIBRARY IEEE;- 模块 NOTETABSUSE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY NOTETABS ISPORT(CLK:IN STD_LOGIC;TONEINDEX:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);END;ARCHITECTURE AIRU OF NOTETABS ISCOMPONENT MUSICLIANG 调用“梁祝”音符数据,在于 LPM_ROM 中PORT(addr
8、ess:IN STD_LOGIC_VECTOR(8 DOWNTO 0);-address 为地址,地址单元内存放着音符clock:IN STD_LOGIC;q:OUT STD_LOGIC_VECTOR(3 DOWNTO 0); -Q 为音符指针END COMPONENT;SIGNAL COUNTER:STD_LOGIC_VECTOR(8 DOWNTO 0); -在 NOTETABS 中设置了一个九位二进制计数器(计数最大值为 138) ,作为音符数据 ROM 的地址发生器。BEGINCNT8: PROCESS(CLK,COUNTER)BEGINIF COUNTER=138 THEN COUNT
9、ERCOUNTER,q=TONEINDEX,clock=CLK);END;LIBRARY IEEE; -模块 TONETABA: 模块 TONETABA 是乐曲简谱码对应的分频预置数的查表电路,其中设置了 “梁祝 ”乐曲全部音符所对应的分频预置数,共 13 个,USE IEEE.STD_LOGIC_1164.ALL;ENTITY TONETABA ISPORT(INDEX:IN STD_LOGIC_VECTOR(3 DOWNTO 0); -INDEX 为音符指针CODE:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);-接数码管用于显示音符HIGH:OUT STD_LOGIC
10、; -HIGH 高中低音显示,HIGH 为 0 时44为低音,HIGH 为 1 时为中高音TONE:OUT STD_LOGIC_VECTOR(10 DOWNTO 0); -控制音调的预置数即为后面数控分频器的预置数END;ARCHITECTURE AIRU OF TONETABA ISBEGINSEARCH:PROCESS(INDEX)BEGINCASE INDEX IS -译码电路,通过查表方式,控制音调的预置数WHEN “0000“ = TONE TONE TONE TONE TONE TONE TONE TONE TONE TONE TONE TONE TONENULL;END CASE
11、;END PROCESS;END;-INDEX 为 0001 时,CODE=1,HIGH-0 表示低音 1,TONE=773分频比为 COUNT11-TONE=2047-773=1274- INDEX 为 1000 时,CODE=1,HIGH-1 表示中音 1,TONE=1410分频比为 COUNT11-TONE=2047-1410=637- INDEX 为 1111 时,CODE=1,HIGH-1 表示高音 1,TONE=1728分频比为 COUNT11-TONE=2047-1728=3191247=2*637=2*2*319 表示每两个八度音之间的频率相差一倍LIBRARY IEEE;-模
12、块 SPEAKERAUSE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY SPEAKERA ISPORT( CLK:IN STD_LOGIC;TONE:IN STD_LOGIC_VECTOR(10 DOWNTO 0); -11 位可预置数SPKS:OUT STD_LOGIC); -接喇叭,作为输出END;55ARCHITECTURE AIRU OF SPEAKERA ISSIGNAL PRECLK,FULLSPKS:STD_LOGIC;BEGINDIVIDECLK:PROCESS(CLK)VARIABLE COUN
13、T4:STD_LOGIC_VECTOR(3 DOWNTO 0);BEGINPRECLK11 THEN PRECLKCLK4HZ,TONEINDEX=TONEINDEX1);-元件例化U2:TONETABA PORT MAP(INDEX=TONEINDEX1,TONE=TONE1,CODE=CODE1,HIGH=HIGH1);U3:SPEAKERA PORT MAP(CLK=CLK6MHZ,TONE=TONE1,SPKS=SPKOUT);END;五、实验步骤1. 打开Quartus II,选择菜单 file-New Project Wizard 建立工程文件,文件名与顶层文件实体名SONG 一致
14、 2. File-New,新建VHDL 文本文件:输入附录中的程序; 3 建立.mif 文件存储音符数据 根据“梁祝”的乐谱,输入相应的音符数据。如下图77输完数据后保存为MUSIC.mif; 5. 定制notetabs 模块中的音符数据 ROM 。 新建 文件,双击空白处,在出现的对话框出输入lpm_rom ,点击 ,输出文件类型选 ,输出文件名设为MUSIC ,单击next, 选4 位,选512,next, 去掉前面的勾,next,点击 找到建好的MUSIC.mif 文件,点击next 直到finish。 6. 两个LPM_ROM 元件都定制完后,单击 进行编译; 7、建立波形文件,导入结
15、点,并设置好仿真结束时间,保存文件,进行仿真设置,然后进行波形仿真,如下图:88六波形仿真分析后面一一分析类似,不再赘述,可见仿真成功。低音 3 四个 一个高音 1,两个中音 1,共三个,而且此时 HIGH 变成了高电平99七、硬件测试1.Assignments-.device-引脚锁定,参照下载实验板 1K100 的引脚号说明书,选择适当的引脚2.引脚锁定后,保存,必须重新进行一次全程编译,编译通过后才能编程下载。3.编程下载,用下载线将计算机并口和试验箱上的 JTAG 口接起来,接通电源。选择 ToolsProgrammer 菜单,打开 programmer 窗口。在 mode 中选中 J
16、TAG,将 Program/Configure 下的笑方框选中4 在开始编程之前,必须正确设置编程硬件。点击“Hardware Setup”按钮,打开硬件设置口。点击“Add Hardware”打开硬件添加窗口,在“Hardware type”下拉框中选择“ByteBlasterMV or ByteBlaster II”,“Port”下拉框中选择 “LPT1”,点击 OK 按钮确认,关闭 Hardware Setup 窗口,完成硬件设置。5、点击“Start”按钮,开始编程下载八、硬件测试结果下载好后,就可以在实验板上观察实验现象了。把 CODE 接在一个数码管上可以看见实验开始后,数码管上显
17、示的音符,同“梁祝”乐谱中的音符把 HIGH 接了 LED1 显示高中低音可以发现如到了乐谱中的高音 1,LED1 会亮,同时 CODE 显示 1当 LED1 亮时喇叭发出的音调比不亮时要高些,中音或高音要比低音来得响一些。实验比较成功九、实验心得体会通过本次实验,学会了建立.mif 格式文件以及如何定制 LPM_ROM 元件,学会了如何读音乐简谱,听到实验箱演奏音乐,很激动,但是频率选择有点快,歌曲有点跑调。再就是由于乐谱知识有限,只弄了一首“梁祝” ,要是能让演奏多首歌曲就更好了,哎,21 世纪还是要综合素质的人才啊!以后要更加深入学习下乐谱。十、参考文献1010EDA 技术实用教程 潘松 黄继业EDA 实验指导书 丁杰 朱启标