国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

基于VHDL的FPGA簡易電子琴(實(shí)現(xiàn)三音階切換與彈奏)

這篇具有很好參考價(jià)值的文章主要介紹了基于VHDL的FPGA簡易電子琴(實(shí)現(xiàn)三音階切換與彈奏)。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

目錄

一、設(shè)計(jì)內(nèi)容簡介

二、系統(tǒng)框圖

1、簡易框圖

?2、總電路圖(quarters軟件自動生成)

三、代碼說明?

1、總體代碼

2、代碼思路

四、仿真實(shí)現(xiàn)結(jié)果與分析總結(jié)

1、仿真思路

2、仿真建立過程

3、仿真結(jié)果檢驗(yàn)

?

(1)靜音功能檢驗(yàn)

(2)琴鍵功能檢驗(yàn)

(3)模式選擇功能檢驗(yàn)

五、心得體會

六、開發(fā)板管腳介紹及管腳對應(yīng)

1、開發(fā)板管腳介紹

2、管腳對應(yīng)?

七、程序下載到實(shí)驗(yàn)板的步驟


一、設(shè)計(jì)內(nèi)容簡介

? ? ? ? 本項(xiàng)目中介紹了電子琴系統(tǒng)的整體的設(shè)計(jì),并基于超高速硬件描述語言VHDL在相關(guān)的芯片上編程實(shí)現(xiàn)的。本設(shè)計(jì)是采用EDA技術(shù)設(shè)計(jì)的一個(gè)簡易的十三音符電子琴,該系統(tǒng)基于計(jì)算機(jī)中時(shí)鐘分頻器的原理,可以通過對時(shí)鐘脈沖的分頻,并根據(jù)按鍵輸入設(shè)置分頻系數(shù),進(jìn)而控制無源蜂鳴器的發(fā)聲頻率,實(shí)現(xiàn)一個(gè)簡易電子琴的設(shè)計(jì)。

? ? ? 基于Quartus Ⅱ軟件平臺,本小組運(yùn)用VHDL語言對簡易電子琴進(jìn)行了基礎(chǔ)設(shè)計(jì),程序仿真以及波形驗(yàn)證。該電子琴的代碼中主要實(shí)現(xiàn)了分頻,消抖,模式選擇,琴鍵發(fā)聲等功能,超速硬件描述語言VHDL編程實(shí)現(xiàn),能夠?qū)崿F(xiàn)高中低三個(gè)音階的切換,每個(gè)音階對應(yīng)八個(gè)不同的琴鍵。系統(tǒng)實(shí)現(xiàn)是用硬件描述語言VHDL按照模塊化方式進(jìn)行設(shè)計(jì),然后進(jìn)行編程、時(shí)序仿真、總體整合。本系統(tǒng)的功能比較齊全,對于實(shí)際的電子琴功能仿真程度較高,具有一定的實(shí)用價(jià)值。

? ? ?在實(shí)現(xiàn)功能上,該電子琴可以實(shí)現(xiàn)三個(gè)音階的按鍵切換,并設(shè)置有鋼琴黑鍵功能,最大程度上模擬了實(shí)際使用的電子琴功能,不具備自動彈奏功能,僅能實(shí)現(xiàn)手動控制發(fā)聲。

二、系統(tǒng)框圖

1、簡易框圖

基于fpga的簡易電子琴的設(shè)計(jì)eda課程設(shè)計(jì),fpga開發(fā),vhdl

?2、總電路圖(quarters軟件自動生成)

基于fpga的簡易電子琴的設(shè)計(jì)eda課程設(shè)計(jì),fpga開發(fā),vhdl

三、代碼說明?

1、總體代碼

library IEEE;

use IEEE.STD_LOGIC_1164.ALL;

use IEEE.STD_LOGIC_unsigned.ALL;

use IEEE.STD_LOGIC_arith.ALL;

entity piano3 is

????Port ( CLK : in ?STD_LOGIC;

??BB1,BB2: IN STD_LOGIC;--高低八度開關(guān)

??BB3: IN STD_LOGIC;--黑鍵開關(guān)

??????????????SS1,SS2,SS3,SS4,SS5,SS6,SS7,SS8: in ?STD_LOGIC; --開關(guān)1-8

??LED: ???out ??STD_LOGIC_VECTOR (6 downto 0); --數(shù)碼管

??EN_LED: OUT STD_LOGIC_VECTOR (7 downto 0);--數(shù)碼管選擇

??RSST: in ?STD_LOGIC;--復(fù)位/靜音

??SND : out STD_LOGIC);--輸出聲音

end piano3;



architecture Behavioral of piano3 is



SIGNAL ??CP0:INTEGER RANGE 0 TO 500000; ?--分頻計(jì)數(shù)

SIGNAL CP:STD_LOGIC; ?--分頻時(shí)鐘50HZ用以消抖

signal ?????fm:INTEGER range 0 to 50000000;--聲音時(shí)長

signal ?????CT:INTEGER; ?--CT為計(jì)數(shù)最大值決定音階

signal ????CT0:INTEGER range 0 to 50000000;--CT0計(jì)數(shù)

signal ??sound:std_logic; ?--輸出聲音

signal ??flag:std_logic;

SIGNAL S1,S2,S3,S4,S5,S6,S7,S8,B1,B2,B3,RST:STD_LOGIC;

