音乐数码管计时点阵流水灯设计.docx
《音乐数码管计时点阵流水灯设计.docx》由会员分享,可在线阅读,更多相关《音乐数码管计时点阵流水灯设计.docx(30页珍藏版)》请在冰豆网上搜索。
音乐数码管计时点阵流水灯设计
可编程器件及数字系统设计
音乐数码管计时点阵流水灯设计
目录
一设计目的与任务3
1设计目的3
2设计任务3
二设计方案4
三设计实现5
1音乐模块5
2数码管模块8
3点阵模块11
4流水灯模块11
四实验结果及分析12
五实习总结13
六附录(程序或电路图)14
一设计目的与任务
1设计目的
爱情,是一个永远都很流行的元素,从古至今,亘古未变。
而梁山伯与祝英台的爱情故事更是被视为爱情的典范,《梁祝》细腻地呈现这一段唯美彻骨、惊天动地的爱情。
他们的情,感天动地,二人化成彩蝶翩翩飞舞。
本作品古今结合,融合梁祝优美凄凉的音乐和变化的点阵,更有类似播放音乐的数码管时钟和变化多样的十二个流水灯,更增加了现代的气息。
本作品可以用来制作工艺品来表达爱人双方对对方的爱。
在点阵上可以画出各种图案,并写上想说的话,独特而实用。
2设计任务
由于硬件原因,本应该用蜂鸣器发声的改用扬声器来发声。
把扬声器,点阵,流水灯,数码管四部分组合在一起,完成以声音为核心的整体组合。
其中,对音乐的编写需要计算来调频,并且对音乐有一定的基础。
对点阵,有图案的变化,通过频率和画出的图案的变化,可以产生动画的效果,但是由于模块的限制只能大体显示这个意思。
流水灯是通过一个计数器改变十二个灯亮的形式。
数码管则是一个数字钟的前身,只有秒数和分钟数,因为现实中歌曲很少有超过一小时的。
二设计方案
图1—1
先通过分频程序对声音进行分频,查找乐谱,使发出想要的音乐。
然后通过数码管计时,产生音乐播放器的效果,并在后续连接点阵显示想要的文字和图案。
并且通过计数器来控制流水灯。
三设计实现
1音乐模块
音乐模块,就是用扬声器循环播放“梁祝”这首歌,是此次设计的核心所在。
程序如下:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_ARITH.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
entityyinyueis
port(
clk:
instd_logic;
speaker:
outstd_logic);
endyinyue;
architecturebhvofyinyueis
signalup:
std_logic_vector(0to18);
signalyin:
integerrange0to17:
=1;
signalj:
integerrange0to139:
=1;
signalshijian,jiange:
integerrange0to20480;
begin
process(clk)
begin
if(clk'eventandclk='1')then
ifup="1111111111111111111"then
up<="0000000000000000000";
j<=j+1;
elseup<=up+1;
ifj=70thenj<=1;endif;------
casejis
when0=>yin<=3;
when1=>yin<=3;
when2=>yin<=3;
when3=>yin<=3;--
when4=>yin<=5;
when5=>yin<=5;
when6=>yin<=5;
when7=>yin<=6;--
when8=>yin<=8;
when9=>yin<=8;
when10=>yin<=8;
when11=>yin<=9;--
when12=>yin<=6;
when13=>yin<=8;
when14=>yin<=5;
when15=>yin<=5;--
when16=>yin<=12;
when17=>yin<=12;
when18=>yin<=12;
when19=>yin<=15;--
when20=>yin<=13;
when21=>yin<=12;
when22=>yin<=10;
when23=>yin<=12;--
when24=>yin<=9;
when25=>yin<=9;
when26=>yin<=9;
when27=>yin<=9;--
when28=>yin<=9;
when29=>yin<=9;
when30=>yin<=0;
when31=>yin<=0;--
when32=>yin<=9;
when33=>yin<=9;
when34=>yin<=9;
when35=>yin<=10;--
when36=>yin<=7;
when37=>yin<=7;
when38=>yin<=6;
when39=>yin<=6;--
when40=>yin<=5;
when41=>yin<=5;
when42=>yin<=5;
when43=>yin<=6;--
when44=>yin<=8;
when45=>yin<=8;
when46=>yin<=9;
when47=>yin<=9;--
when48=>yin<=3;
when49=>yin<=3;
when50=>yin<=8;
when51=>yin<=8;--
when52=>yin<=6;
when53=>yin<=5;
when54=>yin<=6;
when55=>yin<=8;--
when56=>yin<=5;
when57=>yin<=5;
when58=>yin<=5;
when59=>yin<=5;--
when60=>yin<=5;
when61=>yin<=5;
when62=>yin<=0;
when63=>yin<=0;----
when64=>yin<=10;
when65=>yin<=10;
when66=>yin<=10;
when67=>yin<=12;--
when68=>yin<=7;
whenothers=>yin<=0;
endcase;
caseyinis
when1=>jiange<=7816;--c
when2=>jiange<=6965;--d
when3=>jiange<=6206;--e
when4=>jiange<=5868;--f
when5=>jiange<=5224;--g
when6=>jiange<=4654;--a
when7=>jiange<=4145;--b
when8=>jiange<=3915;
when9=>jiange<=3543;
when10=>jiange<=3107;
when11=>jiange<=2934;
when12=>jiange<=2612;
when13=>jiange<=2327;
when14=>jiange<=2072;
when15=>jiange<=1957;
whenothers=>speaker<='0';
endcase;
ifshijian<=jiangethenshijian<=shijian+1;
ifshijian<=jiange/2thenspeaker<='1';elsespeaker<='0';endif;
elseshijian<=0;
endif;
endif;
endif;
endprocess;
endbhv;
2数码管模块
简单计时装置,修改自数字钟,产生播放器的感觉,程序如下:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_ARITH.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYjishiIS
port(sel:
bufferstd_logic_vector(7downto0);
seg:
outstd_logic_vector(6downto0));
endjishi;
architecturebhvofjishiis
signalff:
std_logic_vector(20downto0);
signalclk0:
std_logic;
signalaa,bb:
std_logic_vector(5downto0);
signalk:
std_logic_vector(2downto0);
signaltemp1,temp2:
std_logic_vector(5downto0);
signalresult1,result2,co1,co2:
std_logic_vector(3downto0);
signaldd:
std_logic_vector(2downto0);
signalsum:
std_logic_vector(3downto0);
begin
clk0<=ff(20);
p1:
process(clk)
begin
if(clk'eventandclk='1')then
ff<=ff+1;
endif;
endprocess;
process(clk0)
begin
if(clk0'eventandclk0='1')then
ifaa="111011"then
aa<="000000";
bb<=bb+1;
else
bb<=bb;
aa<=aa+1;
endif;
ifbb="111011"then
bb<="000000";
endif;
endif;
ifaa<10then
temp1<=aa;
result1<=temp1(3downto0);
co1<="0000";
endif;
if(aa>9andaa<20)then
temp1<=aa+6;
result1<=temp1(3downto0);
co1<="0001";
endif;
if(aa>19andaa<30)then
temp1<=aa+12;
result1<=temp1(3downto0);
co1<="0010";
endif;
if(aa>29andaa<40)then
temp1<=aa+18;
result1<=temp1(3downto0);
co1<="0011";
endif;
if(aa>39andaa<50)then
temp1<=aa+24;
result1<=temp1(3downto0);
co1<="0100";
endif;
if(aa>49andaa<60)then
temp1<=aa+30;
result1<=temp1(3downto0);
co1<="0101";
endif;
ifbb<10then
temp2<=bb;
result2<=temp2(3downto0);
co2<="0000";
endif;
if(bb>9andbb<20)then
temp2<=bb+6;
result2<=temp2(3downto0);
co2<="0001";
endif;
if(bb>19andbb<30)then
temp2<=bb+12;
result2<=temp2(3downto0);
co2<="0010";
endif;
if(bb>29andbb<40)then
temp2<=bb+18;
result2<=temp2(3downto0);
co2<="0011";
endif;
if(bb>39andbb<50)then
temp2<=bb+24;
result2<=temp2(3downto0);
co2<="0100";
endif;
if(bb>49andbb<60)then
temp2<=bb+30;
result2<=temp2(3downto0);
co2<="0101";
endif;
endprocess;
process(clk)
begin
if(clk'eventandclk='1')then
dd<=dd+1;
endif;
endprocess;
withddselect
sel<="10000000"when"000",
"01000000"when"001",
"00100000"when"010",
"00010000"when"011",
"00001000"when"100",
"00000100"when"101",
"00000010"when"110",
"00000001"when"111";
withddselect
sum<=co2when"000",
result2when"001",
"1010"when"010",
co1when"011",
result1when"100",
"0000"whenothers;
withsumselect
seg<="1000000"when"0000",
"1111001"when"0001",
"0100100"when"0010",
"0110000"when"0011",
"0011001"when"0100",
"0010010"when"0101",
"0000010"when"0110",
"1011000"when"0111",
"0000000"when"1000",
"0010000"when"1001",
"0111111"when"1010",
"1111111"whenothers;
endbhv;
3点阵模块
点阵模块,主要就是点阵循环跳动显示心形(有大有小,动画的思想),还有蝴蝶形,还有“爱成蝶”三个字。
(由于程序较长,且后面有附录,所以不在此显示。
)
4流水灯模块
流水灯模块,主要显示的就是12盏灯循环有规则亮灭,配合音乐,并不断变化,形成视觉上的效果。
(由于程序较长,且后面有附录,所以不在此显示。
)
四实验结果及分析
实验成品的效果是音乐在播放,同时数码管开始计时,点阵开始显示文字和图案,流水灯也开始按照各种形式来循环闪烁。
除了音乐是上网查的一些音谱和学习了一下大体模式,其它的都是本次实习过程中做成功的程序的修改。
在实验的过程中一共碰到了以下几个问题
1、音乐模块中播放音乐开始使用蜂鸣器,但是总是发出类似蝉鸣的叫声,无论怎么改都不好用;后来使用扬声器,开始时有杂音,十分不清晰,后来经过分析,造成这个问题的原因可能有两个:
第一,分频不对,造成音调有高有低,播放的不成曲调。
第二,扬声器有失真效应,造成播放的有杂音。
发现原因后,又重新对分频进行了处理,然后换了一个新的扬声器,而后程序编译通过,终于可以正常播放音乐了。
2、在加入各种模块的过程中,出现了逻辑单元不够用的现象,怎么改都不好用,后来经过多方修改,发现使用的if语句使用太多的缘故,更改了一些语句,终于逻辑单元的数目降下来了,编译通过了。
3、点阵模块设计时,出现了只跳动前几个字的现象,而且每两个一停顿。
最后还有一个全亮的,经过修改程序,发现其中的一个计数器的位数不够,还有分频分的不对,是一个比0.5秒多一点的频率,修改成1秒,上述情况就解决了。
五实习总结
先总结一下自主设计,本次设计是我第一次用一门自己陌生的语言做的设计,做的不是很完善,只能说是一些基本模块的整合。
关于音乐系统,因为时间和知识缺乏的关系,设计得很是简陋,远远达不到当今社会的需求,应该多加几首音乐,并且用加入音乐选择的功能,这样,现实性更强了,同时点阵的设计本来想加一个跳动与滚动的转化的,但是时间仓促,总是有错误,所以最后只能放弃,以后好好研究一下。
再总结一下整个小学期的实习,在短短的四个星期的日子里,学到很多很多的的东西,不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。
以焊电路板开始,以自主设计结束,每一次都感觉自己做的很难,一旦成功后,就会继续更难更复杂的东西。
课程设计也由浅入深,在之前的基础之上灵活使用,不仅需要缜密的逻辑思维以及清醒的头脑,更需要很强的动手能力,使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,从而提高自己的实际动手能力和独立思考的能力。
我会把这段经历当做一笔宝贵的财富,激励我不断前进。
六附录(程序或电路图)
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_ARITH.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYYINYYUEIS
port(clk:
instd_logic;
speaker:
outstd_logic;
i1:
outstd_logic_vector(15downto0);
i2:
outstd_logic_vector(15downto0);
sel:
bufferstd_logic_vector(7downto0);
seg:
outstd_logic_vector(6downto0);
dout:
outstd_logic_vector(11downto0));
endyinyyue;
architecturebhvofyinyyueis
signalup:
std_logic_vector(0to18);
signalyin:
integerrange0to17:
=1;
signalj:
integerrange0to139:
=1;
signalshijian,jiange:
integerrange0to20480;
signala,e:
std_logic;
signalb:
std_logic_vector(20downto0);
signalc:
std_logic_vector(3downto0);
signald:
std_logic_vector(2downto0);
signali2a,i2b,i2c,i2d,i2e,i2f,i2g:
std_logic_vector(15downto0);
signalcl:
std_logic_vector(20downto0);
signalmm:
integerrange0to15;
signalclm:
std_logic;
signalnnn:
integerrange0to31;
signaly1:
std_logic_vector(31downto0);
signalx,y:
std_logic_vector(15downto0);
signalff:
std_logic_vector(20downto0);
signalclk0:
std_logic;
signalaa,bb:
std_logic_vector(5downto0);
signalk:
std_logic_vector(2downto0);
signaltemp1,temp2:
std_logic_vector(5downto0);
signalresult1,result2,co1,co2:
std_logic_vector(3downto0);
signaldd:
std_logic_vector(2downto0);
signalsum:
std_logic_vector(3downto0);
signalcnt:
std_logic_vector(7downto0);
--variablecount:
integerRANGE0TO7;
signalcount:
std_logic_vector(5DOWNTO0);
signalf:
std_logic_vector(22downto0);
signalclk1:
std_logic;
begin
process(clk)
begin
if(clk'eventandclk='1')then
if(b<2048000)then
b<=b+1;else
b<="000000000000000000000";
endif;
endif;
endprocess;
e<='1'whenb<="000000000000000000000"else
'0';
process(clk)
begin
ifclk'eventandclk='1'then
c<=c+1;
endif;
endprocess;
process(e)
begin
ife'eventande='1'then
ifd<7then
d<=d+1;
else
d<="000";
endif;
endif;
endprocess;
withcselect
i1<="1000000000000000"when"0000",
"0100000000000000"when"0001",
"0010000000000000"when"0010",
"0001000000000000"when"0011",
"0000100000000000"when"0100",
"0000010000000000"when"0101",
"0000001000000000"when"0110",
"0000000100000000"when"0111",
"0000000010000000"when"1000",
"0000000001000000"when"1001",
"0000000000100000"when"1010",
"0000000000010000"when"1011",
"0000000000001000"when"1100",
"0000000000000100"when"1101",
"0000000000000010"when"1110",
"0000000000000001"when"1111";
process(e)
begin
casecis