文档介绍:VHDL 实验报告
一、实验目的
1、 掌握蜂鸣器的使用;
2、 通过复杂实验,进一步加深对
VHDL语言的掌握程度。
二、实验原理
乐曲都是由一连串的音符组成,因此就可以控制音长了。
三、实验步骤
1、设置端口
1)输入端口
CLK: 40MHZ系统时钟输入端口。
2)输出端口
device :乐曲的声音输出端口,输出的是对应各音符频率的方波信号。
2、设置模块
1)自动演奏模块
自动演奏模块可以自动播放电子琴内置乐曲, 按节拍读取内置乐谱。 将键盘输入的音符
信号输出。因此,本模块是向 Tone 模块提供音符信息。
首先,对 40MHz系统时钟进行 10M的分频, 得到 4Hz 的信号, 这样一秒中就可以按照四拍进行。然后依照此频率进行地址累计。
2)音频发生器模块
根据自动演奏模块的信号输出,不同的信号被翻译为不同的频率。
3)蜂鸣器驱动模块
根据音频发生器发出音频的不同,蜂鸣器得到的驱动也不同。首先,对系统时钟进行
40 分频,再对 1mhz的脉冲再次分频,得到所需要的音符频率,然后再进行 2 分频。
四、实验代码
library ieee;
use tone is
port(
index: in std_logic_vector(15 downto 0);
tone0: out integer range 0 to 2047
--
--
音符输入信号
音符的分频系数
);
end tone;
architecture behavioral of tone is
begin
search :process(index) -- 此进程完成音符到音符的分频系数译码,音符的显示,高
低音阶
begin
case index is
when "0000000000000001" => tone0<=1433;
when "0000000000000010" => tone0<=1277;
when "0000000000000100" => tone0<=1138;
when "0000000000001000" => tone0<=1074;
when "0000000000010000" => tone0<=960;
when "0000000000100000" => tone0<=853;
when "0000000001000000" => tone0<=759;
when "00000000" => tone0<=716;
when "00000000" => tone0<=358;
when "00000000" => tone0<=319;
when "00000" => tone0<=284;
when "0000" => tone0<=268;
when "000" => tone0<=239;