SIGNAL MODE:STD_LOGIC_VECTOR(1 DOWNTO 0);

SIGNAL MUL:INTEGER;

signal ??????HEX:std_logic_vector(3 downto 0);--七段信號

signal ??????HEXX:std_logic_vector(5 downto 0);

--------------------------------------------------

begin

SND <= sound;

--------------------------------------------------------

-----------------數(shù)碼管模塊------------------------

HEXX<=HEX&B1&B2;

WITH HEXX SELECT

???LED<= ----------默認(rèn)

"1111001" when "000000", ??--1

?????????"0100100" when "000100", ??--2

?????????"0110000" when "001000", ??--3

?????????"0011001" when "001100", ??--4

?????????"0010010" when "010000", ??--5

?????????"0000010" when "010100", ??--6

?????????"1111000" when "011000", ??--7

?????????"0000000" when "011100", ??--8

??????"0111111" when "111100", ??---

"1111001" when "000011", ??--1

?????????"0100100" when "000111", ??--2

?????????"0110000" when "001011", ??--3

?????????"0011001" when "001111", ??--4

?????????"0010010" when "010011", ??--5

?????????"0000010" when "010111", ??--6

?????????"1111000" when "011011", ??--7

?????????"0000000" when "011111", ??--8

??????"0111111" when "111111", ??---

----------LOW

"1111001" when "000010", ??--1

?????????"0100100" when "000110", ??--2

?????????"0110000" when "001010", ??--3

?????????"0011001" when "001110", ??--4

?????????"0010010" when "010010", ??--5

?????????"0000010" when "010110", ??--6

?????????"1111000" when "011010", ??--7

?????????"0000000" when "011110", ??--8

??????"1000111" when "111110", ??--L

----------HIGH

"1111001" when "000001", ??--1

?????????"0100100" when "000101", ??--2

?????????"0110000" when "001001", ??--3

?????????"0011001" when "001101", ??--4

?????????"0010010" when "010001", ??--5

?????????"0000010" when "010101", ??--6

?????????"1111000" when "011001", ??--7

?????????"0000000" when "011101", ??--8

??????"0001001" when "111101", ??--H

"0111111" when others;

WITH HEX SELECT

???EN_LED<= "11111110" when "0000", ??--1

????????????"11111101" when "0001", ??--2

????????????"11111011" when "0010", ??--3

????????????"11110111" when "0011", ??--4

????????????"11101111" when "0100", ??--5

"11011111" when "0101", ??--6

"10111111" when "0110", ??--7

"01111111" when "0111", ??--8

"00000000" when others; ??---

-------------------------------------------------------

----------------消抖模塊---------------------------

PROCESS(CLK)

BEGIN

IF RISING_EDGE(CLK) THEN

IF CP0 = 500000 THEN

CP0<=0;

CP <= NOT CP;

ELSE CP0 <=CP0+1;

END IF;

END IF;

END PROCESS;



PROCESS(CP)

BEGIN

IF RISING_EDGE(CP) THEN

S1 <= SS1;

S2 <= SS2;

S3 <= SS3;

S4 <= SS4;

S5 <= SS5;

S6 <= SS6;

S7 <= SS7;

S8 <= SS8;

B1 <= BB1;

B2 <= BB2;

B3 <= BB3;

RST <= RSST;

END IF;

END PROCESS;

------------------------------------------------------------

-----------------高低八度模式選擇-------------------

MODE<=B1&B2;

PROCESS(MODE)--S1設(shè)置低八度,S2設(shè)置高八度,S1和S2相同時(shí)為中八度(默認(rèn))

BEGIN

IF MODE="00" OR MODE="11" THEN

MUL<=2;

ELSIF MODE="10" THEN

MUL<=4;

ELSIF MODE="01" THEN

MUL<=1;

END IF;

END PROCESS;

---------------------------------------------------------

------------------頻率設(shè)置模塊---------------------

PROCESS(RST,CLK)--根據(jù)模式設(shè)置聲音頻率

BEGIN

--------------------------------------------------

IF B3 = '0' THEN

IF S1='0' ???THEN

CT<=47777*MUL;

HEX<="0000";

flag<='1';

ELSIF S2='0' THEN

CT <=42567*MUL;

HEX<="0001";

flag<='1';

ELSIF S3='0' THEN

CT <=37922*MUL;

HEX<="0010";

flag<='1';

ELSIF S4='0' THEN

CT <=35793*MUL;

HEX<="0011";

flag<='1';

ELSIF S5='0' THEN

CT <=31888*MUL;

HEX<="0100";

flag<='1';

ELSIF S6='0' THEN

CT <=28409*MUL;

HEX<="0101";

flag<='1';

ELSIF S7='0' THEN

CT <=25310*MUL;

HEX<="0110";

flag<='1';

ELSIF S8='0' THEN

CT <=23888*MUL;

HEX<="0111";

flag<='1';

ELSE

CT <=0;

HEX<="1111";

flag<='0';

END IF;

ELSIF B3 = '1' THEN ?--黑鍵

IF S1='0' ???THEN

CT<=45126*MUL;

HEX<="0000";

flag<='1';

ELSIF S2='0' THEN

CT <=40193*MUL;

HEX<="0001";

flag<='1';

ELSIF S3='0' THEN

CT <=0;-----

HEX<="0010";

flag<='1';

