基于verilog语言简易电子琴设计数字电子技术课程设计报告Word格式.docx
《基于verilog语言简易电子琴设计数字电子技术课程设计报告Word格式.docx》由会员分享,可在线阅读,更多相关《基于verilog语言简易电子琴设计数字电子技术课程设计报告Word格式.docx(22页珍藏版)》请在冰豆网上搜索。
低8度音:
基本音频率/2,例如低音1的频率为523/2=261.5Hz。
高8度音:
基本音频率×
2,例如高音1的频率为523×
2=1046Hz.。
不同的频率产生利用给定的时钟脉冲来进行分频实现。
(2)消抖的原理:
按键默认输入逻辑‘1’,当有按键按下时对应的输入为逻辑‘0’(但会存在抖动),当FPGA开始检测到该引脚从‘1’变为‘0’后开始定时(按键抖动时间大约10ms),定时时间结束后若该引脚仍然为‘0’则表示确实发生按键按下,否则视为抖动而不予以理会;
按键松开过程的消抖处理和按下时原理一样。
(3)原理框图
四、管脚对应表
信号名称
对应FPGA管脚名
说明
1MHz
L2
基准时钟
OU
F3
音频输出
S1
F8
基本功能按键
S2
A14
S3
F10
S4
B16
S5
F12
S6
B17
S7
F15
S8
B18
BT1
M1
扩展功能按键
BT2
M2
BT3
U12
BT4
U11
五、实验过程
1、设计按键防抖模块
(1)设计程序
modulexiaodou(rst,clk_1M,out);
inputclk_1M;
inputrst;
outputout;
wirerst;
regout;
reg[24:
0]cnt;
reg[2:
0]state;
parameterstate0=3'
b000,
state1=3'
b001,
state2=3'
b010,
state3=3'
b011,
state4=3'
b100,
state5=3'
b101;
always@(posedgeclk_1M)
begin
cnt<
=24'
d0;
case(state)
state0:
if(!
rst)
begin
out=0;
state<
=state1;
end
else
=state0;
state1:
begin
out=0;
cnt<
=cnt+1;
if(cnt==10000)
state<
=state2;
else
begin
//out=1;
end
end
state2:
=state3;
state3:
begin
out=1;
cnt<
=0;
//state<
=state4;
state4:
if(cnt==200000)
out=1;
=state5;
state5:
if(rst)
state<
endcase
end
endmodule
(2)原理图及仿真波形
2、按键识别模块设计
(1)程序设计
modulexkey(a,b,c,d,e,f,g,h,l,qout);
inputa,b,c,d,e,f,g,h,l;
outputqout;
reg[8:
0]qin;
reg[4:
0]qout;
always@(aorborcordoreorforgorhorl)
qin[8]=a;
qin[7]=b;
qin[6]=c;
qin[5]=d;
qin[4]=e;
qin[3]=f;
qin[2]=g;
qin[1]=h;
qin[0]=l;
end
always@(qin)
case(qin)
9'
b100000000:
qout<
=5'
b00001;
b010000000:
b00010;
b001000000:
b00011;
b000100000:
b00100;
b000010000:
b00101;
b000001000:
b00110;
b000000100:
b00111;
b100000010:
b01000;
b010000010:
b01001;
b001000010:
b01010;
b000100010:
b01011;
b000010010:
b01100;
b000001010:
b01101;
b000000110:
b01110;
b100000001:
b01111;
b010000001:
b10000;
b001000001:
b10001;
b000100001:
b10010;
b000010001:
b10011;
b000001001:
b10100;
b000000101:
b10101;
b000000000:
b00000;
b000000010:
b000000001:
default:
endcase
3、分频器模块的设计
modulefenpin(in,clk_1M,out);
inputin;
inputclk_1M;
outputout;
wire[4:
0]in;
regout;
reg[11:
0]count;
reg[4:
initial
count<
=12'
parameterstate0=5'
b00000,
state1=5'
b00001,
state2=5'
b00010,
state3=5'
b00011,
state4=5'
b00100,
state5=5'
b00101,
state6=5'
b00110,
state7=5'
b00111,
state8=5'
b01000,
state9=5'
b01001,
state10=5'
b01010,
state11=5'
b01011,
state12=5'
b01100,
state13=5'
b01101,
state14=5'
b01110,
state15=5'
b01111,
state16=5'
b10000,
state17=5'
b10001,
state18=5'
b10010,
state19=5'
b10011,
state20=5'
b10100,
state21=5'
b10101,
state22=5'
b10110;
always@(posedgeclk_1M)
case(state)
state0:
//if(allin==5'
b10110)
//state<
if(in==5'
b00001)
state<
elseif(in==5'
b00010)
b00011)
b00100)
b00101)
b00110)
=state6;
b00111)
=state7;
b01000)
=state8;
b01001)
=state9;
b01010)
=state10;
b01011)
=state11;
b01100)
=state12;
b01101)
=state13;
b01110)
=state14;
b01111)
=state15;
b10000)
state