A. 簡易8按鍵電子琴設計實驗
簡易電子琴的設計
摘 要 隨著基於CPLD的EDA技術的發展和應用領域的擴大與深入,EDA技術在電子信息、通信、自動控制用計算機等領域的重要性日益突出。作為一個學電子信息專業的學生,我們必須不斷地了解更多的新產品信息,這就更加要求我們對EDA有個全面的認識。本程序設計的是簡易電子琴的設計。採用EDA作為開發工具,VHDL語言為硬體描述語言,MAX + PLUS II作為程序運行平台,所開發的程序通過調試運行、波形模擬驗證,初步實現了設計目標。本程序使用的硬體描述語言VHDL,可以大大降低了硬體數字系統設計的入門級別,讓人感覺就是C語言的近親。通過老師的指導和自己的學習完成了預想的功能。
關鍵詞 電子琴;課程設計;EDA;VHDL
1 引言
1.1 課程設計胡配陪的目的
鞏固和運用所學課程,理論聯系實際,提高分析、解決計算機技術實際問題的獨立工作能力,通過對一個簡易的八音符電子琴的設計,進一步加深對計算機原理以及數字電路應用技術方面的了解與認識,進一步熟悉數字電路系統設計、製作與調試的方法和步驟。鞏固所學課堂知識,理論聯系實際,提高分析、解決計算機技術實際問題的獨立工作能力。為了進一步了解計算機組成原理與系統結構,深入學習EDA技術,用VHDL語言去控制將會使我們對本專業知識可以更好地掌握。
1.2 課程設計的內容
(1)設計一個簡易的八音符電子琴,它可通過按鍵輸入來控制音響。
(2)演奏時可以選擇是手動演奏(由鍵盤輸入)還是自動演奏已存入的樂曲。
(3)能夠自動演奏多首樂曲,且每首樂曲可重復演奏。
2 開發工具簡介
2.1 EDA技術
EDA是電子設計自動化(Electronic Design Automation)縮寫,是90年代初從CAD(計算機輔助設計)、CAM(計算機輔助製造)、CAT(計算機輔助測試)和CAE(計算機輔助工程)的概念發展而來的。EDA技術是以計算機為工具,根據硬體描述語言HDL( Hardware Description language)完成的設計文件,自動地完成邏輯編譯、化簡、分割、綜合及優化、布局布線、模擬以及對於特定目標晶元的適配編譯和編程褲蠢下載等工作。典型的EDA工具中必須包含兩個特殊的軟體包,即綜合器和適配器。綜合器的功能就是將設計者在EDA平台上完成的針對某個系統項目的HDL、原理圖或狀態圖形描述,針對給定的硬體系統組件,進行編譯、優化、轉換和綜合,最終獲得我們欲實現功能的描述文件。綜合器在工作前,必須給定所要實現的硬體結構參數,它的功能就是將軟體描述與給定的硬體結構用一定的方式聯系起來。也就是說,綜合器是軟體描述與硬體實現的一座橋梁。綜合過程就是將電路的高級語言描述轉換低級的、可與目標器件FPGA/CPLD相映射的網表文件。
適配器的功能是將由綜合器產生的王表文件配置與指定的目標器件中,產生最終的下載文件,如JED文件。適配所選定的目標器件(FPGA/CPLD晶元)必須屬於在綜合器中已指定的目標器件系列。
硬體描述語言HDL是相對於一般的計算機軟體語言,如:C、PASCAL而言的。HDL語言使用與設計硬體電子系統的計算機語言,它能描述電子系統的邏輯功能、電路結構和連接方式。設計者可利用HDL程序來描述所希望的電路系統,規定器件結構特徵和電路的行為方式;然後利用綜合器和適配器將此程序編程能控制FPGA和CPLD內部結構,並實現相應邏輯功能的的門級或更底層的結構網表文件或下載文件。目前,就FPGA/CPLD開發來說,比較常用和流行的HDL主要有ABEL-HDL、AHDL和VHDL。
2.2硬體描述語言—VHDL
VHDL的英文全名是Very-High-Speed Integrated Circuit Hardware Description Language,誕生於1982年。1987年底,VHDL被IEEE和美國國防部確認為標准硬體描述語言 。自IEEE公布了VHDL的標准版本,IEEE-1076(簡稱87版)之後,各EDA公司相繼推出了自己的VHDL設計環境,或宣布自己的設計工賣弊具可以和VHDL介面。此後VHDL在電子設計領域得到了廣泛的接受,並逐步取代了原有的非標準的硬體描述語言。1993年,IEEE對VHDL進行了修訂,從更高的抽象層次和系統描述能力上擴展VHDL的內容,公布了新版本的VHDL,即IEEE標準的1076-1993版本,(簡稱93版)。現在,VHDL和Verilog作為IEEE的工業標准硬體描述語言,又得到眾多EDA公司的支持,在電子工程領域,已成為事實上的通用硬體描述語言。有專家認為,在新的世紀中,VHDL於Verilog語言將承擔起大部分的數字系統設計任務。
VHDL主要用於描述數字系統的結構,行為,功能和介面。除了含有許多具有硬體特徵的語句外,VHDL的語言形式和描述風格與句法是十分類似於一般的計算機高級語言。VHDL的程序結構特點是將一項工程設計,或稱設計實體(可以是一個元件,一個電路模塊或一個系統)分成外部(或稱可是部分,及埠)和內部(或稱不可視部分),既涉及實體的內部功能和演算法完成部分。在對一個設計實體定義了外部界面後,一旦其內部開發完成後,其他的設計就可以直接調用這個實體。這種將設計實體分成內外部分的概念是VHDL系統設計的基本點。應用VHDL進行工程設計的優點是多方面的。
(1) 與其他的硬體描述語言相比,VHDL具有更強的行為描述能力,從而決定了他成為系統設計領域最佳的硬體描述語言。強大的行為描述能力是避開具體的器件結構,從邏輯行為上描述和設計大規模電子系統的重要保證。
(2) VHDL豐富的模擬語句和庫函數,使得在任何大系統的設計早期就能查驗設計系統的功能可行性,隨時可對設計進行模擬模擬。
(3) VHDL語句的行為描述能力和程序結構決定了他具有支持大規模設計的分解和已有設計的再利用功能。符合市場需求的大規模系統高效,高速的完成必須有多人甚至多個代發組共同並行工作才能實現。(4)對於用VHDL完成的一個確定的設計,可以利用EDA工具進行邏輯綜合和優化,並自動的把VHDL描述設計轉變成門級網表。
(4) VHDL對設計的描述具有相對獨立性,設計者可以不懂硬體的結構,也不必管理最終設計實現的目標器件是什麼,而進行獨立的設計。
2.3 VHDL的設計流程:
(1) 設計輸入根據電路設計所提出的要求,將程序輸入到VHDL編輯器中去編輯。
(2) 功能級模擬用VHDL,模擬器對編輯後的程序進行模擬,如果達不到設計要求,則可以重新修改程序,直到通過功能模擬。
(3) 邏輯綜合與優化 將通過功能模擬的程序放到VHDL編譯器中,進行邏輯綜合與優化。
(4) 門級模擬對電路用VHDL。模擬器模擬。可對門級電路的延時、定時狀態、驅動能力等進行模擬。如不符合要求,可重復步驟(3),再門級模擬,直到符合要求止。
(5) 版圖生成 用相應的軟體處理後,就可以拿去製版。
設計過程
3.1設計規劃
根據系統設計要求,系統設計採用自頂向下的設計方法,系統的整體組裝設計原理圖如圖3-1所示,它由樂曲自動演奏模塊、音調發生模塊和數控分頻模塊三部分組成。
圖3-1 系統的整體組裝設計原理圖
3.2 各模塊的原理及其程序
(1)樂曲自動演奏模塊
樂曲自動演奏模塊(AUTO.VHD)的作用是產生8位發聲控制輸入信號/當進行自動演奏時,由存儲在此模塊中的8位二進制數作為發聲控制輸入,從而自動演奏樂曲。
VHDL源程序(AUTO.VHD)
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY AUTO IS
PORT ( CLK : IN STD_LOGIC;
AUTO : IN STD_LOGIC;
CLK2 : BUFFER STD_LOGIC;
INDEX2 : IN STD_LOGIC_VECTOR(7 DOWNTO 0);
INDEX0 : OUT STD_LOGIC_VECTOR(7 DOWNTO 0));
END AUTO;
ARCHITECTURE BEHAVIORAL OF AUTO IS
SIGNAL COUNT0: INTEGER RANGE 0 TO 31;
BEGIN
PULSE0 :PROCESS(CLK,AUTO)
VARIABLE COUNT :INTEGER RANGE 0 TO 8;
BEGIN
IF AUTO ='1' THEN
COUNT := 0;CLK2<='0';
ELSIF(CLK'EVENT AND CLK ='1')THEN
COUNT :=COUNT +1;
IF COUNT =4 THEN
CLK2 <='1';
ELSIF COUNT =8 THEN
CLK2<='0'; COUNT:=0;
END IF ;
END IF ;
END PROCESS;
MUSIC:PROCESS(CLK2)
BEGIN
IF (CLK2'EVENT AND CLK2='1')THEN
IF (COUNT0=31)THEN
COUNT0<=0;
ELSE
COUNT0<=COUNT0+1;
END IF ;
END IF ;
END PROCESS;
COM1:PROCESS(COUNT0,AUTO,INDEX2)
BEGIN
IF AUTO ='0' THEN
CASE COUNT0 IS
WHEN 0=>INDEX0<="00000100"; --3
WHEN 1=>INDEX0<="00000100"; --3
WHEN 2=>INDEX0<="00000100"; --3
WHEN 3=>INDEX0<="00000100"; --3
WHEN 4=>INDEX0<="00010000"; --5
WHEN 5=>INDEX0<="00010000"; --5
WHEN 6=>INDEX0<="00010000"; --5
WHEN 7=>INDEX0<="00100000"; --6
WHEN 8=>INDEX0<="10000000"; --8
WHEN 9=>INDEX0<="10000000"; --8
WHEN 10=>INDEX0<="10000000"; --8
WHEN 11=>INDEX0<="00000100"; --3
WHEN 12=>INDEX0<="00000010"; --2
WHEN 13=>INDEX0<="00000010"; --2
WHEN 14=>INDEX0<="00000001"; --1
WHEN 15=>INDEX0<="00000001"; --1
WHEN 16=>INDEX0<="00010000"; --5
WHEN 17=>INDEX0<="00010000"; --5
WHEN 18=>INDEX0<="00001000"; --4
WHEN 19=>INDEX0<="00001000"; --4
WHEN 20=>INDEX0<="00001000"; --4
WHEN 21=>INDEX0<="00000100"; --3
WHEN 22=>INDEX0<="00000010"; --2
WHEN 23=>INDEX0<="00000010"; --2
WHEN 24=>INDEX0<="00010000"; --5
WHEN 25=>INDEX0<="00010000"; --5
WHEN 26=>INDEX0<="00001000"; --4
WHEN 27=>INDEX0<="00001000"; --4
WHEN 28=>INDEX0<="00000100"; --3
WHEN 29=>INDEX0<="00000100"; --3
WHEN 30=>INDEX0<="00000010"; --2
WHEN 31=>INDEX0<="00000010"; --2
WHEN OTHERS =>NULL;
END CASE;
ELSE INDEX0<=INDEX2;
END IF;
END PROCESS;
END BEHAVIORAL;
(2) 音調發生模塊
音調發生模塊的作用是產生音階的分頻預置值。當8位發聲控制輸入信號中的某一位為高電平時,則對應某一音節的數值將輸出,該數值即為該音階的分頻預置值,分頻預置值控制數控分頻模塊進行分頻,由此可得到每個音階對應的頻率。
VHDL源程序(TONE.VHD)
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY TONE IS
PORT (INDEX: IN STD_LOGIC_VECTOR(7 DOWNTO 0);
CODE: OUT STD_LOGIC_VECTOR(6 DOWNTO 0);
HIGH: OUT STD_LOGIC;
TONE0: OUT INTEGER RANGE 0 TO 2047);
END TONE;
ARCHITECTURE ART OF TONE IS
BEGIN
SEARCH : PROCESS(INDEX)
BEGIN
CASE INDEX IS
WHEN "00000001"=>TONE0 <=773;CODE<="1001111";HIGH<='1';
WHEN "00000010"=>TONE0 <=912;CODE<="0010010";HIGH<='1';
WHEN "00000100"=>TONE0 <=1036;CODE<="0000110";HIGH<='1';
WHEN "00001000"=>TONE0 <=1116;CODE<="1001100";HIGH<='1';
WHEN "00010000"=>TONE0 <=1197;CODE<="0100100";HIGH<='1';
WHEN "00100000"=>TONE0 <=1290;CODE<="0100000";HIGH<='0';
WHEN "01000000"=>TONE0 <=1372;CODE<="0001111";HIGH<='0';
WHEN "10000000"=>TONE0 <=1410;CODE<="0000000";HIGH<='0';
WHEN OTHERS =>TONE0<=2047;CODE<="0000001";HIGH<='0';
END CASE;
END PROCESS;
END ART;
(3) 數控分頻模塊
數控分頻模塊是對時基脈沖進行分頻,得到與1、2、3、4、5、6、7七個音符相對應的頻率。
VHDL源程序(FENPIN.VHD)
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY FENPIN IS
PORT(CLK1: IN STD_LOGIC;
TONE1: IN INTEGER RANGE 0 TO 2047;
SPKS: OUT STD_LOGIC);
END ENTITY FENPIN;
ARCHITECTURE ART OF FENPIN IS
SIGNAL PRECLK:STD_LOGIC;
SIGNAL FULLSPKS:STD_LOGIC;
BEGIN
PROCESS(CLK1)
VARIABLE COUNT:INTEGER RANGE 0 TO 8;
BEGIN
IF (CLK1'EVENT AND CLK1='1')THEN
COUNT:=COUNT +1;
IF COUNT=2 THEN
PRECLK<='1';
ELSIF COUNT =4 THEN
PRECLK<='0';COUNT:=0;
END IF ;
END IF ;
END PROCESS;
PROCESS(PRECLK,TONE1)
VARIABLE COUNT11:INTEGER RANGE 0 TO 2047;
BEGIN
IF (PRECLK'EVENT AND PRECLK='1')THEN
IF COUNT11<TONE1 THEN
COUNT11:=COUNT11+1;FULLSPKS<='1';
ELSE
COUNT11:=0;FULLSPKS<='0';
END IF ;
END IF ;
END PROCESS;
PROCESS(FULLSPKS)
VARIABLE COUNT2 :STD_LOGIC:='0';
BEGIN
IF (FULLSPKS'EVENT AND FULLSPKS='1')THEN
COUNT2:=NOT COUNT2;
IF COUNT2='1'THEN
SPKS<='1';
ELSE
SPKS<='0';
END IF ;
END IF;
END PROCESS;
END ART;
(4) 頂層設計
VHDL源程序(DIANZIQIN.VHD)
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY DIANZIQIN IS
PORT(CLK32MHZ: IN STD_LOGIC;
HANDTOAUTO:IN STD_LOGIC;
CODE1: OUT STD_LOGIC_VECTOR(6 DOWNTO 0);--音符顯示信號
INDEX1: IN STD_LOGIC_VECTOR(7 DOWNTO 0);--鍵盤輸入信號
HIGH1: OUT STD_LOGIC;--高低音節信號
SPKOUT: OUT STD_LOGIC);--音頻信號
END;
ARCHITECTURE ART OF DIANZIQIN IS
COMPONENT AUTO
PORT(CLK: IN STD_LOGIC;
AUTO: IN STD_LOGIC;
INDEX2: IN STD_LOGIC_VECTOR(7 DOWNTO 0);
INDEX0: OUT STD_LOGIC_VECTOR(7 DOWNTO 0));
END COMPONENT;
COMPONENT TONE
PORT(INDEX: IN STD_LOGIC_VECTOR(7 DOWNTO 0);
CODE: OUT STD_LOGIC_VECTOR(6 DOWNTO 0);
HIGH: OUT STD_LOGIC;
TONE0: OUT INTEGER RANGE 0 TO 2047);
END COMPONENT;
COMPONENT FENPIN
PORT(CLK1: IN STD_LOGIC;
TONE1:IN INTEGER RANGE 0 TO 2047;
SPKS: OUT STD_LOGIC);
END COMPONENT;
SIGNAL TONE2:INTEGER RANGE 0 TO 2047;
SIGNAL INDX:STD_LOGIC_VECTOR(7 DOWNTO 0);
BEGIN
U0:AUTOPORTMAP(CLK=>CLK32MHZ,INDEX2=>INDEX1,INDEX0=>INDX,AUTO=>HANDTOAUTO);
U1:TONEPORTMAP(INDEX=>INDX,TONE0=>TONE2,CODE=>CODE1,HIGH=>HIGH1);
U2:FENPIN PORT MAP(CLK1=>CLK32MHZ,TONE1=>TONE2,SPKS=>SPKOUT);
END ART;
4 波形模擬
(1)樂曲自動演奏模塊的模擬(如圖4-1所示)
圖4-1樂曲自動演奏模塊的模擬圖
(2)音調發生模塊的模擬(如圖4-2)
圖4-2 音調發生模塊的模擬圖
(3)數控分頻模塊的模擬(如圖4-3)
圖4-3數控分頻模塊模擬圖
(4)簡易電子琴整個系統的模擬(如圖4-4)
圖4-4簡易電子琴整個系統的模擬圖
5 結束語
經過努力,簡易電子琴的設計基本上完成了。在整個設計過程中,包括前期中期和後期,我都有著許多不同的體會:
1) 這個設計的基本是接觸一門新的語言並加以應用,對於我來說,沒有想到的是入手的速度比我的預料快,在以前編程的基礎上,從接觸到開始動手編程的時間得到了很大的縮短。知識的接收速度在很大的程度上決定了動手的時間。
2) VHDL的編程與C語言的編程有著本質的不同,然而以往形成的舊編程習慣在VHDL編程中依然起著很大的作用。一通百通,不是沒有道理的。對於學習新的知識並予以應用的信心,顯得更足了。
3) VHDL的設計關鍵是電路邏輯設計,而一個程序的關鍵是總體設計。對於硬體設計接觸不多的我們清楚這一點也許不無好處。
4)通過這個程序設計讓我學會一種新的語言,對數字系統結構也有了更進一步的了解和認識,對我以後的學習有很大的幫助。希望其他人在看再做類似設計時有所借鑒。
通過幾天的課程設計,我對資料庫軟體EDA技術、VHDL、等系列知識都有了一定的了解。使用EDA技術開發頁面的能力也有了很大提高。
在整個設計過程中,有很多人對任務的完成給予了重要的支持和幫助。感謝老師給了我本次設計的機會並提供指導;感謝許多同學在我此課程設計遇到問題時給我的幫助使我能夠順利地進行設計的工作;論壇中有很多認識不認識的朋友也都為我的設計提出了很寶貴的建議,同樣在這里感謝他們。
參考文獻
《VHDL與數字電路設計》.盧毅,賴傑.科學出版社
《VHDL語言100例詳解——北京理工大學ASIC研究所》.北京理工大學ASIC研究所.清華大學出版社
《VHDL程序設計》(第二版). 曾繁泰等.清華大學出版社
《VHDL入門與應用》陳雪松,滕立中.人民郵電出版社
《VHDL簡明教程》.王小軍.清華大學出版社