ELSIF S4='0' THEN

CT <=33783*MUL;

HEX<="0011";

flag<='1';

ELSIF S5='0' THEN

CT <=30120*MUL;

HEX<="0100";

flag<='1';

ELSIF S6='0' THEN

CT <=26824*MUL;

HEX<="0101";

flag<='1';

ELSIF S7='0' THEN

CT <=0;-----

HEX<="0110";

flag<='1';

ELSIF S8='0' THEN

CT <=22563*MUL;

HEX<="0111";

flag<='1';

ELSE

CT <=0;

HEX<="1111";

flag<='0';

END IF;

END IF;

---------------------------------------------------------

---------------------核心分頻模塊------------------

IF RST ='1' ?THEN --因?yàn)榻娱_關(guān)S8所以RST為1時(shí)靜音,為0時(shí)允許發(fā)出聲音

?? ???sound <='1';

ELSE

IF rising_edge(clk) then

??if flag='1' then

IF CT0 = CT THEN

CT0 <= 0;

SOUND <=NOT SOUND;

ELSIF CT0 /= CT ?THEN

CT0 <= CT0 + 1;

ELSE

sound <= '1';

CT0 <= 0;

END IF;

else

???sound <= '1';

CT0 <= 0;

END IF;

end if;

END IF;

end process;

--------------------------------------------------

--------------------------------------------------

end Behavioral;

2、代碼思路

(1)單個(gè)按鍵發(fā)聲功能,即基本分頻功能實(shí)現(xiàn)

????首先編寫核心分頻模塊,實(shí)現(xiàn)最簡單的按一個(gè)鍵出一個(gè)波形的功能,輸出聲音時(shí)長取決于按鍵時(shí)長,可以設(shè)置變量CT0來對時(shí)鐘脈沖進(jìn)行計(jì)數(shù),CT為對應(yīng)音階相對應(yīng)的脈沖計(jì)數(shù)上限值,CT0每達(dá)到該上限值對聲音SOUND信號進(jìn)行翻轉(zhuǎn),CT0未達(dá)到該上限值CT則進(jìn)行加1。如果RST開關(guān)在有效位置,則輸出聲音SOUND始終為1。

對應(yīng)的代碼如下:

IF RST ='1' ?THEN

?? ???sound <='1';

ELSE

IF rising_edge(clk) then

??if flag='1' then

IF CT0 = CT THEN

CT0 <= 0;

SOUND <=NOT SOUND;

ELSIF CT0 /= CT ?THEN

CT0 <= CT0 + 1;

ELSE

sound <= '1';

CT0 <= 0;

END IF;

else

???sound <= '1';

CT0 <= 0;

END IF;

end if;

END IF;

end process;

????在仿真時(shí)可以先將CT設(shè)置為一個(gè)較小的數(shù)字,便于查看仿真時(shí)查看波形,驗(yàn)證基本功能。而在實(shí)際上板燒錄時(shí),則需要根據(jù)實(shí)際的不同的音階及音調(diào)頻率計(jì)算CT值,下圖是小組組員根據(jù)實(shí)際頻率計(jì)算的CT值。

(2)根據(jù)不同頻率擴(kuò)展到8個(gè)按鍵S1,S2,S3,S4,S5,S6,S7,S8

????在核心的分頻實(shí)現(xiàn)單個(gè)按鍵發(fā)聲功能后,類似的可以根據(jù)計(jì)算的計(jì)數(shù)值表設(shè)置好同音階的另外幾個(gè)計(jì)數(shù)值,原理與單個(gè)按鍵類似。這里我們考慮到了燒錄到FPGA板子時(shí)管腳設(shè)置的便利性問題,并沒有將八個(gè)按鍵設(shè)置為一個(gè)長度為8的向量,而是設(shè)置了8個(gè)不同的變量S1,S2,S3,S4,S5,S6,S7,S8,這樣在設(shè)置管腳時(shí),只需要一一對應(yīng)的設(shè)置管腳,更加方便快捷。這八個(gè)按鍵作為輸入,為反邏輯(0有效),當(dāng)Si(i=1...8)='0'時(shí),則視為按下按鍵,發(fā)出該按鍵對應(yīng)頻率的琴音。

IF S1='0' ???THEN

CT<=47777*MUL;

HEX<="0000";

flag<='1';

ELSIF S2='0' THEN

CT <=42567*MUL;

HEX<="0001";

flag<='1';

ELSIF S3='0' THEN

CT <=37922*MUL;

HEX<="0010";

flag<='1';

ELSIF S4='0' THEN

CT <=35793*MUL;

HEX<="0011";

flag<='1';

ELSIF S5='0' THEN

CT <=31888*MUL;

HEX<="0100";

flag<='1';

ELSIF S6='0' THEN

CT <=28409*MUL;

HEX<="0101";

flag<='1';

ELSIF S7='0' THEN

CT <=25310*MUL;

HEX<="0110";

flag<='1';

ELSIF S8='0' THEN

CT <=23888*MUL;

HEX<="0111";

flag<='1';

ELSE

CT <=0;

HEX<="1111";

flag<='0';

END IF;

(3)根據(jù)高中低三個(gè)音階及黑鍵功能設(shè)置模式選擇開關(guān)B1,B2,B3

