沈阳工程学院课程设计(论文)
不同的初始值即可。用加载初始值而不是将分频输出译码反馈,可以有效地减少成本设计占用可编程逻辑器件的资源,也是同步计数器一个常用设计技巧。
(2)控制音长的节拍发生器
该演奏电路演奏的乐曲是“梁祝”片段,其最小的节拍是1拍。将1拍的时间定为0.25S,则只需要再提供一个4HZ的时钟频率即可产生1拍的时长,演奏的时间控制通过ROM查表得方式完成。对于占用时间较长的节拍(一定是拍的整数倍),如全音符为4拍(重复4次),2/4音符为2拍(重复2次),1//4音符为1拍(重复1次)。
要求演奏时能循环进行,因此需要另外设置一个时长计数器,当乐曲演奏完成时,保证能自动从头开始演奏。该计数器控制真值表按顺序输出简谱。
3.3乐曲硬件演奏电路的层次化设计方案
根据层次化的设计思路,可把乐曲硬件演奏电路分为3个模块,音乐节拍发生器NoteTabs模块,音符译码电路ToneTaba模块,数控分频模块(Speakera)。
3.3.1音乐节拍发生器NoteTabs
该模块将利用FPGA的片内POM存放乐曲简谱真值表,该计数器的计数频率为4HZ,即每一个数值的停留时间为0.25S,随着NoteTabs中计数器按4HZ的时钟频率做加法计数时,乐符数据转向音符译码电路ToneTaba,所以所存的乐曲就自然的演奏起来。
其VHDL源程序如下: LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL; USE IEEE.STD_LOGIC_ARITH.ALL;
ENTITY NoteTabs IS
PORT ( clk : IN STD_LOGIC;
ToneIndex : OUT INTEGER RANGE 0 TO 15 ); END;
ARCHITECTURE one OF NoteTabs IS
SIGNAL Counter : INTEGER RANGE 0 TO 145; BEGIN
CNT8 : PROCESS(clk)
- 9 -
沈阳工程学院课程设计(论文)
BEGIN
IF Counter = 138 THEN Counter <= 0; ELSIF (clk'EVENT AND clk = '1') THEN Counter <= Counter + 1; END IF;
END PROCESS;
Search : PROCESS(Counter) BEGIN
CASE Counter IS 调表的索引值
WHEN 00 WHEN 01 WHEN 02 WHEN 03 WHEN 04 WHEN 05 WHEN 06 WHEN 07 WHEN 08 WHEN 09 WHEN 10 WHEN 11 WHEN 12 WHEN 13 WHEN 14 WHEN 15 WHEN 16 WHEN 17 WHEN 18 WHEN 19 WHEN 20 WHEN 21 WHEN 22 WHEN 23 WHEN 24 WHEN 25 WHEN 26 -- 译码器,查歌曲的乐谱表,查表结果为音=> ToneIndex <= 5; => ToneIndex <= 3; => ToneIndex <= 5; => ToneIndex <= 3; => ToneIndex <= 2; => ToneIndex <= 2; => ToneIndex <= 2; => ToneIndex <= 6; => ToneIndex <= 8; => ToneIndex <= 8; => ToneIndex <= 8; => ToneIndex <= 9; => ToneIndex <= 6; => ToneIndex <= 8; => ToneIndex <= 5; => ToneIndex <= 5; => ToneIndex <= 12; => ToneIndex <= 12; => ToneIndex <= 12; => ToneIndex <= 15; => ToneIndex <= 13; => ToneIndex <= 12; => ToneIndex <= 10; => ToneIndex <= 12; => ToneIndex <= 9; => ToneIndex <= 9;
=> ToneIndex <= 9;
- 10 -
沈阳工程学院课程设计(论文)
WHEN 27 => ToneIndex <= 9; WHEN 28 => ToneIndex <= 9; WHEN 29 => ToneIndex <= 9; WHEN 30 => ToneIndex <= 9; WHEN 31 => ToneIndex <= 0; WHEN 32 => ToneIndex <= 9; WHEN 33 => ToneIndex <= 9; WHEN 34 => ToneIndex <= 9; WHEN 35 WHEN 36 WHEN 37 WHEN 38 WHEN 39 WHEN 40 WHEN 41 WHEN 42 WHEN 43 WHEN 44 WHEN 45 WHEN 46 WHEN 47 WHEN 48 WHEN 49 WHEN 50 WHEN 51 WHEN 52 WHEN 53 WHEN 54 WHEN 55 WHEN 56 WHEN 57 WHEN 58 WHEN 59 WHEN 60 WHEN 61 WHEN 62 WHEN 63 WHEN 64 => ToneIndex <= 10; => ToneIndex <= 7; => ToneIndex <= 7; => ToneIndex <= 6; => ToneIndex <= 6; => ToneIndex <= 5; => ToneIndex <= 5; => ToneIndex <= 5; => ToneIndex <= 6; => ToneIndex <= 8; => ToneIndex <= 8; => ToneIndex <= 9; => ToneIndex <= 9; => ToneIndex <= 3; => ToneIndex <= 3; => ToneIndex <= 8; => ToneIndex <= 8; => ToneIndex <= 6; => ToneIndex <= 5; => ToneIndex <= 6; => ToneIndex <= 8; => ToneIndex <= 5; => ToneIndex <= 5; => ToneIndex <= 5; => ToneIndex <= 5; => ToneIndex <= 5; => ToneIndex <= 5; => ToneIndex <= 5; => ToneIndex <= 5; => ToneIndex <= 10;
- 11 -
沈阳工程学院课程设计(论文)
WHEN 65 => ToneIndex <= 10; WHEN 66 => ToneIndex <= 10; WHEN 67 => ToneIndex <= 12; WHEN 68 => ToneIndex <= 7; WHEN 69 => ToneIndex <= 7; WHEN 70 => ToneIndex <= 9; WHEN 71 => ToneIndex <= 9; WHEN 72 => ToneIndex <= 6; WHEN 73 => ToneIndex <= 8; WHEN 74 => ToneIndex <= 5; WHEN 75 => ToneIndex <= 5; WHEN 76 => ToneIndex <= 5; WHEN 77 => ToneIndex <= 5; WHEN 78 => ToneIndex <= 5; WHEN 79 => ToneIndex <= 5; WHEN 80 => ToneIndex <= 3; WHEN 81 => ToneIndex <= 5; WHEN 82 => ToneIndex <= 3; WHEN 83 => ToneIndex <= 3; WHEN 84 => ToneIndex <= 5; WHEN 85 => ToneIndex <= 6; WHEN 86 => ToneIndex <= 7; WHEN 87 => ToneIndex <= 9; WHEN 88 => ToneIndex <= 6; WHEN 89 => ToneIndex <= 6; WHEN 90 => ToneIndex <= 6; WHEN 91 => ToneIndex <= 6; WHEN 92 => ToneIndex <= 6; WHEN 93 => ToneIndex <= 6; WHEN 94 => ToneIndex <= 5; WHEN 95 => ToneIndex <= 6; WHEN 96 => ToneIndex <= 8; WHEN 97 => ToneIndex <= 8; WHEN 98 => ToneIndex <= 8; WHEN 99 => ToneIndex <= 9; WHEN 100 => ToneIndex <= 12; WHEN 101 => ToneIndex <= 12; WHEN 102 => ToneIndex <= 12;
- 12 -
沈阳工程学院课程设计(论文)
WHEN 103 => ToneIndex <= 10; WHEN 104 => ToneIndex <= 9; WHEN 105 => ToneIndex <= 9; WHEN 106 => ToneIndex <= 10; WHEN 107 => ToneIndex <= 9; WHEN 108 => ToneIndex <= 8; WHEN 109 => ToneIndex <= 8; WHEN 110 => ToneIndex <= 6; WHEN 111 => ToneIndex <= 5; WHEN 112 => ToneIndex <= 3; WHEN 113 => ToneIndex <= 3; WHEN 114 => ToneIndex <= 3; WHEN 115 => ToneIndex <= 3; WHEN 116 => ToneIndex <= 8; WHEN 117 => ToneIndex <= 8; WHEN 118 => ToneIndex <= 8; WHEN 119 => ToneIndex <= 8; WHEN 120 => ToneIndex <= 6; WHEN 121 => ToneIndex <= 8; WHEN 122 => ToneIndex <= 6; WHEN 123 => ToneIndex <= 5;
WHEN 124 => ToneIndex <= 3; WHEN 125 => ToneIndex <= 5; WHEN 126 => ToneIndex <= 6; WHEN 127 => ToneIndex <= 8;
WHEN 128 => ToneIndex <= 5; WHEN 129 => ToneIndex <= 5; WHEN 130 => ToneIndex <= 5; WHEN 131 => ToneIndex <= 5; when 132 => ToneIndex <= 5; when 133 => ToneIndex <= 5; when 134 => ToneIndex <= 5; when 135 => ToneIndex <= 5; when 136 => ToneIndex <= 0; when 137 => ToneIndex <= 0; when 138 => ToneIndex <= 0; WHEN OTHERS => NULL; END CASE;
- 13 -