音阶发生器实验报告5112119025王一飞.docx
- 文档编号:26138046
- 上传时间:2023-06-17
- 格式:DOCX
- 页数:18
- 大小:102.74KB
音阶发生器实验报告5112119025王一飞.docx
《音阶发生器实验报告5112119025王一飞.docx》由会员分享,可在线阅读,更多相关《音阶发生器实验报告5112119025王一飞.docx(18页珍藏版)》请在冰豆网上搜索。
音阶发生器实验报告5112119025王一飞
音阶发生器实验报告
5112119025王一飞
一.设计方案和设计过程
基础部分:
音名与频率的关系:
音乐上的十二平均律规定,每两个八度音之间的频率相差一倍。
在这两个八度音之间,分成十二个半音,每两个相邻半音的频率比为2^(1/12)。
另外还规定,音名A的频率为440Hz。
音名B到C之间,E到F之间为半音,其余为全音。
这样,可计算得从A到al之间的每个音名的频率为:
A:
440Hza:
880Hzal:
1760Hz
B:
493.88Hzb:
987.76Hz
C∶523.25Hzc:
1046.50Hz
D:
587.33Hzd:
1174.66Hz
E∶659.25Hze:
1318.51Hz
F∶698.46Hzf:
1396.92Hz
G∶783.99Hzg:
1567.98Hz
由高频分得低频,采用以下思路:
时钟频率4MHz,其周期为1/4M=0.00000025S,
而音频a1为1760Hz,其周期远大于4MHz的周期,而4M/1760=2272。
因此,如果设计
一个2272进制的计数器,其时钟输入为4MHz,那其进位信号就是2272Hz。
用这样的方
法可以产生其它任意频率的信号。
a可由a1二分频得到。
由于频率较高,需加入一个t触
发器。
通过将4m的晶频分频,得到不同的频率,在输入到mainplayer模块中,这个模块通过快速扫描,将每个时间对应的信号传给扬声器进行发声。
扫描信号用2048Hz分频得到。
扩展部分:
扩展一:
演奏乐曲,乐曲自选。
这部分没什么特别,只需自己修改主模块,让其随时间发出自己编写的曲子。
扩展二:
用数码管实时显示乐曲简谱名称且按下一个按键后,暂停运行。
产生不同频率的方法和基础部分一样,用数码管显示比较难,将每个频率对应一个二进制数,传给line模块,产生15个信号,对应15个二进制数,再在select模块分类,每种音阶对应一个二进制数,传给segment模块,其通过选择7个数码管的亮暗显示简谱名称。
对于按键后的暂停。
先将两种开关通过一个或非门,再通过circle模块,作为clk的使能端。
当两个开关没打开时,clk正常走,否则停滞。
扩展三:
改用点阵来显示音阶名,而不采用简谱。
只需将select的输出传给disp模块进行选择,每种输出对应一个点阵,通过这样来显示。
二.顶层图
基础部分:
扩展部分:
三.Tdf源代码
基础部分:
subdesignmainplayer
(alow,ahigh,a1,blow,bhigh,clow,chigh,dlow,dhigh,
elow,ehigh,flow,fhigh,glow,ghigh:
input;
clk:
input;
spk:
output;
)
variable
count[4..0]:
dff;
begin
count[].clk=clk;
ifcount[]==h"0"thenspk=alow;endif;
ifcount[]==h"1"thenspk=blow;endif;
ifcount[]==h"2"thenspk=clow;endif;
ifcount[]==h"3"thenspk=dlow;endif;
ifcount[]==h"4"thenspk=elow;endif;
ifcount[]==h"5"thenspk=flow;endif;
ifcount[]==h"6"thenspk=glow;endif;
ifcount[]==h"7"thenspk=ahigh;endif;
ifcount[]==h"8"thenspk=bhigh;endif;
ifcount[]==h"9"thenspk=chigh;endif;
ifcount[]==h"a"thenspk=dhigh;endif;
ifcount[]==h"b"thenspk=ehigh;endif;
ifcount[]==h"c"thenspk=fhigh;endif;
ifcount[]==h"d"thenspk=ghigh;endif;
ifcount[]==h"e"thenspk=a1;count[].d=h"0";
elsecount[].d=count[].q+1;endif;end;
//循环输出1,2,3,4,5,6….
//以下几个是分频
subdesignfreqaa
(clk:
input;
freqaa:
output;
)
variable
count[20..0]:
dff;
begin
defaults
freqaa=gnd;
enddefaults;
count[].clk=clk;
ifcount[]==h"8E0"thenfreqaa=vcc;count[].d=h"0";
elsecount[].d=count[].q+1;
endif;
end;
subdesignfreqbb
(clk:
input;
freqbb:
output;
)
variable
count[21..0]:
dff;
begin
defaults
freqbb=gnd;
enddefaults;
count[].clk=clk;
ifcount[]==h"FD2"thenfreqbb=vcc;count[].d=h"0";
elsecount[].d=count[].q+1;
endif;
end;
subdesignfreqcc
(clk:
input;
freqcc:
output;
)
variable
count[21..0]:
dff;
begin
defaults
freqcc=gnd;
enddefaults;
count[].clk=clk;
ifcount[]==h"EEE"thenfreqcc=vcc;count[].d=h"0";
elsecount[].d=count[].q+1;
endif;
end;
subdesignfreqdd
(clk:
input;
freqdd:
output;
)
variable
count[21..0]:
dff;
begin
defaults
freqdd=gnd;
enddefaults;
count[].clk=clk;
ifcount[]==h"D4D"thenfreqdd=vcc;count[].d=h"0";
elsecount[].d=count[].q+1;
endif;
end;
subdesignfreqee
(clk:
input;
freqee:
output;
)
variable
count[21..0]:
dff;
begin
defaults
freqee=gnd;
enddefaults;
count[].clk=clk;
ifcount[]==h"BDA"thenfreqee=vcc;count[].d=h"0";
elsecount[].d=count[].q+1;
endif;
end;
subdesignfreqff
(clk:
input;
freqff:
output;
)
variable
count[21..0]:
dff;
begin
defaults
freqff=gnd;
enddefaults;
count[].clk=clk;
ifcount[]==h"B2F"thenfreqff=vcc;count[].d=h"0";
elsecount[].d=count[].q+1;
endif;
end;
subdesignfreqgg
(clk:
input;
freqgg:
output;
)
variable
count[21..0]:
dff;
begin
defaults
freqgg=gnd;
enddefaults;
count[].clk=clk;
ifcount[]==h"9F7"thenfreqgg=vcc;count[].d=h"0";
elsecount[].d=count[].q+1;
endif;
end;
//二分频
subdesignfreqdivider
(
clk:
input;
freq:
output;
)
variable
count[2..0]:
dff;
begin
defaults
freq=gnd;
enddefaults;
count[].clk=clk;
ifcount[]==h"2"thenfreq=vcc;count[].d=h"0";
elsecount[].d=count[].q+1;
endif;
end;
扩展部分:
subdesigncircle
(
siginalin:
input;
sound:
input;
siginalout:
output;
)
begin
defaults
siginalout=gnd;
enddefaults;
ifsoundthensiginalout=siginalin;
endif;
end;
//控制clk的输入
subdesignstop
(
choice1,choice2:
input;
select:
output;
)
begin
defaults
select=0;
enddefaults;
select=choice1#choice2;
end;
//一个或非门
subdesigngy
(
alow,ahigh,all,blow,bhigh,clow,chigh,dlow,dhigh,
elow,ehigh,flow,fhigh,glow,ghigh:
input;
clk:
input;
spk:
output;
out[3..0]:
output;
)
variable
q[5..0]:
dff;
begin
q[].clk=clk;
ifq[]==h"0"thenspk=elow;out[3..0]=h"a";endif;
ifq[]==h"1"thenspk=elow;out[3..0]=h"a";endif;
ifq[]==h"2"thenspk=flow;out[3..0]=h"c";endif;
ifq[]==h"3"thenspk=glow;out[3..0]=h"e";endif;
ifq[]==h"4"thenspk=glow;out[3..0]=h"e";endif;
ifq[]==h"5"thenspk=flow;out[3..0]=h"c";endif;
ifq[]==h"6"thenspk=elow;out[3..0]=h"a";endif;
ifq[]==h"7"thenspk=dlow;out[3..0]=h"8";endif;
ifq[]==h"8"thenspk=clow;out[3..0]=h"6";endif;
ifq[]==h"9"thenspk=clow;out[3..0]=h"6";endif;
ifq[]==h"a"thenspk=dlow;out[3..0]=h"8";endif;
ifq[]==h"b"thenspk=elow;out[3..0]=h"a";endif;
ifq[]==h"c"thenspk=elow;out[3..0]=h"a";endif;
ifq[]==h"d"thenspk=dlow;out[3..0]=h"8";endif;
ifq[]==h"e"thenspk=dlow;out[3..0]=h"8";endif;
ifq[]==h"f"thenspk=dlow;out[3..0]=h"8";endif;
ifq[]==h"11"thenspk=elow;out[3..0]=h"a";endif;
ifq[]==h"12"thenspk=elow;out[3..0]=h"a";endif;
ifq[]==h"13"thenspk=flow;out[3..0]=h"c";endif;
ifq[]==h"14"thenspk=glow;out[3..0]=h"e";endif;
ifq[]==h"15"thenspk=glow;out[3..0]=h"e";endif;
ifq[]==h"16"thenspk=flow;out[3..0]=h"c";endif;
ifq[]==h"17"thenspk=elow;out[3..0]=h"a";endif;
ifq[]==h"18"thenspk=dlow;out[3..0]=h"8";endif;
ifq[]==h"19"thenspk=clow;out[3..0]=h"6";endif;
ifq[]==h"1a"thenspk=clow;out[3..0]=h"6";endif;
ifq[]==h"1b"thenspk=dlow;out[3..0]=h"8";endif;
ifq[]==h"1c"thenspk=elow;out[3..0]=h"a";endif;
ifq[]==h"1d"thenspk=dlow;out[3..0]=h"8";endif;
ifq[]==h"1e"thenspk=clow;out[3..0]=h"6";endif;
ifq[]==h"1f"thenspk=clow;out[3..0]=h"6";endif;
ifq[]==h"20"thenspk=clow;out[3..0]=h"6";endif;
ifq[]==h"22"thenq[].d=h"0";
elseq[].d=q[].q+1;endif;end;
//输出欢乐颂的歌曲
subdesignselect
(
alow,ahigh,all,blow,bhigh,clow,chigh,dlow,dhigh,
elow,ehigh,flow,fhigh,glow,ghigh:
input;
out[3..0]:
output;
)
begin
ifcloworchighthenout[3..0]=h"1";endif;
ifdlowordhighthenout[3..0]=h"2";endif;
ifeloworehighthenout[3..0]=h"3";endif;
iffloworfhighthenout[3..0]=h"4";endif;
ifgloworghighthenout[3..0]=h"5";endif;
ifaloworahighorallthenout[3..0]=h"6";endif;
ifbloworbhighthenout[3..0]=h"7";endif;
end;
//将不同的音频进行分类
subdesign7segment
(
i[3..0]:
input;
a,b,c,d,e,f,g:
output;
)
begin
table
i[3..0]=>a,b,c,d,e,f,g;
h"0"=>0,0,0,0,0,0,1;
h"1"=>1,0,0,1,1,1,1;
h"2"=>0,0,1,0,0,1,0;
h"3"=>0,0,0,0,1,1,0;
h"4"=>1,0,0,1,1,0,0;
h"5"=>0,1,0,0,1,0,0;
h"6"=>0,1,0,0,0,0,0;
h"7"=>0,0,0,1,1,1,1;
h"8"=>0,0,0,0,0,0,0;
h"9"=>0,0,0,0,1,0,0;
endtable;
end;
//数码管的控制
subdesigndisp
(
i[3..0]:
input;
clk[2..0]:
input;
row[8..1]:
output;
colred[16..1]:
output;
)
begin
ifi[3..0]==h"1"then
table
clk[2..0]=>row[8..1],colred[16..1];
h"0"=>h"1",b"1111111111111111";
h"1"=>h"2",b"1111111111011111";
h"2"=>h"4",b"1111111111011111";
h"3"=>h"8",b"1100001111000011";
h"4"=>h"10",b"1101101111011011";
h"5"=>h"20",b"1101101111011011";
h"6"=>h"40",b"1100001111000011";
h"7"=>h"80",b"1111111111111111";
endtable;
endif;
ifi[3..0]==h"2"then
table
clk[2..0]=>row[8..1],colred[16..1];
h"0"=>h"1",b"1111111111111111";
h"1"=>h"2",b"1111111111111111";
h"2"=>h"4",b"1100001111000011";
h"3"=>h"8",b"1111101111011011";
h"4"=>h"10",b"1100001111000011";
h"5"=>h"20",b"1111101111101011";
h"6"=>h"40",b"1100001111101011";
h"7"=>h"80",b"1111111111111111";
endtable;
endif;
ifi[3..0]==h"3"then
table
clk[2..0]=>row[8..1],colred[16..1];
h"0"=>h"1",b"1111111111111111";
h"1"=>h"2",b"1110111111111111";
h"2"=>h"4",b"1111111110000011";
h"3"=>h"8",b"1110111110101011";
h"4"=>h"10",b"1110111110101011";
h"5"=>h"20",b"1110111110101011";
h"6"=>h"40",b"1110111110101011";
h"7"=>h"80",b"1111111111111111";
endtable;
endif;
ifi[3..0]==h"4"then
table
clk[2..0]=>row[8..1],colred[16..1];
h"0"=>h"1",b"1111111111111111";
h"1"=>h"2",b"1111111111111111";
h"2"=>h"4",b"1100001111000011";
h"3"=>h"8",b"1101101111111011";
h"4"=>h"10",b"1100001111000011";
h"5"=>h"20",b"1101101111111011";
h"6"=>h"40",b"1101101111111011";
h"7"=>h"80",b"1111111111111111";
endtable;
endif;
ifi[3..0]==h"5"then
table
clk[2..0]=>row[8..1],colred[16..1];
h"0"=>h"1",b"1111111111111111";
h"1"=>h"2",b"1111111111111111";
h"2"=>h"4",b"1111111111000011";
h"3"=>h"8",b"1100001111111011";
h"4"=>h"10",b"1101101111000011";
h"5"=>h"20",b"1101101111011111";
h"6"=>h"40",b"1100001111000011";
h"7"=>h"80",b"1111111111111111";
endtable;
endif;
ifi[3..0]==h"6"then
table
clk[2..0]=>row[8..1],colred[16..1];
h"0"=>h"1",b"1111111111111111";
h"1"=>h"2",b"1111111111111111";
h"2"=>h"4",b"1100001111111011";
h"3"=>h"8",b"1101101111111011";
h"4"=>h"10",b"1100001111111011";
h"5"=>h"20",b"1101101111111011";
h"6"=>h"40",b"1101101111000011";
h"7"=>h"80",b"1111111111111111";
endtable;
endif;
ifi[3..0]==h"7"then
table
clk[2..0]=>row[8..1],colred[16..1];
h"0"=>h"1",b"1111111111111111";
h"1"=>h"2",b"1110111110111101";
h"2"=>h"4",b"1111111111011011";
h"3"=>h"8",b"1110111111100111";
h"4"=>h"10",b"1110111111100111";
h"5"=>h"20",b"1110111111011011";
h"6"=>h"40",b"1110111110111101";
h"7"=>h"80",b"1111111111111111";
endtable;
endif;
end;
//通过不同的输入,控制点阵的显示。
subdesignline
(
in[3..0]:
input;
m1,m2,m3,m4,m5,m6,m7,m8,m9,m10,m11,m12,m13,m14,m15:
output;
)
begin
table
in[3..0]=>m1,m2,m3,m4,m5,m6,m7,m8,m9,m10,m11,m12,m13
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 音阶 发生器 实验 报告 5112119025 王一飞