根據(jù)三個(gè)不同的音階設(shè)定計(jì)數(shù)初值。為了簡化代碼,提高運(yùn)行效率,我們設(shè)置了模式選擇的中間變量MODE與頻率倍數(shù)中間變量MUL。其中,我們將B1和B2兩個(gè)開關(guān)的外部輸入視為一個(gè)兩位向量MODE,B1,B2改變時(shí)會頻率倍數(shù)變量MUL賦給不同值(1,2,4),而MUL變量則作為按鍵發(fā)聲部分代碼后的一個(gè)系數(shù)變量,改變發(fā)聲的頻率值(詳見上2部分代碼)。

-----------------高低八度模式選擇-------------------

MODE<=B1&B2;

PROCESS(MODE)--S1設(shè)置低八度,S2設(shè)置高八度,S1和S2相同時(shí)為中八度(默認(rèn))

BEGIN

IF MODE="00" OR MODE="11" THEN

MUL<=2;

ELSIF MODE="10" THEN

MUL<=4;

ELSIF MODE="01" THEN

MUL<=1;

END IF;

END PROCESS;



將B3單獨(dú)設(shè)置,用于模擬實(shí)際鋼琴中“黑鍵”的功能,即B3=1或0時(shí)分別算出兩種不同的頻率計(jì)數(shù)初值賦予CT。

(4)根據(jù)按下琴鍵的不同設(shè)置對應(yīng)顯示的七段碼顯示管

????本設(shè)計(jì)中共設(shè)計(jì)了8個(gè)不同的按鍵,我們根據(jù)八個(gè)按鍵由低到高的順序排序,當(dāng)按下某一琴鍵時(shí),顯示譯碼管上就會顯示此時(shí)按下的按鍵序號,以及當(dāng)前對應(yīng)發(fā)聲模式:高八度——H,低八度——L,中八度(默認(rèn))——不顯示。

-----------------數(shù)碼管模塊------------------------

HEXX<=HEX&B1&B2;

WITH HEXX SELECT

???LED<= ----------默認(rèn)

"1111001" when "000000", ??--1

?????????"0100100" when "000100", ??--2

?????????"0110000" when "001000", ??--3

?????????"0011001" when "001100", ??--4

?????????"0010010" when "010000", ??--5

?????????"0000010" when "010100", ??--6

?????????"1111000" when "011000", ??--7

?????????"0000000" when "011100", ??--8

??????"0111111" when "111100", ??---

"1111001" when "000011", ??--1

?????????"0100100" when "000111", ??--2

?????????"0110000" when "001011", ??--3

?????????"0011001" when "001111", ??--4

?????????"0010010" when "010011", ??--5

?????????"0000010" when "010111", ??--6

?????????"1111000" when "011011", ??--7

?????????"0000000" when "011111", ??--8

??????"0111111" when "111111", ??---

----------LOW

"1111001" when "000010", ??--1

?????????"0100100" when "000110", ??--2

?????????"0110000" when "001010", ??--3

?????????"0011001" when "001110", ??--4

?????????"0010010" when "010010", ??--5

?????????"0000010" when "010110", ??--6

?????????"1111000" when "011010", ??--7

?????????"0000000" when "011110", ??--8

??????"1000111" when "111110", ??--L

----------HIGH

"1111001" when "000001", ??--1

?????????"0100100" when "000101", ??--2

?????????"0110000" when "001001", ??--3

?????????"0011001" when "001101", ??--4

?????????"0010010" when "010001", ??--5

?????????"0000010" when "010101", ??--6

?????????"1111000" when "011001", ??--7

?????????"0000000" when "011101", ??--8

??????"0001001" when "111101", ??--H

"0111111" when others;

WITH HEX SELECT

???EN_LED<= "11111110" when "0000", ??--1

????????????"11111101" when "0001", ??--2

????????????"11111011" when "0010", ??--3

????????????"11110111" when "0011", ??--4

????????????"11101111" when "0100", ??--5

"11011111" when "0101", ??--6

"10111111" when "0110", ??--7

"01111111" when "0111", ??--8

"00000000" when others; ??---

基于fpga的簡易電子琴的設(shè)計(jì)eda課程設(shè)計(jì),fpga開發(fā),vhdl基于fpga的簡易電子琴的設(shè)計(jì)eda課程設(shè)計(jì),fpga開發(fā),vhdl

基于fpga的簡易電子琴的設(shè)計(jì)eda課程設(shè)計(jì),fpga開發(fā),vhdl基于fpga的簡易電子琴的設(shè)計(jì)eda課程設(shè)計(jì),fpga開發(fā),vhdl

基于fpga的簡易電子琴的設(shè)計(jì)eda課程設(shè)計(jì),fpga開發(fā),vhdl基于fpga的簡易電子琴的設(shè)計(jì)eda課程設(shè)計(jì),fpga開發(fā),vhdl

?基于fpga的簡易電子琴的設(shè)計(jì)eda課程設(shè)計(jì),fpga開發(fā),vhdl基于fpga的簡易電子琴的設(shè)計(jì)eda課程設(shè)計(jì),fpga開發(fā),vhdl

5.實(shí)現(xiàn)按鍵消抖

在代碼的基本部分全部實(shí)現(xiàn)完成后,我們對8個(gè)琴鍵按鍵,3個(gè)模式選擇開關(guān),和一個(gè)復(fù)位開關(guān)加入了消抖代碼。其思路為將輸入時(shí)鐘信號CLK進(jìn)行分頻,得到低頻中間信號CP0,以所得的CP0

