版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025正規(guī)民間借款合同
- 設(shè)備租賃定向合作協(xié)議
- 2025布袋除塵合同
- 建筑裝飾監(jiān)理協(xié)議
- 建筑施工合同:旅游度假區(qū)工程
- 高鐵站裝修粉刷施工合同
- 藝術(shù)園區(qū)用地租賃協(xié)議
- 房地產(chǎn)經(jīng)紀(jì)副總經(jīng)理聘用協(xié)議
- 通信網(wǎng)絡(luò)建設(shè)概況-施工合同狀態(tài)
- xx省分布式光伏項(xiàng)目可行性研究報(bào)告
- 09阜新地價(jià)修正體系
- 華海醫(yī)藥智慧園區(qū)方案
- 中小學(xué)教師信息技術(shù)應(yīng)用能力發(fā)展測(cè)評(píng):30項(xiàng)微能力
- 旅游地理學(xué)發(fā)展簡(jiǎn)史
- 常見鵝病診斷和防治
- 鉆孔灌注樁施工危險(xiǎn)源識(shí)別及防控措施
- 藍(lán)色企業(yè)發(fā)展歷程時(shí)間軸PPT模板課件
- 新《行政處罰法》修訂對(duì)比解讀PPT課件
- 水電站課程設(shè)計(jì) 40
- 酒精發(fā)酵相關(guān)化驗(yàn)指標(biāo)測(cè)定
- LED基礎(chǔ)知識(shí)及外延工藝
評(píng)論
0/150
提交評(píng)論