目錄
一、設(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、簡易框圖
?2、總電路圖(quarters軟件自動生成)
三、代碼說明?
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; ??---
?
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
(2)為了仿真結(jié)果更明顯,仿真時(shí)間內(nèi)有更多CLK時(shí)鐘信號,將其設(shè)置為周期20ns的方波。
(3)RST為復(fù)位鍵‘1’有效,賦初值,同時(shí)RST為1時(shí)應(yīng)實(shí)現(xiàn)靜音功能。
、
S1 S2為琴鍵,1有效,S1最初設(shè)置為0檢驗(yàn)靜音功能,后再RST為‘0’時(shí)檢驗(yàn)聲音分頻功能。S2錯(cuò)開S1有效時(shí)間有效,檢驗(yàn)不同按鍵功能。
(4)B1 B2為模式選擇鍵,設(shè)置如下:
3、仿真結(jié)果檢驗(yàn)
(1)靜音功能檢驗(yàn)
?
如上圖仿真結(jié)果,靜音按鍵下按下琴鍵,只會有數(shù)碼管顯示,不會對蜂鳴器輸出聲音。
(2)琴鍵功能檢驗(yàn)
?
如上圖,S1和S2分別有效時(shí),輸出的頻率是2倍的關(guān)系,同時(shí)具體周期也與仿真代碼分頻模塊中設(shè)置相同,同時(shí)數(shù)碼管譯碼前的數(shù)據(jù)正確。
(3)模式選擇功能檢驗(yàn)
如上圖仿真結(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ā)板管腳介紹
?
?
?
?
2、管腳對應(yīng)?
?
?
七、程序下載到實(shí)驗(yàn)板的步驟
?1.將設(shè)計(jì)下載在FPGA 中。點(diǎn)擊菜單項(xiàng)Tools->Programmer。打開程序下載環(huán)境。
?2.點(diǎn)擊Hardware Setup 按鈕,選擇USB。點(diǎn)擊 Close 確認(rèn)設(shè)置。
3.下載程序。在Programmer界面中,將文件列表中Program/Configure 屬性勾上,點(diǎn)擊Start,精度條顯示100%時(shí)完成下載。文章來源:http://www.zghlxwxcb.cn/news/detail-792508.html
?
文章來源地址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)!