----------------消抖模塊---------------------------

PROCESS(CLK)

BEGIN

IF RISING_EDGE(CLK) THEN

IF CP0 = 500000 THEN

CP0<=0;

CP <= NOT CP;

ELSE CP0 <=CP0+1;

END IF;

END IF;

END PROCESS;



PROCESS(CP)

BEGIN

IF RISING_EDGE(CP) THEN

S1 <= SS1;

S2 <= SS2;

S3 <= SS3;

S4 <= SS4;

S5 <= SS5;

S6 <= SS6;

S7 <= SS7;

S8 <= SS8;

B1 <= BB1;

B2 <= BB2;

B3 <= BB3;

RST <= RSST;

END IF;

END PROCESS;

四、仿真實(shí)現(xiàn)結(jié)果與分析總結(jié)

1、仿真思路

??下載程序到開發(fā)板前需要仿真查錯(cuò),由于QURTUS仿真功能時(shí)間很短,不能實(shí)現(xiàn)真實(shí)的音階頻率仿真(50M晶振的頻率分頻需要很久)于是在填入不同音節(jié)對應(yīng)分頻系數(shù)前,新建專門用于仿真的工程文件,把分頻系數(shù)調(diào)小到仿真可清晰看出變化的程度。更改后仿真分頻系數(shù)如下:

PROCESS(CLK)

BEGIN

IF B3 = '0' THEN

IF S1='0' ???THEN

CT<=1*MUL;

HEX<="0000";

flag<='1';

ELSIF S2='0' THEN

CT <=2*MUL;

HEX<="0001";

flag<='1';

ELSIF S3='0' THEN

CT <=3*MUL;

HEX<="0010";

flag<='1';

ELSIF S4='0' THEN

CT <=4*MUL;

HEX<="0011";

flag<='1';

ELSIF S5='0' THEN

CT <=5*MUL;

HEX<="0100";

flag<='1';

ELSIF S6='0' THEN

CT <=6*MUL;

HEX<="0101";

flag<='1';

ELSIF S7='0' THEN

CT <=7*MUL;

HEX<="0110";

flag<='1';

ELSIF S8='0' THEN

CT <=8*MUL;

HEX<="0111";

flag<='1';

ELSE

CT <=0;

HEX<="1111";

flag<='0';

END IF;

ELSIF B3 = '1' THEN

IF S1='0' ???THEN

CT<=1*MUL;

HEX<="0000";

flag<='1';

ELSIF S2='0' THEN

CT <=2*MUL;

HEX<="0001";

flag<='1';

ELSIF S3='0' THEN

CT <=0;-----

HEX<="0010";

flag<='1';

ELSIF S4='0' THEN

CT <=3*MUL;

HEX<="0011";

flag<='1';

ELSIF S5='0' THEN

CT <=4*MUL;

HEX<="0100";

flag<='1';

ELSIF S6='0' THEN

CT <=5*MUL;

HEX<="0101";

flag<='1';

ELSIF S7='0' THEN

CT <=0;-----

HEX<="0110";

flag<='1';

ELSIF S8='0' THEN

CT <=6*MUL;

HEX<="0111";

flag<='1';

ELSE

CT <=0;

HEX<="1111";

flag<='0';

END IF;

END IF;

2、仿真建立過程

(1)設(shè)置ENDTIME為 10us

基于fpga的簡易電子琴的設(shè)計(jì)eda課程設(shè)計(jì),fpga開發(fā),vhdl

(2)為了仿真結(jié)果更明顯,仿真時(shí)間內(nèi)有更多CLK時(shí)鐘信號,將其設(shè)置為周期20ns的方波。

基于fpga的簡易電子琴的設(shè)計(jì)eda課程設(shè)計(jì),fpga開發(fā),vhdl

(3)RST為復(fù)位鍵‘1’有效,賦初值,同時(shí)RST為1時(shí)應(yīng)實(shí)現(xiàn)靜音功能。

、基于fpga的簡易電子琴的設(shè)計(jì)eda課程設(shè)計(jì),fpga開發(fā),vhdl

S1 S2為琴鍵,1有效,S1最初設(shè)置為0檢驗(yàn)靜音功能,后再RST為‘0’時(shí)檢驗(yàn)聲音分頻功能。S2錯(cuò)開S1有效時(shí)間有效,檢驗(yàn)不同按鍵功能。

(4)B1 B2為模式選擇鍵,設(shè)置如下:

基于fpga的簡易電子琴的設(shè)計(jì)eda課程設(shè)計(jì),fpga開發(fā),vhdl

3、仿真結(jié)果檢驗(yàn)

基于fpga的簡易電子琴的設(shè)計(jì)eda課程設(shè)計(jì),fpga開發(fā),vhdl

(1)靜音功能檢驗(yàn)

?基于fpga的簡易電子琴的設(shè)計(jì)eda課程設(shè)計(jì),fpga開發(fā),vhdl

如上圖仿真結(jié)果,靜音按鍵下按下琴鍵,只會有數(shù)碼管顯示,不會對蜂鳴器輸出聲音。

(2)琴鍵功能檢驗(yàn)

?基于fpga的簡易電子琴的設(shè)計(jì)eda課程設(shè)計(jì),fpga開發(fā),vhdl

