第一篇:EDA課設電子琴設計.
武漢理工大學《電子線路EDA》課程設計 課程設計任務書
學生姓名:-專業班級:電子科學與技術0903班 指導教師: 李成軍 工作單位: 信息工程學院 題 目: 簡易電子琴設計 初始條件:
QUARTUS 軟件,微機,EDA-IV型實驗箱。課題要求:
結合所學的知識,利用QUARTUS采用VHDL語言設計樂曲演奏電路,可以演奏8個音符:1、2、3、4、5、6、7、1。
課題內容: 時間安排: 1、2011年6月11日集中,聽老師作課設安排與報告格式要求說明。2、2012年6月12日至6月16日,選好課題,學習相關資料,開始課 設。3、2012年6月17日至6月19日,進行硬件調試。4、2012年6月20至6月21日,撰寫實驗報告。5、2012年6月22日,檢查硬件,進行答辯,提交設計報告。
設計一個簡易的八音符電子琴,可以通過按鍵輸入來控制蜂鳴器輸出不同音調。指導教師簽名: 2012年 月 日 系主任(或責任教師)簽名: 2012年 月 日 武漢理工大學《電子線路EDA》課程設計 目錄
摘要................................................................................................................................3 Abstract..........................................................................................................................4 緒論................................................................................................................................5 1設計簡介.....................................................................................................................6 1.1 課程設計的目的..............................................................................................6 1.2 課程設計的內容..............................................................................................6 2.VHDL簡介.................................................................................................................7 2.1 VHDL的特點...................................................................................................7 2.2VHDL特點........................................................................................................8 2.3VHDL設計流程...............................................................................................8 3程序過程.....................................................................................................................9 3.1設計總體模塊...................................................................................................9 3.2模塊原理及程序...............................................................................................9
4波形仿真...................................................................................................................12 5總結體會...................................................................................................................13 參考文獻......................................................................................................................14 附錄 源程序................................................................................................................15 武漢理工大學《電子線路EDA》課程設計 摘要
隨著基于CPLD的EDA技術的發展和應用領域的擴大與深入,EDA技術在電子信息、通信、自動控制用計算機等領域的重要性日益突出。作為一個學電子信息專業的學生,我們必須不斷地了解更多的新產品信息,這就更加要求我們對EDA有個全面的認識。本程序設計的是簡易電子琴的設計。采用EDA作為開發工具,VHDL語言為硬件描述語言,QUARTUS作為程序運行平臺,所開發的程序通過調試運行、波形仿真驗證,初步實現了設計目標。本程序使用的硬件描述語言VHDL,可以大大降低了硬件數字系統設計的入門級別,讓人感覺就是C語言的近親。通過老師的指導和自己的學習完成了預想的功能。關鍵詞:電子琴 ;quartus;EDA;VHDL語言 武漢理工大學《電子線路EDA》課程設計
Abstract With the expansion and deepening of CPLD EDA technology development and applications, EDA technology in the electronic information, communication, automatic control computers and other areas of importance have become increasingly prominent.As an electronic information of professional students, we must continue to learn more about the new product information, it is even more we have a comprehensive understanding of EDA.The program design is the design of simple keyboard.Using EDA as a development tool, VHDL language for hardware description language, QUARTUS run as a program platform, the development of program debugging and running, the waveform simulation, the initial realization of the design goals.This program uses the hardware description language VHDL, can greatly reduce the entry level of the hardware design of digital systems, and close relatives of people feel is the C language.Through the guidance of their teachers and their own learning to complete the desired function.Keywords: electronic organ;the quartus;the EDA;VHDL language 武漢理工大學《電子線路EDA》課程設計
緒論
EDA是電子設計自動化(Electronic Design Automation)的縮寫。EDA技術就是依賴功能強大的計算機,在EDA工具軟件平臺上,對以硬件描述語言
HDL(Hardware Description Language)為系統邏輯描述手段完成的設計文件,自動地完成邏輯編譯、化簡、分割、綜合、布局布線以及邏輯優化和仿真測試,直至實現既定的電子線路系統功能。EDA技術使設計者的工作僅局限于利用軟件的方式來完成對系統硬件功能的實現,可以說EDA技術的產生與發展是電子設計技術的一個巨大進步。EDA技術融合了眾多電子設計技術和計算機輔助技術,使得它在現代電子學方面的應用越來越廣泛,也成為電子、電氣類大學生必須熟練掌握的一種設計工具。
硬件描述性語言HDL是EDA技術的重要組成部分,常見HDL的有VHDL、HDL、ABEL、Verilog、AHDL、SystemC等。其中VHDL、Verilog在現在的EDA設計中使用的最多,也擁有了幾乎所有主流EDA工具的支持,而相對于其他語言VHDL更加完善。VHDL是英文全名是VHSIC(Very High Speed Integrated Circuit)Hardware Description Language,是硬件描述語言的業界標準之一。它作為一個規范語言和建模語言,具有與具體硬件電路無關及設計平臺無關的特性,而且還有很強的電路行為描述和建模能力,能從多個層次的數字系統進行建模和描述,從而大大簡化了硬件設計的任務,提高了設計效率和可靠性。武漢理工大學《電子線路EDA》課程設計 1設計簡介
1.1 課程設計的目的
鞏固和運用所學課程,理論聯系實際,提高分析、解決計算機技術實際問題的獨立工作能力,通過對一個簡易的八音符電子琴的設計,進一步加深對計算機原理以及數字電路應用技術方面的了解與認識,進一步熟悉數字電路系統設計、制作與調試的方法和步驟。鞏固所學課堂知識,理論聯系實際,提高分析、解決計算機技術實際問題的獨立工作能力。為了進一步了解計算機組成原理與系統結構,深入學習EDA技術,用VHDL語言去控制將會使我們對本專業知識可以更好地掌握。
1.2 課程設計的內容
設計一個簡易的八音符電子琴,它可通過按鍵輸入來控制音響。當按下不同按鍵時,蜂鳴器發出不同頻率聲響,來實現簡易電子琴功能。
武漢理工大學《電子線路EDA》課程設計 2.VHDL簡介 2.1 VHDL的特點
VHDL語言功能強大、設計靈活。VHDL語言可以用簡潔明確的源代碼來描述復雜的邏輯控制,它具有多層次的設計描述功能,層層細化,最后可直接生成電路級描述。VHDL支持同步電路、異步電路和隨機電路的設計,這是其他硬件描述語言雖不能比擬的。VHDL還支持多種設計方法,既支持自底向上的設計,又支
持自頂向下的設計;既支持模塊化設計,又支持層次化設計。由于VHDL已經成為IEEE標準所規定的硬件描述性語言,目前大多數EDA工具幾乎都支持VHDL。因為VHDL易讀和結構化且易于修改設計所以在硬件電路設計過程中,VHDL語言得到廣泛應用。
VHDL語言獨立于器件的設計與工藝無關。因而設計人員用VHDL進行設計時,不需要考慮選擇器件得問題,就可以集中精力進行設計的優化。當設計描述完成后,可以用多種不同的器件結構來實現其功能。
VHDL語言易于共享和復用。VHDL采用基于庫(Library)的設計方法,可以建立各種可再次利用的模塊。這些模塊可以預先設計或使用以前設計中的存檔模塊,將這些模塊存放到庫中,就可以在以后的設計中進行復用,可以使設計成果在設計人員之間進行交流和共享,減少硬件電路設計。VHDL豐富的仿真語句和庫函數,使得在任何大系統的設計早期就能查驗設計系統的功能可行性,隨時可對設計進行仿真模擬。
VHDL語句的行為描述能力和程序結構決定了它具有支持大規模設計的分解和已有設計的再利用功能。這個特點很好的符合了市場需求。對于用VHDL完成的一個確定的設計,可以利用EDA工具進行邏輯綜合和優化,并自動的把VHDL描述的設計轉變成門級網表。
總之,由于VHDL語言有的這些優良的特點,它被廣泛的應用在電子線路和電子系統的設計中。
武漢理工大學《電子線路EDA》課程設計 2.2VHDL優點
(1)與其他的硬件描述語言相比,VHDL具有更強的行為描述能力,從而決定了他成為系統設計領域最佳的硬件描述語言。強大的行為描述能力是避開具體的器件結構,從邏輯行為上描述和設計大規模電子系統的重要保證。
(2)VHDL豐富的仿真語句和庫函數,使得在任何大系統的設計早期就能查驗設計系統的功能可行性,隨時可對設計進行仿真模擬。
(3)VHDL語句的行為描述能力和程序結構決定了他具有支持大規模設計的分解和已有設計的再利用功能。符合市場需求的大規模系統高效,高速的完成必須有多人甚至多個代發組共同并行工作才能實現。(4)對于用VHDL完成的一個確定的設計,可以利用EDA工具進行邏輯綜合和優化,并自動的把VHDL描述設計轉變成門級網表。
(4)VHDL對設計的描述具有相對獨立性,設計者可以不懂硬件的結構,也不必管理最終設計實現的目標器件是什么,而進行獨立的設計。
2.3VHDL設計流程
(1)設計輸入根據電路設計所提出的要求,將程序輸入到VHDL編輯器中去編輯。
(2)功能級模擬用VHDL,模擬器對編輯后的程序進行模擬,如果達不到設計要求,則可以重新修改程序,直到通過功能模擬。
(3)邏輯綜合與優化 將通過功能模擬的程序放到VHDL編譯器中,進行邏輯綜合與優化。
(4)門級模擬對電路用VHDL。仿真器仿真。可對門級電路的延時、定時狀態、驅動能力等進行仿真。如不符合要求,可重復步驟(3),再門級模擬,直到符合要求止。
(5)版圖生成 用相應的軟件處理后,就可以拿去制版。武漢理工大學《電子線路EDA》課程設計 3程序過程 3.1設計總體模塊
圖3-1電子琴總體模塊
Clk為實驗板時鐘輸入,key[7..0]分別對應八個按鍵輸入,buz為輸出端,連接蜂鳴器。
3.2模塊原理及程序 1、2、3、4、5、6、7、1分別對應的頻率分別為2616HZ、2936HZ、3295HZ、3490HZ、3920HZ、4399HZ、4940HZ、5232HZ。在程序里可以對20M時鐘頻率進行分頻來得到所需頻率而發出不同音調。
20M時鐘要得到上面所需頻率需要進行分頻,分頻系數分別為3822、3405、3034、2865、2551、2273、2024、1911,可以令時鐘計數一定次數后反向從而達到分頻的效果得到所需不同音調對應的頻率。程序中定義8個常數來作為計數對應值:
constant duo : std_logic_vector(12 downto 0):=“0111011101110”;constant lai : std_logic_vector(12 downto 0):= “0110101001101”;constant mi : std_logic_vector(12 downto 0):= “0101111011010”;constant fa : std_logic_vector(12 downto 0):= “0101100110001”;constant suo : std_logic_vector(12
downto 0):= “0100111110111”;constant la : std_logic_vector(12 downto 0):= “0100011100001”;constant xi : std_logic_vector(12 downto 0):= “0011111101000”;武漢理工大學《電子線路EDA》課程設計
constant duo1 : std_logic_vector(12 downto 0):= “0011101110111”;8個按鍵分別對應8個頻率的脈沖,當一個按鍵按下去后此時該按鍵對應引腳輸入高電平,故可利用“01000000”這種形式來表示哪個按鍵按下,而不同按鍵對應不同頻率輸出。對應關系分別為:
“10000000”對應1的頻率; “01000000”對應2的頻率; “00100000”對應3的頻率;
“00010000”對應4的頻率; “00001000”對應5的頻率; “00000100”對應6的頻率; “00000010”對應7的頻率; “00000001”對應1的頻率;
故可用以下程序來實現不同按鍵對應不同頻率的要求:
when“10000000”=>if(clk1 /= duo)then clk1<=clk1+“0000000000001”;else clk1<=“0000000000000”;buzz<=not buzz;end if;
(clk1 /= lai)then clk1<=clk1+“0000000000001”;else clk1<=“0000000000000”;buzz<=not buzz;end if;when“00100000”=>if(clk1 /= mi)then clk1<=clk1+“0000000000001”;else clk1<=“0000000000000”;buzz<=not buzz;end if;武漢理工大學《電子線路EDA》課程設計
when“00010000”=>if(clk1 /= fa)then clk1<=clk1+“0000000000001”;else clk1<=“0000000000000”;buzz<=not buzz;end if;when“00001000”=>if(clk1 /= suo)then clk1<=clk1+“0000000000001”;else clk1<=“0000000000000”;buzz<=not buzz;end if;when“00000100”=>if(clk1 /= la)then clk1<=clk1+“0000000000001”;else clk1<=“0000000000000”;buzz<=not buzz;end if;when“00000010”=>if(clk1 /= xi)then clk1<=clk1+“0000000000001”;else clk1<=“0000000000000”;buzz<=not buzz;end if;when“00000001”=>if(clk1 /= duo1)then clk1<=clk1+“0000000000001”;else clk1<=“0000000000000”;buzz<=not buzz;end if;when others=>null;武漢理工大學《電子線路EDA》課程設計 4波形仿真
圖4-1 波形仿真圖
由仿真波形可以看到,當按鍵輸入不同值時,蜂鳴器也將發出不同頻率聲響。武漢理工大學《電子線路EDA》課程設計
5總結體會
經過努力,簡易電子琴的設計基本上完成了。在整個設計過程中,包括前期中期和后期,我都有著許多不同的體會:
1)這個設計的基本是接觸一門新的語言并加以應用,對于我來說,沒有想到的是入手的速度比我的預料快,在以前編程的基礎上,從接觸到開始動手編程的時間得到了很大的縮短。知識的接收速度在很大的程度上決定了動手的時間。
2)VHDL的編程與C語言的編程有著本質的不同,然而以往形成的舊編程習慣在VHDL編程中依然起著很大的作用。一通百通,不是沒有道理的。對于學習新的知識并予以應用的信心,顯得更足了。
3)VHDL的設計關鍵是電路邏輯設計,而一個程序的關鍵是總體設計。對于硬件設計接觸不多的我們清楚這一點也許不無好處。
4)通過這個程序設計讓我學會一種新的語言,對數字系統結構也有了更進一步的了解和認識,對我以后的學習有很大的幫助。希望其他人在看再做類似設計時有所借鑒。
通過幾天的課程設計,我對數據庫軟件EDA技術、VHDL、等系列知識都有了一定的了解。使用EDA技術開發頁面的能力也有了很大提高。武漢理工大學《電子線路EDA》課程設計
參考文獻
[1]潘松 黃繼業.EDA技術與VHDL(第二版).北京:清華大學出版社,2005.7 [2]康華光.電子技術基礎.北京:高等教育出版社.2006.1 [3]付家才.EDA工程實踐技術.北京:化學工業出版社,2007.1 [4]漢澤西.EDA技術及其應用.北京:北京航空航天大學出版社,2004.5 [5]趙剛.EDA技術簡明教程.成都:四川大學出版社,2004.6 [6]章彬宏 周正林.EDA應用技術.北京:北京理工大學出版社,2007.7 [7]劉艷萍 高振斌 李志平.EDA實用技術及應用.北京:國防工業出版社,2006.1
武漢理工大學《電子線路EDA》課程設計 附錄 源程序
library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity music is port(clk:in std_logic;key:in std_logic_vector(7 downto 0);buz:out std_logic);end music;architecture beh of music is signal clk1:std_logic_vector(12 downto 0);constant duo : std_logic_vector(12 downto 0):=“0000000001110”;constant lai : std_logic_vector(12 downto 0):= “0000000001101”;constant mi : std_logic_vector(12 downto 0):= “0000000011010”;constant fa : std_logic_vector(12 downto 0):= “0000000010011”;constant suo : std_logic_vector(12 downto 0):= “0000000010010”;constant la : std_logic_vector(12 downto 0):= “0000000010001”;constant xi : std_logic_vector(12 downto 0):= “0000000010000”;constant duo1 : std_logic_vector(12 downto 0):= “0000000001111”;signal buzz:std_logic;signal key_out:std_logic_vector(7 downto 0);begin buz<=buzz;key_out<=key;process(clk)begin if clk'event and clk='1' then case key_out is when“10000000”=>if(clk1 /= duo)then clk1<=clk1+“0000000000001”;else clk1<=“0000000000000”;buzz<=not buzz;end if;when“01000000”=>if(clk1 /= lai)then clk1<=clk1+“0000000000001”;
else clk1<=“0000000000000”;buzz<=not buzz;end if;when“00100000”=>if(clk1 /= mi)then clk1<=clk1+“0000000000001”;else clk1<=“0000000000000”;武漢理工大學《電子線路EDA》課程設計 buzz<=not buzz;end if;when“00010000”=>if(clk1 /= fa)then clk1<=clk1+“0000000000001”;else clk1<=“0000000000000”;buzz<=not buzz;end if;when“00001000”=>if(clk1 /= suo)then clk1<=clk1+“0000000000001”;else clk1<=“0000000000000”;buzz<=not buzz;end if;when“00000100”=>if(clk1 /= la)then clk1<=clk1+“0000000000001”;else clk1<=“0000000000000”;buzz<=not buzz;end if;when“00000010”=>if(clk1 /= xi)then clk1<=clk1+“0000000000001”;else clk1<=“0000000000000”;buzz<=not buzz;end if;when“00000001”=>if(clk1 /= duo1)then clk1<=clk1+“0000000000001”;else clk1<=“0000000000000”;buzz<=not buzz;end if;when others=>null;end case;end if;end process;end beh;武漢理工大學《電子線路EDA》課程設計 本科生課程設計成績評定表
指導教師簽字: 年 月 日
第二篇:EDA課設
EDA課程設計報告
課題名稱:智力競賽搶答器
班級:11電科2班
姓名:代維寬
學號:201114580207
同組人:聞仔遜
指導老師:賈默伊
任務書
一、用VHDL運用層次化設計方法設計一個小型數字系統
題目:智力競賽搶答器
二、說明書內容:
1.系統設計要求(功能)2.系統設計方案(包括頂層電路圖)3.VHDL源程序及仿真波形圖 4.課程設計注釋 5.設計解釋、說明 6.獨特之處
三、成績評定
1.設計內容及掌握情況
2.說明書。包括電子檔(各類文件的可執行性及說明書)和紙質
3.答辯情況
目錄
第一章:系統設計
1系統設計要求???????????????????1 2系統設計方案???????????????????2 第二章:VHDL原程序及仿真波形圖
1、搶答啟動模塊??????????????????3(1)按鍵識別子模塊?????????????????3(2)倒計時子模塊??????????????????5
2、選手搶答模塊??????????????????7(1)單個選手按鍵子模塊???????????????7(2)判斷搶答選手子模塊???????????????9
3、加減分模塊???????????????????11(1)組別判斷子模塊?????????????????11(2)加減及寄存器子模塊???????????????12(3)分數選擇輸出模塊????????????????15
4、顯示模塊????????????????????16
5、蜂鳴器模塊???????????????????18
第三章設計心得及總結
智力競賽搶答器
1系統設計要求
1.設計一智力競賽搶答器,可同時供8名選手參加比賽。2.給節目主持人設置一個控制開關,控制系統清零和搶答開始。
3.搶答器具有鎖存功能和顯示功能。搶答開始后,若有選手按動搶答按鈕,編號立即鎖存,并在LED數碼管上顯示選手編號,同時揚聲器響,禁止其他選手搶答。
4.搶答器具有搶答定時功能,時間由主持人確定。5.參賽選手在設定的時間內搶答有效,定時器停止工作。
6.如果定時時間到,無人搶答,本次搶答無效,系統報警,并封鎖輸入電路,禁止超時搶答,定時器顯示00。
7.為每組設計一個計分電路,0~999分,可加分,也可減分。
對于一個搶答器系統,可將其分為五個模塊:選手搶答模塊、搶答啟動模塊、加減分模塊、顯示模塊、蜂鳴器控制模塊。整體框圖如下:
圖一 總體框圖
其中搶答啟動模塊具有啟動搶答及啟動定時功能,輸出使能信號給選手識別模塊,以及搶答剩余時間給顯示模塊;選手識別模塊完成鎖存搶答信號的功能,并輸出選手號給顯示模塊;蜂鳴器對搶答成功以及超時鳴聲報警;顯示模塊對輸入的數據進行顯示。
2系統設計方案
智力競賽搶答器擬由單片CPLDFPGA來實現,經分析設計要求,擬定整個系統由五個單元組成,原理圖如下所示:
主要VHDL源程序
1、搶答啟動模塊
啟動模塊除了有啟動的功能外,還有啟動定時的功能。定時時間分為5秒和20秒兩種,使用兩個按鍵對應兩種限時搶答。
將本模塊再劃分為2個子模:一個模塊完成按鍵識別的功能,另一模塊完成倒計時功能。
1)按鍵識別子模塊
按鍵的識別即對輸入信號進行電平變化檢測,電平發生跳變就認為是鍵被按下。但VHDL程序中一個結構體內不能同時對兩個信號進行電平跳變的檢測,所以對本模塊的程序設計采用狀態機來實現,并使用統一的時鐘信號來掃描按鍵的電平狀態。模塊圖如下:
圖2 按鍵識別子模塊
對START5和START20兩個按鍵定義三種狀態,START5按下為ST1狀態,此時兩個按鍵“START5&START20”輸入電平為“01”;START20按下為ST2狀態,此時電平為“10”;兩個都沒按下為ST0狀態,此時電平為“11”。
本模塊程序為:
LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY START_5_20 IS PORT(CLK1,RST,START5,START20:IN STD_LOGIC;
B,A:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);--輸出定時初值
S_FLAG:OUT STD_LOGIC);
--置數信號
END ENTITY;ARCHITECTURE ONE OF START_5_20 IS SIGNAL DATAIN:STD_LOGIC_VECTOR(1 DOWNTO 0);TYPE ST_TYPE IS(ST0,ST1,ST2);
--定義狀態
SIGNAL C_ST:ST_TYPE;BEGIN
DATAIN<=START5&START20;
--兩個輸入信號放在一起判斷 BEGIN
IF RST='0' THEN
--復位 B<=“0000”;A<=“0000”;C_ST<=ST0;S_FLAG<='0';ELSIF CLK1'EVENT AND CLK1='1' THEN CASE C_ST IS WHEN ST0=> IF DATAIN=“01” THEN
C_ST<=ST1;
--輸入信號為01,轉ST1狀態 S_FLAG<='1';
--置數信號有效 B<=“0000”;A<=“0101”;
--定時初值“05” ELSIF DATAIN=“10” THEN
C_ST<=ST2;
--輸入信號為10,轉ST1狀態
S_FLAG<='1';
--置數信號有效 B<=“0010”;A<=“0000”;
--定時初值“20”
ELSE C_ST<=ST0;--輸入信號為11,保持ST0狀態
END IF;
C_ST<=ST0;--防按鍵抖動,為11時才轉ST0狀態 S_FLAG<='0';
--置數信號無效
ELSE C_ST<=ST1;
--按鍵沒彈起,繼續等待
END IF;
ELSE C_ST<=ST2;END IF;PROCESS(RST,CLK1)WHEN ST1=>IF DATAIN=“11” THEN WHEN ST2=>IF DATAIN=“11” THEN C_ST<=ST0;S_FLAG<='0';WHEN OTHERS=>C_ST<=ST0;B<=“0000”;A<=“0000”;END CASE;END IF;END PROCESS;END ARCHITECTURE;本模塊仿真波形如圖所示。
圖3 按鍵識別模塊仿真波形
2)倒計時子模塊
倒計時需要1Hz的脈沖輸入,每來一個上升沿,進行一次減一運算,將結果輸出到TIMEB、TIMEA;置數信號LOAD輸入有效,讀入B、A端口的數據;輸入L_CR信號與選手識別模塊連接,當選手搶答成功后,L_CR信號為0,將倒計時清0.;若倒計時到,沒有選手搶答,則在SR1輸出1使揚聲器發聲。同時輸出信號給選手搶答模塊,禁止選手搶答。
圖4倒計時模塊
本模塊程序為:
LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY DE_COUNT IS PORT(CLK2,LOAD,L_CR,RST:IN STD_LOGIC;
B,A:IN STD_LOGIC_VECTOR(3 DOWNTO 0);
TIMEB,TIMEA:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
TIMEOUT,SR1:OUT STD_LOGIC);END ENTITY;ARCHITECTURE TWO OF DE_COUNT IS BEGIN
PROCESS(LOAD,L_CR,RST,CLK2)VARIABLE P1,P0:STD_LOGIC_VECTOR(3 DOWNTO 0);BEGIN
IF LOAD='1' THEN P1:=B;P0:=A;
--指數信號有效,將B、A值讀入P1、P0 ELSIF L_CR='0' THEN
--有選手搶答成功,L_CR輸入為0,定時時間清0 P1:=“0000”;P0:=“0000”;TIMEOUT<='0';SR1<='1';ELSIF RST='0' THEN P1:=“0000”;P0:=“0000”;TIMEOUT<='0';SR1<='0';
ELSIF(CLK2'EVENT AND CLK2='1')THEN
IF P0=“0000” THEN
IF P1>0 THEN P1:=P1-1;P0:=“1001”;
--若個位為0,十位減1,個位賦為9 END IF;ELSE P0:=P0-1;
--若個位不為0,個位直接減一
IF P0=“0000” AND P1=“0000” THEN TIMEOUT<='0';SR1<='1';
--若時間到,輸出鎖存信號 END IF;END IF;
END IF;TIMEB<=P1;TIMEA<=P0;END PROCESS;END ARCHITECTURE;
程序中,因為每次減一后的時間值需要保存,用于下次繼續減一,所以程序中使用了不完整的IF語句引入寄存器,用于保存每次減一后的時間值。P1、P0定義為變量而不是信號的原因是,變量的賦值是即時的,減一后可以馬上進行判斷;若定義為信號,不能即時進行判斷,并且減一操作后的賦值要經過一個δ延時,程序不好控制。
本模塊仿真波形如圖所示:
圖5 倒計時模塊仿真波形
用元件例化語句將以上兩個子模塊組合,得到整個搶答啟動模塊。如下圖所示:
圖6 由兩個子模塊組成搶答啟動模塊
兩個子模塊組合的程序為:
LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY STARTER IS PORT(CLK1,CLK2,L_CR,RST,START5,START20:IN STD_LOGIC;
TIMEB,TIMEA:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
TIMEOUT,SR1:OUT STD_LOGIC);END ENTITY;ARCHITECTURE THREE OF STARTER IS
COMPONENT START_5_20 IS
--調用元件START_5_20聲明
PORT(CLK1,RST,START5,START20:IN STD_LOGIC;
B,A:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
S_FLAG:OUT STD_LOGIC);END COMPONENT;COMPONENT DE_COUNT IS
--調用元件DE_COUNT聲明
PORT(CLK2,LOAD,L_CR,RST:IN STD_LOGIC;
B,A:IN STD_LOGIC_VECTOR(3 DOWNTO 0);
TIMEB,TIMEA:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
TIMEOUT,SR1:OUT STD_LOGIC);END COMPONENT;SIGNAL m,n:STD_LOGIC_VECTOR(3 DOWNTO 0);SIGNAL p:STD_LOGIC;
--對應圖7中的中間信號 BEGIN
--按照圖7將兩個元件連接起來
U1:START_5_20 PORT MAP(CLK1=>CLK1,START5=>START5,START20=>START20,RST=>RST,B=>m,A=>n,S_FLAG=>p);U2:DE_COUNT PORT MAP(CLK2=>CLK2,B=>m,A=>n,LOAD=>p,RST=>RST,L_CR=>L_CR,TIMEB=>TIMEB,TIMEA=>TIMEA, TIMEOUT=>TIMEOUT,SR1=>SR1);END ARCHITECTURE;
2、選手搶答模塊
在一個結構體中用8個進程同時對8個選手按鍵電平變化的監測是不可實現的,所以將本模塊劃分為兩個子模塊:單個選手按鍵模塊和判斷搶答選手模塊。最后將8個選手按鍵模塊和1個判斷搶答選手模塊連接起來,得到整個選手搶答模塊。
1)單個選手按鍵子模塊
按鍵輸入相當于該實體的時鐘信號,鍵被按下,等于來一個脈沖,輸出信號給判斷模塊進行選手號的判斷。只要有選手搶答成功,相關模塊會輸出信號使8個按鍵模塊的LOCK信號有效,禁止其他選手搶答。如圖所示。
圖7 單個選手按鍵模
本模塊程序如下:
LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY BUTTON1 IS PORT(LOCK , BUTTON , RST :IN STD_LOGIC;PRESSED:OUT STD_LOGIC);END ENTITY;ARCHITECTURE B1 OF BUTTON1 IS BEGIN
PROCESS(RST , BUTTON)
--使用進程時刻監測RST、BUTTON信號 BEGIN
IF RST='0' THEN
PRESSED<='0';
--復位
IF LOCK='1' THEN
--鍵被按下并且LOCK信號無效 PRESSED<='1';
--則輸出信號給判斷模塊 END IF;ELSIF BUTTON'EVENT AND BUTTON='0' THEN END IF;END PROCESS;END ARCHITECTURE;
圖8 倒計時模塊仿真波形
2)判斷搶答選手子模塊
本子模塊接收8個按鍵子模塊的輸出信號,如收到1號子模塊輸出的高電平,則輸出選手號“0001”;并發出信號使揚聲器發聲并控制8個按鍵子模塊使它們的LOCK信號有效,禁止其他選手搶答。本子模塊端口設置如圖所示。
圖9判斷選手模塊
本子模塊程序如下:
LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY IDENTIFIER IS
PORT(PP1,PP2,PP3,PP4,PP5,PP6,PP7,PP8:IN STD_LOGIC;P_NUM:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);LOCK,SR1:OUT STD_LOGIC);END ENTITY;ARCHITECTURE ONE OF IDENTIFIER IS
SIGNAL P:STD_LOGIC_VECTOR(7 DOWNTO 0);BEGIN
P<=PP8&PP7&PP6&PP5&PP4&PP3&PP2&PP1;
--8個輸入放在一起判斷 BEGIN
CASE P IS
WHEN “00000001”=>P_NUM<=“0001”;LOCK<='0';SR1<='1';--1號選手 WHEN “00000010”=>P_NUM<=“0010”;LOCK<='0';SR1<='1';--2號選手 WHEN “00000100”=>P_NUM<=“0011”;LOCK<='0';SR1<='1';--3號選手 WHEN “00001000”=>P_NUM<=“0100”;LOCK<='0';SR1<='1';--4號選手 WHEN “00010000”=>P_NUM<=“0101”;LOCK<='0';SR1<='1';--5號選手 WHEN “00100000”=>P_NUM<=“0110”;LOCK<='0';SR1<='1';--6號選手 WHEN “01000000”=>P_NUM<=“0111”;LOCK<='0';SR1<='1';--7號選手 WHEN “10000000”=>P_NUM<=“1000”;LOCK<='0';SR1<='1';--8號選手 WHEN OTHERS=>P_NUM<=“0000”;LOCK<='1';SR1<='0';PRO1:PROCESS(P)
--輸入若發生變化,馬上啟動進程進行判斷
END CASE;END PROCESS;END ARCHITECTURE;9
圖10 判斷搶答選手模塊仿真波形
所以將以上兩個子模塊用元件例化語句連接起來,組成整個選手搶答模塊,如下圖所示
圖11 選手搶答模塊
實現程序為:
LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY BUTTON IS
PORT(P1,P2,P3,P4,P5,P6,P7,P8,RST,LOCK:IN STD_LOGIC;P_NUM:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);LOCK_S,SR1:OUT STD_LOGIC);END ENTITY;ARCHITECTURE BB1 OF BUTTON IS COMPONENT BUTTON1 IS
--調用元件BUTTON1聲明
PORT(LOCK,B,RST:IN STD_LOGIC;PRESSED:OUT STD_LOGIC);END COMPONENT;COMPONENT IDENTIFIER IS
--調用元件IDENTIFIER聲明
PORT(PP1,PP2,PP3,PP4,PP5,PP6,PP7,PP8:IN STD_LOGIC;P_NUM:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);10 LOCK,SR1:OUT STD_LOGIC);END COMPONENT;SIGNAL a1,a2,a3,a4,a5,a6,a7,a8:STD_LOGIC;
--定義圖12中的中間信號 BEGIN
--按照圖12將兩個元件連接起來
U1:BUTTON1 PORT MAP(LOCK=>LOCK,B=>P1,RST=>RST,PRESSED=>a1);U2:BUTTON1 PORT MAP(LOCK=>LOCK,B=>P2,RST=>RST,PRESSED=>a2);U3:BUTTON1 PORT MAP(LOCK=>LOCK,B=>P3,RST=>RST,PRESSED=>a3);U4:BUTTON1 PORT MAP(LOCK=>LOCK,B=>P4,RST=>RST,PRESSED=>a4);U5:BUTTON1 PORT MAP(LOCK=>LOCK,B=>P5,RST=>RST,PRESSED=>a5);U6:BUTTON1 PORT MAP(LOCK=>LOCK,B=>P6,RST=>RST,PRESSED=>a6);U7:BUTTON1 PORT MAP(LOCK=>LOCK,B=>P7,RST=>RST,PRESSED=>a7);U8:BUTTON1 PORT MAP(LOCK=>LOCK,B=>P8,RST=>RST,PRESSED=>a8);U9:IDENTIFIER PORT MAP(PP1=>a1,PP2=>a2,PP3=>a3,PP4=>a4,PP5=>a5,PP6=>a6,PP7=>a7,PP8=>a8,P_NUM=>P_NUM,LOCK=>LOCK_S,SR1=>SR1);END ARCHITECTURE;
3、加減分模塊
加減分模塊要識別按下的按鍵:加5分按鍵及減5分按鍵。所以采用狀態機的方法來識別。將本模塊劃分為三個子模塊:組別判斷子模塊,加減及寄存器子模塊,分數選擇輸出子模塊。
1)組別判斷子模塊
該模塊要實現的功能是根據搶答成功的選手編號,判斷出該選手屬于哪組,并輸出使能信號允許該組的分數寄存器進行加減操作。如圖所示。
圖12 組別判斷模塊
實現程序為:
LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY DECODE IS PORT(CLK:IN STD_LOGIC;P_NUM:IN STD_LOGIC_VECTOR(3 DOWNTO 0);
EN1,EN2,EN3,EN4:OUT STD_LOGIC);END ENTITY;ARCHITECTURE ONE OF DECODE IS
SIGNAL E:STD_LOGIC_VECTOR(3 DOWNTO 0);BEGIN
PROCESS(CLK)
--引入時鐘信號,協調各部分電路的工作
BEGIN IF CLK'EVENT AND CLK='1' THEN
CASE P_NUM IS WHEN “0001”=>E<=“0001”;WHEN “0010”=>E<=“0001”;--
1、2號選手屬第一組
WHEN “0011”=>E<=“0010”;WHEN “0100”=>E<=“0010”;--
3、4號選手屬第二組 WHEN “0101”=>E<=“0100”;WHEN “0110”=>E<=“0100”;--
5、6號選手屬第三組 WHEN “0111”=>E<=“1000”;WHEN “1000”=>E<=“1000”;--
7、8號選手屬第四組 WHEN OTHERS=>E<=“0000”;
--其他情況則四個分數鎖存器都不工作
END CASE;END IF;
END PROCESS;
EN4<=E(3);EN3<=E(2);EN2<=E(1);EN1<=E(0);END ARCHITECTURE;程序仿真波形如圖所示:
圖13 組別判斷模塊仿真波形
2)加減及寄存器子模塊
本模塊的狀態機轉換過程為:將ADD和SUB信號并置,并檢測其電平變化。當ADD按下時,“ADD&SUB”的電平為“01”,彈起時恢復為“11”。當SUB按下時,“ADD&SUB”的電平為“10”,彈起時恢復為“11”。本模塊另外還需實現的功能是寄存功能。如下圖所示:
圖14 加減及寄存器模塊
實現程序如下: LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY COUNTER1 IS PORT(CLK,EN:IN STD_LOGIC;
ADD,SUB:IN STD_LOGIC;
AA2,AA1,AA0:OUT STD_LOGIC_VECTOR(3 DOWNTO 0));END ENTITY;ARCHITECTURE ONE OF COUNTER1 IS SIGNAL A:STD_LOGIC_VECTOR(1 DOWNTO 0);TYPE ST_TYPE IS(ST0,ST1,ST2);SIGNAL C_ST:ST_TYPE;BEGIN A<=ADD&SUB;
--將ADD信號和SUB信號并置在一起判斷
PROCESS(CLK)VARIABLE P2,P1,P0:STD_LOGIC_VECTOR(3 DOWNTO 0);BEGIN
IF EN='1' THEN
--使能端有效,才對該分數寄存器進行操作
IF CLK'EVENT AND CLK='1' THEN
CASE C_ST IS
WHEN ST0=>IF A=“01” THEN--A為“01”,說明ADD按下
C_ST<=ST1;
--下一狀態轉ST1,以等待按鍵彈起
IF P0=“1001” THEN--個位為9,進1為0,再向十位進1
P0:=“0000”;
IF P1=“1001” THEN
--十位為9,進一為0
P1:=“0000”;
IF P2=“1001” THEN
--百位為9,進一為0
P2:=“0000”;
ELSE P2:=P2+1;
--百位不為9,百位加1
END IF;
ELSE P1:=P1+1;
--十位不為9,加一
END IF;
ELSE P0:=P0+1;
--個位不為9,加一
END IF;
ELSIF A=“10” THEN
--A為“10”,說明SUB按下
C_ST<=ST2;--下一狀態轉ST2,以等待按鍵彈起
IF(P2/=0 OR P1/=0 OR P0/=0)THEN
IF P0=“0000” THEN P0:=“1001”;
P1:=P1-1;--個位向十位借1 P2:=P2-1;--十位向百位借1
IF P1=“0000” THEN
ELSE P1:=P1-1;--十位不為0,直接減1
END IF;
P1:=“1001”;
ELSE P0:=P0-1;--個位不為0,直接減1
END IF;
END IF;
ELSE C_ST<=ST0;
END IF;WHEN ST1=>IF A=“11” THEN
--A為“11”,說明按鍵彈起
C_ST<=ST0;
--回到ST0繼續監視按鍵
ELSE C_ST<=ST1;--否則等待按鍵彈起
END IF;
C_ST<=ST0;WHEN ST2=>IF A=“11” THEN
ELSE C_ST<=ST2;
END IF;WHEN OTHERS=>C_ST<=ST0;END CASE;END IF;END IF;
AA2<=P2;AA1<=P1;AA0<=P0;
--操作后的分數輸出 END PROCESS;END ARCHITECTURE;
加減及寄存器模塊仿真波形圖如下:
圖15 加減及寄存器模塊仿真波形
圖中,加分按鍵ADD按下,輸出“010”;減分按鍵SUB按下,輸出回到“000”;又來兩個加分按鍵,輸出“020”。當EN信號無效時,有按鍵按下輸出不變。
3)分數選擇輸出模塊
四組分數要顯示出來,需要12個7段數碼管。若只顯示當前搶答成功選手的分數,則只需3個數碼管。所以設置一個分數選擇器,根據搶答成功的選手編號,選擇其分數輸出給顯示模塊顯示。
程序為:
LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY MUXX IS PORT(P_NUM,AA2,AA1,AA0,BB2,BB1,BB0:IN STD_LOGIC_VECTOR(3 DOWNTO 0);
CC2,CC1,CC0,DD2,DD1,DD0:IN STD_LOGIC_VECTOR(3 DOWNTO 0);
D2,D1,D0:OUT STD_LOGIC_VECTOR(3 DOWNTO 0));END ENTITY;ARCHITECTURE ONE OF MUXX IS BEGIN
PROCESS(P_NUM)
--P_NUM為選手編號
BEGIN
CASE P_NUM IS
WHEN “0001”=>D2<=AA2;D1<=AA1;D0<=AA0;WHEN “0010”=>D2<=AA2;D1<=AA1;D0<=AA0;--1號和2號選手為一組 WHEN “0011”=>D2<=BB2;D1<=BB1;D0<=BB0;WHEN “0100”=>D2<=BB2;D1<=BB1;D0<=BB0;--3號和4號選手為一組 WHEN “0101”=>D2<=CC2;D1<=CC1;D0<=CC0;WHEN “0110”=>D2<=CC2;D1<=CC1;D0<=CC0;--5號和6號選手為一組 WHEN “0111”=>D2<=DD2;D1<=DD1;D0<=DD0;WHEN “1000”=>D2<=DD2;D1<=DD1;D0<=DD0;--7號和8號選手為一組 WHEN OTHERS=>D2<=“0000”;D1<=“0000”;D0<=“0000”;
END CASE;
END PROCESS;END ARCHITECTURE;仿真波形如圖所示。
圖16分數選擇輸出模塊仿真波形
4、顯示模塊
本模塊根據送來的數據:搶答成功選手號,選手分數、倒計時時間,將相應的字形碼送數碼管顯示。端口設置如圖所示。
圖17顯示模塊
圖18數碼管分配
顯示0,“00111111”;3F;顯示1,“00000110”;06;顯示2,“01011011”;5B;顯示3,“01001111”;4F;顯示4,“01100110”;66;顯示5,“01101101”;6D;顯示6,“01111101”;7D;顯示7,“00000111”;07;顯示8,“01111111”;7F;顯示9,“01101111”;6F;顯示10,“00000000”;00;
17圖中,BT為數碼管的位選信號,SG為數碼管的段選信號。另外圖18為數碼管的分配。左起第一位為選手編號,第3、4位為該選手的分數,最后兩位為倒計時。程序如下:
LIBRARY IEEE;16
USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY DISPLAY IS
PORT(CLK:IN STD_LOGIC;SCORE2,SCORE1,SCORE0,P_NUMBER,TIMEB,TIMEA:IN BT,SG:OUT STD_LOGIC_VECTOR(7 DOWNTO 0));
STD_LOGIC_VECTOR(3 DOWNTO 0);END ENTITY;ARCHITECTURE ONE OF DISPLAY IS SIGNAL CNT8:STD_LOGIC_VECTOR(2 DOWNTO 0);SIGNAL A:STD_LOGIC_VECTOR(3 DOWNTO 0);BEGIN P1:PROCESS(CLK)
BEGIN
IF CLK'EVENT AND CLK='1' THEN
--時鐘信號一來,顯示下一位 CNT8<=CNT8+1;END IF;END PROCESS;BEGIN
CASE CNT8 IS
WHEN “000”=>BT<=“10000000”;A<=P_NUMBER;--第一位顯示選手號
WHEN “001”=>BT<=“01000000”;A<=“1010”;
--第二位不用,滅
WHEN “010”=>BT<=“00100000”;A<=SCORE2;
--第三位顯示分數百位
WHEN “011”=>BT<=“00010000”;A<=SCORE1;
--第四位顯示分數十位
WHEN “100”=>BT<=“00001000”;A<=SCORE0;
--第五位顯示分數個位
WHEN “101”=>BT<=“00000100”;A<=“1010”;
--第六位不用,滅
WHEN “110”=>BT<=“00000010”;A<=TIMEB;
--第七位顯示倒計時十位
WHEN “111”=>BT<=“00000001”;A<=TIMEA;
--第八位顯示倒計時個位 END CASE;P2:PROCESS(CNT8)
END PROCESS;BEGIN
CASE A IS
--根據數據選擇相應的字形碼送數碼管顯示
WHEN “0000”=>SG<=“00111111”;WHEN “0001”=>SG<=“00000110”;
WHEN “0010”=>SG<=“01011011”;WHEN “0011”=>SG<=“01001111”;
WHEN “0100”=>SG<=“01100110”;WHEN “0101”=>SG<=“01101101”;
WHEN “0110”=>SG<=“01111101”;WHEN “0111”=>SG<=“00000111”;
WHEN “1000”=>SG<=“01111111”;WHEN “1001”=>SG<=“01101111”;
WHEN “1010”=>SG<=“00000000”;WHEN OTHERS=>NULL;END CASE;P3:PROCESS(A)END PROCESS;END ARCHITECTURE;本模塊仿真波形如圖所示。
圖19顯示模塊仿真波形
5、蜂鳴器模塊
當SR1鳴聲信號來時,輸出CLK2(2KHz)驅動蜂鳴器發聲。CLK1用于掃描SR1的電平變化,SR1上升沿來到,允許CLK2輸出,并持續一段時間。模塊圖如下:
圖20蜂鳴器模塊
本模塊程序如下:
LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY SPEAKER IS PORT(CLK1,SR1,CLK2:IN STD_LOGIC;
S:OUT STD_LOGIC);END ENTITY;ARCHITECTURE ONE OF SPEAKER IS TYPE ST_TYPE IS(ST0,ST1);SIGNAL C_ST:ST_TYPE;SIGNAL A:STD_LOGIC;BEGIN PROCESS(CLK1)
VARIABLE P:STD_LOGIC_VECTOR(7 DOWNTO 0);--P用于定時,使蜂鳴器發聲持續
BEGIN
IF CLK1'EVENT AND CLK1='1' THEN
CASE C_ST IS WHEN ST0=>IF SR1='1' THEN
--SR1信號有上升沿
P:=“00111111”;18
C_ST<=ST1;A<='1';--蜂鳴器發聲,開始定時
ELSE C_ST<=ST0;A<='0';--否則等待
END IF;
P:=P-1;C_ST<=ST1;
A<='0';--定時到,蜂鳴器停止發聲 IF SR1='1' THEN
C_ST<=ST1;--等待系統復位 END IF;WHEN ST1=>IF P/=0 THEN
--定時還沒到,等待
ELSE
ELSE C_ST<=ST0;--復位
END IF;WHEN OTHERS=>C_ST<=ST0;A<='0';END CASE;END IF;S<=CLK2 AND A;
--只有A為1時,蜂鳴器才發聲 END PROCESS;END ARCHITECTURE;本模塊的仿真波形如圖所示。
圖21 蜂鳴器模塊仿真波形
3設計心得及總結
剛開始確定這個課題時,我首先確定了要用到哪些知識,主要是VHDL程序的設計,軟件的仿真。首先我查閱課本質料,找了不少關于這方面的程序,盡量的把它們都弄懂了。然后我確定了總體方案,把整體方案劃分成了幾個模塊,形成了一個整體的框架,然后各個擊破。有了總體的思路做指導我很快我就仿真調試好了搶答啟動模塊選手搶答模塊,這樣一來就增加了我的信心,一鼓作氣拿下了以后的模塊。當然任何事情都不會一帆風順,也遇到許多難題,不懂的地方我就請叫老師和同學,最后所有的模塊都被我一個一個的做出來了,我很高興,覺得我這兩天來的努力沒有白費。
此次課程設計不僅加強了我對專業知識的學習與了解,更有許多的感慨,主要有以下幾點:
(1)加強了我們動手、思考和解決問題的能力。我們很少能有這種機會來鍛煉自己,通過這次課程設計,起到了很好的鍛煉效果。
(2)我在做課程設計同時也是對課本知識的鞏固和加強,課本 的知識太多,平時課間的學習并不能很好的理解程序的功能,所以在這次課程設計過程中,我們了解了很多程序的功能,并且對于其在實際中的使用有了更多的認識。
(3)我們兩人一組相互合作,共同解決問題也認識到了團隊精神的重要性
最后,我要感謝老師和同學們給我的幫助,沒有你們的幫助,我是不能完成此次課程設計的,真的很感謝你們!
第三篇:EDA課程設計 電子琴
簡易電子琴的設計和實現
----結題報告
學號:110342241
姓名:章譯文
一.設計要求
1.能發出1234567基本音。
2.能自動播放《偶像萬萬歲》和《梁祝》。3.能在數碼管上顯示彈奏時的音名。
二.設計原理分析
1.音階的獲得
系統要求要求用7個按鍵控制發聲,我們用7個鍵盤來控制產生低音(或中音)段的7個音階頻率。所有的音名頻率都是通過一個基準頻率經過分頻得到的。但部分分頻過大的音頻直接輸出給揚聲器,頻率信號脈沖的占空比會非常窄,不能驅動揚聲器工作。于是,我們設計了一個“帶有預置數的計數器”來簡化整個設計過程。將原頻率分頻成期望值的2倍頻率信號。再通過二分頻,驅動揚聲器工作。
簡易電子琴控制流程圖
2.MUSICAL_NOTE內部電路
MUSICAL_NOTE內部電路
使用MUSICAL_NOTE電路,實現初值可變的計數器,并對音階實現二分頻,使電子琴實現正常發音。
按鍵播放部分電路
3.自動播放功能的實現
自動播放部分電路
Hebing.mif文件(偶像萬萬歲&梁祝)
歌曲長度為352位,利用三個74261設計0~352的計數器,自動尋址,將音頻導入lpm_rom,與MUSICAL_NOTE相互作用,實現自動播放。
按鍵除顫電路原理圖
作為機械開關的鍵盤,在按鍵操作時,機械觸點的彈性及電壓跳動等原因,再觸點閉合或者開啟的瞬間會出現電壓的抖動,如果不進行處理就會造成誤操作。按鍵去抖動的關鍵在于提取穩定的低電平狀態,濾去前沿后沿的抖動毛刺。4.在數碼管上顯示彈奏時的音名
顯示部分電路圖
Display內部電路
電路中的74161是16進制的計數器,它的低三位接到3—8譯碼器模塊74138的地址輸入端,這樣就可以實現74138的8個輸出端輪流輸出低電平,恰好用來控制“位碼”DIG7~DIG0。LPM_MUX是QuartusⅡ中的宏模塊,用來實現多位的“多選一”,它的數據位數可以以及數據的數量可以任意設定。
電路中使用了與非門,實現發音與現實同時實現,在此要注意的是,因為使用了與非門,靜態字符現實數碼管管腳的設定值應該與原值相反。
三.設計原理圖
簡易電子琴原理圖
根據以上分析,將三個模塊組合,便得到了簡易電子琴的整體設計。在整體設計的過程中,要注意三個模塊之間的關系,使其能夠相互作用,正常發音和顯示。
四.實驗總結 在這三天的實驗過程中,通過對于實驗目的的分析,有目標的查找資料,研讀教材,在分清楚模塊的基礎上,寫下了實驗計劃,規劃好時間,確定每天要做的事。在實驗的第一天,實現了按鍵發音,同時,也基本弄清楚了自動播放的原理,有了設計思路,第二天上午,完成了自動循環播放的功能,下午在同學的幫助下,確定了數碼管顯示的基本思路,通過對于以前知識的復習和查找,成功實現了數碼管的顯示功能。
在實驗的過程中,也遇到很多的困難。在自動播放的時候,由于沒有修改hebing.mif的進制,音樂總不能正常播放。還有就是在數碼管顯示的時候,一開始沒有弄清與非門的作用,顯示的數字總是反著的。后來經過冷靜的分析,在老師和同學的幫助下,成功完成了電子琴的設計,實現了所有的功能。當然,設計也還有很多可以完善和改進的地方,在以后的學習過程中,我會更加用心,多做,多思考。
這次課程設計,我受益匪淺,這種認真研讀,查找資料,動手操作的學習方式,應該貫徹到每一門課程的學習,也應該貫徹到我們的生活中。一直保持這樣的方式,不管做什么事,都會取得很好的結果。
第四篇:EDA簡易數字頻率計~課設報告
EDA課程設計~簡易數字頻率計
《EDA技術》課程設計報告
題目:簡易數字頻率計
專業:
本組成員:
簡述
EDA課程設計~簡易數字頻率計
隨著數字電子技術的發展,頻率測量成為一項越來越普遍的工作,因此測頻計常受到人們的青睞。目前許多高精度的數字頻率計都采用單片機加上外部的高速計數器來實現,然而單片機的時鐘頻率不高導致測頻速度比較慢,并且在這種設計中,由于PCB版的集成度不高,導致PCB板走線長,因此難以提高計數器的工作頻率。為了克服這種缺點,大大提高測量精度和速度,我們可以設計一種可編程邏輯器件來實現數字頻率計。
EDA技術是以大規模可編程邏輯器件為設計載體,以硬件語言為系統邏輯描述的主要方式,以計算機、大規模可編程邏輯器件的開發軟件及實驗開發系統為設計工具,通過有關的開發軟件,自動完成用軟件設計的電子系統到硬件系統的設計,最終形成集成電子系統或專用集成芯片的一門新技術。其設計的靈活性使得EDA技術得以快速發展和廣泛應用。以QUARTUSII軟件為設計平臺,采用VHDL語言實現數字頻率計的整體設計。
EDA技術已經廣泛應用于模擬與數字電路系統等許多領域。電子設計自動化是一種實現電子系統或電子產品自動化設計的技術,它與電子技術,微電子技術的發展密切相關,它吸收了計算機科學領域的大多數最新研究成果,以高性能的計算機作為工作平臺,促進了工程發展。EDA的一個重要特征就是使用硬件描述語言(HDL)來完成的設計文件,VHDL語言是經IEEE確認的標準硬件語言,在電子設計領域受到了廣泛的接受。
1.設計概述
EDA課程設計~簡易數字頻率計
1.1設計原理
在電子技術中,頻率是最基本的參數之一,并且與許多電參量的測量方案、測量結果都有十分密切的關系,因此,頻率的測量就顯得更為重要。測量頻率的方法有多種,其中電子計數器測量頻率具有精度高、使用方便、測量迅速,以及便于實現測量過程自動化等優點,是頻率測量的重要手段之一。
數字式頻率計的測量原理有兩類:一是直接測頻法,即在一定閘門時間內測量被測信號的脈沖個數;二是間接測頻法即測周期法,如周期測頻法。直接測頻法適用于高頻信號的頻率測量,通常采用計數器、數據鎖存器及控制電路實現,并通過改變計數器閥門的時間長短在達到不同的測量精度;間接測頻法適用于低頻信號的頻率測量。
本設計中使用的就是直接測頻法,即用計數器在計算1s內輸入信號周期的個數,其測頻范圍為1Hz~9999Hz。
1.2原理框圖
1.3 系統原理圖
系統原理圖仿真
EDA課程設計~簡易數字頻率計
分析說明:clk為1HZ,待測信號sig為10HZ 1.5 引腳圖
2.設計思路
頻率測量的基本原理是計算每秒鐘內待測信號的脈沖個數。這就要求測頻控制信號發生器testpl的計數使能信號tsten能產生一個1秒脈寬的周期信號,并對頻率計的每一計數器cnt10的使能端en進行同步控制。當tsten為高電平“1”時,允許計數;為低電平“0”時停止計數,并保持其計數結果。在停止計數期間,首先需要一個鎖存信號load的上跳沿將計數器在前1 秒種的計數值鎖存進16位鎖存器reg16b中。鎖存信號之后,必須有一個清零信號clr_cnt對計數器進行清零,為下1 秒的計數操作做準備。,然后由外部數碼管控制器ledcom控制的7段譯碼器ymq譯出,并穩定顯示。
3.模塊劃分
3.1 測頻控制信號發生器testpl模塊:
輸入端clk收到1Hz信號后,其輸出端testen控制各個cnt10的使能,clr_cnt控制各個cnt10的清零,load控制鎖存器內數據的輸出。
仿真圖如下:
EDA課程設計~簡易數字頻率計
3.2 十進制計數器cnt10模塊:
有一時鐘使能輸入端en,用于鎖定計數值。當高電平“1”時計數允許計數,低電平“0”時禁止計數。多位十進制計數器時,最低位的計數器的clk端輸入被測信號,各計數器的進位輸出端c10將信號輸到下一位十進制計數器cnt10的輸入端clk,最高位十進制計數器cnt10的進位輸出端c10不處理。
仿真圖如下:
3.3 16位鎖存器reg16b模塊:將已有16 位bcd碼存在于此模塊的輸入口din[15..0],在信號load的上升沿后即被鎖存到寄存器reg16b的內部,并由reg16b的輸出端dout[15..0]輸出,設置鎖存器的好處是,數碼管上顯示的數據穩定,不會由于周期性的清零信號而不斷閃爍。
仿真圖如下:
EDA課程設計~簡易數字頻率計
3.4 數碼管控制器ledcom模塊:兩個輸入端一個為datain[15..0],另一個為數碼管顯示選擇的掃描頻率輸入端clk,輸出端為數碼管選擇信號com[3..0]和對應顯示的數碼管的BCD碼信號端dataout[3..0],數碼管顯示選擇隨掃描頻率clk循環變化,實現穩定顯示。
仿真圖如下:
3.5
譯碼器ymq模塊:輸入端d_in[3..0]將接收BCD碼信號,譯碼后輸出端d_out[7..0]輸出8為7段數碼管信號,其中輸出的第8位均為高電平“1”可以使四個數碼管的小數點不顯示。經譯碼器的處理輸出后數碼管顯示相應的數值。
EDA課程設計~簡易數字頻率計
4.VHDL頂層文件:
library ieee;use ieee.std_logic_1164.all;entity lx is port(clk: in std_logic;led: out std_logic_vector(7 downto 0);ledc: out std_logic_vector(2 downto 0));end lx;architecture art of lx is--十進制計數器
component cnt10--待調用的有時鐘使能的十進制計數器端口定義
port(clk,clr,en: in std_logic;q: out std_logic_vector(3 downto 0);c10: out std_logic);end component;--16位鎖存器
component reg16b--待調用的32位鎖存器端口定義 port(load: in std_logic;din: in std_logic_vector(15 downto 0);dout: out std_logic_vector(15 downto 0));end component;--測頻控制器
component testpl--待調用的測頻控制信號發生器端口定義 port(clk:in std_logic;
EDA課程設計~簡易數字頻率計
tsten:out std_logic;clr_cnt:out std_logic;load:out std_logic);end component;--數碼管選擇器
component ledcom--待調用的數碼管選擇器端口定義 port(clk:in std_logic;datain: in std_logic_vector(15 downto 0);dataout: out std_logic_vector(3 downto 0);sel: out std_logic_vector(2 downto 0));end component;--譯碼器
component ymq--待調用的譯碼器端口定義 port(d_in: in std_logic_vector(3 downto 0);d_out: out std_logic_vector(7 downto 0));end component;signal clk1,clk2,clk3: std_logic;--clk1為1Hz信號,clk2為被測信號,clk3為數碼管掃描信號
signal tsten,clr,load: std_logic;signal c1,c2,c3,c4: std_logic;signal qout,rout: std_logic_vector(15 downto 0);signal datao: std_logic_vector(3 downto 0);begin u0:testpl port map(clk1,tsten,clr,load);u1:cnt10 port map(clk2,clr,tsten,qout(3 downto 0),c1);u2:cnt10 port map(c1,clr,tsten,qout(7 downto 4),c2);u3:cnt10 port map(c2,clr,tsten,qout(11 downto 8),c3);u4:cnt10 port map(c3,clr,tsten,qout(15 downto 12),c4);u5:reg16b port map(load,qout(15 downto 0),rout);u6:ledcom port map(clk3,rout,datao,ledc);u8:ymq port map(datao,led);end art;
5.心得體會
這次課程設計中,我不僅復習鞏固了課堂所學的理論知識,提高
EDA課程設計~簡易數字頻率計
了對所學知識的綜合應用能力,并從根本上了解了VHDL語言的一些基本用法,應用了原來不會或者不熟練的句型,如if句,case句等,也學會了一些基本功能的實現方法,如分頻,狀態控制等等,從另外一個角度重新審視了上學期完全從硬件角度出發的電路設計,明白了軟硬件之間的交互。通過這個課題,對系統框圖、邏輯流程圖、狀態轉移圖的設計有了一定的了解。也懂得了系統的前期設計對于后續的編程和調試的重要性。
本課題采用了自下而上的設計方法,根據系統對硬件的要求,畫出系統控制流程圖;然后根據控制流程圖,分化模塊,利用模塊實現功能;最后進行仿真和調試。
每個成功的背后都要面對無數次的失敗,這次課設也不例外。雖然遇到不少問題與困難,但通過老師以及同學的幫助,都一一得到順利地解決。我想這必定會為將來的實踐積累寶貴的經驗和教訓。總之,這次課設我們都受益匪淺。整個過程氛圍濃厚,本人也態度十分認真,積極向老師和同學求教并在此過程中收獲良多,能夠進一步了解和使用一門與硬件直接打交道的基本語言對我們將來的學習和工作都會十分有益。
6.五個模塊的程序源代碼
6.1 測頻控制信號發生器
EDA課程設計~簡易數字頻率計
library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity testpl is port(clk:in std_logic;--1Hz信號
tsten:out std_logic;--計數器使能信號 clr_cnt:out std_logic;--計數器清零信號 load:out std_logic);--鎖存器輸出控制信號 end testpl;architecture art of testpl is signal div2clk:std_logic;begin process(clk)begin if clk'event and clk='1'then div2clk<=not div2clk;--div2clk為2Hz end if;end process;process(clk ,div2clk)begin if(clk='0'and div2clk='0')then clr_cnt<='1';--當div2clk與clk同時為零時計數器清零 else clr_cnt<='0';--當div2clk處于的高電平時計數器計數 end if;end process;load<=not div2clk;--鎖存器輸出與計數器使能信號反相 tsten<=div2clk;end art;
有時鐘使能的十進制計數器
library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity cnt10 is port(clk,clr,en: in std_logic;--clk:計數器時鐘,clr:清零信號,en:計數使能信號
q: out std_logic_vector(3 downto 0);--q:4位計數結果輸出
EDA課程設計~簡易數字頻率計
c10: out std_logic);--計數進位
end cnt10;architecture art of cnt10 is signal cqi: std_logic_vector(3 downto 0);begin process(clk,clr)begin if clr='1' then cqi<=“0000”;--當輸入的clr_cnt為低電平0時清零
elsif clk'event and clk='1' then if en='1' then--當輸入的tesen為高電平1時允許計數
if(cqi<9)then cqi<=cqi+1;else cqi<=“0000”;--等于9則計數器清零
end if;--當輸入的tesen為低電平0時禁止計數,鎖定計數值 end if;end if;end process;--產生進位 process(cqi)begin if cqi=“1001” then c10<='1';--當加的9時產生進位輸出 else c10<='0';end if;end process;q<=cqi;end art;
16位鎖存器
library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity reg16b is port(load: in std_logic;--輸出鎖存控制信號 din: in std_logic_vector(15 downto 0);dout: out std_logic_vector(15 downto 0));end reg16b;
EDA課程設計~簡易數字頻率計
architecture art of reg16b is begin process(load,din)begin if load'event and load='1'then--load為高電平時teten為低電平,計數器禁止
dout<=din;--鎖存輸入的數據 end if;end process;end art;
6.4 數碼管控制器
library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity ledcom is port(clk:in std_logic;--數碼管掃描頻率
datain: in std_logic_vector(15 downto 0);--鎖存器輸入的16位信號 dataout: out std_logic_vector(3 downto 0);--輸出至譯碼器的4位信號
sel: buffer std_logic_vector(2 downto 0));--輸出數碼管選擇信號 end ledcom;architecture art of ledcom is begin--sel同掃描頻率clk循環變化 process(clk)begin if rising_edge(clk)then if sel>=7 then
sel <=“000”;
else sel<=sel+1;end if;end if;
end process;--數碼管選擇 process(sel,datain)
begin case sel is when “000”=> dataout<=datain(3 downto 0);
EDA課程設計~簡易數字頻率計
when “001”=> dataout<=datain(7 downto 4);when “010”=> dataout<=datain(11 downto 8);when “011”=> dataout<=datain(15 downto 12);when others =>NULL;end case;end process;end art;
七段數碼管的譯碼器
library IEEE;use IEEE.std_logic_1164.all;entity ymq is port(d_in: in std_logic_vector(3 downto 0);--數碼管控制器輸入四位信號
d_out: out std_logic_vector(6 downto 0));--輸出8位信號
end ymq;--第8位d_out[7]為逗號 architecture art of ymq is begin process(d_in)begin case d_in is--第8位為1高電平逗號不顯示 when “0000” => d_out<=“1111110”;--0 when “0001” => d_out<=“0110000”;--1 when “0010” => d_out<=“1101101”;--2 when “0011” => d_out<=“1111001”;--3 when “0100” => d_out<=“0110010”;--4 when “0101” => d_out<=“1011011”;--5 when “0110” => d_out<=“1011111”;--6 when “0111” => d_out<=“1110000”;--7 when “1000” => d_out<=“1111111”;--8 when “1001” => d_out<=“1111011”;--9 when others =>NULL;end case;end process;end art;7.參考文獻
1、王小軍 主編.《VHDL簡明教程》.清華大學出版社,1997
EDA課程設計~簡易數字頻率計
2、潘松、王國棟 主編.《VHDL應用教程》電子科技大學出版社,2000
3、甘歷 主編.《VHDL應用于開發實踐》科學出版社,2003
4、劉愛榮 主編.《EDA技術與CPLD/FPGA開發應用簡明教程》.清華大學出版社,2007
第五篇:可控脈沖發生器的設計EDA課設報告資料
可控脈沖發生器的設計
一、設計目的
1.了解可控脈沖發生器的實現機理。2.學會用示波器觀察FPGA產生的信號。3.學習用VHDL編寫復雜功能的代碼。
二、設計原理
1.EDA是電子設計自動化(Electronic Design Automation)的縮寫。EDA技術就是依賴功能強大的計算機,在EDA工具軟件平臺上,對以硬件描述語言HDL(Hardware Description Language)為系統邏輯描述手段完成的設計文件,自動地完成邏輯編譯、化簡、分割、綜合、布局布線以及邏輯優化和仿真測試,直至實現既定的電子線路系統功能。EDA技術使設計者的工作僅局限于利用軟件的方式來完成對系統硬件功能的實現,可以說EDA技術的產生與發展是電子設計技術的一個巨大進步。EDA技術融合了眾多電子設計技術和計算機輔助技術,使得它在現代電子學方面的應用越來越廣泛,也成為電子、電氣類大學生必須熟練掌握的一種設計工具。
2.VHDL是英文全名是VHSIC(Very High Speed Integrated Circuit)Hardware Description Language,是硬件描述語言的業界標準之一。VHDL語言功能強大、設計靈活。VHDL語言可以用簡潔明確的源代碼來描述復雜的邏輯控制,它具有多層次的設計描述功能,層層細化,最后可直接生成電路級描述。
VHDL支持同步電路、異步電路和隨機電路的設計,這是其他硬件描述語言雖不能比擬的。VHDL還支持多種設計方法,既支持自底向上的設計,又支持自頂向下的設計;既支持模塊化設計,又支持層次化設計。
由于VHDL已經成為IEEE標準所規定的硬件描述性語言,目前大多數EDA工具幾乎都支持VHDL。因為VHDL易讀和結構化且易于修改設計所以在硬件電路設計過程中,VHDL語言得到廣泛應用。
VHDL語言易于共享和復用。VHDL采用基于庫(Library)的設計方法,可以建立各種可再次利用的模塊。這些模塊可以預先設計或使用以前設計中的存檔模塊,將這些模塊存放到庫中,就可以在以后的設計中進行復用,可以使設計成果在設計人員之間進行交流和共享,減少硬件電路設計。
VHDL豐富的仿真語句和庫函數,使得在任何大系統的設計早期就能查驗設計系統的功能可行性,隨時可對設計進行仿真模擬。VHDL語句的行為描述能力和程序結構決定了它具有支持大規模設計的分解和已有設計的再利用功能。這個特點很好的符合了市場需求。對于用VHDL完成的一個確定的設計,可以利用EDA工具進行邏輯綜合和優化,并自動的把VHDL描述的設計轉變成門級網表。總之,由于VHDL語言有的這些優良的特點,它被廣泛的應用在電子線路和電子系統的設計中。
3.Quartus II是Altera公司的綜合性PLD/FPGA開發軟件,支持原理圖、VHDL、VerilogHDL以及AHDL(Altera Hardware Description Language)等多種設計輸入形式,內嵌自有的綜合器以及仿真器,可以完成從設計輸入到硬件配置的完整PLD設計流程。
Quartus II可以在XP、Linux以及Unix上使用,除了可以使用Tcl腳本完成設計流程外,提供了完善的用戶圖形界面設計方式。具有運行速度快,界面統一,功能集中,易學易用等特點。Quartus II支持Altera的IP核,包含了LPM/MegaFunction宏功能模塊庫,使用戶可以充分利用成熟的模塊,簡化了設計的復雜性、加快了設計速度。對第三方EDA工具的良好支持也使用戶可以在設計流程的各個階段使用熟悉的第三方EDA工具。
此外,Quartus II通過和DSP Builder工具與Matlab/Simulink相結合,可以方便地實現各種DSP應用系統;支持Altera的片上可編程系統(SOPC)開發,集系統級設計、嵌入式軟件開發、可編程邏輯設計于一體,是一種綜合性的開發平臺。
4.脈沖發生器就是要產生一個脈沖波形,而可控脈沖發生器則是要產生一個周期和占空比可變的脈沖波形。可控脈沖發生器的實現原理比較簡單,可以簡單的理解為一個計數器對輸入的時鐘信號進行分頻的過程。通過改變計數器的上限值來達到改變周期的目的,通過改變電平翻轉的閾值來達到改變占空比的目的。下面舉個簡單的例子來說明其工作原理。
假如有一個計數器T對時鐘分頻,其計數的范圍是從0~N,另取一個M(0≤M≤N),若輸出為Q,那么Q只要滿足條件
時,通過改變N值,即可改變輸出的脈沖波的周期;改變M值,即可改變脈沖波的占空比。這樣輸出的脈沖波的周期和占空比分別為:
?1Q???00?T?MM?T?N周期?(N?1)TCLOCKM占空比??100%N?
1三、設計內容
編寫實現可控脈沖發生器程序,通過脈沖周期和占空比改變實現不同脈沖的輸出。用QuartusII軟件對設計進行編譯、綜合、仿真,給出相應的時序仿真波形和硬件電路圖。
四、設計流程 1.程序
LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY CC IS
PORT(CLK: IN STD_LOGIC;
--時鐘輸入
RST : IN STD_LOGIC;
--復位輸入
NU,ND : IN STD_LOGIC;
--輸入:控制頻率的改變
MU,MD : IN STD_LOGIC;
--輸入:控制占空比的改變
FOUT : OUT STD_LOGIC
--波形輸出);
END CC;ARCHITECTURE BEHAVE OF CC IS SIGNAL N_BUFFER,M_BUFFER:STD_LOGIC_VECTOR(10 DOWNTO 0);SIGNAL N_COUNT :STD_LOGIC_VECTOR(10 DOWNTO 0);SIGNAL CLKIN : STD_LOGIC;SIGNAL CLK_COUNT : STD_LOGIC_VECTOR(12 DOWNTO 0);--產生一個低速時鐘,用于按鍵判斷
BEGIN
PROCESS(CLK)
--計數器累加
BEGIN
IF(CLK'EVENT AND CLK='1')THEN
IF(N_COUNT=N_BUFFER)THEN
N_COUNT<=“00000000000”;
ELSE
N_COUNT<=N_COUNT+1;
END IF;
END IF;
END PROCESS;
PROCESS(CLK)
--波形判斷
BEGIN
IF(CLK'EVENT AND CLK='1')THEN
IF(N_COUNT FOUT<='1';ELSIF(N_COUNT>M_BUFFER AND N_COUNT THEN 6 FOUT<='0'; END IF; END IF; END PROCESS; PROCESS(CLK) BEGIN IF(CLK'EVENT AND CLKIN='1')THEN CLK_COUNT<=CLK_COUNT+1; END IF; CLKIN<=CLK_COUNT(12); END PROCESS; PROCESS(CLKIN) --頻率及占空比的改變1 BEGIN IF(CLK'EVENT AND CLKIN='0')THEN IF(RST='0')THEN M_BUFFER<=“01000000000”; N_BUFFER<=“10000000000”; ELSIF(NU='0')THEN 7 N_BUFFER<=N_BUFFER+1; ELSIF(ND='0')THEN N_BUFFER<=N_BUFFER-1; ELSIF(MU='0')THEN M_BUFFER<=M_BUFFER+1; ELSIF(MD='0')THEN M_BUFFER<=M_BUFFER-1; END IF; END IF; END PROCESS;END BEHAVE; 2.管腳分配: 3.時序仿真圖: 4.硬件電路圖: 5.現象: 五、心得體會 通過這次EDA課程設計,我對課堂上所學到的理論知識的理解加深了許多,自己動腦、動手設計的能力也得到了較大提高。 在這次課程設計的過程中,我對VHDL語言有了更深的認識。通過查閱相關資料和動手設計我發現我以前對VHDL語言的認識太過膚淺,認為VHDL語言只能用于設計小型的電路系統。但有了更深刻的認識之后我發現學好VHDL語言可以設計出大規模的、功能復雜的電路系統。以前之所以會有錯誤的認識是因為自己對VHDL語言的了解和掌握還不夠。現在仔細想想,這次課程設計使得我對VHDL語言的理解與應用能力得到了較大的提升,也讓我認識到只要升入學習,提升的空間永遠的存在的。 另一方面我也發現了動手實踐的重要性。動手實踐是理論知識得以靈活運用的必要前提,也是今后今后走上工作崗位之后能夠很好的完成設計工作的技術保證。只有遇到實際問題并根據自己對課堂上獲得的專業知識的理解來解決它才能真正的提高自己的能力。這也提醒我在平時的學習生活中不能一味埋頭于課本知識,當今社會競爭越來越激烈,社會對人才的要求越來越全面,只有理論知識是遠遠不夠的,必須靠動手能力做支撐。因此在學習之余我們應該積極參加各種與專業知識有關的實踐活動和知識競賽,鞏固所學的理論知識,多注重培養實際動手能力和專業技術能力,這樣才能在以后的工作崗位上有所作為。 數字秒表設計 一、設計目的 本設計的任務就是設計一個數字鐘,要求顯示格式為小時-分鐘-秒鐘。系統時鐘選擇時鐘模塊的50MHz,要得到1Hz時鐘信號,必須對系統時鐘進行50000000次分頻。用S1按鍵作為系統時鐘復位,復位后全部顯示00-00-00。 二、設計原理 數碼管的八個段a,b,c,d,e,f,g,h(h是小數點)都分別連接到SEG0~SEG7,8個數碼管分別由八個選通信號DIG0~DIG7來選擇,被選通的數碼管顯示數據,其余關閉。如果希望8個數碼管顯示希望的數據,就必須使得8個選通信號DIG0~DIG7分別被單獨選通,并在此同時,在段信號輸入口SEG0~SEG7加上該對應數碼管上顯示的數據,于是隨著選通信號的掃描就能實現動態掃描顯示的目的。雖然每次只有1個數碼管顯示,但只要掃描顯示速率足夠快,利用人眼的視覺余輝效應,我們仍會感覺所有的數碼管都在同時顯示。 三、設計主要內容 本設計要求掌握使用QuartusII設計數字系統的設計思路和設計方法。學習VHDL基本邏輯電路的綜合設計應用。掌握VHDL語言的語法規范,掌握時序電路描述方法。掌握多個數碼管動態掃描顯示的原理及設計方法。 設計一個由共陰八位數碼管作為顯示、按鍵作為控制系統的數字鐘電路,要求利用實驗室設備完成系統設計并運行調試。 四、設計流程 1.程序: library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity stopwatch is port(Clk : in std_logic; --時鐘輸入 reset : in std_logic; --復位輸入 start,over : in std_logic; --秒表控制輸入 ledag : out std_logic_vector(6 downto 0);--七段碼管顯示輸出 SEL : buffer std_logic_vector(2 downto 0)--七段碼管掃描驅動); end stopwatch;architecture behave of stopwatch is signal Disp_Temp : integer range 0 to 15; signal Disp_Decode : std_logic_vector(6 downto 0); signal mSEC1,mSEC10 : integer range 0 to 9; signal SEC1,SEC10 : integer range 0 to 9; signal MIN1,MIN10 : integer range 0 to 9; signal HOUR1,HOUR10 : integer range 0 to 9; signal Clk1kHz : std_logic; signal Clk100Hz : std_logic; signal Start_Flag : std_logic; signal Music_Count : std_logic_vector(2 downto 0); begin PROCESS(clk)--generate 100hz clock signal variable cnt : INTEGER RANGE 0 TO 499999;--產生100Hz時鐘的分頻計數器 BEGIN IF clk='1' AND clk'event THEN IF cnt=499999 THEN cnt:=0; ELSE IF cnt<250000 THEN clk100hz<='1'; ELSE clk100hz<='0'; END IF; cnt:=cnt+1; END IF; END IF; END PROCESS; PROCESS(clk)--generate 1khz clock signal variable cnt1 : INTEGER RANGE 0 TO 49999;--產生1kHz時鐘的分頻計數器 BEGIN IF clk='1' AND clk'event THEN IF cnt1=49999 THEN cnt1:=0; ELSE IF cnt1<25000 THEN clk1khz<='1'; ELSE clk1khz<='0'; END IF; cnt1:=cnt1+1; END IF; END IF; END PROCESS; process(Clk100Hz) begin if(reset='0')then --系統復位 mSEC1<=0; mSEC10<=0; SEC1<=0; SEC10<=0; MIN1<=0; MIN10<=0; HOUR1<=0; HOUR10<=0; Start_Flag<='0'; elsif(start='0' and Start_Flag='0')then Start_Flag<='1'; elsif(over='0' and Start_Flag='1')then Start_Flag<='0'; elsif(Clk100Hz'event and Clk100Hz='1')then --正常運行 if(Start_Flag='1')then if(mSEC1=9)then mSEC1<=0; if(mSEC10=9)then mSEC10<=0; if(SEC1=9)then SEC1<=0; if(SEC10=5)then SEC10<=0; if(MIN1=9)then MIN1<=0; if(MIN10=5)then MIN10<=0; if(HOUR1=9)then HOUR1<=0; if(HOUR10=9)then HOUR10<=0; else HOUR10<=HOUR10+1; end if; else HOUR1<=HOUR1+1; end if; else MIN10<=MIN10+1; end if; else MIN1<=MIN1+1; end if; else SEC10<=SEC10+1; end if; else SEC1<=SEC1+1; end if; else mSEC10<=mSEC10+1; end if; else mSEC1<=mSEC1+1; end if; end if; end if; end process; process(SEL) begin if(HOUR1=0)then case(SEL+1)is when “111”=>Disp_Temp<=mSEC1; when “110”=>Disp_Temp<=mSEC10; when “101”=>Disp_Temp<=10; when “100”=>Disp_Temp<=SEC1; when “011”=>Disp_Temp<=SEC10; when “010”=>Disp_Temp<=10; when “001”=>Disp_Temp<=MIN1; when “000”=>Disp_Temp<=MIN10; end case; else case(SEL+1)is when “111”=>Disp_Temp<=SEC1; when “110”=>Disp_Temp<=SEC10; when “101”=>Disp_Temp<=10; when “100”=>Disp_Temp<=MIN1; when “011”=>Disp_Temp<=MIN10; when “010”=>Disp_Temp<=10; when “001”=>Disp_Temp<=HOUR1; when “000”=>Disp_Temp<=HOUR10; end case; end if; end process;process(Clk1khz) begin if(Clk1khz'event and Clk1khz='1')then --掃描累加 SEL<=SEL+1; ledag<=Disp_Decode; end if; end process; process(Disp_Temp) --顯示轉換 begin case Disp_Temp is when 0=>Disp_Decode<= “0111111”; --0 when 1=>Disp_Decode<= “0000110”; --1 when 2=>Disp_Decode<= “1011011”; --2 when 3=>Disp_Decode<= “1001111”; --3 when 4=>Disp_Decode<= “1100110”; --4 when 5=>Disp_Decode<= “1101101”; --5 when 6=>Disp_Decode<= “1111101”; --6 when 7=>Disp_Decode<= “0000111”; --7 when 8=>Disp_Decode<= “1111111”; --8 when 9=>Disp_Decode<= “1101111”; --9 when 10=>Disp_Decode<= “1000000”; --- when others=>Disp_Decode<=“0000000”; --全滅 end case; end process; end behave; 2.管腳分配: 2.時序仿真圖: 4.硬件電路圖: 5.現象: 五、設計總結 通過本次的課程設計,我初步了解了VHDL語言的編程思想,以及利用EDA軟件進行電子電路設計的方法,通過對一個課題的分析,將實驗的內容進行分塊解讀,具體到每一個模塊的具體作用,然后將各個功能的模塊通過連線進行總體的電路實現,也可以通過VHDL語言對各個模塊進行組合,然后需要在程序編譯成功的基礎上,安裝硬件,將程序下載到具體的芯片上進行硬件的實現。通過整個實驗的完成,我從老師和同學那里學到了更多關于VHDL編程,仿真以及硬件實現的知識,自己以前模糊不清的地方也通過此次的課程設計了解清楚了,并且通過這次課程設計,我也鍛煉了獨立思考,獨立操作的能力,雖然對于VHDL語言的應用我還很生疏,但是此次的課程設計卻讓我學到了很多,也對這門語言有了更深的理解,對EDA軟件的使用有了更多的體會。