




已阅读5页,还剩23页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
数字电路与逻辑设计综合设计实验报告实验名称:简易音乐播放器姓名: 班级: 班班内序号:27一、 设计任务要求设计制作一个简易乐曲播放器。1)播放器内预存3首乐曲;2)播放模式:顺序播放、随机播放,并用数码管或LED显示当前播放模式;3)顺序播放:按内部给定的顺序依次播放3首乐曲;4)随机播放:随机产生一个顺序播放3首乐曲;5)用数码管显示当前播放乐曲的顺序号;6)设置开始/暂停键,乐曲播放过程中按该键则暂停播放,再按则继续播放;7)设置Next和Previous键,按Next键可以听下 一首,按Previous键回到本首开始;8)选做:用户可以自行设定播放顺序,设置完成后,播放器按该顺序依次播放乐曲;9)选做:自拟其它功能。二、系统设计1)设计思路首先音乐有音高和节拍两个因素。音高可以通过对时钟信号不同的分频得到不同频率的信号进而发出不同的音,节拍可以定义一个音符计数器,计数器的每一个值对应一个音高。对播放的控制包括播放/暂停、复位、上一首、下一首、本首重放、顺序播放/随机播放,用一个状态机,共播放和暂停两个状态,另外歌曲的切换以及暂停都是利用音符计数器赋不同的值或保持不变来实现。音高的显示是通过不同的音符对应不同的点阵row和col的值来实现的。歌曲号是通过音符计数器的值来得出并送到数码管显示的。播放、暂停、顺序、随机这些的显示是通过对状态和模式变量的判别进而送到LED显示的。2)总体框图div1div2div3keycontrolmelodyindexshownumberspeaker50M1M4hz2hzrand随机数上、下、本首、复位、暂停键、顺序随机选择暂停态的标志音符序号音符序号歌曲号音高对应的分频数输出声音信号顺序随机暂停的LED显示音高的点阵显示 3)分块设计 共分为9个模块。Div1,div2,div3都是用来分频的,分别是将50mhz变为1mhz,将1mhz变为4hz,将1mhz变为2hz。Rand模块用来产生随机数,用于随机播放模式。Keycontrol是核心模块,用来实现顺序播放、随机播放、播放/暂停、上一首、下一首、本首重放、复位、显示顺序或随机播放状态、显示播放/暂停态。Melody模块是将音符计数器的每一个值与一个音高相对应,即记录曲谱。Index模块是用melody模块传来的音高信号通过查表得到它所对应的音高的分频数,然后将这个分频数送给speaker模块,以发出不同的音,另外对应不同的音它还对点阵进行不同的输出,进而显示出音高。Speaker模块接收index模块送来的分频数,利用分频数对时钟信号进行分频,进而发出不同的音,另外它还接收keycontrol模块送来的暂停态的标志,以保证在暂停态的时候不发出声音。Shownumber模块通过对音符计数器值的判断确定现在播放的是哪首歌,进而输出不同的歌曲号。3、 仿真波形及波形分析1)div1模块由仿真结果可看出,它将50mhz的时钟信号变换为1mhz。Div2和div3模块分别是将1mhz变为4hz,将1mhz变为2hz,原理相同,因而不再列出仿真结果。2) Rand模块由仿真结果可以看出在每一个时钟周期内,randnumber改变一次,randnumber可作为随机数的产生信号。3)Keycontrol模块:(时钟用的是未经分频的) 顺序播放:可以看出,在mode=0,即顺序播放模式下,在没有按任何键时,音符计数器counter随时钟自动加1从而进入下一个音。Sequential表示顺序播放,random表示随机播放,由图可见此时sequential为高电平,random为低电平,可知此时为顺序播放状态。 counter由144自动变到145是第一首播完自动到第二首 下一首:当按一下一首键时,即nextone变为高电平,音符计数器counter由第一首歌的14变到了第二首歌开始音符所对应的数145,实现了切换到下一首的功能。 本首重放:当播放到第二首歌的152时,按下了本首重放键,即previous变为高电平,这时counter变为第二首歌起始音对应的数145,进而实现了本首重放的功能。 上一首:当播放到第二首对应counter为151时,按下了上一首键,即lastone变为高电平,counter变为第一首歌起始音符所对应的值1,从而实现了切换到上一首的功能。 暂停:当按下暂停键后,即pp变为高电平,暂停状态的标志ppsymbol就变为高电平,用于送给LED显示播放/暂停态的ppout变为周期信号,实际中周期为1s,即LED会在1s内一亮一灭进行闪烁,表示进入了暂停状态。 暂停后再按“播放/暂停”键:在暂停态再按一次播放/暂停键后,即pp再次变为高电平,ppout变为低电平,对应的LED会熄灭表示进入了播放状态,ppsymbol也变为低电平。 暂停后按下一首:按了暂停键之后,即pp变为高电平之后,又按了下一首键,即nextone变为高电平,这时进入播放状态,同时counter变成了下一首歌的第一个音符对应的值,实现了通过按下一首退出暂停状态,同时进行歌曲的切换。 暂停后按上一首:暂停后按上一首,即pp变为高电平后lastone也变为高电平,则进入播放状态,并且开始播上一首。(信号counter中158对应的是第二首的音符,1对应的是第一首的音符) 暂停后按本首重放:暂停后按本首重放,即pp变为高电平后previous也变为高电平,这时进入播放状态,另外counter变为本首歌第一个音对应的数,实现了本首重放。 复位:复位所要实现的是不管是在顺序播放还是随机播放状态下,只要一按下复位键,就从第一首歌开始播放。如图,counter等于272时reset变为高电平,counter变为1。 随机播放:在随机播放状态,即mode=1时,在第一首歌的最后一个音(counter为144时)时程序会检测随机数randnumber的值,查到是3,于是下一次counter就变为第三首歌第一个音对应的数213,从而实现了随机播放。此时random为高电平,sequential为低电平,表示此时为随机播放状态。 随机播放状态下按上一首:按了上一首(lastone变为高电平)后,据随机数randnumber的值3,于是转入播放第三首。 按下一首:和按上一首是一样的,也是根据当前randnumber值来确定下一首要播的是哪一首。Randnumber等于1、2、3、4分别对应第一、二、三、四首歌。 按本首重放:随机播放模式下按本首重放,即previous变为高电平,实现的功能与在顺序播放模式是一样的。由图可见,播放到第一首的10时,counter变为1,即回到第一首的第一个音开始播。3) Melody模块:根据不同的音符计数器counter的值,指示音高的值toneindex也在变化,其中1到7代表中音1到7,8代表高音1,9到13代表低音3到7。4) Index模块:由仿真结果可看出,当音高toneindex为不同的值时,分频数tonefreq的值也不同,将它送给speaker模块对时钟进行分频,即可得到不同的音高。另外不同的toneindex值对应的点阵的row和col的值也不一样,进而可以利用点阵显示音高。5)Speaker模块: 根据分频数tonefreq的不同,对时钟产生的分频也不同,如图可见为tonefreq在0和2时输出声音信号sound的两种频率,进而会发出不同的音。 如下图,分频数tonefreq的值并没有变,但表暂停的标志ppsymbol变为了高电平,暂停状态不允许发声,因而输出的声音信号sound变为低电平,当ppsymbol回到低电平时,sound才又变回tonefreq所对应频率的信号。6)Shownumber模块: 第一首:在音符计数器counter的值是第一首歌时,控制数码管显示歌曲号的段选码number一直是01100000,于是在数码管上显示1。而位选码则一直保持01111111不变,只让固定的一个数码管来显示。 第二首Counter现在对应的是第二首歌的音符,number的值为11011010,数码管显示2。四、主要部分源程序1)外围模块playerlibrary ieee;use ieee.std_logic_1164.all; entity player isPort -整个系统对外的输入输出端口 ( clk50mhz,reset,lastone,previous,nextone,pp,mode:in std_logic; sequential,random,ppout,sound:out std_logic; col,row,number:out std_logic_vector(7 downto 0); enable:out std_logic_vector(5 downto 0) ); end player; architecture one of player is -子模块定义component div1port(clk50mhz:in std_logic;clk1mhz:out std_logic);end component;component div2port(clk1mhz:in std_logic;clk4hz:out std_logic);end component;component div3port(clk1mhz:in std_logic;clk2hz:out std_logic);end component;component randport(clk4hz:in std_logic;randnumber:out integer range 1 to 4);end component;component keycontrolport(lastone,previous,nextone,pp,mode,reset,clk2hz,clk4hz:in std_logic;randnumber:in integer range 1 to 4;sequential,random,ppout,ppsymbol:out std_logic;counter:out integer range 1 to 400);end component;component melodyport(counter:in integer range 1 to 400;toneindex:out integer range 0 to 13);end component;component indexport(toneindex:in integer range 0 to 13;tonefreq:out integer range 0 to 1516 ;row:out std_logic_vector(7 downto 0);col:out std_logic_vector(7 downto 0);end component;component speakerport(clk1mhz,ppsymbol:in std_logic;tonefreq:in integer range 0 to 1516 ;sound:out std_logic);end component;component shownumberport(counter:in integer range 1 to 400;enable:out std_logic_vector(5 downto 0);number:out std_logic_vector(7 downto 0);end component;signal clk1mhz,clk4hz,clk2hz,ppsymbol:std_logic;signal randnumber:integer range 1 to 4;signal counter:integer range 1 to 400;signal toneindex:integer range 0 to 13;signal tonefreq:integer range 0 to 1516 ;Begin -各模块间端口的连接u1:div1 port map(clk50mhz=clk50mhz,clk1mhz=clk1mhz);u2:div2 port map(clk1mhz=clk1mhz,clk4hz=clk4hz);u3:div3 port map(clk1mhz=clk1mhz,clk2hz=clk2hz);u4:rand port map(clk4hz=clk4hz,randnumber=randnumber);u5:keycontrol port map(lastone=lastone,previous=previous,nextone=nextone,pp=pp,mode=mode,reset=reset,clk2hz=clk2hz,clk4hz=clk4hz,randnumber=randnumber,sequential=sequential,random=random,ppout=ppout,ppsymbol=ppsymbol,counter=counter);u6:melody port map(counter=counter,toneindex=toneindex);u7:index port map(toneindex=toneindex,tonefreq=tonefreq,row=row,col=col);u8:speaker port map(clk1mhz=clk1mhz,tonefreq=tonefreq,sound=sound,ppsymbol=ppsymbol);u9:shownumber port map(counter=counter,enable=enable,number=number);end one;2) 分频模块div1(div2、div3与div1类似,不再重复)这个模块将50mhz时钟分频成1mhzlibrary ieee;use ieee.std_logic_1164.all;entity div1 isport(clk50mhz:in std_logic;clk1mhz:out std_logic);end div1;architecture one of div1 issignal t:std_logic:=0;begin clk1mhz=t;p1:process(clk50mhz)variable c:integer range 0 to 24; begin if(clk50mhzevent and clk50mhz=1) then if(c=24)then c:=0; t=not t; else c:=c+1; end if; end if;end process p1;end one;3) 产生随机数的rand模块:library ieee;use ieee.std_logic_1164.all;entity rand isport(clk4hz:in std_logic;randnumber:out integer range 1 to 4);end rand;architecture one of rand issignal temp:std_logic_vector(3 downto 0);begin process(clk4hz,temp) begin if(temp=0000)then temp=0001; elsif(clk4hzevent and clk4hz=1)then -利用M序列发生器产生伪随机序列 temp(0)=temp(0)xor temp(3); temp(1)=temp(0); temp(2)=temp(1); temp(3)=temp(2); end if; if(temp=0001or temp=0111or temp=1011or temp=0010)then randnumber=1; elsif(temp=0011or temp=1100or temp=1001or temp=1000)then randnumber=2; elsif(temp=1111or temp=1101or temp=0101or temp=0110)then randnumber=3; elsif(temp=1110or temp=1010or temp=0100)then randnumber=4; end if; end process;end one;4) 核心模块keycontrol:library ieee;use ieee.std_logic_1164.all;entity keycontrol isport(lastone,previous,nextone,pp,mode,reset,clk2hz,clk4hz:in std_logic;randnumber:in integer range 1 to 4;sequential,random,ppout,ppsymbol:out std_logic;counter:out integer range 1 to 400:=1);end keycontrol;architecture one of keycontrol istype statetype is(play,pause,nothing);signal state:statetype:=play; -状态定义,有播放和暂停两种状态signal count:integer range 1 to 400:=1; signal t:std_logic;begincounter=count;ppout=t;p1:process(clk4hz) begin if(clk4hzevent and clk4hz=1)then if(reset=1)then -复位 state=play; count state state=pause; countnull; end case; else if(previous=0and lastone=0and nextone=0)then case state is when pause=count if(mode=0)then -为顺序播放模式时 if(count=400)then count=1; else count=count+1; end if; Else -为随机播放模式时 if(count=144 or count=212 or count=344 or count=400)then if(randnumber=1)then -据随机数不同确定下一首歌曲 count=1; elsif(randnumber=2)then count=145; elsif(randnumber=3)then count=213; else count=345; end if; else countnull; end case; Else -当有键按下时 case state is when pause= -当为暂停态时 if(lastone=0and previous=1and nextone=0)then -按下了本首重放键 state=1 and count=144)then count=145 and count=212)then count=213 and count=344)then count=213; else count=345; end if; else if(mode=0)then -顺序播放模式 if(lastone=1and previous=0and nextone=0)then -上一首 state=1 and count=144)then count=145 and count=212)then count=213 and count=344)then count=145; else count=213; end if; elsif(lastone=0and previous=0and nextone=1)then -下一首 state=1 and count=144)then count=145 and count=212)then count=213 and count=344)then count=345; else count=1; end if; end if; Else -随机播放模式 if(lastone=1or nextone=1)then -按下了上一首或下一首 state=play; if(randnumber=1)then count=1; elsif(randnumber=2)then count=145; elsif(randnumber=3)then count=213; else count -播放状态 if(lastone=0and previous=1and nextone=0)then -本首重放 if(count=1 and count=144)then count=145 and count=212)then count=213 and count=344)then count=213; else count=1 and count=144)then count=145 and count=212)then count=213 and count=344)then count=145; else count=1 and count=144)then count=145 and count=212)then count=213 and count=344)then count=345; else count=1; end if; end if; Else -随机播放模式 if(lastone=1or nextone=1)then -按上一首或下一首 if(randnumber=1)then count=1; elsif(randnumber=2)then count=145; elsif(randnumber=3)then count=213; else countnull; end case; end if; end if; end if;end process p1;p2:process(mode) -根据模式不同(即mode值不同),显示顺序与随机两种播放模式,用sequential和random来表示begin if(mode=0)then sequential=1; random=0; else sequential=0; randomt tnull; end case; end if;end process p3;p4:process(state) -根据播放还是暂停状态来给暂停态的标志ppsymbol赋值begin case state is when play=ppsymbolppsymbolnull; end case;end process p4;end one;5) 记录曲谱的模块melody:library ieee;use ieee.std_logic_1164.all;entity melody isport(counter:in integer range 1 to 400;toneindex:out integer range 0 to 13);end melody;architecture one of melody isbeginp1:process(counter)begin case counter is when 1=toneindextoneindextoneindextoneindextonefreq=0; col=00000000;rowtonefreq=955; col=10000000;rowtonefreq=850; col=01000000;rowtonefreq=757; col=00100000;rowtonefreq=715; col=00010000;rowtonefreq=637; col=00001000;rowtonefreq=567; col=00000100;rowtonefreq=505; col=00000010;rowtonefreq=477; col=00000001;rowtonefreq=1516; col=00100000;rowtonefreq=1431; col=00010000;rowtonefreq=1275; col=00001000;rowtonefreq=1135; col=00000100;rowtonefreq=1011; col=00000010;rowtonefreq=0;col=00000000;row=11111111; end case;end process p1;end one;7) 发声模块speaker:library ieee;use ieee.std_logic_1164.all;entity speaker isport(clk1mhz,ppsymbol:in std_logic;tonefreq:in integer range 0 to 1516;sound:out std_logic);end speaker;architecture one of speaker issignal sound1:std_logic;beginsound=sound1;p1:process(clk1mhz,tonefreq) variable t:integer range 0 to 1516; begin if(clk1mhzevent and clk1mhz=1)then if(ppsymbol=1)then sound1=0; -暂停态不发声 else if(t=tonefreq)then if(t=tonefreq)then -产生与分频数tonefreq相对应的频率的声音信号sound t:=0; sound1=not sound1; else t:=t+1; end if; else t:=0; end if; end if; end if;end process p1;end one;8) 显示歌曲号的模块shownumber:library ieee;use ieee.std_logic_1164.all;entity shownumber isport(counter:in integer range 1 to 400;enable:out std_logic_vector(5 downto 0);number:out std_logic_vector(7 downto 0);end shownumber;ar
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 实验1 研究匀变速直线运动-2023年高考物理实验专项突破(原卷版)
- 老年人安全游泳知识培训课件
- 第五节 双曲线 2026年高三数学第一轮总复习
- 脑溢血的死亡率有多高
- 天气与气候-2024年中考地理一轮复习知识清单(扣空版)
- 人工智能通识教程(微课版) 课件 04 人工智能技术的觉醒-深度学习技术框架
- 上海市某中学2025-2026学年高三年级上册暑期考试数学试卷(7月份)
- CN120203212A 一种以米粒为支架一步法培养大黄鱼细胞为动植物复合食品的方法
- CN120201845A 一种有机半导体异质结光子突触晶体管及其制备方法
- CN120200250A 一种基于企业供电服务画像的供电服务策略优化方法
- GB/T 6344-2008软质泡沫聚合材料拉伸强度和断裂伸长率的测定
- GB/T 39201-2020高铝粉煤灰提取氧化铝技术规范
- GB/T 3836.4-2021爆炸性环境第4部分:由本质安全型“i”保护的设备
- GB/T 20801.6-2020压力管道规范工业管道第6部分:安全防护
- GB/T 19355.2-2016锌覆盖层钢铁结构防腐蚀的指南和建议第2部分:热浸镀锌
- 核心素养视角下教师专业发展课件
- 企业信用信息公告系统年度报告模板:非私营其他企业
- 施工员钢筋工程知识培训(培训)课件
- 质量管理体系审核中常见的不合格项
- 共用水电费分割单模板
- 《阿房宫赋》全篇覆盖理解性默写
评论
0/150
提交评论