VHDL硬件描述語言程序設(shè)計(jì)簡(jiǎn)易電子琴演奏器_第1頁
VHDL硬件描述語言程序設(shè)計(jì)簡(jiǎn)易電子琴演奏器_第2頁
VHDL硬件描述語言程序設(shè)計(jì)簡(jiǎn)易電子琴演奏器_第3頁
VHDL硬件描述語言程序設(shè)計(jì)簡(jiǎn)易電子琴演奏器_第4頁
VHDL硬件描述語言程序設(shè)計(jì)簡(jiǎn)易電子琴演奏器_第5頁
已閱讀5頁,還剩18頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

VHDL硬件描述語言程序設(shè)計(jì)

簡(jiǎn)易電子琴演奏器

姓名:chi

目錄

一、設(shè)計(jì)課題的任務(wù)要求...............................................3

二、系統(tǒng)設(shè)計(jì).........................................................4

三、仿真波形及波形分析...............................................7

四、源程序..........................................................9

五、功能說明........................................................20

六、元器件清單及資源利用情況.......................................21

七、故障及問題分析..................................................22

八、總結(jié)和結(jié)論......................................................23

設(shè)計(jì)課題的任務(wù)要求

基本要求:

1、用8X8點(diǎn)陣顯示“1234567”七個(gè)音符構(gòu)成的電子琴鍵盤。其中點(diǎn)陣的第一列

用一個(gè)LED點(diǎn)亮表示音符“1”,第二列用二個(gè)LED點(diǎn)亮表示音符“2”,依此類推,

如下圖所示。

oooo。0O

oooo。?O

oooo??O

oooe??O

oooe??O

ooee?O

oete??O

ee^e??O

?

1234567

圖1點(diǎn)陣顯示的電子琴鍵盤

2、用BTN1?BTN7七個(gè)按鍵模擬電子琴手動(dòng)演奏時(shí)的“1234567”七個(gè)音符。當(dāng)某

個(gè)按鍵按下時(shí),數(shù)碼管顯示相應(yīng)的音符,點(diǎn)陣上與之對(duì)應(yīng)的音符顯示列全滅,同時(shí)

蜂鳴器演奏相應(yīng)的聲音;當(dāng)按鍵彈開時(shí)數(shù)碼管顯示的音符滅掉,點(diǎn)陣顯示恢復(fù),峰

鳴器停止聲音的輸出。下圖所示為按下BTN3按鍵時(shí)點(diǎn)陣的顯示情況。

ooOo。0O

ooOo。?O

ooOo??O

ooOe??O

ooOe??O

ooOe?O

oeOe??O

eeO??O

*?

1234567

圖2按鍵按下后的點(diǎn)陣顯示

3、由撥碼開關(guān)切換選擇高、中、低音,并用數(shù)碼管進(jìn)行相應(yīng)的顯示。

4、通過按鍵BTNO進(jìn)行復(fù)位,控制點(diǎn)陣顯示圖1的初始狀態(tài)。

提高要求:

1、可通過一個(gè)撥碼開關(guān)進(jìn)行手動(dòng)/自動(dòng)演奏的切換,并與點(diǎn)陣顯示配合增加自動(dòng)演奏

樂曲的功能。

2、增加手動(dòng)演奏的音符存儲(chǔ)、播放功能。

二、系統(tǒng)設(shè)計(jì)

1.設(shè)計(jì)思路

簡(jiǎn)易電子琴的制作主要是利用不同頻率的波來驅(qū)動(dòng)蜂鳴器發(fā)出聲響。通過輸入不同的音

符來設(shè)置不同的分頻系數(shù),使得50MHz的主頻分頻出不同頻率的波。同時(shí),演奏的音符還

可以通過數(shù)碼管和8*8點(diǎn)陣來動(dòng)態(tài)顯示。

根據(jù)系統(tǒng)設(shè)計(jì)要求,該電子琴設(shè)計(jì)采用自頂向下的設(shè)計(jì)方法。整體的功能通過不同的底

層模塊配合來完成電子琴的功能。底層模塊主要包括樂曲自動(dòng)演奏模塊、分頻預(yù)置值產(chǎn)生模

塊和數(shù)控分頻模塊,數(shù)碼管顯示模塊,8*8點(diǎn)陣顯示模塊五部分組成。用這種設(shè)計(jì)思路把整

個(gè)系統(tǒng)分為了若干個(gè)模塊,然后再在頂層文件中將各個(gè)模塊組合在一起,從而體現(xiàn)出超、高

速硬件描述語言VHDL的優(yōu)勢(shì),

關(guān)于提高要求中通過一個(gè)撥碼開關(guān)進(jìn)行手動(dòng)/自動(dòng)演奏的切換,并與點(diǎn)陣顯示配合增加自

動(dòng)演奏樂曲的功能,我打算將一首曲子的音符儲(chǔ)存在自動(dòng)播放的數(shù)組里面,然后通過計(jì)數(shù)器

來順序播放儲(chǔ)存的音符。

關(guān)于提高要求中的手動(dòng)演奏的音符存儲(chǔ)、播放功能,我打算通過編程實(shí)現(xiàn)類似數(shù)據(jù)結(jié)構(gòu)

中隊(duì)列的模塊,來儲(chǔ)存手動(dòng)輸入的音符,然后在要播放的時(shí)候,隊(duì)列里面的音符依次出隊(duì),

從而實(shí)現(xiàn)音符儲(chǔ)存播放的功能。

2.總體框圖

圖3簡(jiǎn)易電子琴總體結(jié)構(gòu)框圖

圖4簡(jiǎn)易電子琴邏輯流程圖

圖5簡(jiǎn)易電子琴VHDL電路原理圖

3.分塊設(shè)計(jì)

(1)分頻模塊divO

由于實(shí)驗(yàn)電路板的主頻是50Mhz,為了數(shù)碼管和點(diǎn)陣的刷新顯示,我們必須將50Mhz的

頻率進(jìn)行分頻。分頻的程序來自電路中心的網(wǎng)站上面。在這個(gè)模塊里,我設(shè)置分頻系數(shù)為

cnt=2499o從實(shí)驗(yàn)結(jié)果看,這個(gè)分頻對(duì)數(shù)碼管和點(diǎn)陣的顯示有很好的效果

(2)數(shù)碼管顯示模塊shuma

我使用了2個(gè)數(shù)碼管,第一個(gè)數(shù)碼管顯示1~7的音符,第二個(gè)數(shù)碼管顯示相關(guān)的信息,

比如高音用H表示,低音用L表示,自動(dòng)播放用A表示。兩個(gè)數(shù)碼管分別刷新,但由于刷

新頻率太快,人眼不能察覺,以為是兩個(gè)數(shù)碼管是同時(shí)亮的。在程序中我們通過duan:out

std_logic_vector(7downto0)和cat:outstd_logic_vector(5downto0)來控制數(shù)碼管的顯示。當(dāng)

輸入不同的音符和不同的控制信息時(shí),duan和cat向量都有不同的值與之對(duì)應(yīng)。

(3)8*8點(diǎn)陣顯示模塊dianzhen

8*8點(diǎn)陣的顯示和數(shù)碼管的顯示運(yùn)用了同樣的原理,在程序中我們通過row:out

std_logic_vector(7downto0)和col:outstd_logic_vector(7downto0)這兩個(gè)向量來控制點(diǎn)陣的

顯示。當(dāng)輸入不同的音符時(shí),點(diǎn)陣顯示相應(yīng)的形狀。

(4)音符產(chǎn)生模塊autOo

這個(gè)模塊的功能是,選擇的不同模式來產(chǎn)生不同的音符。當(dāng)選擇自動(dòng)播放模式時(shí),隨著

計(jì)數(shù)器count的值增加,即地址值遞增時(shí),程序自動(dòng)讀取出事先儲(chǔ)存的音符,并把這個(gè)音符

輸出。當(dāng)選擇手動(dòng)演奏模式時(shí),直接將通過BTNLBTN7輸入的向量當(dāng)做音符輸出yin:out

std_logic_vector(6downto0);?

(5)分頻預(yù)置值產(chǎn)生模塊

該模塊的功能是通過音符以及高低音選項(xiàng)來查表找到對(duì)應(yīng)的頻率值。在程序中設(shè)置了全

部音符對(duì)應(yīng)的分頻預(yù)置數(shù)。通過判斷音符產(chǎn)生模塊輸出的音符yin:instd_logic_vector(6

downto0),以及撥碼開關(guān)的高低音highlow:instd_logic_vector(ldownto0)控制鍵,來查找出

該音符的頻率值,然后將該頻率賦值給

tone:outintegerrange0to2000000);o

(6)數(shù)控分頻發(fā)聲模塊

從實(shí)驗(yàn)板上面輸入的時(shí)鐘是50MHz的,必須經(jīng)過分頻后由clk_out輸出,驅(qū)動(dòng)蜂鳴器發(fā)

聲。Clk_out的輸出頻率就對(duì)應(yīng)著音符的音調(diào)。分頻系數(shù)由來自分頻預(yù)置值模塊的tone:out

由于直接從數(shù)控分頻器中出來的輸出信號(hào)是脈寬極窄的脈沖式

integerrangeOto2000000)o

信號(hào)。為了利用驅(qū)動(dòng)蜂鳴器,需要再增加一個(gè)進(jìn)程,多波形進(jìn)行整理,均衡占空比

三、仿真波形及波形分析

1,數(shù)碼管顯示模塊仿真波形

MasterTimeBar:17.425nsPointer:12.48usInterval:12.46usStart:)p$Erw

)PS1.28us2.56us3.84us5.12us6.4us7.68us8.96us10.24us

Name

17.43ns17.425ns

?0clk_inA0_r-1_rT____I_I____I~~L-L__rn__i_iJ-I__I_L_r1__

?1autoA0

是2田HRA[16][16]X[0]XC161X0][16]X0]X[8][0][2]x

?10國(guó)highlowA[2][2X[0X[1]X[0]

⑥13□atA>>;*=X?X=x>x?>X?瓜?XX

014-...5]A1

315-...4]A1

?16-...3]A1

-...2]A1

318-...1]A1l_J

L.0]1_1

~19A0-LJ-u1_1

⑥20曰duanAmj[0]0]:m*[0])[0]

Q21-.7]A0

222-...6]A11_r_L_-Ln_I_I

323-...5]A1—1___iii_-LL

324-...4]A0r-L_r

Q25-...3]A1n_11_-LJ_L_

?26-...2]A1—I_rn

327A0

-...1]—J—L_

???

<i]>|

波形分析:不同的yin,和highlow組合,數(shù)碼管顯示不同的字符。duan[O]~duan⑺對(duì)應(yīng)著數(shù)

碼管的a段到h段,cat[0]~cat[5]控制不同的數(shù)碼管

2.點(diǎn)陣顯示模塊仿真波形

3.自動(dòng)播放模塊仿真波形

這時(shí)候相當(dāng)于手動(dòng)演奏。

4,分頻預(yù)置值產(chǎn)生模塊仿真波形

波形分析:輸入不同的高低音highlow,和音符yin,輸出不同的tone。而tone將作為發(fā)聲模塊

的分頻預(yù)置值

四、源程序

1.分頻模塊源程序

libraryieee;

useieee.std_logic_1164.all;

useieee.std_logic_unsigned.all;

entitydivOis

port(clk_in:instdjogic;■■輸入時(shí)鐘

clk_tmp:outstdjogic);-輸出時(shí)鐘

end;

architecturebofdivOis

signalelk:std_logic;

begin

pO:process(clk_in)

variableent:integerrange0to2499;

begin

if(clkjn'eventandclkjn='l')then

ifcnt=2499then-分頻系數(shù)為2499

cnt:=O;

clk<=notelk;

else

cnt:=cnt+l;-每個(gè)輸入時(shí)鐘上升沿到來時(shí)

ent加1

endif;

endif;

endprocesspO;

clk_tmp<=clk;

endb;

2.數(shù)碼管顯示源程序

libraryieee;

useieee.std_logic_1164.all;

useieee.std_logic_unsigned.all;

entityshumais

port(clk_in:instd_logic;-以分頻的時(shí)鐘輸入

yin:instd_logic_vector(6downto0);-輸入音符

highlowinstd_logic_vector(ldownto0);-輸入高低音

auto:instdjogic;-自動(dòng)播放

autol:instdjogic;-自動(dòng)播放1

duan:outstd_logic_vector(7downto0);

cat:outstd_logic_vector(5downto0)

end;

architecturebofshumais

signalduant:std_logic_vector(7downto0);

signalcatt:std_logic_vector(5downto0);

begin

pl:process(clk_in,yin,highlow,auto,autol)

begin

ifauto='l'then

catt<="111101";duant<=,,00111111";-顯小"8"表不自動(dòng)播放

elsifautol='l'then

catt<=,,111101";duant<="01111111";-顯示“0”表示試音

elsifauto='0'then

if(clk_in='0')then

caseyinis

when"0000001"=>catt<="111110";duant<="00000110";"1”

when“0000010”=>catt<=”111110”;duant<=“01011011”;--顯示“2”

when“0000100”=>catt<=”111110”;duant<="OlOOini”;--顯示“3”

when”0001000”=>catt<=”111110”;duant<=“01100110”;--顯示“4”

when”0010000”=>catt<二"llino”;duant<=“01101101”;--顯示“5”

when"0100000"=>catt<="111110";duant<="01111101";-S^"6”

when“1000000”=>catt<=”111110”;duant<=”00000111”;--顯示“7”

whenothers=>catt<="llllll";duant<="00000000";

endcase;

elsif(clk_in='l')then

casehighlowis

when"10"=>catt<="111101";duant<="01110100";一顯示“L”

when"01"=>€3?<="111101"^03^<="00111000";一顯示"H”

whenothers=>catt<="llllll";duant<="00000000";

endcase;

endif;

endif;

endprocesspl;

cat<=catt;

duan<=duant;

endb;

3.點(diǎn)陣顯示源程序

libraryieee;

useieee.std_logic_1164.all;

useieee.std_logic_unsigned.all;

entitydianzhenis

port(clk_in:instd_logic;一時(shí)鐘輸入

yin:instd_logic_vector(6downto0);-輸入音符

row:outstd_logic_vector(7downto0);-點(diǎn)陣行向量

col:outstd_logic_vector(7downto0)-點(diǎn)陣列向量

Vb

end;

architecturebofdianzhenis

signalcount:integerrange0to6;

signalrowt:std_logic_vector(7downto0);

signalcolt:std_logic_vector(7downto0);

begin

pl:process(clk_in)

begin

if(clkjn'eventandclk_in=T)then

ifcount=6then

count<=0;

else

count<=count+l;一用count來記數(shù)

endif;

endif;

endprocesspl;

p2:process(count,yin)

begin

if(yin="0000001")then

casecountis--點(diǎn)陣顯示,表示“1”音符

when0=>rowt<=Ulinil0”;coltv=5111110”;

when1=>rowt<="11111101,,;colt<=,,01111110";

when2=>rowt<=Ulin0"';colt<=”01111100”;

when3=>rowt<=,,11110111";colt<=,,01111000";

when4=>rowt<=,,11101111";colt<="01110000";

when5=>rowt<=,,11011111,,;colt<="01100000";

when6=>rowt<=,,10111111";colt<="01000000";

whenothers=>rowt<="llllllll";colt<="00000000";

endcase;

elsif(yin="0000010")then

casecountis--點(diǎn)陣顯示,表示“2”音符

when0=>rowt<=,,11111110";colt<="01111101";

when1=>rowt<二”llini01”;colt<="01111100”;

when2=>rowt<=,,11111011,,;colt<="01111100";

when3=>rowt<=,,11110111,,;colt<="01111000";

when4=>rowt<=,,11101111,,;colt<="01110000";

when5=>rowt<=U10ni"';colt<=”01100000”;

when6=>rowt<="10111111";colt<=,,01000000";

whenothers=>rowt<="llllllll";colt<="00000000";

endcase;

elsif(yin="0000100")then

casecountis--點(diǎn)陣顯示,表示“3”音符

when0=>rowt<=,,11111110";colt<="01111011";

when1=>rowt<="11111101";colt<="01111010";

when2=>rowt<=,,11111011";colt<=,,01111000";

when3=>rowt<="11110111";colt<="01111000";

when4=>rowt<=,,11101111,,;colt<="01110000";

when5=>rowt<=,,11011111";colt<="01100000";

when6=>rowt<="10111111";colt<="01000000";

whenothers=>rowt<="llllllll";colt<="00000000";

endcase;

elsif(yin="0001000")then

casecountis--點(diǎn)陣顯示,表示“4”音符

when0=>rowt<=Ullini0";colt<="01110in”;

when1=>rowt<=,,11111101";colt<="01110110";

when2=>rowt<=,,11111011";colt<=,,01110100";

when3=>rowt<=”11110111”;colt<="01110000”;

when4=>rowt<="11101111";colt<="01110000";

when5=>rowt<=,,11011111";colt<="01100000";

when6=>rowt<="10111111";colt<="01000000";

whenothers=>rowt<="llllllll";colt<="00000000";

endcase;

elsif(yin="0010000")then

casecountis--點(diǎn)陣顯示,表示“5”音符

when0=>rowt<=Ullini0";colt<="01101in”;

when1=>rowt<=,,11111101";colt<="01101110";

when2=>rowt<="11111011,,;colt<="01101100";

when3=>rowt<=,,11110111,,;colt<="01101000";

when4=>rowt<=,,11101111,,;colt<="01100000";

when5=>rowt<=”110111ll”;colt<=”01100000”;

when6=>rowt<="10111111";colt<=,,01000000";

whenothers=>rowt<="llllllll";colt<="00000000";

endcase;

elsif(yin="0100000")then

casecountis--點(diǎn)陣顯示,表示“6”音符

when0=>rowt<=,,11111110";colt<="01011111";

when1=>rowt<=,,11111101,,;colt<="01011110";

when2=>rowt<=,,11111011";colt<=,,01011100";

when3=>rowt<=U11101ir;colt<="01011000”;

when4=>rowt<="11101111,,;colt<="01010000";

when5=>rowt<=,,11011111";colt<="01000000";

when6=>rowt<=”101111ir;colt<="01000000”;

whenothers=>rowt<="llllllll";colt<="00000000";

endcase;

elsif(yin="1000000")then

casecountis--點(diǎn)陣顯示,表示"7"音符

when0=>rowt<=Ullini0";colt<="00111111”;

when1=>rowt<=,,11111101";colt<="00111110";

when2=>rowt<="11111011,,;colt<="00111100";

when3=>rowt<=,,11110111,,;colt<="00111000";

when4=>rowt<=,,11101111";colt<=,>00110000";

when5=>rowt<="11011111,,;colt<="00100000";

when6=>rowt<="10111111";colt<=,,00000000";

whenothers=>rowt<="llllllll";colt<="00000000";

endcase;

else

casecountis--點(diǎn)陣顯示,表示不輸入音符

when0=>

when1=>rowt<=,,11111101";colt<=,,01111110";

when2=>rowt<="11111011";colt<="01111100";

when3=>rowt<="11110111";colt<="01111000";

when4=>rowt<="11101111";colt<="01110000";

when5=>^1<="11011111";6011<="01100000";

when6=>rowt<=,,10111111,,;colt<=,,01000000";

whenothers=>rowt<="llllllll";colt<="00000000";

endcase;

endif;

endprocessp2;

row<=rowt;

col<=colt;

endb;

4.選擇音符及自動(dòng)播放源程序

libraryieee;

useieee.std_logic_1164.all;

useieee.std_logic_unsigned.all;

entityautois

port(clk_in:instd_logic;-輸入時(shí)鐘

auto:instdjogic;-自動(dòng)播放

autol:instd_logic;-試音播放

clear:instd_logic;-復(fù)位

yin_in:instd_logic_vector(6downto0);-輸入音符

yin_out:outstd_logic_vector(6downto0));-輸出音符

endauto;

architectureaofautois

signalcount:integerrange0to35;

signaln:integerrange0to6;

signalyin:std_logic_vector(6downto0);

begin

pl:process(clk_in,clear)

variablei:integerrange0to63000000;

begin

ifclear-1'then

count<=0;

elsif(clkjn'eventandclkjn=’1')then

if(i=20000000)then

i:=0;

ifcount=15then

count<=0;-自動(dòng)播放count記數(shù)

else

count<=count+l;

endif;

ifn=6then

n<=0;-試音播放n記數(shù)

else

n<=n+l;

endif;

else

i:=i+l;

endif;

endif;

endprocesspl;

p2:process(count,auto,yin_in,clear)

begin

ifclear='l'then

yin<="0000000";-音符清零

else

ifauto='l'then-自動(dòng)播放歌曲

casecountis

when1=>yin<="0000100";-3

when2=>yin<="1000000";-7

when3=>yin<="0000100";-3

when4=>yin<="0100000";-6

when5=>yin<="0010000";-5

when6=>yin<="0100000";-6

when7=>yin<="0000001";-1

when8=>yin<="0000100";-3

when9=>yin<="0010000";-5

when10=>yin<="0000100";-3

when11=>yin<="0000100";-3

when12=>yin<="0001000";-4

when13=>yin<="0000100";-2

when14=>yin<="0001000";-4

whenothers=>yin<="0000000";

endcase;

elsifautol='l'then

casenis-試音播放

when0=>yin<="0000001";-1

when1=>yin<="0000010";-2

when2=>yin<="0000100";-3

when3=>yin<="0001000";-4

when4=>yin<="0010000";-5

when5=>yin<="0100000";-6

when6=>yin<="1000000";

whenothers=>yin<="0000000";

endcase;

else

yin<=yin_in;―動(dòng)手演奏

endif;

endif;

endprocessp2;

yin_out<=yin;

enda;

5.預(yù)置分頻系數(shù)模塊源代碼

libraryieee;

useieee.std_logic_1164.all;

useieee.std_logic_unsigned.all;

entityseletoneis

port(highlow:instd_logic_vector(ldownto0);-高低音

yin:instd_logic_vector(6downto0);-要演奏的音符

tone:outintegerrange0to2000000);-預(yù)置分頻系數(shù)

endseletone;

architectureaofseletoneis

signaltoneO:integerrange0to2000000;

begin

process(highlow,yin)

begin

ifhighlow="00"then

caseyinis--中音剖J分

when"0000001"=>tone0<=523;

when"0000010"=>tone0<=587;

when"0000100"=>tone0<=659;

when"0001000"=>tone0<=698;

when"0010000"=>tone0<=784;

when"0100000"=>tone0<=880;

when"1000000"=>tone0<=988;

whenothers=>tone0<=2000000;

endcase;

elsifhighlow="10"then-高音部分

caseyinis

when"0000001"=>tone0<=1045;

when"0000010"=>tone0<=1174;

when"0000100"=>tone0<=1318;

when"0001000"=>tone0<=1396;

when"0010000"=>tone0<=1568;

when"0100000"=>tone0<=1760;

when"1000000"=>tone0<=1975;

whenothers=>tone0<=2000000;

endcase;

elsifhighlow="01"then-低音部分

caseyinis

when"0000001"=>tone0<=261;

when"0000010"=>tone0<=293;

when"0000100"=>tone0<=329;

when"0001000"=>tone0<=349;

when"0010000"=>tone0<=392;

when"0100000"=>tone0<=440;

when"1000000"=>tone0<=494;

whenothers=>tone0<=2000000;

endcase;

endif;

endprocess;

tone<=tone0;

enda;

6.分頻發(fā)音模塊源代碼

libraryieee;

useieee.std_logic_1164.all;

useieee.std_logic_unsigned.all;

entitydivis

port(clk_in:instd_logic;-輸入時(shí)鐘

tone:inintegerrange0to2000000;-預(yù)置頻率

clk_out:outstd_logic);-輸出時(shí)鐘

enddiv;

architectureaofdivis

signalclk_tmp0:std_logic;

signalclk_tmpl:std_logic;

begin

pO:process(clk_in,tone)

variableent:integerrange0to49999999;

begin

if(clkjn'eventandclk_in='l')then

ifent<12999999/tonethen--分頻系數(shù)

cnt:=cnt+l;

clk_tmpO<='l';

else

cnt:=0;

clk_tmp0<='0';

endif;

endif;

endprocesspO;

pl:process(clk_tmpO)

variablecount:std_logic;

begin

if(clk_tmpO'eventandclk_tmpO='l')then

count:=notcount;

ifcount='l'then

clk_tmpl<='l';-輸出平穩(wěn)的波形

else

clk_tmpl<='0';

endif;

endif;

endprocesspl;

clk_out<=clk_tmpl;

enda;

7.電子琴頂層設(shè)計(jì)

libraryieee;

useieee.std_logic_1164.all;

useieee.std_logic_unsigned.all;

entitydianzqis

port(clkinstdjogic;一時(shí)鐘輸入

yin:instd_logic_vector(6downto0);-音符輸入

highlow:instd_logic_vector(ldownto0);-高低音輸入

auto_in:instdjogic;-自動(dòng)播放

autolinstdjogic;-試音播放

clear:instd_logic;-復(fù)位

clk_out:outstdjogic;-輸出時(shí)鐘

rowoutstd_logic_vector(7downto0);--點(diǎn)陣顯示

col:outstd_logic_vector(7downto0);一點(diǎn)陣顯示

duan:outstd_logic_vector(7downto0);-數(shù)碼管顯示

cat:outstd_logic_vector(5downto0));-數(shù)碼管顯示

architectureaofdianzqis

componentdivOis-分頻模塊

port(clk_in:instdjogic;

clk_tmp:outstdjogic);

endcomponent;

componentdianzhenis-點(diǎn)陣顯示模塊

port(clk_in:instdjogic;

yin:instd_logic_vector(6downto0);

row:outstd_logic_vector(7downto0);

col:outstd_logic_vector(7downto0)

endcomponent;

componentshumais-數(shù)碼管顯示模塊

port(clk_in:instd_logic;

yin:instd_logic_vector(6downto0);

highlow:instd_logic_vector(ldownto0);

auto:instdjogic;

autolinstd_logic;

duan:outstd_logic_vector(7downto0);

cat:outstd_logic_vector(5downto0)

if

endcomponent;

componentautois-自動(dòng)播放模塊

port(clk_in:instdjogic;

autoinstd_logic;

autol:instd_logic;

yinjn:instd_logic_vector(6downto0);

clear:instdjogic;

yin_out:outstd_logic_vector(6downto0));

endcomponent;

componentseletoneis-預(yù)置分頻系數(shù)模塊

port(highlow:instd_logic_vector(ldownto0);

yin:instd_logic_vector(6downto0);

tone:outintegerrange0to2000000);

endcomponent;

componentdivis-分頻發(fā)音模塊

port(clk_in:instd_logic;

tone:inintegerrange0to2000000;

clk_out:outstdjogic);

endcomponent;

signalyin_tmp:std_logic_vector(6downto0);

signaltone_tmp:integerrange0to2000000;

signalclk_tmp:stdjogic;

begin

ul:autoportmap

(clk_in=>clk,auto=>auto_in,yin_in=>yin,yin_out=>yin_tmp,clear=>clear,autol=>autol);

u2:seletoneportmap(highlow=>highlow,yin=>yin_tmp,tone=>tone_tmp);

u3:shumaportmap

(duan=>duan,cat=>cat,yin=>yin_tmp,clk_in=>clk_tmp,highlow=>highlow,auto=>auto_in,aut

ol=>autol);

u4:dianzhenportmap(row=>row,col=>col,yin=>yin_tmp,clk_in=>clk_tmp);

u5:divportmap(clk_in=>clk,tone=>tone_tmp,clk_out=>clk_out);

u6:divOportmap(clk_in=>clk,clk_tmp=>clk_tmp);

enda;

五、功能說明

初始狀態(tài),8X8點(diǎn)陣顯示“1234567”七個(gè)音符構(gòu)成的電子琴鍵盤,其中點(diǎn)陣的第一

列用一個(gè)LED點(diǎn)亮表示音符“1”,第二列用二個(gè)LED點(diǎn)亮表示音符“2”,依此類推,

用BTN1?BTN7七個(gè)按鍵模擬電子琴手動(dòng)演奏時(shí)的“1234567”七個(gè)音符。

當(dāng)某個(gè)按鍵按下時(shí),數(shù)碼管顯示相應(yīng)的音符,點(diǎn)陣上與之對(duì)應(yīng)的音符顯示列全滅,同時(shí)

蜂鳴器演奏相應(yīng)的聲音;當(dāng)按鍵彈開時(shí)數(shù)碼管顯示的音符滅掉,點(diǎn)陣顯示恢復(fù),蜂鳴器停止

聲音的輸出。

由撥碼開關(guān)切換選擇高、中、低音,并用數(shù)碼管進(jìn)行相應(yīng)的顯示

可通過一個(gè)撥碼開關(guān)進(jìn)行手動(dòng)/自動(dòng)演奏的切換,并與點(diǎn)陣顯示配合增加自動(dòng)演奏樂曲

的功能。

六、元器件清單及資源利用情況

1.元器件清單

基本功能:Altra公司Maxll系列EPM71270T144C5開發(fā)板一塊及電源線、下載線各

一根。開發(fā)板內(nèi)元器件利用情況如下:

元器件數(shù)量

8X8點(diǎn)陣顯示屏1

撥碼開關(guān)4

按鍵8

數(shù)碼管2

蜂鳴器1

2.管腳設(shè)置

NodeNameDirectionLocationI/OBankVREFGroupI/OStandard

1?autolInput

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論