实验七 硬件电子琴设计
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
采用预置数法可有效地减少设计所占用的可编程逻辑器件 资源,本例用此法。 置位法:由初始值d计到最大值N-1,再置入初始值d,初 始值到最大值N-1共n个状态。 可知,低音1的分频系数最大,其值为152,所以公用二 进制计数容量N大于“最大分频系数n“, 即N>MAX(分频系数n),故取N=28=256;计数最大值N-1 为256-1=255; 初值d的计算:初值d=N-分频系数n 例如中音1的初值d的计算= N-分频系数n=25676=180=(11010100)2 ,即从置入初始值180开始,循环体共有76个状态,实现了 152分频的要求。其它可自己填出。
实验七 硬件电子琴设计
一.设计要求
设计一个硬件电子琴:利用EDA实验箱8个
按键作为硬件电子琴的琴键,每按下一个 按键,分别产生从中音1到高音1的八个音 调,由实验箱蜂鸣器发声;用发光二级管 显示当前按键所代表的音调。
2
二、实验设计方法
1、自顶向下设计:根据系统功能划分若干功 能模块及各个功能模块之间的互连 2、功能模块设计:设计各个功能模块。对每 一模块进行仿真,验证其逻辑或时序是否符 合设计要求。 3、总体设计:各底层功能模块互连,完成顶 层设计;仿真分析系统逻辑或时序是否符合 设计要求。 4、硬件验证:在实验开发板上进行设计系统 功能硬件验证。
8
综上
模块1:音阶发生器的设计---完成对键盘按键输入的信 号进行检测,并且产生获得音阶相应的分频预置数和 发光二极管显示。
框图或电路符号?:
8个按键代表8个音符, 如1,2,3,4-按键 KEY(7..0) 语法?: 音阶 发生 器 分频预置数
发光二极管显示
返回系统框图
10
可变分频器
模块二:计数模块(数控分频器的设计)
11
设计结果:系统框图
CLK0 锋鸣器 DZQ 数控 分频 音阶 分频 器 发生 预置 器的 数 设计 BELL 发光二极管显示1,2,3, 4,5,6,7,1—几个二 极管?
8个按键代表8个音符, 如1,2,3,4-KEY(7..0)
设计的主体是数控分频器,对输入的频率按照与每个音阶对应的分频 系数进行分频,得到各个音阶对应的频率分别在蜂鸣器上发声。按键 时对应的音阶在发光二极管上显示。 外部时钟信号40 MHz(实验箱CLK0) 由键盘输入控制蜂鸣器产生不同的音阶,因为有8个按键,可以利 用按键k0到k6表示中音1到7,k7分别为高音的1。 发光二极管显示当前按键具体音名,即是1、2、3、4.。。中的任 意一个。
523.25
587.33 659.25 698.46 783.99 880 987.76
高音1
高音2 高音3 高音4 高音5 高音6 高音7
1046.50
1174.66 1318.51 1396.92 1576.98 1760 1975.52
特点:每两个8度音之间的频率相差一倍
提问3:频率?我们实验箱给我们提供了哪些频率,如何 建立这个频率与这些音名对应频率的关系? CLK0---40MHZ,分频—即计数器的设计
CLK0
分频预置数D
entity speak is port(clk : in std_logic; --40MHz D : in std_logic_vector(7 downto 0); Fout : out std_logic ); end;
17
architecture bhv of speak is signal clk1 : std_logic; signal Full : std_logic; begin P_Div : process(clk) variable CNT10 : std_logic_vector(8 downto 0); begin if clk 'event and clk = '1' then if CNT10 = "111110011" then--499 CNT10 := "000000000"; 功能: clk1 <= '1'; 将初始信号clk else (40MHZ)进行500分 CNT10 := CNT10 + 1; 频,产生clk1信号,频 clk1 <= '0'; 率是80kHz,计数是0end if; 499 end if; end process P_Div;
=256-57=199=(11000111)2
=256-57=199=(11000111)2 =256-45=212=(11010100)2 =256-40=216=(11011000)2 =256-37=220=(11011100)2
7
公用二进制计数容量N的选取。n分频器用n进制的计数器实现, 可用复位法和置位法(预置数)实现。
12
系统组成
对输入的时钟信号 按照分频系数进行 分频,产生各种音 阶对应的声音频率
40MHZ
发出音调
FPGA
按 键
音阶 发生 器
数 控 分 频 器
蜂鸣器
显示声阶
对键盘按键输入的信 号进行检测,并且产 生获得音阶相应的分 频预置数
发光二极管
13
电路设计
模块TONE音节发生器的功能: 通过k0-k7 8个按键模拟电子琴的8个音节,输出信号code显示当前按键 具体音名,即是1、2、3、4.。。中的任意一个 输出信号Tone[7..0]为不同按键产生的不同分频预置数。 模块speak数控分频器的功能: 初始频率从外部输入,通过不同按键产生的不同预置数,将初始频率 进行分频,得到不同的分频结果,每一个结果对应一个音。 14
18
P_Reg : process(clk1) variable CNT8 : std_logic_vector(7 downto 0); begin if clk1 'event and clk1 = '1' then if CNT8 = "11111111" then CNT8 := D; 功能:根据预置数D的 Full <= '1'; 不同,产生不同的分频 else 比,得到不同频率的输 CNT8 := CNT8 + 1; 出信号full(255)初值d的计 Full <= '0'; 算= N-分频系数n=256-76=180 end if; end if; end process P_Reg;
中音3
中音4 中音5 中音6 中音7 高音1
659.25
698.46 783.99 880 988 1046
=80KHZ/(659*2)=60.69 =256-60=196= (11000011)2
=80KHZ/(698*2)=57.3 =80KHZ/(783*2)=51 =80KHZ/(880*2)=45 =80KHZ/(988*2)=40 =80KHZ/(1046*2)=37
4
模块1:音阶发生器的设计(1)
简谱音名与频率的关系:
频率(HZ) 音名 频率(HZ) 音名 频率(HZ)
音名
低音1
低音2 低音3 低音4 低音5 低音6 低音7
261.63
293.67 329.63 349.23 391.99 440 493.88
中音1
中音2 中音3 中音4 中音5 中音6 中音7
键按键
分频预置数 示音调数字
end;
Tone : out std_logic_vector(7 downto 0);--产生
Code : out std_logic_vector(3 downto 0));--显
15
architecture bhv of ToneTab is 预值数 8,高音1 begin P_Search : process(Key) begin case Key is when "01111111" => Tone <= "11011010"; Code <= "1000"; --高音1 when "10111111" => Tone <= "11011000"; Code <= "0111"; --中音7 when "11011111" => Tone <= "11010011";Code <= "0110"; --中音6 when "11101111" => Tone <= "11001101"; Code <= "0101";--中音5 when "11110111" => Tone <= "11000111"; Code <= "0100";--中音4 when "11111011" => Tone <= "11000011"; Code <= "0011";--中音3 when "11111101" => Tone <= "10111100"; Code <= "0010";--中音2 when "11111110" => Tone <= "10110100"; Code <= "0001";--中音1 when others => Tone <= "11111111"; Code <= "0000"; --没有按键按
对输入的频率按照与每个音阶对应的分频系数进行分频,得 到各个音阶对应的频率分别在蜂鸣器。数控分频模块的目的 是对基准脉冲分频,得到1,2,3,4,5, 分频 器 分频预置数
实现该模块有三个步骤: 1.对40MHz的基准脉冲进行500 分频得到80kHz的脉冲 2.按照音阶发生器输入的分频系 数对80kHz的脉冲再次分频,得 到的所需要的频率。 3.为了使扬声器有足够功率发音 ,在音调输出时再进行二分频, 将脉冲展宽。 2倍输出频率=80kHz/(255-(D-1)),D 为预置分频数
6
音名 低音1
频率 261.63
分频系数 =80KHZ/(261*2)=152
初值d= N-1-分频系数n =256-152=104
中音1
中音2
523.25
587.33
=80KHZ/(523.25*2) =76.44
=256-76.44=180= (10110100) 2
=80KHZ/(587*2)=68.14 =256-68=188=(10111100)2
3
设计思路:
系统框图
锋鸣器 DZQ 音阶 发生 器的 设计 分频预置数 发光二极管显示1,2,3, 4,5,6,7,1—几个二 极管? 4个 BELL
顶层:
8个按键代表8个音符, 如1,2,3,4-KEY(7..0)
提问:1.目前电子琴的外部接口也即顶层模块我们设计完了,如何 实现按键SW0表示中音1?依次类推? 2. 如何用发光二极管表示中音1?
下或多个键按下
中音1 频率523.25,分频系数=80KHZ/(523*2)=76.4 end case; ,预值数=265-76=180= (10110100)2 end process P_Search; end; 16
2、speak模块
fout蜂鸣器
library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all;
三、底层模块设计 1、Tone音阶发生器模块
library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all;
entity ToneTab is port( Key : in std_logic_vector(7 downto 0);--8个琴
5
(1)基准频率的选择:各音名所对应的频率可由一频率较高 的基准频率进行整数分频得到,所以实际产生各音名频率为 近似的整数值。基准频率越高,近似程度越好,音准也越好 。但同时分频系数会越大,耗费芯片资源也越多。本实例选 取80KHZ信号作为基准频率。 实验箱输入时钟clk0为40MHz ,首先进行分频(500)得到较 低一点频率,如80kHz ,然后再对80kHz进行分频得到各音 阶频率。 (2)分频系数、公用二进制计数器容量N及初始值d的选取, 分别叙述如下: 分频系数A=f0/音名频率 分频系数n=分频系数A /2 =(f0/音名频率)/2; 以中音1为例,分频系数A=80KHZ/523=152.96,取整,这 里分频后的523HZ不是对称方波,由于占空比很小的方波很 难使扬声器有效的发出声响,所以再2分频得到分频系数n =80KHZ/(523*2)=76.44