电子琴实验

一、实验目的

了解按键选择编程方法,进一步加强EDA设计电路的能力。

二、实验原理图

图5-1 按键电路

图5-2 蜂鸣器电路

三、实验原理

组成乐曲的每个音符的频率值以及持续时间是乐曲能连续演奏所需的基本数据。本实验的关键是如何用分频的方法,产生每个音符的频率,通过蜂鸣器放音。不同的音域,音符的频率也不同,比如,中音段,1、2、3、4、5、6、7对应的频率分别为:262HZ、294HZ、330HZ、349HZ、392HZ、440HZ、494HZ。这些频率的获得可以利用分频器(即计数器)来实现,比如,用12MHZ作为时钟输入,计数到45801时,即可产生一个262HZ的频率,发“1”的音。

四、实验内容及要求

AN按键作为琴键,用7个按键,代表1~7的音,当按键按下时,即发相应的音。
系统可以包括二个部分(模块),一个是按键检测及计数值确定的模块(实现要计算好不同音的分频基数),一个是分频/计数及输出模块。可以用一个实体实现,也可以采用层次的方法。

五、实验连线

  1. 蜂鸣器上的短路帽JPSPE开关插在ON上;
  2. 彩灯控制实验

六、实验现象

按住实验板上的不同按键,蜂鸣器发出相应的音;

我的vhdl代码

主程序DZQ

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY DZQ IS
PORT(AN:IN STD_LOGIC_VECTOR(6 DOWNTO 0);
CLK:IN STD_LOGIC;
CC: OUT STD_LOGIC);
END DZQ;
ARCHITECTURE STR OF DZQ IS
COMPONENT H2
PORT(CLK:IN STD_LOGIC;
CP:buffer STD_LOGIC_VECTOR(6 DOWNTO 0));
END COMPONENT;
COMPONENT H3
PORT(CP:IN STD_LOGIC_VECTOR(6 DOWNTO 0);
AN: IN STD_LOGIC_VECTOR(6 DOWNTO 0);
CC:OUT STD_LOGIC);
END COMPONENT;
SIGNAL CP:STD_LOGIC_VECTOR(6 DOWNTO 0);
BEGIN
ONE: H2 PORT MAP(CLK,CP);
TWO:H3 PORT MAP(CP,AN,CC);
END;

部件H2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity h2 is
port(clk:in std_logic;
cp:buffer std_logic_vector (6 downto 0));
end h2;
architecture one of h2 is
signal tour1:integer range 0 to 45800:=0;
signal tour2:integer range 0 to 40815:=0;
signal tour3:integer range 0 to 36362:=0;
signal tour4:integer range 0 to 34383:=0;
signal tour5:integer range 0 to 30611:=0;
signal tour6:integer range 0 to 27272:=0;
signal tour7:integer range 0 to 24290:=0;
begin
process(clk)
begin
if(clk'event and clk='1') then
if tour1=45800 then tour1<=0;
else tour1<=tour1+1;
end if;
if tour1>45800/2 and tour1<45800 then
cp(0)<='0';
else cp(0)<='1';
end if;
if tour2=40815 then tour2<=0;
else tour2<=tour2+1;
end if;
if tour2>40815/2 and tour2<40815 then
cp(1)<='0';
else cp(1)<='1';
end if;
if tour3=36362 then tour3<=0;
else tour3<=tour3+1;
end if;
if tour3>36362/2 and tour3<36362 then
cp(2)<='0';
else cp(2)<='1';
end if;
if tour4=34383 then tour4<=0;
else tour4<=tour4+1;
end if;
if tour4>34383/2 and tour4<34383 then
cp(3)<='0';
else cp(3)<='1';
end if;
if tour5=30611 then tour5<=0;
else tour5<=tour5+1;
end if;
if tour5>30611/2 and tour5<30611 then
cp(4)<='0';
else cp(4)<='1';
end if;
if tour6=27272 then tour6<=0;
else tour6<=tour6+1;
end if;
if tour6>27272/2 and tour6<27272 then
cp(5)<='0';
else cp(5)<='1';
end if;
if tour7=24291 then tour7<=0;
else tour7<=tour7+1;
end if;
if tour7>24291/2 and tour7<24291 then
cp(6)<='0';
else cp(6)<='1';
end if;
end if;
end process;
end;

部件H3

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY H3 IS
PORT(CP:IN STD_LOGIC_VECTOR(6 DOWNTO 0);
AN: IN STD_LOGIC_VECTOR(6 DOWNTO 0);
CC:OUT STD_LOGIC);
END H3;
ARCHITECTURE STR OF H3 IS
BEGIN
PROCESS(AN)
BEGIN
CASE AN IS
WHEN "1000000"=> CC<=CP(6);
WHEN "0100000"=> CC<=CP(5);
WHEN "0010000"=> CC<=CP(4);
WHEN "0001000"=> CC<=CP(3);
WHEN "0000100"=> CC<=CP(2);
WHEN "0000010"=> CC<=CP(1);
WHEN "0000001"=> CC<=CP(0);
WHEN OTHERS=> NULL;
END CASE;
END PROCESS;
END;

引脚连接如下: