簡(jiǎn)易電子琴課程設(shè)計(jì)-QUARTUS-制作_第1頁(yè)
簡(jiǎn)易電子琴課程設(shè)計(jì)-QUARTUS-制作_第2頁(yè)
簡(jiǎn)易電子琴課程設(shè)計(jì)-QUARTUS-制作_第3頁(yè)
簡(jiǎn)易電子琴課程設(shè)計(jì)-QUARTUS-制作_第4頁(yè)
簡(jiǎn)易電子琴課程設(shè)計(jì)-QUARTUS-制作_第5頁(yè)
已閱讀5頁(yè),還剩21頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、精選優(yōu)質(zhì)文檔-傾情為你奉上可編程邏輯期末設(shè)計(jì)題 目:簡(jiǎn)易電子琴制作學(xué) 院:信息工程學(xué)院年 級(jí):2009 級(jí)完成時(shí)間 :2012年2月27日目錄1、課程設(shè)計(jì)目的1) 利用數(shù)控分頻器設(shè)計(jì)一個(gè)電子琴硬件電路和音樂(lè)發(fā)生器,設(shè)計(jì)達(dá)到演奏時(shí)可以選擇是手演奏(鍵盤(pán)輸入),或自動(dòng)演奏已存入的樂(lè)曲,并且能自動(dòng)演奏。2) 鞏固和運(yùn)用所學(xué)課程,理論聯(lián)系實(shí)際,提高分析、解決計(jì)算機(jī)技術(shù)實(shí)際問(wèn)題的獨(dú)立工作能力,通過(guò)對(duì)一個(gè)簡(jiǎn)易的14音符電子琴的設(shè)計(jì),進(jìn)一步加深對(duì)計(jì)算機(jī)原理以及數(shù)字電路應(yīng)用技術(shù)方面的了解與認(rèn)識(shí),進(jìn)一步熟悉數(shù)字電路系統(tǒng)設(shè)計(jì)、制作與調(diào)試的方法和步驟。鞏固所學(xué)課堂知識(shí),理論聯(lián)系實(shí)際,提高分析、解決計(jì)算機(jī)技術(shù)實(shí)際問(wèn)題

2、的獨(dú)立工作能力。為了進(jìn)一步了解計(jì)算機(jī)組成原理與系統(tǒng)結(jié)構(gòu),深入學(xué)習(xí)EDA技術(shù),用VHDL語(yǔ)言去控制將會(huì)使我們對(duì)本專業(yè)知識(shí)可以更好地掌握。3) 提高學(xué)生對(duì)eda軟件實(shí)踐操作能力和工程設(shè)計(jì)能力,對(duì)eda技術(shù)和fpga應(yīng)用的相關(guān)知識(shí)進(jìn)行了系統(tǒng)的介紹,內(nèi)容包括eda技術(shù)的基本知識(shí),fpga的基本原理,quartus ii的使用方法與使用技巧,主流描述語(yǔ)言vhdl的語(yǔ)法規(guī)則介紹及實(shí)例說(shuō)明,常用的控制或通信功能模塊的設(shè)計(jì)方法實(shí)例,以及采用vhdl語(yǔ)言描述的fpga綜合實(shí)例。2、課程設(shè)計(jì)要求2.1、基礎(chǔ)部分1) 當(dāng)鍵盤(pán)輸入abcde 是對(duì)應(yīng)響應(yīng)的頻率2) 演奏時(shí)在8段數(shù)碼管顯示對(duì)應(yīng)音符2.2、發(fā)揮部

3、分3) 具有存儲(chǔ)功能存儲(chǔ)20個(gè)音符4) 當(dāng)鍵盤(pán)上某一個(gè)鍵(如v)時(shí),自動(dòng)重放存儲(chǔ)區(qū)音符3、設(shè)計(jì)(課程)基本內(nèi)容內(nèi)容包括eda技術(shù)的基本知識(shí),fpga的基本原理,quartus ii的使用方法與使用技巧,主流硬件描述語(yǔ)言vhdl的語(yǔ)法規(guī)則介紹及實(shí)例說(shuō)明,常用的控制或通信功能模塊的設(shè)計(jì)方法實(shí)例,以及采用vhdl語(yǔ)言描述的fpga綜合實(shí)例設(shè)計(jì)。本書(shū)由淺入深,從易到難,既讓初學(xué)者輕松入門,又讓有經(jīng)驗(yàn)的設(shè)計(jì)者得到有價(jià)值的參考信息。3.1、eda技術(shù)/vhd語(yǔ)言隨著基于cpld的eda技術(shù)的發(fā)展和應(yīng)用領(lǐng)域的擴(kuò)大與深入,eda技術(shù)在電子信息、通信、自動(dòng)控制用計(jì)算機(jī)等領(lǐng)域的重要性日益突出。EDA技術(shù)就是以計(jì)算

4、機(jī)為工具,設(shè)計(jì)者在EDA軟件平臺(tái)上,用硬件描述語(yǔ)言HDL完成設(shè)計(jì)文件,然后由計(jì)算機(jī)自動(dòng)地完成邏輯編譯、化簡(jiǎn)、分割、綜合、優(yōu)化、布局、布線和仿真,直至對(duì)于特定目標(biāo)芯片的適配編譯、邏輯映射和編程下載等工作。EDA技術(shù)的出現(xiàn),極大地提高了電路設(shè)計(jì)的效率和可操作性,減輕了設(shè)計(jì)者的勞動(dòng)強(qiáng)度。利用EDA工具,電子設(shè)計(jì)師可以從概念、算法、協(xié)議等開(kāi)始設(shè)計(jì)電子系統(tǒng),大量工作可以通過(guò)計(jì)算機(jī)完成,并可以將從電路設(shè)計(jì)、性能分析到設(shè)計(jì)出IC版圖或PCB版圖的整個(gè)過(guò)程的計(jì)算機(jī)上自動(dòng)處理完成。此次設(shè)計(jì)主要是基于vhdl文本輸入法設(shè)計(jì)樂(lè)曲演奏電路,運(yùn)用vhdl語(yǔ)言對(duì)簡(jiǎn)易電子琴的各個(gè)模塊進(jìn)行設(shè)計(jì),并使用eda 工具對(duì)各模塊進(jìn)行

5、仿真驗(yàn)證。該系統(tǒng)基于計(jì)算機(jī)中時(shí)鐘分頻器的原理,采用自頂向下的設(shè)計(jì)方法來(lái)實(shí)現(xiàn),通過(guò)按鍵輸入來(lái)控制音響或者自動(dòng)演奏已存入的歌曲。系統(tǒng)由樂(lè)曲自動(dòng)演奏模塊、音調(diào)發(fā)生模塊和數(shù)控分頻模塊三個(gè)部分組成。系統(tǒng)實(shí)現(xiàn)是用硬件描述語(yǔ)言vhdl按模塊化方式進(jìn)行設(shè)計(jì),然后進(jìn)行編程、時(shí)序仿真、電路功能驗(yàn)證,奏出美妙的樂(lè)曲(當(dāng)然由于條件限制,暫不進(jìn)行功能驗(yàn)證,只進(jìn)行編程和時(shí)序仿真)。該設(shè)計(jì)最重要的一點(diǎn)就是通過(guò)按鍵控制不同的音調(diào)發(fā)生,每一個(gè)音調(diào)對(duì)應(yīng)不同的頻率,從而輸出對(duì)應(yīng)頻率的聲音。4、電子琴設(shè)計(jì)原理及過(guò)程4.1、設(shè)計(jì)規(guī)劃根據(jù)系統(tǒng)設(shè)計(jì)要求,系統(tǒng)設(shè)計(jì)采用自頂向下的設(shè)計(jì)方法,它由樂(lè)曲自動(dòng)演奏模塊、音調(diào)發(fā)生模塊和數(shù)控分頻模塊,存儲(chǔ)

6、模塊四部分組成4.2、基礎(chǔ)部分原理本課程設(shè)計(jì)目的在于靈活運(yùn)用eda技術(shù)編程實(shí)現(xiàn)一個(gè)簡(jiǎn)易電子琴的樂(lè)曲演奏,它要求在實(shí)驗(yàn)箱上構(gòu)造一個(gè)電子琴電路,不同的音階對(duì)應(yīng)不同頻率的正弦波。按下每個(gè)代表不同音階的按鍵時(shí),能夠發(fā)出相對(duì)應(yīng)頻率的聲音。故系統(tǒng)可分為樂(lè)曲自動(dòng)演奏模塊(ps2scan)、音調(diào)發(fā)生模塊(tonetaba)和數(shù)控分頻模塊(speakera)三部分。4.3、簡(jiǎn)易電子琴的設(shè)計(jì)流程根據(jù)系統(tǒng)設(shè)計(jì)要求,系統(tǒng)該系統(tǒng)基于計(jì)算機(jī)中時(shí)鐘分頻器的原理,設(shè)計(jì)采用自頂向下的設(shè)計(jì)方法,通過(guò)按鍵輸入來(lái)控制音響或者自動(dòng)演奏已存入的歌曲。它由樂(lè)曲自動(dòng)演奏模塊、音調(diào)發(fā)生模塊和數(shù)控分頻模塊三部分組成。用vhdl語(yǔ)言設(shè)計(jì)電路的流程

7、:1. 使用文本編輯器輸入設(shè)計(jì)源文件。2. 使用編譯工具編譯源文件:vhdl的編譯語(yǔ)言。3. 功能仿真。 4. 綜合。綜合的目的是在于將設(shè)計(jì)的源文件由語(yǔ)言轉(zhuǎn)換為實(shí)際的電路。這一部分最終目的是生成門電路級(jí)的網(wǎng)表(netlist)。5. 框圖布局、布線。這一步的目的是生成用于編程文件。先將各個(gè)設(shè)計(jì)中的門根據(jù)網(wǎng)表的內(nèi)容和器件的結(jié)構(gòu)放在器件的特定部位。然后,在根據(jù)網(wǎng)表中提供的各門的連接,把各個(gè)門的輸入輸出連接起來(lái)。6. 編譯完成,下載。5、課程設(shè)計(jì)的程序模塊5.1、樂(lè)曲演奏模塊(ps2scan)5.1.1、模塊說(shuō)明樂(lè)曲自動(dòng)演奏模塊的作用是產(chǎn)生14位發(fā)生控制輸入信號(hào)。當(dāng)進(jìn)行自動(dòng)演奏時(shí),由存儲(chǔ)在此模塊的8

8、位二進(jìn)制數(shù)作為發(fā)聲控制輸入,從而自動(dòng)演奏樂(lè)曲。該模塊的vhdl源程序主要由3個(gè) process(clk)工作進(jìn)程組成, 第一個(gè) process(clk)的作用是根據(jù)鍵盤(pán)輸入(自動(dòng)演奏)的值(0或1)來(lái)判斷計(jì)數(shù)器count以及脈沖clk的輸出值。部分源程序如下: process(clk) -工作進(jìn)程開(kāi)始 begin if clk'event and clk = '1' then 時(shí)鐘輸入信號(hào)為1 kbclkreg <= kbclk; kbclkfall <= kbclkreg and (not kbclk); end if; end process;當(dāng)確定了時(shí)

9、鐘信號(hào)輸出的值后,在第二個(gè)process中就可以由它控制14位發(fā)聲控制輸入信號(hào)了。即disp的值為時(shí),count為1。最后的process(clk)便是由前兩個(gè)process所確定的count、kbclk和鍵盤(pán)輸入信號(hào)值kbdata將8位的二進(jìn)制數(shù)轉(zhuǎn)化為音符信號(hào)的輸出,達(dá)到自動(dòng)演奏的目的。部分源程序如下: process(clk) begin if clk'event and clk = '1' then case kbcodereg is-由計(jì)數(shù)器從0到15的取值判斷音符信號(hào)的8位二進(jìn)制數(shù) when ""=>disp<="00

10、01" when ""=>disp<="0010" 該模塊最主要的用途就是將輸入二進(jìn)制數(shù)轉(zhuǎn)化為發(fā)聲控制輸入,是產(chǎn)生音符的重要步驟, ps2scan模塊的源程序符號(hào)編輯圖如圖圖5-1-1:ps2scan模塊的符號(hào)編輯在此程序中自動(dòng)模塊輸出的音符數(shù)據(jù),經(jīng)過(guò)翻譯后將輸出到數(shù)控分頻模塊為其提供分頻系數(shù)的初始值, 5.1.2、樂(lè)曲演奏模塊文本程序-程序名稱:ps2scan.vhd-程序功能:采用vhdl語(yǔ)言編程產(chǎn)生14位發(fā)聲控制輸入信號(hào)library ieee; use ieee.std_logic_1164.all;use ieee.num

11、eric_std.all;entity ps2scan is port ( clk,kbclk,kbdata:in std_logic; -系統(tǒng)時(shí)鐘信號(hào)/鍵盤(pán)輸入演奏信號(hào) /鍵盤(pán)輸入信號(hào) disp : out std_logic_vector(3 downto 0); -音符顯示信號(hào)(時(shí)鐘輸出) auto : out std_logic - -音頻信號(hào)(鍵盤(pán)輸入信號(hào))end entity;architecture rtl of ps2scan is signal kbclkreg, kbclkfall : std_logic; signal datacoming : std_logic:=&#

12、39;0' signal cnt : integer range 0 to 9; signal shiftdata,kbcodereg : std_logic_vector(7 downto 0);- -輸入8位控制信號(hào) signal delay:std_logic:='0' signal count: integer range 0 to 10000;-定義信號(hào)計(jì)數(shù)器, 10000個(gè)信號(hào)元素begin process(clk) -工作進(jìn)程開(kāi)始 begin if clk'event and clk = '1' then kbclkreg <

13、= kbclk; kbclkfall <= kbclkreg and (not kbclk); end if; end process; process(clk) begin if clk'event and clk = '1' then-鍵盤(pán)輸入為1 if kbclkfall = '1' and datacoming = '0' and kbdata = '0' then datacoming <= '1'cnt <= 0; elsif kbclkfall = '1' a

14、nd datacoming = '1' then if cnt = 9 then if kbdata = '1' then datacoming <= '0'end if; cnt <= 0;kbcodereg<=shiftdata; else shiftdata <= kbdata & shiftdata(7 downto 1); cnt <= cnt + 1; end if; end if; end if; end process; process(clk) begin if clk'event

15、and clk = '1' then case kbcodereg is-由計(jì)數(shù)器從0到15的取值判斷音符信號(hào)的8位二進(jìn)制數(shù) when ""=>disp<="0001" when ""=>disp<="0010" when ""=>disp<="0011" when ""=>disp<="0100" when ""=>disp<="

16、0101" when ""=>disp<="0110" when ""=>disp<="0111" when ""=>disp<="1000" when ""=>disp<="1001" when ""=>disp<="1010" when ""=>disp<="1011" w

17、hen ""=>disp<="1100" when ""=>disp<="1101" when ""=>disp<="1110" when ""=>disp<="1111" when others=>disp<="0000" end case; end if; end process;process(clk)beginif clk'event and

18、 clk = '1' thencase kbcodereg is when ""=>delay<='1' when ""=>delay<='1' when ""=>delay<='1' when ""=>delay<='1' when ""=>delay<='1' when ""=>delay<='1&

19、#39; when ""=>delay<='1' when ""=>delay<='1' when ""=>delay<='1' when ""=>delay<='1' when ""=>delay<='1' when ""=>delay<='1' when ""=>delay<

20、='1' when ""=>delay<='1' when ""=>delay<='0' when others=>delay<='0' end case; end if;if clk'event and clk = '1' then count <= count + 1;else null;end if;if count=1000 and delay='1' then count<=0; auto<

21、;='1'else if count = 1000 and delay='0' then count<=0; auto<='0'end if;end if;end process;end rtl;5.2、音調(diào)發(fā)生模塊5.2.1、模塊說(shuō)明音調(diào)發(fā)生模塊的作用是產(chǎn)生音階的分頻預(yù)置值。當(dāng)14位發(fā)聲控制輸入信號(hào)中的某一位為高電平時(shí),則對(duì)應(yīng)某一音階的數(shù)值將輸出,該數(shù)值即為該音階的分頻預(yù)置值,分頻預(yù)置值控制數(shù)控分頻模塊進(jìn)行分頻,由此得到每個(gè)音階對(duì)應(yīng)的頻率,根據(jù)頻率的不同,從而能通過(guò)喇叭聽(tīng)到不同的聲音,實(shí)現(xiàn)音樂(lè)的播放。該模塊的唯一輸入信號(hào)index對(duì)

22、應(yīng)就是自動(dòng)模塊中最后的輸出,音符顯示信號(hào),高低音顯示信號(hào)high和音符分頻系數(shù)都是根據(jù)音符輸入確定的。比如我們自定義index第2位為高電平時(shí),它的分頻系數(shù)則為773hz,音符顯示信號(hào)為:when "0001" => tone<="" ; -code<="0001" - 773;即是773的二進(jìn)制表示,此時(shí)高低音顯示1表示高音。部分源程序如下:process(index) begin case index is - 譯碼電路,查表方式,控制音調(diào)的預(yù)置數(shù) when "0000" => tone

23、<="" ; -code<="0000" - 2047 when "0001" => tone<="" ; -code<="0001" - 773; when "0010" => tone<="" ; -code<="0010" - 912;該模塊最主要的作用就是給音符輸入預(yù)設(shè)頻率值,因?yàn)?,電子琴最終實(shí)現(xiàn)樂(lè)曲演奏就是輸出不同頻率的正弦波,此模塊就是將二進(jìn)制發(fā)聲信號(hào)轉(zhuǎn)化為對(duì)應(yīng)的頻率。該模塊的

24、源程序符號(hào)編輯圖如圖:圖5-2-2:tonrtaba模塊的符號(hào)編輯圖5.2.2、音調(diào)發(fā)生模塊文本程序:-程序名稱:tonetaba.vhd-程序功能:采用vhdl語(yǔ)言編程產(chǎn)生音階的分頻預(yù)置值library ieee;use ieee.std_logic_1164.all;entity tonetaba is port ( index : in std_logic_vector (3 downto 0) ; -音符輸入信號(hào) tone : out std_logic_vector (10 downto 0) ); -音符顯示信號(hào)end; architecture one of tonetaba i

25、s beginprocess(index) begin case index is - -此進(jìn)程完成音符到音符的分頻系數(shù)譯碼,音符的顯示,高低音階 when "0000" => tone<="" ; -code<="0000" - 2047 when "0001" => tone<="" ; -code<="0001" - 773; when "0010" => tone<="" ; -c

26、ode<="0010" - 912; when "0011" => tone<="" ; -code<="0011" -1036; when "0100" => tone<="" ; -code<="0101" -1197;1116 when "0101" => tone<="" ; -code<="0110" -1290;1197 wh

27、en "0110" => tone<="" ; -code<="0111" -1372;1290 when "0111" => tone<="" ; -code<="0001" -1410;1372 when "1000" => tone<="" ; -code<="0010" -1480;1410 when "1001" => tone

28、<="" ; -code<="0011" -1542;1480 when "1010" => tone<="" ; -code<="0101" -1622;1542 when "1011" => tone<="" ; -code<="0110" -1668;1590 when "1100" => tone<="" ; -code<=

29、"0001" -1728;1622 when "1101" => tone<="" ; -code<="0110" -1275;1668 when "1110" => tone<="" ; -code<="0001" -1136;1692 when others => null; end case; end process;end5.3、數(shù)控分頻模塊5.3.1、模塊說(shuō)明數(shù)控分頻模塊是對(duì)時(shí)基脈沖進(jìn)行分頻,得到與1、2

30、、3、4、5、6、7、8、9、a、b、c、d、e 這14個(gè)音符相對(duì)應(yīng)的頻率。speakera模塊的源程序符號(hào)編輯圖如圖。圖5-3-1:speakera模塊的符號(hào)編輯圖該模塊主要由3個(gè)工作進(jìn)程(divideclk,genspks,delayspks)組成。首先,根據(jù)系統(tǒng)時(shí)鐘信號(hào)的輸入得到時(shí)基脈沖以及計(jì)數(shù)器的值,而時(shí)鐘信號(hào)在auto模塊中便已給出,兩者之間的設(shè)置關(guān)系類似于auto模塊中第一個(gè)工作進(jìn)程的設(shè)置。第二個(gè)process是此模塊的核心,即由時(shí)基脈沖值轉(zhuǎn)化為音符的頻率。部分源程序如下:genspks : process(preclk, tone)- 11位可預(yù)置計(jì)數(shù)器 variable cou

31、nt11 : std_logic_vector (10 downto 0);最后一個(gè)process則是用來(lái)設(shè)置揚(yáng)聲器輸出信號(hào)的,揚(yáng)聲器信號(hào)由0和1控制,當(dāng)且僅當(dāng)前一個(gè)process中的fullspks輸出為1時(shí),揚(yáng)聲器才有輸出,再根據(jù)計(jì)數(shù)器取值來(lái)確定輸出是1還是0。部分源程序如下:if fullspks'event and fullspks = '1' then count2 := not count2; -揚(yáng)聲器音頻信號(hào)為1 if count2 = '1' then spks <= '1' -揚(yáng)聲器輸出為1 else spks &

32、lt;= '0' end if; 5.3.2、數(shù)控分頻模塊文本程序-程序名稱:speakera.vhd-程序功能:采用vhdl語(yǔ)言編程實(shí)現(xiàn)發(fā)生器的數(shù)控分頻library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity speakera is port ( clk : in std_logic;-系統(tǒng)時(shí)鐘信號(hào) tone : in std_logic_vector (10 downto 0); -音符分頻系數(shù) spks : out std_logic ); -驅(qū)動(dòng)揚(yáng)聲器的音頻信號(hào)end;

33、architecture one of speakera is -定義時(shí)基脈沖信號(hào) signal preclk, fullspks : std_logic;begin divideclk : process(clk) variable count4 : std_logic_vector (3 downto 0); begin preclk <= '0' - 將clk進(jìn)行16分頻,preclk為clk的16分頻 if count4>11 then preclk <= '1' count4 := "0000" elsif clk

34、'event and clk = '1' then count4 := count4 + 1; -時(shí)鐘信號(hào)為1時(shí) -判斷計(jì)數(shù)器取值為1 end if; end process;genspks : process(preclk, tone) -此進(jìn)程按照tone1輸入的分頻系數(shù)對(duì)8mhz的脈沖再次分頻,得到所需要的音符頻率 variable count11 : std_logic_vector (10 downto 0);begin if preclk'event and preclk = '1' then if count11 = 16#7ff#

35、 then count11 := tone ; fullspks <= '1' -若計(jì)數(shù)器11值小于音符信號(hào)1,計(jì)數(shù)器加1,音頻信號(hào)為1 else count11 := count11 + 1; fullspks <= '0' end if; end if; end process;-音頻信號(hào)輸出進(jìn)程開(kāi)始delayspks : process(fullspks)- 此進(jìn)程對(duì)fullspks進(jìn)行2分頻,展寬脈沖,使揚(yáng)聲器有足夠功率發(fā)音 variable count2 : std_logic; -定義變量頻率計(jì)數(shù)器2begin if fullspks&#

36、39;event and fullspks = '1' then count2 := not count2; -揚(yáng)聲器音頻信號(hào)為1 if count2 = '1' then spks <= '1' -揚(yáng)聲器輸出為1 else spks <= '0' end if; end if; end process;end;以上三個(gè)模塊組裝的整體組裝設(shè)計(jì)原理圖如圖5-3所示。 圖5-3 基礎(chǔ)發(fā)音系統(tǒng)的整體組裝設(shè)計(jì)原理圖由于設(shè)計(jì)分模塊組成,每個(gè)單獨(dú)的模塊都是一個(gè)完整的源程序,分別實(shí)現(xiàn)不同性質(zhì)的功能,但是每個(gè)模塊又是緊密關(guān)聯(lián)的,前一個(gè)

37、模塊的輸出很可能是后一模塊的輸入。如ps2scan模塊的音符信號(hào)輸出就是tonetaba模塊的音符信號(hào)輸入。另外,時(shí)鐘脈沖信號(hào)在本課程設(shè)計(jì)中用的最多,用處也最大,一般情況下時(shí)鐘信號(hào)處上升沿有效,判斷和控制各個(gè)計(jì)數(shù)器計(jì)數(shù)多少。(此框圖編譯完成的功能為:當(dāng)按下一個(gè)鍵時(shí),有相應(yīng)的樂(lè)音發(fā)出,同時(shí)用指示燈顯示樂(lè)音,用數(shù)碼管顯示音符)。5.4、音符存儲(chǔ)模塊5.4.1、模塊說(shuō)明此模塊將根據(jù)自己編制的音符順序存入電子琴,演奏時(shí)可選擇鍵盤(pán)輸入樂(lè)曲或者已存入的樂(lè)曲。樂(lè)曲存儲(chǔ)模塊產(chǎn)生節(jié)拍控制和音階選擇信號(hào),即在此模塊中可存放一個(gè)樂(lè)曲曲譜真值表,由一個(gè)計(jì)數(shù)器來(lái)控制此真值表的輸出,而由計(jì)數(shù)器的計(jì)數(shù)時(shí)鐘信號(hào)作為樂(lè)曲節(jié)拍控

38、制信號(hào)。5.4.2、音符存儲(chǔ)模塊的源程序-程序名稱:save.vhd-程序功能:采用vhdl語(yǔ)言編寫(xiě),參與主程序調(diào)用3個(gè)子程序,實(shí)現(xiàn)音符存儲(chǔ)演奏的功能library ieee;use ieee.std_logic_1164.all;use ieee.numeric_std.all;entity save is port ( inter,clks:in std_logic; input: in std_logic_vector(3 downto 0); disp: out std_logic_vector(3 downto 0) - led : out std_logic_vector(3 do

39、wnto 0) );end entity;architecture rtl of save is type ram_array is array (0 to 30) of std_logic_vector(3 downto 0); signal a: ram_array;- signal i : integer range 0 to 30; signal b : integer range 0 to 30;-signal cnt : integer range 0 to 9;signal count: integer range 0 to 3; -計(jì)數(shù)器寬度 - variable result

40、 : inter:='1'-變量賦初值beginprocess(inter) begin if inter'event and inter = '1' then i<=i+1;if i=20 then i<=0; end if; end if; end process;-以上程序類似于中斷響應(yīng),即來(lái)一次數(shù)據(jù)便存一次,數(shù)組進(jìn)入下一個(gè)process(inter) beginif input=x"f" then -數(shù)據(jù)回放disp<=a(b); if clks'event and clks = '1'

41、; thencount <= count + 1; -計(jì)數(shù)器來(lái)做延時(shí),時(shí)鐘為8hzif count=3 thencount<=0; b<=b+1; if b=20 then b<=0;end if;end if;end if; else a(i)<=input;disp<=a(i);-數(shù)據(jù)通過(guò)數(shù)組存儲(chǔ)end if;- disp<=a(i); end process; end rtl;6、頂層模塊設(shè)計(jì)6.1、模塊說(shuō)明該music_ram模塊是整個(gè)電子琴設(shè)計(jì)的核心,也是vhdl程序的主程序,前面3個(gè)源程序都是作為子程序分別實(shí)現(xiàn)電子琴的某一功能,而music

