文档从互联网中收集,已重新修正排版,word格式支持编辑,如有帮助欢迎下载支持。设计性实验报告
班级:
姓名(学号):
实验项目名称:乐曲演奏实验
实验项目性质:设计性
实验所属课程:EDA基础
实验室(中心):
指导教师:
实验完成时间:2009 年12 月13 日
教师评阅意见:
签名:年月日实验成绩:
一、实验目的
1、熟悉QuartusII 软件的使用。
2、熟悉EDA实验开发系统的基本使用。
3、学习VHDL基本单元电路的设计应用。进一步掌握EDA的多层次设计方法。
4、学习音乐发生器的设计。
二、实验内容及要求
1、实验内容
利用可编程逻辑器件FPGA,设计乐曲硬件电路,可自动演奏乐曲。
2、实验要求
要求能够演奏出《友谊天长地久》的曲调或可另选一段较完整的曲调(扩展要
求:能够从数码管上显示出当前曲调的简谱和频率),我们组演奏出的是实验
要求上的《友谊天长地久》曲调。
三、实验原理
1、乐曲硬件电路产生音乐是和音乐频率和音乐的持续时间有关;音符的持续时间需
根据乐曲的速度和每个音符的节拍数来确定。其简谱中音符和频率的关系如下:
2、该演奏电路演奏的乐曲是《友谊天长地久》片段,其最小的节拍为1拍,将1拍
的时长定位0.25S,则只需要再提供一个4hz的时钟频率即可产生1拍的时长,演奏的时间控制通过ROM查表的方式来完成。对于占用时间较长的节拍,(一定是节拍的整数倍),如全音符为4拍,2/4音符为2拍,1/4音符为1拍。
3、乐曲硬件演奏电路系统主要有数控分频器和乐曲存储模块两个部分组成,其余还有
音乐节拍发生器等等。数控分频器对FPGA 的基准频率进行分频,得到与各个音节对应的频率输出。乐曲存储模块产生节拍控制和音阶选择信号,即在此模块中存放一个乐曲曲谱真值表(实验中用的ROM存储),由一个计数器来控制此真值表的输出,而由计数器的技术时钟信号作为乐曲节拍控制信号。
4、要求演奏时能循环进行,必须需另外设置一个时长计数器,当乐曲演奏完成时,保
证能自动从头开始演奏。该计数器控制真值表按顺序输出简谱。
四、实验仪器、材料
计算机一台、GW48 EDA/SOPC实验箱一台
QuartusII软件、实验箱连接线一根
五、方案设计
这个实验中采用层次化的设计思路,因此我们把此乐曲硬件演奏电路分为3个主要模块,即音乐发生器NoteTabs模块,音符译码电路Tonetaba模块,数控分频Speakera 模块。分好层次之后,编写每个模块的程序,分别生成项目符号,最后把生成的个项目符号用原理图的方式连接起来,然后编译、下载即可。由图例表示如下:
此实验设计中,我主要负责音乐发生器NoteTabs模块(ROM的定制过程)和最后的连接原理图部分。
六、实验过程及原始记录
1、音乐节拍发生器NoteTabs模块
这个模块用FPGA的片内ROM存放乐曲的简谱真值表,由一个二进制计数器为乐曲数据存储ROM的地址发生器随着NoteTabs中计数器按时钟频率做加法计数时,乐曲数据存储器ROM中的音符数据,将从ROM中的输出口输向音符译码电路Tonetaba
,所存储的乐曲就开始连续自然地演奏起来。
ROM的定制过程,利用MegawizardPlug-In Manager定制音符数据存储器music1 其过程如下:
在QuartusII主窗口Tools菜单中选择MegawizardPlug-In Manager命令,选择Create a new custom megafunction项。单击next按钮后,选择好后cyclone和VHDL语言后,产生对话框如下:
如上所示就完成了,LPM_ROM的定制流程,完成了music1模块的定制工作,其产生的music1的VHDL语言程序如下:
LIBRARY ieee;
USE ieee.std_logic_1164.all;
LIBRARY altera_mf;
USE altera_mf.altera_mf_components.all;
ENTITY music1 IS
PORT
(
address : IN STD_LOGIC_VECTOR (7 DOWNTO 0);
clock : IN STD_LOGIC ;
q : OUT STD_LOGIC_VECTOR (3 DOWNTO 0)
);
END music1;
ARCHITECTURE SYN OF music1 IS
SIGNAL sub_wire0 : STD_LOGIC_VECTOR (3 DOWNTO 0);
COMPONENT altsyncram
GENERIC (
intended_device_family : STRING;
width_a : NATURAL;
widthad_a : NATURAL;
numwords_a : NATURAL;
operation_mode : STRING;
outdata_reg_a : STRING;
address_aclr_a : STRING;
outdata_aclr_a : STRING;
width_byteena_a : NATURAL;
init_file : STRING;
lpm_hint : STRING;
lpm_type : STRING
);
PORT (
clock0 : IN STD_LOGIC ;
address_a : IN STD_LOGIC_VECTOR (7 DOWNTO 0);
q_a : OUT STD_LOGIC_VECTOR (3 DOWNTO 0) );
END COMPONENT;
BEGIN
q<= sub_wire0(3 DOWNTO 0);
altsyncram_component : altsyncram
GENERIC MAP (
intended_device_family => "Cyclone",
width_a => 4,
widthad_a => 8,
numwords_a => 256,
operation_mode => "ROM",
outdata_reg_a => "CLOCK0",
address_aclr_a => "NONE",
outdata_aclr_a => "NONE",
width_byteena_a => 1,
init_file => "data.mif",
lpm_hint => "ENABLE_RUNTIME_MOD=NO",
lpm_type => "altsyncram"
)
PORT MAP (
clock0 => clock,
address_a => address,
q_a => sub_wire0
);
END SYN;
在定制ROM的过程中,由于需要存入122个音符数据,选择ROM的数据位宽为8,地址为为8(共计256个字),ROM的类型选择为Auto。
根据友谊天长地久的音乐简谱,以及简谱中的低、中、高和额节拍与发生频率的关系等等,化成个音符数字有122个,存入ROM中。
在数据文件编辑窗中,在mif格式表格中填入友谊天长地久的122个音符数据,并以十进制填入,最后保存数据文件名为data.mif,存入原路径中。
2、音乐节拍发生器NoteTabs的VHDL设计
其源程序如下:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY NoteTabs IS
PORT(clk4hz:IN STD_LOGIC;
Index2:IN STD_LOGIC_VECTOR(3 DOWNTO 0);
Tone:OUT STD_LOGIC_VECTOR(3 DOWNTO 0));
END NoteTabs;
ARCHITECTURE one OF NoteTabs IS
COMPONENT MUSIC1
PORT (address:IN STD_LOGIC_VECTOR(7 DOWNTO 0);
clock:IN STD_LOGIC;
q:OUT STD_LOGIC_VECTOR(3 DOWNTO 0));
END COMPONENT;
SIGNAL Counter:STD_LOGIC_VECTOR(7 DOWNTO 0);
SIGNAL INDEX1:STD_LOGIC_VECTOR(3 DOWNTO 0);
Begin
CNT8:PROCESS(clk4hz,Counter)
BEGIN
IF Counter=122 THEN Counter<="00000000";
ELSIF(clk4hz'EVENT AND clk4hz='1') THEN Counter<=Counter+1;
END IF;
END PROCESS CNT8;
u1:music1 PORT MAP(address=>Counter,clock=>clk4hz,q=>Index1);
Tone<=Index1;
END one;
◆在源程序中Tone是音乐节拍发生器输出地音符数据;clk4hz是计数时钟输入端,该
信号作为音符的快慢信号,频率越高,时钟的输出节拍速度就越快,演奏的速度也越快。
◆将以上设计的音乐节拍发生器设置成可调用的原件,以被高层使用,其生成项目符
号为:
3、音符译码电路Tonetaba模块,其程序如下:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY ToneTaba IS
PORT(Index:IN STD_LOGIC_VECTOR(3 DOWNTO 0);
CODE:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
HIGH:OUT STD_LOGIC;
Tone:OUT STD_LOGIC_VECTOR(12 DOWNTO 0));
END;
ARCHITECTURE one OF ToneTaba IS
BEGIN
PROCESS(Index)
BEGIN
CASE Index IS
WHEN"0000"=>Tone<="11";CODE<="0000";HIGH<='0';
WHEN"0101"=>Tone<="01";CODE<="0101";HIGH<='0';
WHEN"0110"=>Tone<="01";CODE<="0110";HIGH<='0';
WHEN"1000"=>Tone<="10001";CODE<="0001";HIGH<='1';
WHEN"1001"=>Tone<="10010";CODE<="0010";HIGH<='1';
WHEN"1010"=>Tone<="10";CODE<="0011";HIGH<='1';
WHEN"1100"=>Tone<="10";CODE<="0101";HIGH<='1';
WHEN"1101"=>Tone<="10";CODE<="0110";HIGH<='1';
WHEN"1111"=>Tone<="01000";CODE<="0001";HIGH<='1';
WHEN OTHERS=>Tone<="11";CODE<="0000";HIGH<='0';
END CASE;
END PROCESS;
END;
◆在源程序中,Index[3..0]是音乐节拍发生器输出地音符数据;Tone[12..0]是为数控分
频模块提供音符频率的初始值,此处有一个音符译码输出CODE[3..0]和音高指示信号HIGH可以通过数码管和LED来显示乐曲演奏时对应得音符和高低音。
◆将以上设计的音符译码电路设置成可调用的原件,以被高层使用,其生成项目符号
为:
4、数控分频模块(speakera)设计,其程序如下:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY Speakera IS
PORT( clk :IN STD_LOGIC;
Tone:IN STD_LOGIC_VECTOR(12 DOWNTO 0);
SpkS:OUT STD_LOGIC );
END;
ARCHITECTURE one OF Speakera IS
SIGNAL PreCLK,FullSpkS:STD_LOGIC;
BEGIN
DivedeCLK:PROCESS(clk)
V ARIABLE Count4:STD_LOGIC_VECTOR(3 DOWNTO 0);
BEGIN
PreCLK<='0';
IF Count4>11 THEN PreCLK<='1'; Count4:="0000";
ELSIF clk'EVENT AND clk='1' THEN Count4:=Count4+1;
END IF;
END PROCESS DivedeCLK;
GenSpkS:PROCESS(PreCLK,Tone)
V ARIABLE Count13:STD_LOGIC_VECTOR(12 DOWNTO 0);
BEGIN
IF PreCLK'EVENT AND PreCLK='1' THEN
IF Count13=16#1FFF#THEN Count13:=Tone;FullSpkS<='1';
ELSE Count13:=Count13+1;FullSpkS<='0';END IF;
END IF;
END PROCESS GenSpkS;
DelaySpkS:PROCESS(FullSpkS)
V ARIABLE 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;
◆数控分频器对FPGA的基准频率进行分频,得到与各个音阶对应的频率输出,里面
包含一个计数器,当计数器满时,产生一个进位信号FULLSPKS,该信号就是用作发音的频率信号,在计数器端的预置值端给定不同的初值时,产生不同频率的信号。
◆VHDL程序的第一个进程,为时基脉冲按照Tone输入的分频系数对4Mhz的脉冲分
频,得到所需要的音符频率;第二个进程的作用,在音调输出时在进行2分频,目的是将脉冲拓宽,使扬声器有足够的发生频率,我们可以很好的听到其发出的声音。
◆将以上设计的数控分频器设置成可调用的原件,以被高层使用,其生成项目符号为:
5、根据层次化设计要求把各个部分根据实验设计流程,即各个阶段产生的项目元件符
号连接成原理图如下:
6、经编译无错后,绑定引脚,选择实验模式5,下载测试,但我们组的实验出现错误,没有演奏出音乐,但可以手动输入信号,可产生音符。为了可自动循环演奏出音乐,我们仔细分析,认为可能是没有加入address端口信号,于是,我们在原来的基础上,加了一个addressROM地址端口和一个计数器。
七、实验结果及分析
1、在原来的基础上,加入的addressROM地址端口和计数器,计数器利用计数的功能循环给ROM不同的值,因而使后面的电路不断取ROM中的音符数据,从而演奏乐曲。 其计数器的VHDL源程序如下:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY CNT10 IS
PORT(CLK,RST,EN:IN STD_LOGIC;
CQ:OUT STD_LOGIC_VECTOR(7 DOWNTO 0));
END CNT10;
ARCHITECTURE behav OF CNT10 IS
BEGIN
PROCESS(CLK,RST,EN)
V ARIABLE CQI:STD_LOGIC_VECTOR(7 DOWNTO 0);
BEGIN
IF RST='1' THEN CQI:=(OTHERS=>'0');
ELSIF CLK'EVENT AND CLK='1' THEN
IF EN='1' THEN
IF CQI<122 THEN CQI:=CQI+1;
ELSIF CQI=122 THEN CQI:=(OTHERS=>'0');
END IF;
END IF;
END IF;
CQ<=CQI;
END PROCESS;
END behav;
◆将以上设计的计数器设置成可调用的原件,以被高层使用,其生成项目符号为:
◆在定制ROM的过程中,产生的Music1VHDL程序在上面已经给出,将其设置成可
调用的原件,以被高层使用,其生成项目符号为:
3、在原来基础上加上地址ROM端信号和计数器,重新连接原理图如下:
4、编译无错后,按如下所示绑定引脚:
5、绑定引脚之后原理图如下:
6、下载测试,选择实验模式5,下载完毕,听到完整的一段《友谊天长地久》音乐,并且音调很好,在绑定引脚的频率大范围内不变时,可以调整音量大小和速度快慢。八、实验体会