大连理工大学本科实验报告题目:电子琴课程名称:数字电路课程设计学院(系):电子信息工程专业:电子信息工程班级:学生姓名:学号:完成日期:成绩:2010年12月08日题目:1设计要求(1)有两种模式可供选择,分别为弹奏模式和自动演奏模式。(2)在弹奏模式下,分别按下实验箱上七个键,扬声器分别发出中音Do,Re,Mi,Fa,Sol,La,Ti(3)在自动演奏模式下,自动循环播放歌曲JingleBells。(4)由三位数码管分别显示高、中、低音的音符。2设计分析及系统方案设计a.设计分析:电子琴的设计包括四个模块:弹奏模块keyplay、自动演奏模块autoplay、查表及显示模块table和分频模块fenpin。弹奏模块keyplay根据按键动作key产生指示音调的index_key自动演奏模块autoplay接收1024Hz的时钟信号,输出index_auto查表及显示模块table根据按键button选择采用index_key或ndex_auto来查分频系数表,输出分频系数tone。同时将音调对应的BCD码code0(低音)、code1(中音)、code2(高音)分别输出给三个数码管。分频模块fenpin接收tabled输出的分频系数tone,并据此分频,将对应频率的信号buzz输出给扬声器供其发声。b.系统设计方案:顶层设计:输入:6MHz时钟clk、1024Hz时钟、按键key[6..0]、按键button输出:spkout给扬声器弹奏模块keyplay:将输入key[6..0]编码为index_key[4..0]。index_key[4..0]的高两位表示高、中、低音,00表示低音,01表示中音、10表示高音。由于按键数目有限,只能弹出中音。index_key[4..0]低三位表示音调,001表示do,010表示re,以此类推,000表示不发音。自动演奏模块autoplay:把1024Hz的输入时钟分频为16Hz,作为节拍。将要自动演奏的歌曲预先写为index_auto的格式(index_auto格式与index_key格式相同)。以16Hz的频率将index_auto输出。查表及显示模块table:(1)输入按键button用于选择模式。由于是琴键式,不能根据button本身的值来选择模式。故加一个内部信号choice,button每来一个上升沿,choice翻转一次。Choice为1则把index_auto赋给内部信号index,否则把index_key赋给它。(2)用index来查表,获得分频系数tone,输出。(3)同时根据index获得BCD码表示的高、中、低音的音调,输出给数码管。分频模块fenpin:输入分频系数tone。(1)设置内部信号i用于计数,clk_data作为分频结果。,每次clk上升沿检测i是否等于tone,相等则把i清零,并使clk_data翻转,否则i自增1。(2)把clk_data赋给输出信号buzz,由buzz驱动扬声器发声。设计框图:KeyplaykeyautoplayClk2tableIndex_keyIndex_autobuttonfenpintonecode0code1code2buzz3系统以及模块硬件电路设计试验箱使用的是模式3的电路结构。1.按键PIO7是模式选择按键button,每按下一次改变一次模式2.按键PIO6-0用于弹奏,在弹奏模式下,被按下时分别发出中音Do,Re,Mi,Fa,Sol,La,Ti。3.Clk0用于分频以供扬声器发声4.Clk5用于控制自动演奏节拍5.三个数码管用于显示高、中、低音音调下载时选择的开发系统模式以及管脚定义6MHz译码器译码器译码器PIO27-24PIO23-20PIO23-20FPGA最小系统Clk0Clk5PIO7PIO6PIO5PIO4PIO3PIO2PIO1PIO0spkButtonKey6Key51024HzKey4Key3Key2Key1Key0表1GW48-CK开发系统工作模式:接口名称类型(输入/输出)结构图上的信号名引脚号说明clkINPUTCLK02供分频发声Clk2INPUTCLK583供分频获得节拍KeyINPUTPIO6-011-5按键弹奏ButtonINPUTPIO716模式选择Code0topOUTPUTPIO19-1630-27低音显示Code1topOUTPUTPIO23-2038-35中音显示Code2topOUTPUTPIO27-2449-47,39高音显示SpkoutOUTPUTSPEAKER3发声4系统的VHDL设计顶层程序:top.vhdlibraryIEEE;useIEEE.STD_LOGIC_1164.ALL;useIEEE.STD_LOGIC_ARITH.ALL;useIEEE.STD_LOGIC_UNSIGNED.ALL;entitytopisport(clk:instd_logic;clk2:instd_logic;key:instd_logic_vector(6downto0);button:instd_logic;spkout:outstd_logic;code0top:outstd_logic_vector(3downto0);code1top:outstd_logic_vector(3downto0);code2top:outstd_logic_vector(3downto0));endtop;architecturebehaveoftopiscomponentautoplayport(clk2:instd_logic;index_auto:outstd_logic_vector(4downto0));endcomponent;componentfenpinport(clk:instd_logic;tone:inintegerrange0to8190;buzz:outstd_logic);endcomponent;componenttableport(index_auto:instd_logic_vector(4downto0);index_key:instd_logic_vector(4downto0);button:instd_logic;tone:outintegerrange0to8190;code0:outstd_logic_vector(3downto0);code1:outstd_logic_vector(3downto0);code2:outstd_logic_vector(3downto0));endcomponent;componentkeyplayport(key:instd_logic_vector(6downto0);index_key:outstd_logic_vector(4downto0));endcomponent;signalindex_auto_top:std_logic_vector(4downto0);signalindex_key_top:std_logic_vector(4downto0);signaltone_top:integerrange0to8190;beginu1:autoplayportmap(clk2=clk2,index_auto=index_auto_top);u2:fenpinportmap(clk=clk,tone=tone_top,buzz=spkout);u3:tableportmap(index_auto=index_auto_top,index_key=index_key_top,tone=tone_top,button=button,code0=code0top,code1=code1top,code2=code2top);u4:keyplayportmap(key=key,index_key=index_key_top);endbehave;按键弹奏模块:keyplay.vhdlibraryieee;useieee.std_logic_1164.all;useieee.std_logic_arith;useieee.std_logic_unsigned.all;entitykeyplayisport(key:instd_logic_vector(6downto0);index_key:outstd_logic_vector(4downto0));end;architecturebehaveofkeyplayisbeginprocess(key)begincasekeyiswhen0000001=index_key=01001;--按键从右到左依次表示do,re,mi,fa,sol,la,tiwhen0000010=index_key=01010;when0000100=index_key=01011;when0001000=index_key=01100;when0010000=index_key=01101;when0100000=index_key=01110;when1000000=index_key=01111;whenothers=index_key=00000;endcase;endprocess;endbehave;自动演奏模块:autoplay.vhdlibraryIEEE;useIEEE.STD_LOGIC_1164.ALL;useIEEE.STD_LOGIC_ARITH.ALL;useIEEE.STD_LOGIC_UNSIGNED.ALL;entityautoplayisport(clk2:instd_logic;index_auto:outstd_logic_vector(4downto0));end;architecturebehaveofautoplayissignalcount:integerrange0to136;--可根据乐曲长度改变signaljiepai:std_logic;signalj:integerrange0to60;beginjiepai1:process(clk2)--分频产生16Hz的节拍beginifclk2'eventandclk2='1'thenifj=30thenj=0;jiepai=notjiepai;elsej=j+1;endif;endif;endprocessjiepai1;--jiepai=clk2;process(jiepai)beginifjiepai'eventandjiepai='1'thenifcount=136thencount=0;--可根据乐曲长度改变elsecount=count+1;endif;endif;endprocess;music:process(count)--歌曲jinglebellsbegincasecountis--此case语句:存储自动演奏部分的曲谱when0=index_auto=01011;--3第一小节when1=index_auto=01011;--3when2=index_auto=01011;--3when3=index_auto=00000;--0when4=index_auto=01011;--3when5=index_auto=01011;--3when6=index_auto=01011;--3when7=index_auto=00000;--0when8=index_auto=01011;--3when9=index_auto=01011;--3when10=index_auto=01011;--3when11=index_auto=01011;--3when12=index_auto=01011;--3when13=index_auto=01011;--3when14=index_auto=01011;--3when