北邮数电实验电子琴Word文件下载.docx
- 文档编号:19604262
- 上传时间:2023-01-08
- 格式:DOCX
- 页数:25
- 大小:490.65KB
北邮数电实验电子琴Word文件下载.docx
《北邮数电实验电子琴Word文件下载.docx》由会员分享,可在线阅读,更多相关《北邮数电实验电子琴Word文件下载.docx(25页珍藏版)》请在冰豆网上搜索。
关于提高要求中的手动演奏的音符存储、播放功能,我打算通过编程实现类似数据结构中队列的模块,来储存手动输入的音符,然后在要播放的时候,队列里面的音符依次出队,从而实现音符储存播放的功能。
2.总体框图
图3简易电子琴总体结构框图
是否自动播放
查找对应的频率值
结束
开始
输入按键
点阵显示
蜂鸣器输出
数码管显示
选择高低音
是
否
图4简易电子琴逻辑流程图
图5简易电子琴VHDL电路原理图
3.分块设计
(1)分频模块div0
由于实验电路板的主频是50Mhz,为了数码管和点阵的刷新显示,我们必须将50Mhz的频率进行分频。
分频的程序来自电路中心的上面。
在这个模块里,我设置分频系数为cnt=2499。
从实验结果看,这个分频对数码管和点阵的显示有很好的效果
(2)数码管显示模块shuma
我使用了2个数码管,第一个数码管显示1~7的音符,第二个数码管显示相关的信息,比如高音用H表示,低音用L表示,自动播放用A表示。
两个数码管分别刷新,但由于刷新频率太快,人眼不能察觉,以为是两个数码管是同时亮的。
在程序中我们通过duan:
outstd_logic_vector(7downto0)和cat:
outstd_logic_vector(5downto0)来控制数码管的显示。
当输入不同的音符和不同的控制信息时,duan和cat向量都有不同的值与之对应。
(3)8*8点阵显示模块dianzhen
8*8点阵的显示和数码管的显示运用了同样的原理,在程序中我们通过row:
outstd_logic_vector(7downto0)和col:
outstd_logic_vector(7downto0)这两个向量来控制点阵的显示。
当输入不同的音符时,点阵显示相应的形状。
(4)音符产生模块auto。
这个模块的功能是,选择的不同模式来产生不同的音符。
当选择自动播放模式时,随着计数器count的值增加,即地址值递增时,程序自动读取出事先储存的音符,并把这个音符输出。
当选择手动演奏模式时,直接将通过BTN1~BTN7输入的向量当做音符输出yin:
outstd_logic_vector(6downto0);
。
(5)分频预置值产生模块
该模块的功能是通过音符以及高低音选项来查表找到对应的频率值。
在程序中设置了全部音符对应的分频预置数。
通过判断音符产生模块输出的音符yin:
instd_logic_vector(6downto0),以及拨码开关的高低音highlow:
instd_logic_vector(1downto0)控制键,来查找出该音符的频率值,然后将该频率赋值给tone:
outintegerrange0to2000000);
(6)数控分频发声模块
从实验板上面输入的时钟是50MHz的,必须经过分频后由clk_out输出,驱动蜂鸣器发声。
Clk_out的输出频率就对应着音符的音调。
分频系数由来自分频预置值模块的tone:
outintegerrange0to2000000)。
由于直接从数控分频器中出来的输出信号是脉宽极窄的脉冲式信号。
为了利用驱动蜂鸣器,需要再增加一个进程,多波形进行整理,均衡占空比
三、仿真波形及波形分析
1.数码管显示模块仿真波形
波形分析:
不同的yin,和highlow组合,数码管显示不同的字符。
duan[0]~duan[7]对应着数码管的a段到h段,cat[0]~cat[5]控制不同的数码管
2.点阵显示模块仿真波形
不同的yin输入,点阵的col和row会有不同的波形,利用clk_in的上升沿来动态扫描点阵。
从而得显示出指定的图形。
3.自动播放模块仿真波形
当auto置1,clear置0,yin_out输出储存在程序里面的曲子音符,这时候相当于自动播放。
当auto置0,clear置0,yin_out输出从BTN1~BTN7读取的手动输入的信号,这时候相当于手动演奏。
4.分频预置值产生模块仿真波形
波形分析:
输入不同的高低音highlow,和音符yin,输出不同的tone。
而tone将作为发声模块的分频预置值
四、源程序
1.分频模块源程序
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitydiv0is
port(clk_in:
instd_logic;
--输入时钟
clk_tmp:
outstd_logic);
--输出时钟
end;
architecturebofdiv0is
signalclk:
std_logic;
begin
p0:
process(clk_in)
variablet:
integerrange0to2499;
begin
if(clk_in'
eventandclk_in='
1'
)then
ift=2499then--分频系数为2499
cnt:
=0;
clk<
=notclk;
else
=cnt+1;
--每个输入时钟上升沿到来时cnt加1
endif;
endif;
endprocessp0;
clk_tmp<
=clk;
endb;
2.数码管显示源程序
entityshumais
--以分频的时钟输入
yin:
instd_logic_vector(6downto0);
--输入音符
highlow:
instd_logic_vector(1downto0);
--输入高低音
auto:
instd_logic;
--自动播放
auto1:
--自动播放1
duan:
outstd_logic_vector(7downto0);
cat:
outstd_logic_vector(5downto0)
);
architecturebofshumais
signalduant:
std_logic_vector(7downto0);
signalcatt:
std_logic_vector(5downto0);
p1:
process(clk_in,yin,highlow,auto,auto1)
ifauto='
then
catt<
="
111101"
;
duant<
00111111"
--显示“8”表示自动播放
elsifauto1='
catt<
01111111"
--显示“0”表示试音
elsifauto='
0'
if(clk_in='
caseyinis
when"
0000001"
=>
111110"
00000110"
--显示“1”
0000010"
01011011"
--显示“2”
0000100"
01001111"
--显示“3”
0001000"
01100110"
--显示“4”when"
0010000"
01101101"
--显示“5”when"
0100000"
01111101"
--显示“6”when"
1000000"
00000111"
--显示“7”whenothers=>
111111"
00000000"
endcase;
elsif(clk_in='
casehighlowis
10"
01110100"
--显示“L”
01"
00111000"
--显示“H”
whenothers=>
endprocessp1;
cat<
=catt;
duan<
=duant;
endb;
3.点阵显示源程序
entitydianzhenis
--时钟输入
instd_logic_vector(6downto0);
--输入音符
row:
--点阵行向量
col:
outstd_logic_vector(7downto0)--点阵列向量
architecturebofdianzhenis
signalcount:
integerrange0to6;
signalrowt:
signalcolt:
ifcount=6then
count<
=count+1;
--用count来记数
p2:
process(count,yin)
if(yin="
)then
casecountis--点阵显示,表示“1”音符
when0=>
rowt<
11111110"
colt<
01111110"
when1=>
11111101"
when2=>
11111011"
01111100"
when3=>
11110111"
01111000"
when4=>
11101111"
01110000"
when5=>
11011111"
01100000"
when6=>
10111111"
01000000"
whenothers=>
11111111"
endcase;
elsif(yin="
casecountis--点阵显示,表示“2”音符
casecountis--点阵显示,表示“3”音符
01111011"
01111010"
casecountis--点阵显示,表示“4”音符
01110111"
01110110"
casecountis--点阵显示,表示“5”音符
01101111"
01101110"
01101100"
01101000"
casecountis--点阵显示,表示“6”音符
01011111"
01011110"
01011100"
01011000"
01010000"
casecountis--点阵显示,表示“7”音符
00111110"
00111100"
00110000"
00100000"
else
casecountis--点阵显示,表示不输入音符
endif;
endprocessp2;
row<
=rowt;
col<
=colt;
4.选择音符及自动播放源程序
entityautois
port(clk_in:
instd_logic;
--输入时钟
--试音播放
clear:
--复位
yin_in:
instd_logic_vector(6downto0);
yin_out:
outstd_logic_vector(6downto0));
--输出音符
endauto;
architectureaofautois
integerrange0to35;
signaln:
signalyin:
std_logic_vector(6downto0);
p
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 北邮数电 实验 电子琴