如上圖,S1和S2分別有效時(shí),輸出的頻率是2倍的關(guān)系,同時(shí)具體周期也與仿真代碼分頻模塊中設(shè)置相同,同時(shí)數(shù)碼管譯碼前的數(shù)據(jù)正確。

(3)模式選擇功能檢驗(yàn)

基于fpga的簡易電子琴的設(shè)計(jì)eda課程設(shè)計(jì),fpga開發(fā),vhdl

如上圖仿真結(jié)果,不同模式下按下不同琴鍵對應(yīng)輸出頻率和仿真代碼模式選擇模塊中設(shè)置相同,模式功能實(shí)現(xiàn)。

五、心得體會

電子綜合設(shè)計(jì)是培養(yǎng)我們綜合運(yùn)用所學(xué)知識,提出和解決問題能力的重要學(xué)習(xí)活動。通過這次實(shí)踐,我們對FPGA的工作原理與使用都有了進(jìn)一步的理解,更重要的是提高了自主研究學(xué)習(xí)的能力。

剛開始,我們研讀設(shè)計(jì)要求,通過網(wǎng)絡(luò)等各種方式查詢相關(guān)的資料。通過對這些資料的學(xué)習(xí),我們大致了解了本次課程設(shè)計(jì)相關(guān)的知識,例如Quartus Ⅱ軟件的使用與VHDL語言等,鍛煉了我們搜集信息的能力。

開發(fā)過程中,通過學(xué)習(xí)資料,我們對DE2-115板卡的各個(gè)部分有了更深層次的了解,也熟悉了一些引腳的分配方法。在編程方面,通過Quartus Ⅱ軟件的開發(fā),使我們加深了對FPGA的工作原理的理解,熟悉了VHDL語言的結(jié)構(gòu)和編程規(guī)則。通過DE2-115板與外部設(shè)備的配合實(shí)現(xiàn)我們所需的相關(guān)功能。

此次課程設(shè)計(jì)中,我們遇到了一系列的問題,也看到了自身的不足。代碼的編寫部分我們花費(fèi)了大量時(shí)間。由于上學(xué)期數(shù)電中接觸過ISE軟件,因此一開始我們小組考慮采用ISE進(jìn)行代碼編寫與仿真,而實(shí)際上板時(shí)直接遷移至Quartus Ⅱ軟件中,完成課程設(shè)計(jì)。代碼思路也與現(xiàn)在的最終成果思路不太一致,當(dāng)時(shí)我們考慮到板卡中按鍵數(shù)量不夠無法滿足實(shí)際需要,便按照撥動開關(guān)作為琴鍵設(shè)計(jì),而非最終的按鍵開關(guān)設(shè)計(jì),且觸發(fā)源我們采用上升沿和下降沿均可以觸發(fā),即對于撥動開關(guān),我們在上撥和下?lián)軙r(shí)都會讓琴發(fā)出聲音,并設(shè)定聲音延時(shí)時(shí)長為0.25s,較為符合電子琴的實(shí)際效果。

當(dāng)時(shí)在ise軟件中,這一思路的代碼已經(jīng)通過了軟件編譯和波形仿真,能夠?qū)崿F(xiàn)我們想要的初步功能,只差加入顯示譯碼管和消抖功能上板了。但是后來在第一次集中燒錄時(shí),我們滿懷信心的將原本ISE中的代碼遷移至Quartus Ⅱ軟件進(jìn)行編譯燒錄時(shí),卻遇到了很大的問題——代碼根本無法通過調(diào)試!我們嘗試進(jìn)行修改,但無奈報(bào)錯(cuò)實(shí)在太多,讓我們非??鄲?。后來我們無奈的向老師求助,老師在看了我們的代碼后,很確定的告訴我們,我們這種邊沿觸發(fā)的方式是完全錯(cuò)誤的,F(xiàn)PGA根本無法執(zhí)行這樣的指令,且由于時(shí)鐘速度過快,邊沿觸發(fā)也很難進(jìn)行消抖處理,我們當(dāng)時(shí)就如同晴空霹靂一般,心里想著三個(gè)人三個(gè)周末的努力居然就這么白白浪費(fèi)了,真是心有不甘。但后來組員們也鎮(zhèn)靜下來,最終商討后決定使用Quartus Ⅱ軟件重新編寫代碼,由一開始的單個(gè)按鍵,重新走一遍設(shè)計(jì)流程。有了第一次的失敗經(jīng)驗(yàn),大家的信心有些受挫,甚至有組員考慮過臨時(shí)更換題目,但后來也都堅(jiān)持了下來。最終經(jīng)歷了兩個(gè)周末,第二版代碼成功編譯并完成仿真,上板燒錄,實(shí)現(xiàn)了這一實(shí)踐設(shè)計(jì)。

從開始設(shè)計(jì)到最終完成代碼編寫,我們小組花費(fèi)了一個(gè)月左右的時(shí)間,代碼的最終實(shí)現(xiàn)離不開三位組員共同努力相互幫助,也離不開老師的耐心指導(dǎo)。最后,感謝組員的相互幫助,以及老師的精心指導(dǎo),讓我們小組得以完成這次課程設(shè)計(jì)。

六、開發(fā)板管腳介紹及管腳對應(yīng)

1、開發(fā)板管腳介紹

