1、沈阳理工大学课程设计专用纸 摘要 音乐节拍器作为音乐初学者必备的辅助器材可以帮助演奏者在练习期间能将音符表达的更贴切,避免演奏难度及音乐情绪干扰演奏速度影响表演效果因此,节拍器的精度及质量至关重要。而传统基于机械时钟的节拍器要制作出高质量的成品成本很高,故制作工艺简单,体积小,功能全面,而且时钟稳定,无需维护的电子音节节拍器应运而生。 随着电子技术的发展, 应用系统向着的应用引起电子产品及系统开发的革命性变革。和其他的电子技术相比,VHDL 语言作为可编程逻辑器件的标准语言描述能力强, 覆盖面广, 抽象能力强, 在实际应用中越来越广泛。在这个阶段,人们开始追求贯彻整个系统设计的自动化
2、可以从繁重的设计工作中彻底解脱出来,把精力集中在创造性的方案与概念构思上,从而可以提高设计效率,缩短产品的研制周期。作为一种工业标准硬件描述语言。 本文为广大的电子爱好者及音乐学习者提供了一份不同于传统音乐节开启的设计方案,利用向着小型化、快速化、大容量、重量轻的方向发展的EDA 技术阐述了完整全面的设计方法及结果,从概念模型设计到详细的系统设计均图文并茂的展示了设计的思路与方式,并附ALTERA电子公司专用仿真设计环境QYARTUS II的波形仿真图及全部源码(VHDL语言), 目录 引言 - 1 - 1.系统的设计要求 - 1 - 2.系统分析 - 1 - 2.1 系统构
3、成 - 1 - 2.2 系统实现过程 - 2 - 3.具体模块设计 - 3 - 3.1数控分频电路TimeCLK - 3 - 3.2数码管驱动显电路LED8 - 3 - 3.3声光输出电路OutputTem - 3 - 4.程序设计 - 4 - 4.1数控分频电路TimeCLK源代码 - 4 - 4.2数码管驱动显电路LED8源代码 - 4 - 4.4 顶层文件设计模块 - 2 - 5.运行结果与分析 - 2 - 5.1数控分频电路TimeCLK - 2 - 5.2数码管驱动显电路LED8 - 2 - 5.3声光输出电路OutputTem - 2 - 6.结束语 -
4、 2 - 参考文献 - 3 - 引言 随着当前科学技术的发展以及人民的思想愈加开放,使用电子产品不再是一种可以谋生的特殊技术,相反技术走进生活成为新时代的口号和发展动向,越来越多的人致力于设计出更巧妙的电子产品以帮助我们更好的生活、工作、学习。 多年来,音乐节拍器作为音乐初学者必备的辅助器材,一直备受争议:好的音乐节拍器节奏精准,音色润美,可以帮助演奏者在练习期间能将音符表达的更贴切,避免演奏难度及音乐情绪干扰演奏速度影响表演效果;但劣质节拍器的频率不准,反而会打乱学习者本身的节奏感,且使演奏者很难专注地将感情融入到演奏之中。因此,节拍器的精度及质量至关重要。 然
5、而,传统的节拍器多基于机械时钟,不仅防震防磁效果差、体积大、维护困难,且要制作出高精度的成品成本很高,与此相比,基于晶振时钟的电子音节节拍器,制作工艺简单,体积小,功能全面,而且时钟稳定,无需维护,且音量音速音色可调,能满足几乎全部学习者的需求。 随着电子技术的发展, 应用系统向着小型化、快速化、大容量、重量轻的方向发展,EDA 技术的应用引起电子产品及系统开发的革命性变革。和其他的电子技术相比,VHDL 语言作为可编程逻辑器件的标准语言描述能力强, 覆盖面广, 抽象能力强, 在实际应用中越来越广泛。在这个阶段,人们开始追求贯彻整个系统设计的自动化,可以从繁重的设计工作中彻底解脱出来,把精力
6、集中在创造性的方案与概念构思上,从而可以提高设计效率,缩短产品的研制周期。作为一种工业标准硬件描述语言。 1.系统的设计要求 设计一个音乐节拍器,三种可选拍号(2/4,3/4,4/4),能准确声光同步显示拍强(即拍显),可连续调整并用数码管显示拍速,可连续调整音量。 2.系统分析 2.1 系统构成 CPU(CPLD)部分的逻辑功能:检测按钮输入模块的信息(拍号、拍速、音量),并按相应信息进行分频调整得到正确频率的输出信号,并驱动扬声器,数码管及LED灯以显示所需信息。 外围电路有两部分,一部分为输出(声光模块),一部分为输入(按钮模块),系统框图如图2.1: 按钮
7、输入模块 CPU(CPLD) 拍号调节TK 拍速调节TS[0,1] 音量调节VM[0,1] 数码管片选CS[3…0] 数码管字形控制S[8…0] 声信号输出Speaker 声光输出模块 图2.1 系统构成框图 本文着重讲述系统设计中的CPLD程序设计部分,故“CPLD芯片的输入信号”、“CPLD芯片的输出信号”、“CPLD芯片的逻辑结构”等词语均省略为“输入信号”、“输出信号”、“逻辑结构”等,特此声明,不再赘述。 2.2 系统实现过程 用VHDL进行设计 ,首先应该了解 ,VHDL语言一种全方位硬件描述语言 ,包括系统行为级描述 ,寄存器传输级和逻
8、辑门阵列等多个设计层次。充分利用VHDL“自顶向下”的设计优点以及层次化的设计概层次概念对于设计复杂的数字系统非常有用,能使得再复杂的系统设计也可从简单的单元入手 ,简化设计过程,降低设计难度,且提高了程序的可读性,并降低了程序的维护难度。 根据本系统设计要求知(如图2.1)—— 1) 整个系统共有三个输入信号: a) 控制拍号(2/4、3/4、4/4)的逻辑输入信号TK; b) 控制拍速(20…400)的调节信号TS[0,1],分别为“增加”、“减小”; c) 控制音量的上下调节信号(1…20); 2) 整个系统共有四个输出信号: a) 扬声器驱动信号Speaker; b)
9、拍显LED驱动信号LED[1…3]; c) 数码管驱动信号S[1…8]; d) 数码管片选信号CS[1…2]。 据此,我们可以将整个节拍产生电路分为三大部分: a) 数控分频电路TimeCLK; b) 数码管驱动显示LED8; c) 声光输出OutputTem电路。 综上,系统的工作原理便可简述如下: 1) 数码管驱动根据输入信号拍速TS结合字形码(按数码管类型分为共阴极或共阳极)动态扫描三位数码管即可; 2) 数控分频电路根据输入信号TS、CLK,可产生无可察觉干扰指定频率的,可供声光输出电路使用的时钟信号(节拍信号)CLK1; 3) 声光输出电路则是根据拍号
10、TK及CLK1则可以产生能驱动扬声器发出不同音调的波形,输出给扬声器,同时按拍强让三个同色不同亮度的LED灯依次亮起,产生声光同步的拍显效果。 完整的音乐节拍系统的逻辑结构图如图2.2所示: CS S[0…7] CS Spd 数码管驱动电路 TS S[0…7] 输出信号 输入信号 CLK1 Spd CLK Speaker Speaker CLK CLK1 数控分频 TK LED[0…2] LED[0…2] 声光输出 TK VM TS VM 图 2.2 逻辑结构图 3.具体模块设计 3.1数控分频电路Tim
11、eCLK 数控分频电路功能: 利用计数器,结合输入信号TS、CLK,实现分频,产生无可察觉干扰指定频率的,可供声光输出电路使用的时钟信号(节拍信号)CLK1; 3.2数码管驱动显电路LED8 数码管驱动电路功能: 1) 根据输入信号——拍速调节信号TS计算当前拍速并输出; 2) 根据当前拍速按字形码(共阴极或共阳极)动态扫描三位数码管; 3.3声光输出电路OutputTem 声光输出电路功能: 1) 根据拍号TK及CLK1产生能驱动扬声器发出不同音调的波形,输出给扬声器; 2) 按拍强让三个同色不同亮度的LED灯依次亮起,产生声光同步的拍显效果。 4.程序设计 4.
12、1数控分频电路TimeCLK源代码 library IEEE; Use IEEE.STD_LOGIC_1164.ALL; Use IEEE.STD_LOGIC_ARITH.ALL; Use IEEE.STD_LOGIC_UNSIGNED.ALL; entity TimeCLK is PORT( CLK :IN STD_LOGIC; SPEED :IN INTEGER RANGE 24 TO 400; CLK1 :buffer STD_LOGIC ); END ENTITY; ARCHITECTURE BHV OF TimeCLK
13、 IS SIGNAL flag:STD_LOGIC:='0'; SIGNAL SUM:INTEGER RANGE 0 TO 1000:=1000; BEGIN SUM<=24000/SPEED; process(CLK) variable cot:INTEGER RANGE 0 to 5000; BEGIN IF(clk='1') THEN IF (COT < SUM) THEN cot:=cot+1; CLK1<='0'; ELSIF (COT<2*SUM) THEN cot:=cot+1; CLK1
14、<='1'; ELSE cot:=0; END IF; END IF; END PROCESS; END ARCHITECTURE; 4.2数码管驱动显电路LED8源代码 Library IEEE; Use IEEE.STD_LOGIC_1164.ALL; Use IEEE.STD_LOGIC_ARITH.ALL; Use IEEE.STD_LOGIC_UNSIGNED.ALL; entity LED8 is PORT( CLK:IN STD_LOGIC; TS:IN STD_LOGIC_VECTOR(0 TO 1);
15、S :buffer STD_LOGIC_VECTOR(0 TO 7); CS :buffer STD_LOGIC_VECTOR(0 TO 3); SPEED1:BUFFER INTEGER RANGE 24 TO 400 ); END ENTITY; ARCHITECTURE BHV OF LED8 IS SIGNAL Shun:STD_LOGIC_VECTOR(0 TO 7) :="00000110"; SIGNAL Sten:STD_LOGIC_VECTOR(0 TO 7) :="00111111"; SIGNAL Sone:STD_LOGIC_VECTOR(0 T
16、O 7):="00111111"; SIGNAL SPEED:INTEGER RANGE 24 TO 400 :=100; BEGIN PROCESS(TS) variable hun:integer range 0 to 4; variable ten:integer range 0 to 9; variable one:integer range 0 to 9; BEGIN hun:=Speed/100; ten:=(Speed-hun*100)/10; one:=Speed-hun*100-ten*10; CASE hun IS WH
17、EN 0=> Shun<="00111111"; WHEN 1=> Shun<="00000110"; WHEN 2=> Shun<="01011011"; WHEN 3=> Shun<="01001111"; WHEN 4=> Shun<="01100110"; WHEN OTHERS=> Shun<="11111111"; END CASE; CASE (ten) IS WHEN 0=> Sten<="00111111"; WHEN 1=> Sten<="00000110"; WHEN 2=> Sten<="01011011"; WHEN 3=> Sten<
18、"01001111"; WHEN 4=> Sten<="01100110"; WHEN 5=> Sten<="01101110"; WHEN 6=> Sten<="01111110"; WHEN 7=> Sten<="00000111"; WHEN 8=> Sten<="01111111"; WHEN 9=> Sten<="01101111"; WHEN OTHERS=> Sten<="11111111"; END CASE; CASE (one) IS WHEN 0=> Sone<="00111111"; WHEN 1=> Sone<="00000110"; WH
19、EN 2=> Sone<="01011011"; WHEN 3=> Sone<="01001111"; WHEN 4=> Sone<="01100110"; WHEN 5=> Sone<="01101110"; WHEN 6=> Sone<="01111110"; WHEN 7=> Sone<="00000111"; WHEN 8=> Sone<="01111111"; WHEN 9=> Sone<="01101111"; WHEN OTHERS=> Sone<="11111111"; END CASE; END PROCESS; PROCESS(CL
20、K) BEGIN if(clk'event and clk='1') then CASE CS IS WHEN "0001"=> S<=Sone; CS<="0010"; WHEN "0010"=> S<=Sten; CS<="0100"; WHEN "0100"=> S<=Shun; CS<="0001"; WHEN OTHERS=> S<="11000011"; CS<="0001"; END CASE; SPEED1<=SPEED; end i
21、f; END PROCESS; PROCESS(TS) BEGIN IF(TS(0)='1') THEN Speed<=Speed+1; END IF; IF(TS(1)='1') THEN Speed<=Speed-1; END IF; END PROCESS; END ARCHITECTURE; 4.3声光输出电路OutputTem源代码 library IEEE; Use IEEE.STD_LOGIC_1164.ALL; Use IEEE.STD_LOGIC_ARITH.ALL;
22、Use IEEE.STD_LOGIC_UNSIGNED.ALL; entity OutputTem is PORT( CLK :IN STD_LOGIC; CLK1 :IN STD_LOGIC; TK :IN STD_LOGIC; Speaker:BUFFER STD_LOGIC; LED :OUT STD_LOGIC_VECTOR(0 TO 2) ); END ENTITY; ARCHITECTURE BHV OF OutputTem IS SIGNAL TemKind:integer range 2 to 4:=2; BEGIN PROCE
23、SS(CLK) variable count:integer range 0 to 4; variable SPKBuf:STD_LOGIC; BEGIN IF(CLK1='1')THEN Speaker<=not CLK; count:=0; ELSE Speaker<='0'; END IF; END PROCESS; PROCESS(CLK1) variable count1:integer range 0 to 4; BEGIN IF CLK1='0' THEN CASE (TemKind) is wh
24、en 2 => case(count1) is when 1=> LED<="001"; when OTHERS=> count1:=0; LED<="100"; end case; when 3 => case(count1) is when 1=>LED<="010"; when 2=>LED<="001"; when OTHERS=>count1:=0;LED<="100"; end case; when 4 => case(count1) is when 1=>LED<="001"; when 2=>LED<="010"; w
25、hen 3=>LED<="001"; when OTHERS=>count1:=0;LED<="100"; end case; when others => LED<="111"; END CASE; count1:=count1+1; END IF; END PROCESS; PROCESS(TK) BEGIN if(TK='1') then CASE(TemKind) is when 2=> TemKind<=3; when 3=> TemKind<=4; when 4=> TemKind<=2; when others
26、> TemKind<=2; end case; end if; END PROCESS; END ARCHITECTURE; 4.4 顶层文件设计模块 library IEEE; Use IEEE.STD_LOGIC_1164.ALL; Use IEEE.STD_LOGIC_ARITH.ALL; Use IEEE.STD_LOGIC_UNSIGNED.ALL; entity SimTem is PORT( CLK :IN STD_LOGIC; TK :IN STD_LOGIC; TS :IN STD_LOGIC_VECTOR(0 TO
27、1); Speaker:OUT STD_LOGIC; LED :OUT STD_LOGIC_VECTOR(0 TO 2); S:OUT STD_LOGIC_VECTOR(0 TO 7); CS:OUT STD_LOGIC_VECTOR(0 TO 3) ); END ENTITY; ARCHITECTURE BHV OF SimTem IS Component TimeCLK PORT( CLK :IN STD_LOGIC; SPEED:IN INTEGER RANGE 24 TO 400; CLK1:OUT STD_LOGIC ); END Compon
28、ent; Component LED8 PORT( CLK :IN STD_LOGIC; TS :IN STD_LOGIC_VECTOR(0 TO 1); S :BUFFER STD_LOGIC_VECTOR(0 TO 7); CS : BUFFER STD_LOGIC_VECTOR(0 TO 3); SPEED1:BUFFER INTEGER RANGE 24 TO 400 ); END Component; Component OutputTem PORT( CLK :IN STD_LOGIC; CLK1 :IN STD_LOGIC; TK
29、IN STD_LOGIC; Speaker:OUT STD_LOGIC; LED :OUT STD_LOGIC_VECTOR(0 TO 2) ); END Component; SIGNAL CLK1:STD_LOGIC; SIGNAL SPEED:INTEGER RANGE 24 TO 400; BEGIN U0:TimeCLK PORT MAP(CLK,SPEED,CLK1); U1:LED8 PORT MAP(CLK,TS,S,CS,SPEED); U2:OutputTem PORT MAP(CLK,CLK1,TK,Speaker,LED);
30、END ARCHITECTURE; 5.运行结果与分析 5.1数控分频电路TimeCLK 波形仿真图: 图5.1 TimeCLK波形仿真图 当设定CLK为10MHz的时钟脉冲,且speed输入为默认的200(节拍/分钟)(有预防针资源有限,图形中用s代替min)则分频后的时钟信号。 5.2数码管驱动显电路LED8 波形仿真图: 5.3声光输出电路OutputTem 波形仿真图: 按5.1设定好本仿真输入的clk与clk1,则当clk1为高电平时扬声器应发声,而扬声器的发声又需要方波驱动,顾利用clk产生局部方波;同时按节拍产生带有一定延时效果的LE
31、D驱动信号。 6.结束语 学习所有的编程语言都离不开实践与思考,大学期间能系统的学习各门课程固然是难得的机会,但在学习之后还有机会及时的利用所学知识在实践中思考练习更为荣幸至极,珍惜这次的学习过程变认真思考,认真设计每一句代码,设计仿真输入的每一个码元值,认真对待自己疑惑的每一个知识点,认真学习也是认真对待自己的一大表现,尽管我的作品很简单逻辑也并不复杂,但我相信我在这里付出得并不少,也相信我收获的也会更多,每一不同的课程设计虽多数都用不同的语言,能让我们感受到不同的气氛,但编程之路上严谨思考,细致分析的做事方式,和不骄不躁的态度,是异曲同工的,是在一次次课程设计中联系学习磨练的,我会将自
32、己的学习方式坚持下去,也希望我们七专业都能在老师们为我们良苦用心地设计的诸多课程之中用心去做,之外认真补缺,之后有所进步,不负老师一片用心,不负家里人的一片希望,也不负自己的一片青春,一同成长为一名合格的大学生。 我会作课设,你试着做过么?尝试的过程是痛苦的,但结果是快乐的,你所谓的捷径的代价,,,,,, 参考文献 [1].侯伯亭,顾新.VHDL硬件描述语言与数字逻辑电路设计. 西安,1999. [2].潘松,黄继业,EDA技术与VHDL.北京:清华大学出版社.2013 [3].马建民,孙德哲.关于音乐节拍器设计功能的思考.辽宁,2005 [4].王金明 .数字系统设计VHDL.北京:电子工业出版设.2010 [5]方爵.基本乐理.西南师范大学出版社,1997






