预览加载中,请您耐心等待几秒...
1/10
2/10
3/10
4/10
5/10
6/10
7/10
8/10
9/10
10/10

亲,该文档总共28页,到这已经超出免费预览范围,如果喜欢就直接下载吧~

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

实验 乐曲演奏电路内容概要实验目的实验原理简谱中的音名与频率的关系本实验中选取4MHz为基准频率。 本实验演奏的是梁祝乐曲,该乐曲各音阶频率及相应的分频系数如下图所示。为减小输出的偶次谐波分量,最后输出到扬声器的波形应为对称方波,在到达扬声器之前,有一个二分频的分频器。上表中的分频系数就是在从4MHz频率二分频得到的2MHz频率基础上计算得出的。 分频的方法 反馈复0法 加载预置数法(本实验采用这种方法) 预置数=计数器最大值-分频系数 =(213-1)-分频系数 =8191-分频系数。乐曲演奏电路原理图程序流程图乐曲演奏电路子模块LIBRARYIEEE; USEIEEE.STD_LOGIC_1164.ALL; USEIEEE.STD_LOGIC_UNSIGNED.ALL; ENTITYsongIS PORT( clk_4MHz, clk_4Hz:INSTD_LOGIC; --预置计数器和乐谱产生器的时钟 digit:BUFFERSTD_LOGIC_VECTOR(6DOWNTO0); --低三位表示低音,中间三位表示中音,最高位表示高音;本曲仅仅有高音1,故此用1位表示。 speaker:outSTD_LOGIC--扬声器 ); ENDsong; ARCHITECTUREsong_archOFsongISSIGNALdivider,origin:STD_LOGIC_VECTOR(12DOWNTO0);--13位计数值和预置值 SIGNALcounter:integerrange0to140; --记录1/4拍曲谱的内容 SIGNALcount:STD_LOGIC_VECTOR(1DOWNTO0); SIGNALcarrier:STD_LOGIC; BEGIN PROCESS(clk_4MHz)BEGIN IF(clk_4MHz'eventANDclk_4MHz='1')THEN IF(divider="1111111111111")THEN carrier<='1'; divider<=origin; ELSE divider<=divider+'1'; carrier<='0'; ENDIF; ENDIF; ENDPROCESS;PROCESS(carrier) BEGIN IF(carrier'eventANDcarrier='1')THEN count<=count+'1'; --输出时钟四分频 IFcount="00"THEN speaker<='1'; ELSE speaker<='0'; ENDIF; ENDIF; ENDPROCESS;PROCESS(clk_4Hz)--1/4节拍 BEGIN IF(clk_4Hz'eventANDclk_4Hz='1')THEN IF(counter=140)THEN counter<=0; ELSE counter<=counter+1; ENDIF; ENDIF; CASEcounterIS--音调digit的赋值WHEN0=>digit<="0000011";WHEN1=>digit<="0000011"; WHEN2=>digit<="0000011";WHEN3=>digit<="0000011"; --由下图可知有4个低音3;3个低音5; WHEN4=>digit<="0000101";WHEN5=>digit<="0000101"; WHEN6=>digit<="0000101";WHEN7=>digit<="0000110"; WHEN8=>digit<="0001000";WHEN9=>digit<="0001000"; WHEN10=>digit<="0001000";WHEN11=>digit<="0010000"; WHEN12=>digit<="0000110";WHEN13=>digit<="0001000"; WHEN14=>digit<="0000101";WHEN15=>digit<="0000101"; WHEN16=>digit<="0101000";WHEN17=>digit<="0101000"; WHEN18=>digit<="0101000";WHEN19=>digit<="1000000"; WHEN20=>digit<="0110000";WHEN21=>digit<="0101000";WHEN22=>digit<="0011000";WHEN23=>digit<="0101000"; WHEN24=>digit<="0010000";WHEN25=>digit<="0010000"; WHEN26=>digit<="0010000";WHEN27=>digit<="0010000"; WHEN28=>digit<="00