基于fpga的簡易電子琴的設(shè)計(jì)eda課程設(shè)計(jì),fpga開發(fā),vhdl

基于fpga的簡易電子琴的設(shè)計(jì)eda課程設(shè)計(jì),fpga開發(fā),vhdl?基于fpga的簡易電子琴的設(shè)計(jì)eda課程設(shè)計(jì),fpga開發(fā),vhdl

?基于fpga的簡易電子琴的設(shè)計(jì)eda課程設(shè)計(jì),fpga開發(fā),vhdl

?基于fpga的簡易電子琴的設(shè)計(jì)eda課程設(shè)計(jì),fpga開發(fā),vhdl

基于fpga的簡易電子琴的設(shè)計(jì)eda課程設(shè)計(jì),fpga開發(fā),vhdl

基于fpga的簡易電子琴的設(shè)計(jì)eda課程設(shè)計(jì),fpga開發(fā),vhdl

基于fpga的簡易電子琴的設(shè)計(jì)eda課程設(shè)計(jì),fpga開發(fā),vhdl?基于fpga的簡易電子琴的設(shè)計(jì)eda課程設(shè)計(jì),fpga開發(fā),vhdl

2、管腳對應(yīng)?

?基于fpga的簡易電子琴的設(shè)計(jì)eda課程設(shè)計(jì),fpga開發(fā),vhdl

?基于fpga的簡易電子琴的設(shè)計(jì)eda課程設(shè)計(jì),fpga開發(fā),vhdl

七、程序下載到實(shí)驗(yàn)板的步驟

?1.將設(shè)計(jì)下載在FPGA 中。點(diǎn)擊菜單項(xiàng)Tools->Programmer。打開程序下載環(huán)境。

基于fpga的簡易電子琴的設(shè)計(jì)eda課程設(shè)計(jì),fpga開發(fā),vhdl

?2.點(diǎn)擊Hardware Setup 按鈕,選擇USB。點(diǎn)擊 Close 確認(rèn)設(shè)置。

基于fpga的簡易電子琴的設(shè)計(jì)eda課程設(shè)計(jì),fpga開發(fā),vhdl

基于fpga的簡易電子琴的設(shè)計(jì)eda課程設(shè)計(jì),fpga開發(fā),vhdl

3.下載程序。在Programmer界面中,將文件列表中Program/Configure 屬性勾上,點(diǎn)擊Start,精度條顯示100%時(shí)完成下載。

基于fpga的簡易電子琴的設(shè)計(jì)eda課程設(shè)計(jì),fpga開發(fā),vhdl?基于fpga的簡易電子琴的設(shè)計(jì)eda課程設(shè)計(jì),fpga開發(fā),vhdl文章來源地址http://www.zghlxwxcb.cn/news/detail-792508.html

