北邮数电实验电子琴Word格式文档下载.docx

上传人:b****1 文档编号:3832822 上传时间:2023-05-02 格式:DOCX 页数:29 大小:475.06KB
下载 相关 举报
北邮数电实验电子琴Word格式文档下载.docx_第1页
第1页 / 共29页
北邮数电实验电子琴Word格式文档下载.docx_第2页
第2页 / 共29页
北邮数电实验电子琴Word格式文档下载.docx_第3页
第3页 / 共29页
北邮数电实验电子琴Word格式文档下载.docx_第4页
第4页 / 共29页
北邮数电实验电子琴Word格式文档下载.docx_第5页
第5页 / 共29页
北邮数电实验电子琴Word格式文档下载.docx_第6页
第6页 / 共29页
北邮数电实验电子琴Word格式文档下载.docx_第7页
第7页 / 共29页
北邮数电实验电子琴Word格式文档下载.docx_第8页
第8页 / 共29页
北邮数电实验电子琴Word格式文档下载.docx_第9页
第9页 / 共29页
北邮数电实验电子琴Word格式文档下载.docx_第10页
第10页 / 共29页
北邮数电实验电子琴Word格式文档下载.docx_第11页
第11页 / 共29页
北邮数电实验电子琴Word格式文档下载.docx_第12页
第12页 / 共29页
北邮数电实验电子琴Word格式文档下载.docx_第13页
第13页 / 共29页
北邮数电实验电子琴Word格式文档下载.docx_第14页
第14页 / 共29页
北邮数电实验电子琴Word格式文档下载.docx_第15页
第15页 / 共29页
北邮数电实验电子琴Word格式文档下载.docx_第16页
第16页 / 共29页
北邮数电实验电子琴Word格式文档下载.docx_第17页
第17页 / 共29页
北邮数电实验电子琴Word格式文档下载.docx_第18页
第18页 / 共29页
北邮数电实验电子琴Word格式文档下载.docx_第19页
第19页 / 共29页
北邮数电实验电子琴Word格式文档下载.docx_第20页
第20页 / 共29页
亲,该文档总共29页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

北邮数电实验电子琴Word格式文档下载.docx

《北邮数电实验电子琴Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《北邮数电实验电子琴Word格式文档下载.docx(29页珍藏版)》请在冰点文库上搜索。

北邮数电实验电子琴Word格式文档下载.docx

关于提高要求中的手动演奏的音符存储、播放功能,我打算通过编程实现类似数据结构中队列的模块,来储存手动输入的音符,然后在要播放的时候,队列里面的音符依次出队,从而实现音符储存播放的功能。

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)

variablecnt:

integerrange0to2499;

begin

if(clk_in'

eventandclk_in='

1'

)then

ifcnt=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);

be

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 工程科技 > 能源化工

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2