北邮数字电路综合实验电子节拍器Word文档格式.docx
《北邮数字电路综合实验电子节拍器Word文档格式.docx》由会员分享,可在线阅读,更多相关《北邮数字电路综合实验电子节拍器Word文档格式.docx(15页珍藏版)》请在冰豆网上搜索。
数码管显示部分根据6位二进制数和3位二进制数显示拍速和节拍类型;
高低音频生成器生成两种音频分别代表强音与弱音,强音与弱音时钟均进入声光提示部分;
声光提示部分根据由节拍选择部分发来的信号与强弱音时钟发出相应的提示声与灯光。
2.
数码管显示部分
节拍选择部分
拍速产生部分
声光提示部分
高低音频生成部分
总体框图
3.分块设计
拍速产生器:
将6位二进制数的十进制初始定义为40,对加减按键进行计时,计时功能通过一个经过分频的时钟来实现,短加减即改变1,长按即每秒改变5,最后通过一个检测来判断改变后的数值是否在40-120的区间内,若低于40则以40计,高于120以120计,并输出这个6位二进制数;
通过计算将6位二进制数计算为相应的分频比并输出这一分频后的时钟(由于节拍器要求八分音符的节拍要求产生的时钟频率为对应拍速频率的二倍)。
节拍选择部分:
通过一个3位二进制数来代表节拍类型,题目要求一个按键来控制节拍,则通过检测按键的上升沿来改变3位二进制数,根据节拍出现的顺序分别将6个节拍类型分配到各个数值中;
通过一个选择模块判断,若选择的为四分音符则需要对拍速时钟进行二分频;
通过一个切换模块实现与拍速时钟同步的信号生成,1/4拍信号为1111…、2/4为101010…、3/4为100100…、4/4为10001000…、3/8与3/4相同、6/8为100000100000…。
高低音频生成部分:
通过分频器对时钟分频产生两种在人的听觉范围内的不同频率的时钟。
数码管显示部分:
通过扫频将拍速产生器的6位二进制数和节拍选择器的3位二进制数显示在数码管上。
声光提示部分:
先将由高低音频产生器发来的连续的两个不同频率时钟变为与拍速时钟同步的间歇时钟;
判断器会判断由节拍选择器发来的信号,若信号为1则高频(重音)进入蜂鸣器且灯1发光,若信号为0则低频(轻音)进入蜂鸣器且灯2发光。
仿真波形及波形分析
1.拍速产生器(由于长按要求的endtime较长,无法以50m的时钟进行仿真,而拍速时钟分频比较大,所以输出的拍速时钟频率较小在仿真中为直线)
+键短按:
plusbtn为+键,从number波形可以看出每当plusbtn出现一个上升沿时number的数值增加1;
+键长按:
plusbtn为1持续了约4秒,可以从波形中看出大约plusbtn每持续1秒number增加5,仿真中共增加了20;
-键短按:
substractbtn为-键,从number波形可以看出每当substractbtn出现一个上升沿时number的数值减小1;
-键长按:
substractbtn为1持续了约秒,可以从波形中看出大约substractbtn每持续1秒number减小5;
2.节拍选择器
a为切换节拍类型的按键,每一个上升沿b增加1;
根据b的不同值来选择是否对拍速时钟进行分频,其中1、2、3、4分别代表1/4、2/4、3/4、4/4对拍速时钟进行二分频;
5、6分别代表3/8、6/8不分频;
根据b的不同值改变信号o(b=1信号为1111…、b=2为101010…、b=3为100100…、b=4为10001000…、b=5为100100…、b=6为100000100000…)
3.高低音频生成器
高频;
低频
4.数码管显示器
设定bpm1004/4拍;
5.声光提示器
ai为高音频信号,bi为低音频信号,clk为拍速时钟,将连续的音频信号转变为和拍速时钟同步的间歇信号;
i为节拍选择器的输入信号,aibi应分别为上图中的间歇信号(此处仅为测试此原件功能暂时以连续信号代替)可以看出i=1时输出为高频信号,i=0时输出低频信号。
源程序
拍速产生器(speedmaker):
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entityspeedmakeris
port(
plusbtn:
instd_logic;
subtractbtn:
clk:
speednumberout:
outintegerrange0to127;
clkout3:
outstd_logic
);
endentity;
architectureaofspeedmakeris
signalinc:
integerrange0to200;
signaldec:
integerrange0to80;
signalcntplus:
integerrange0to10;
signalcntsub:
signalspeed:
integerrange0to127;
signalcounter:
integerrange0to2500000;
signalcouter:
signalclkout:
std_logic;
signalclkout2:
begin
p1:
process(clk,counter)—计时时钟
ifclk'
eventandclk='
1'
then
counter<
=counter+1;
ifcounter=2500000then
clkout<
=notclkout;
=0;
elsenull;
endif;
endprocess;
p2:
process(clkout,plusbtn,subtractbtn)--拍速的加减
ifclkout'
eventandclkout='
ifplusbtn='
cntplus<
=cntplus+1;
ifcntplus>
3then
inc<
=inc+5;
else
=inc;
elsifcntplus>
0then
=inc+1;
ifsubtractbtn='
cntsub<
=cntsub+1;
ifcntsub>
dec<
=dec+5;
else
=dec;
elsifcntsub>
1then
=dec+1;
speed<
=inc-dec+40;
ifspeed>
120then
=80;
elsifspeed<
40then
=0;
p3:
process(clk,speed)--拍速超出范围的处理
speednumberout<
=120;
=40;
=speed;
p4:
process(clk,speed)—拍速时钟的产生
variabledivmod:
integerrange0to100000000;
divmod:
=100000000/speed;
clkout3<
=clkout2;
ifclk'
couter<
=couter+1;
ifcouter=divmodthen
clkout2<
=notclkout2;
endprocess;
endarchitecture;
节拍选择器:
entityselect4or8is
port(clk,a:
b:
outstd_logic_vector(2downto0));
architecturebehavofselect4or8is
signalcount:
std_logic_vector(2downto0);
process(clk)--对b赋值
begin
ifa'
eventanda='
count<
=count+1;
b<
=count;
entityfenpin4or8is
port(clk:
clkout:
outstd_logic);
architecturebehavoffenpin4or8is
integerrange0to1;
signalcout:
std_logic:
='
0'
;
process(clk)—判断是否为四分音(四分音即进行二分频)
=cout;
ifb="
001"
orb="
010"
011"
100"
000"
then
ifcount=1then
cout<
=notcout;
elsecout<
=clk;
entityselectjiepaiis
o:
architecturebehavofselectjiepaiis
signalcoant:
process(clk)—根据节拍类型产生和拍速时钟同步的信号
casebis
when"
=>
coant<
="
101"
110"
whenothers=>
endcase;
ifcoant<
o<
ifcount=coantthen
ifcount="
o<
='
声光提示器:
entitypulseis
port(ai,bi,clk:
ao,bo:
architecturebehavofpulseis
process(clk)—将连续音频信号变为间歇音频信号
caseclkis
when'
ao<
=ai;
bo<
=bi;
entityqiehuanis
port(ai,bi,i,clk:
o,light1,light2:
architecturebehavofqiehuanis
process(clk)--产生最终的beep信号和灯光提示信号
caseiis
light1<
=ai;
light2<
=bi;
功能说明及资源利用情况
插上数据线开始打节拍,短按+键拍速加一,长按+键拍速每秒加五,短按-键拍速减一,长按-键拍速每秒减五;
按下select键切换节拍,顺序为1/4、2/4、3/4、4/4、3/8、6/8,蜂鸣器在每小节的第一拍发出重音,灯光为红灯,在小节中其他节拍上发出轻音,灯光为黄色;
数码管显示当前的拍速和节拍类型。
占用逻辑单元数为810/1270,总管脚数为20/116
故障及问题分析
故障1:
在按下select按键或短按+/-键时会出现按一次切换多次节拍和增加或减少多次的情况
问题分析:
由于实验板上微动按键本身硬件问题会造成按一次产生多个时钟上升沿的情况,于是在按键的输入前添加了防抖模块,问题解决。
故障2:
灯光提示会持续发光不随节拍闪烁
查找代码发现灯光部分代码错误,错误代码如下:
=1;
很显然会造成灯光持续发光的问题,于是更改代码如下:
更改后灯光会随节拍闪烁,闪烁时刻与频率也与蜂鸣器吻合,发光顺序正确,但会有一定的几率发生灯光延续,如3/4拍灯光顺序为红、黄、黄,而实际为红、红黄同亮、黄;
再次查看代码后进行了一下更改:
加入了灯光输出归零操作后,灯光提示正常。