到了這里,關(guān)于基于VHDL的FPGA簡易電子琴(實(shí)現(xiàn)三音階切換與彈奏)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 如何使用NE555設(shè)計(jì)一個(gè)簡易電子琴

    如何使用NE555設(shè)計(jì)一個(gè)簡易電子琴

    今天來分享個(gè)使用NE555制作一個(gè)電子琴。 首先看到音調(diào)和頻率的關(guān)系 ?NE555電子器的原理就是利用不同的按鍵使NE555發(fā)出不同頻率的方波,從而產(chǎn)生不同的音調(diào) NE555產(chǎn)生方波電路如下: 接上喇叭后就能發(fā)出不同的音調(diào)了 其中RB用不同的電阻加按鍵代替,當(dāng)按下相應(yīng)的按鍵后,

    2024年02月11日
    瀏覽(27)
  • 基于FPGA的數(shù)字電子琴——數(shù)電小系統(tǒng)設(shè)計(jì)【數(shù)字電子技術(shù)】(使用Vivado中的verilog語言)含piano代碼文件(全)

    基于FPGA的數(shù)字電子琴——數(shù)電小系統(tǒng)設(shè)計(jì)【數(shù)字電子技術(shù)】(使用Vivado中的verilog語言)含piano代碼文件(全)

    目錄 一、電路功能描述 二、方案設(shè)計(jì) 1. 總體設(shè)計(jì)方案 2. 對原理框圖或程序流程圖做出簡單解釋 3. 各模塊介紹 3.1 音頻驅(qū)動模塊 3.2 LED顯示模塊 3.3 數(shù)碼管顯示模塊 3.4 矩陣鍵盤模塊 3.5 PS2機(jī)械鍵盤模塊 3.6 時(shí)鐘分頻模塊 3.7 曲譜生成模塊 三、總結(jié) 數(shù)碼管和LED顯示模塊 矩陣鍵盤

    2024年02月06日
    瀏覽(27)
  • 【Proteus仿真】【Arduino單片機(jī)】簡易電子琴

    【Proteus仿真】【Arduino單片機(jī)】簡易電子琴

    本項(xiàng)目使用Proteus8仿真Arduino單片機(jī)控制器,使用無源蜂鳴器、按鍵等。 主要功能: 系統(tǒng)運(yùn)行后,按下K1-K7鍵發(fā)出不同音調(diào)。 B站演示視頻:https://space.bilibili.com/444388619 視頻地址:https://space.bilibili.com/444388619/video 專注于51單片機(jī)、STM32、國產(chǎn)32、DSP、Proteus、arduino、ESP32、物聯(lián)網(wǎng)

    2024年02月06日
    瀏覽(20)
  • FPGA復(fù)雜數(shù)字系統(tǒng)設(shè)計(jì)1(數(shù)字電子琴)

    FPGA復(fù)雜數(shù)字系統(tǒng)設(shè)計(jì)1(數(shù)字電子琴)

    做的是一個(gè)簡陋的按鍵電子琴模塊,并且用的笨辦法,很笨蛋,但有效。 一、來看看實(shí)驗(yàn)要求: 通過按鍵控制蜂鳴器鳴響,編寫Verilog程序,對基本時(shí)鐘源(20MHz)進(jìn)行分頻,以產(chǎn)生如表1所示的各個(gè)頻率信號。表1中列出的頻率共有21個(gè),分別與低音、中音、高音3個(gè)頻段下的不

    2024年02月05日
    瀏覽(23)
  • 基于單片機(jī)的電子琴設(shè)計(jì)

    基于單片機(jī)的電子琴設(shè)計(jì)

    摘 要 讀書、看電影、聽音樂,都是最常見的豐富內(nèi)心世界的良劑。聽音樂,作為陶冶情操、提升境界最便捷的方式,正受到越來越多人們的歡迎。音樂可以很輕松的融入各種場合,給人們帶來很輕松的氛圍,只有真正的接觸它,才可以真正的感受到它的魅力。 本次設(shè)計(jì)正是

    2024年03月18日
    瀏覽(29)
  • 51單片機(jī)項(xiàng)目(9)——基于51單片機(jī)的電子琴設(shè)計(jì)

    51單片機(jī)項(xiàng)目(9)——基于51單片機(jī)的電子琴設(shè)計(jì)

    簡易電子琴設(shè)計(jì)設(shè)計(jì)內(nèi)容: 1.用矩陣鍵盤代表琴鍵,至少能彈出8個(gè)音符,分別是:音符1.23.4.,5,6,? 2.鍵按下的時(shí)間長短表征節(jié)拍的長短,用蜂鳴器發(fā)出聲音 3.數(shù)碼管顯示出當(dāng)前音符 4.音量可調(diào) (代碼及其工程文件放在最后) 電路圖如下: 51單片機(jī)電子琴是一種基于51單片機(jī)(

    2024年02月09日
    瀏覽(27)
  • stm32蜂鳴器實(shí)現(xiàn)電子琴(原理+代碼)

    stm32蜂鳴器實(shí)現(xiàn)電子琴(原理+代碼)

    許久沒有摸32了,今天是培訓(xùn)的第一天,做個(gè)電子琴練練手。 編程難度很小,無非就是gpio控制引腳高低電平轉(zhuǎn)換,比較值得注意的主要是一些樂理上的知識。 我們能聽到的1 2 3 4 5 6 7的音符,實(shí)際上是一個(gè)個(gè)固定的頻率,這個(gè)具體算我也不懂,問巴赫去吧 總而言之,通過百度

    2024年02月06日
    瀏覽(25)
  • 基于51單片機(jī)的7鍵電子琴音樂播放器proteus

    基于51單片機(jī)的7鍵電子琴音樂播放器proteus

    本設(shè)計(jì)僅供參考 基于51單片機(jī)的7鍵電子琴音樂播放器proteus(仿真+源碼+原理圖) 原理圖:Altium Designer 仿真圖proteus 7.8 程序編譯器:keil 4/keil 5 編程語言:C語言 編號C0036 有需要學(xué)習(xí)可以點(diǎn)擊下方鏈接下載 資料下載鏈接 設(shè)計(jì)介紹: 本次設(shè)計(jì)首先對單片機(jī)設(shè)計(jì)簡易電子琴仔細(xì)分

    2024年02月11日
    瀏覽(18)
  • 基于AT89C51單片機(jī)的電子琴設(shè)計(jì)與仿真

    基于AT89C51單片機(jī)的電子琴設(shè)計(jì)與仿真

    點(diǎn)擊鏈接獲取Keil源碼與Project Backups仿真圖: https://download.csdn.net/download/qq_64505944/87848430?spm=1001.2014.3001.5503 源碼獲取 主要內(nèi)容: 設(shè)計(jì)一個(gè)簡易的電子琴,至少具有可以彈奏并發(fā)出不同的音調(diào)。電子琴方案主要分為實(shí)驗(yàn)的系統(tǒng)分析,具體的實(shí)施方案,以及最終的實(shí)驗(yàn)檢驗(yàn),最終

    2024年02月07日
    瀏覽(27)
  • Proteus仿真--基于51單片機(jī)的可演奏電子琴設(shè)計(jì)(仿真文件+程序)

    Proteus仿真--基于51單片機(jī)的可演奏電子琴設(shè)計(jì)(仿真文件+程序)

    本文主要介紹基于51單片機(jī)的可演奏電子琴設(shè)計(jì)(完整仿真源文件及代碼見文末鏈接) 仿真圖如下 其中通過矩陣鍵盤可以實(shí)現(xiàn)不同的音樂播放 仿真運(yùn)行視頻 Proteus仿真--基于51單片機(jī)的可演奏電子琴設(shè)計(jì)(仿真文件+程序) 附完整Proteus仿真資料+代碼資料 百度網(wǎng)盤鏈接: https:

    2024年02月06日
    瀏覽(62)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包