42、_ram模塊則通過(guò)調(diào)用子程序最終實(shí)現(xiàn)樂(lè)曲演奏的目的,奏出美妙的樂(lè)曲。利用vhdl語(yǔ)言component將三個(gè)模塊組合起來(lái),其中3個(gè)模塊和music_ram模塊的輸入輸出是一一對(duì)應(yīng)的,比如disp對(duì)應(yīng)musicin,auto對(duì)應(yīng)auto,musicout對(duì)應(yīng)index等,該模塊的符號(hào)編輯圖如圖3-4。圖:6-1:music_ram系統(tǒng)模塊的符號(hào)編輯圖該圖描述的是music_ram模塊輸入輸出的變量表示,整個(gè)系統(tǒng)的整體組裝設(shè)計(jì)原理圖就是這4幅編輯圖按輸入輸出關(guān)系順序連接而成的。6.2、頂層模塊文本程序-程序名稱:music_ram.vhd-程序功能:采用vhdl語(yǔ)言編寫(xiě)主程序調(diào)用3個(gè)子程序,實(shí)現(xiàn)樂(lè)

43、曲演奏(存/放)的功能。library ieee;-use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity music_ram is port (musicin:in std_logic_vector(3 downto 0); -系統(tǒng)時(shí)鐘信號(hào) auto,clk :in std_logic; -auto='1':read ,'0'=write -鍵盤(pán)輸入/自動(dòng)演奏信號(hào) musicout: out std_logic_vector(

44、3 downto 0) -音符顯示信號(hào) );end music_ram;architecture behavioral of music_ram is-subtype word is std_logic_vector(3 downto 0);type memory is array (20 downto 0) of std_logic_vector(3 downto 0); signal musram : memory; - signal addr: integer range 0 to 20; -存儲(chǔ)20 個(gè)音符signal ptr: integer range 0 to 20;-signa

45、l count: integer range 0 to 3;-計(jì)數(shù)范圍0到3beginprocess(auto) -引入 kbclk元件begin if auto'event and auto='1' then -鍵盤(pán)輸入為1ptr<=ptr+1; -計(jì)數(shù)器值為1,時(shí)鐘信號(hào)幅值為1if ptr=20 then ptr<=0; end if;end if;end process;-auto is a flag of signal process (clk,musicin)beginif musicin="1111" then -如果輸入字母

46、f,-調(diào)用存儲(chǔ)的音符自動(dòng)演奏musicout<=musram(addr);if clk'event and clk = '1' then -時(shí)鐘信號(hào)為1count <= count + 1; -計(jì)數(shù)器來(lái)做延時(shí),時(shí)鐘為8hzif count=3 thencount<=0;addr<=addr+1; if addr=20 then addr<=0;end if;end if;end if;else musram(ptr)<=musicin; musicout<=musram(ptr);end if;end process;end b

47、ehavioral;6.3、綜合設(shè)計(jì)原理圖(完善)將tonetaba,speakera,music_ram,和ps2scan四個(gè)模塊連接在一起形成完整的電子琴發(fā)音系統(tǒng),將繪制好的原理圖保存,確保無(wú)誤后運(yùn)行進(jìn)行引腳搭配,編譯,和下載。圖6-3:系統(tǒng)的整體組裝設(shè)計(jì)原理圖7、系統(tǒng)程序仿真和編譯系統(tǒng)仿真是在實(shí)際系統(tǒng)上進(jìn)行實(shí)驗(yàn)研究比較困難時(shí)適用的必不可少的工具,它是指通過(guò)系統(tǒng)模型實(shí)驗(yàn)去研究一個(gè)已經(jīng)存在或正在設(shè)計(jì)的系統(tǒng)的過(guò)程,通俗地講,就是進(jìn)行模型實(shí)驗(yàn)。因而,系統(tǒng)仿真的結(jié)果決定整個(gè)課程設(shè)計(jì)任務(wù)完成的到位程度。7.1、程序編譯7.1.1、編譯過(guò)程1)建立頂層設(shè)計(jì)文件夾top在硬盤(pán)適當(dāng)位置建立top文件夾中。注意:該文件夾的路徑中不能包含漢字。路徑中的所有目錄和子目錄的名稱都必須符合vhdl

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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)論