- 1、本文档共12页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
音乐演奏实验VHDL语言写
基于梁山伯与祝英台的乐曲演奏实验
学校:广东工业大学 学院:自动化(研)专业:电路系统
姓名:陈君(09级)
实验目的:学习利用数控分频器设计硬件乐曲演奏电路、熟悉DE2开发板
与quartus2软件及其开发流程
实验原理:主系统包括7个模块,其中1个顶层模块用原理图12.bdf表示其余为六个功能模块。
组成乐曲的每个音符的发音频率值及其持续的时间是乐曲能够连续演奏的两个基本要素,模块notetabes类似于人的手指;tonetaba类似于琴键;
Speakera类似于琴弦或者音调发生器。
顶层电路图12.bdf
下面我们进一步分析其工作原理:
音符的频率可以由speakera获得,这是一个数控分频器。由其CLK端输入一个具有较高频率(这里是12M,实验中我们speakera模块的输入频率是12M而我们DE2实验板的频率是50M因此我们还需要使用一个锁相环产生12M的时钟)的信号,通过speakera分频后由SPKOUT输出,由于直接从数控分频器中出来的输出信号是脉宽极窄的脉冲式信号,为啦有利于驱动扬声器,我们用50M分频成12M的时候和产生音调频率的时候我们均将其占空比设为1/2。Speakera对输入信号的分频比由11位的预置数TONE[10..0]决定。Spkout的输出频率将决定每一音符的音调,这样,分频计数器的预置数与spkout的频率就有啦对应的关系。
音符的持续时间需根据乐曲的速度及每个音符的节拍数来确定,因此这里我们使用啦一个LPM宏模块
实验步骤;首先我们新建一个music的文件夹,再在quartus2里面新建一个名字为12的工程,建好后如图
然后我们开始点击FILE新建一个VHDL文件保存命名为clk_div1572864.vhd作用是把12M的频率分成8HZ并且保持其占空比为1/2
程序如下;
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
entity clk_div1572864 is
port(clk:in std_logic;
clk_out:out std_logic);
end;
architecture one of clk_div1572864 is
signal clk_temp:std_logic;
begin
process(clk)
variable counter :integer range 0 to 800000;
constant md:integer:=786432;
begin
if clkevent and clk=1 then
if (counter=md) then
counter:=0;
clk_temp = not clk_temp;
else
counter:= counter+1;
end if;
end if;
end process;
clk_out=clk_temp;
end;
语法分析后没有错误,然后我们再在FILE作如下图的点击将其打包
打包后的图形如下图(这个以后我们作顶层电路图的时候我们需要调用)同理我们再新建以下几个VHDL文件并将其打包
新建notetaba.vhd文件程序如下
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(10 downto 0));
end;
architecture one of tonetaba is
begin
search:process(index)
begin
case index is
when 0000=tone=11111111111;code=0000;high=0;
when 0001=tone=01100000101;code=0001;high=0;
when 0010=tone=01110010000;code=0010;high=0;
when 0011=tone=10000001100;code=0011;high=0;
when 0101=tone=10010101101;code=0101;high=0;
when 0110=tone=10100001010;code=0110;high=0;
when 0111=tone=101010111
文档评论(0)