版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、<p> 基于VHDL的自動售貨機的設(shè)計</p><p><b> 姓名</b></p><p><b> 班級:</b></p><p><b> 學號:</b></p><p><b> 指導老師:</b></p>&
2、lt;p><b> 摘要:</b></p><p><b> 1)EDA:</b></p><p> EDA技術(shù)就是以計算機為工具,設(shè)計者在EDA軟件平臺上,用硬件描述語言VHDL完成設(shè)計文件,然后由計算機自動地完成邏輯編譯、化簡、分割、綜合、優(yōu)化、布局、布線和仿真,直至對于特定目標芯片的適配編譯、邏輯映射和編程下載等工作。EDA技術(shù)
3、的出現(xiàn),極大地提高了電路設(shè)計的效率和可操作性,減輕了設(shè)計者的勞動強度。 </p><p> 利用EDA工具,電子設(shè)計師可以從概念、算法、協(xié)議等開始設(shè)計電子系統(tǒng),大量工作可以通過計算機完成,并可以將電子產(chǎn)品從電路設(shè)計、性能分析到設(shè)計出IC版圖或PCB版圖的整個過程的計算機上自動處理完成。 </p><p> 現(xiàn)在對EDA的概念或范疇用得很寬。包括在機械、電子、通信、航空航天、化工、礦產(chǎn)、
4、生物、醫(yī)學、軍事等各個領(lǐng)域,都有EDA的應(yīng)用。目前EDA技術(shù)已在各大公司、企事業(yè)單位和科研教學部門廣泛使用。</p><p><b> 2)售貨機簡介:</b></p><p> 一般的自動售貨機由錢幣裝置、指示裝置、貯藏售貨裝置等組成。錢幣裝置是售貨機的核心分選錢幣的種類,計算金額。如果投入的金額達到購買物品的數(shù)值即發(fā)出售貨信號,并找出余錢。指示裝置用以指示顧客
5、所選商品的品種。</p><p> 3)現(xiàn)狀及發(fā)展趨勢:</p><p> 從自動售貨機的發(fā)展趨勢來看,它的出現(xiàn)是由于勞動密集型的產(chǎn)業(yè)構(gòu)造向技術(shù)密集型社會轉(zhuǎn)變的產(chǎn)物。大量生產(chǎn)、大量消費以及消費模式和銷售環(huán)境的變化,要求出現(xiàn)新的流通渠道;而相對的超市、百貨購物中心等新的流通渠道的產(chǎn)生,人工費用也不斷上升;再加上場地的局限性以及購物的便利性等這些因素的制約,無人自動售貨機作為一種必須的機器
6、便應(yīng)運而生了。 </p><p> 從廣義來講投入硬幣、紙幣、信用卡等后便可以銷售商品的機械,從狹義來講就是自動銷售商品的機械。從供給的條件看,自動售貨機可以充分補充人力資源的不足,適應(yīng)消費環(huán)境和消費模式的變化,24小時無人售貨的系統(tǒng)可以更省力,運營時需要的資本少、面積小,有吸引人們購買好奇心的自身性能,可以很好地解決人工費用上升的問題等各項優(yōu)點。</p><p> 現(xiàn)在,自動售貨機產(chǎn)
7、業(yè)正在走向信息化并進一步實現(xiàn)合理化。例如實行聯(lián)機方式,通過電話線路將自動售貨機內(nèi)的庫存信息及時地傳送各營業(yè)點的電腦中,從而確保了商品的發(fā)送、補充以及商品選定的順利進行。并且,為防止地球暖化,自動售貨機的開發(fā)致力于能源的節(jié)省,節(jié)能型清涼飲料自動售貨機成為該行業(yè)的主流。在夏季電力消費高峰時,這種機型的自動售貨機即使在關(guān)掉冷卻器的狀況下也能保持低溫,與以往的自動售貨機相比,它能夠節(jié)約10-15%的電力。進入21世紀時,自動售貨機也將進一步向節(jié)
8、省資源和能源以及高功能化的方向發(fā)展。 </p><p> 關(guān)鍵字:EDA技術(shù) 廣泛使用 自動售貨機</p><p><b> 目錄</b></p><p> 1、引言 3</p><p> 1
9、.1設(shè)計的目的 3</p><p> 1.2設(shè)計的基本內(nèi)容 3</p><p> 2、EDA 和VHDL簡介
10、 4</p><p> 2.1 EDA的簡介 4</p><p> 2.2VHDL語言的特點 5</p><p> 3、基于VHDL的智力競賽搶答器
11、的模塊設(shè)計 6</p><p> 3.1智力競賽搶答器的組成原理 6</p><p> 3.2搶答器模塊的設(shè)計 6</p><p> 3.2
12、.1搶答鑒別模塊的設(shè)計 7</p><p> 3.2.2倒計時模塊的設(shè)計 8</p><p> 3.2.3計分模塊的設(shè)計 10</p>
13、;<p> 3.2.4數(shù)碼管顯示選擇模塊的設(shè)計 16</p><p> 3.2.5譯碼顯示模塊的設(shè)計 17</p><p> 3.2.6蜂鳴器控制模塊的設(shè)計 2
14、0</p><p> 附表 22</p><p> 參考文獻 23</p><p><b> 1、引言</b&
15、gt;</p><p><b> 1.1 設(shè)計的目的</b></p><p> 本次設(shè)計是基于“學以致用”四字。首先,在學習了VHDL語言之后,必須有一個較為完整的設(shè)計才能更為深刻和透徹地了解學習這門語言的意義及使用方法,糾正在以往設(shè)計中存在的問題并大致對設(shè)計有一定的認識,逐步建立正確設(shè)計思想。其次,本設(shè)計可以將所有的相關(guān)學科的知識,如模擬電路,數(shù)字電路,單片機原
16、理等等課程融會貫通,由點及面得學習。與此同時,在題目的選擇上將其確定為“自動售貨機”是因為這個題目的實際效益較為明顯,最貼近于生活。而我們設(shè)計者就應(yīng)該選擇那些和生活息息相關(guān)的題材來進行學習和研究,這樣才能有助于專業(yè)知識的生活化,普及化。讓更多的人意識到自己的生活充滿了電子設(shè)計,也讓電子設(shè)計。最后,可以通過自動售貨機的設(shè)計鞏固和綜合運用所學課程,加強動手能力,提高分析、解決計算機技術(shù)實際問題的獨立工作能力,本設(shè)計以撥碼開關(guān)信號來控制商品選
17、擇及價格投入,應(yīng)用二極管和數(shù)碼顯示管為主要部件來模擬真實的自動售貨機。通過課程設(shè)計深入理解VHDL語言的精髓和掌握運用所學的知識,達到課程設(shè)計的目標。</p><p> 1.2設(shè)計的基本內(nèi)容</p><p> 設(shè)計一個有四樣商品的自動售貨機,其價格分別為0.5,1.0,1.5,2.0。利用撥碼開關(guān)對商品進行任意選擇,小于等于四個即可。選擇完后,對應(yīng)貨品的燈亮,數(shù)碼管上會顯示出所選貨品總
18、共的價格。同樣用四個撥碼開關(guān)代表投入的錢數(shù),分別為0.5,1.0,2.0,2.0,撥碼選擇投入的錢數(shù)之后,數(shù)碼管上同時顯示所投錢數(shù),而另外兩個數(shù)碼管則顯示出了應(yīng)該找回的錢。在交易成功之時(即投幣數(shù)大于購買價格)蜂鳴器響起,否則指示燈亮。</p><p> 2、EDA 和VHDL簡介</p><p> 2.1 EDA的簡介</p><p> EDA技術(shù)是在電子C
19、AD技術(shù)基礎(chǔ)上發(fā)展起來的計算機軟件系統(tǒng),是指以計算機為工作平臺,融合了應(yīng)用電子技術(shù)、計算機技術(shù)、信息處理及智能化技術(shù)的最新成果,進行電子產(chǎn)品的自動設(shè)計。利用EDA工具,電子設(shè)計師可以從概念、算法、協(xié)議等開始設(shè)計電子系統(tǒng),大量工作可以通過計算機完成,并可以將電子產(chǎn)品從電路設(shè)計、性能分析到設(shè)計出IC版圖或PCB版圖的整個過程在計算機上自動處理完成?,F(xiàn)在對EDA的概念或范疇用得很寬。包括在機械、電子、通信、航空航天、化工、礦產(chǎn)、生物、醫(yī)學、軍
20、事等各個領(lǐng)域,都有EDA的應(yīng)用。目前EDA 技術(shù)已在各大公司、企事業(yè)單位和科研教學部門廣泛使用。例如在飛機制造過程中,從設(shè)計、性能測試及特性分析直到飛行模擬,都可能涉及到EDA技術(shù)。本文所指的EDA技術(shù),主要針對電子電路設(shè)計、PCB設(shè)計和IC設(shè)計。EDA 設(shè)計可分為系統(tǒng)級、電路級和物理實現(xiàn)級。</p><p> VHDL 的英文全名是 Very-High-Speed Integrated Circuit Har
21、dwareDescription Language,VHDL主要用于描述數(shù)字系統(tǒng)的結(jié)構(gòu),行為,功能和接口。除了含有許多具有硬件特征的語句外,VHDL的語言形式和描述風格與句法是十分類似于一般的計算機高級語言。VHDL的程序結(jié)構(gòu)特點是將一項工程設(shè)計,或稱設(shè)計實體(可以是一個元件,一個電路模塊或一個系統(tǒng))分成外部(或稱可視部分,及端口)和內(nèi)部(或稱不可視部分),既涉及實體的內(nèi)部功能和算法完成部分。在對一個設(shè)計實體定義了外部界面后,一旦其內(nèi)部
22、開發(fā)完成后,其他的設(shè)計就可以直接調(diào)用這個實體。這種將設(shè)計實體分成內(nèi)外部分的概念是VHDL系統(tǒng)設(shè)計的基本點。</p><p> 2.2VHDL語言的特點</p><p> VHDL 語言能夠成為標準化的硬件描述語言并獲得廣泛應(yīng)用,它自身必然具有很多其他硬件描述語言所不具備的優(yōu)點。歸納起來,VHDL 語言主要具有以下優(yōu)點:</p><p> ?。?) VHDL 語言
23、功能強大,設(shè)計方式多樣</p><p> VHDL 語言具有強大的語言結(jié)構(gòu),只需采用簡單明確的VHDL語言程序就可以描述十分復雜的硬件電路。同時,它還具有多層次的電路設(shè)計描述功能。此外,VHDL 語言能夠同時支持同步電路、異步電路和隨機電路的設(shè)計實現(xiàn),這是其他硬件描述語言所不能比擬的。VHDL 語言設(shè)計方法靈活多樣,既支持自頂向下的設(shè)計方式,也支持自底向上的設(shè)計方法;既支持模塊化設(shè)計方法,也支持層次化設(shè)計方法。
24、</p><p> ?。?) VHDL 語言具有強大的硬件描述能力</p><p> VHDL 語言具有多層次的電路設(shè)計描述功能,既可描述系統(tǒng)級電路,也可以描述門級電路;描述方式既可以采用行為描述、寄存器傳輸描述或者結(jié)構(gòu)描述,也可以采用三者的混合描述方式。同時,VHDL 語言也支持慣性延遲和傳輸延遲,這樣可以準確地建立硬件電路的模型。VHDL 語言的強大描述能力還體現(xiàn)在它具有豐富的數(shù)據(jù)類
25、型。VHDL 語言既支持標準定義的數(shù)據(jù)類型,也支持用戶定義的數(shù)據(jù)類型,這樣便會給硬件描述帶來較大的自由度。</p><p> ?。?) VHDL 語言具有很強的移植能力</p><p> VHDL 語言很強的移植能力主要體現(xiàn)在:對于同一個硬件電路的 VHDL 語言描述,它可以從一個模擬器移植到另一個模擬器上、從一個綜合器移植到另一個綜合器上或者從一個工作平臺移植到另一個工作平臺上去執(zhí)行。
26、</p><p> ?。?) VHDL 語言的設(shè)計描述與器件無關(guān)</p><p> 采用 VHDL 語言描述硬件電路時,設(shè)計人員并不需要首先考慮選擇進行設(shè)計的器件。這樣做的好處是可以使設(shè)計人員集中精力進行電路設(shè)計的優(yōu)化,而不需要考慮其他的問題。當硬件電路的設(shè)計描述完成以后,VHDL 語言允許采用多種不同的器件結(jié)構(gòu)來實現(xiàn)。</p><p> (5) VHDL 語言
27、程序易于共享和復用</p><p> VHDL 語言采用基于庫 ( library) 的設(shè)計方法。在設(shè)計過程中,設(shè)計人員可以建立各種可再次利用的模塊,一個大規(guī)模的硬件電路的設(shè)計不可能從門級電路開始一步步地進行設(shè)計,而是一些模塊的累加。這些模塊可以預(yù)先設(shè)計或者使用以前設(shè)計中的存檔模塊,將這些模塊存放在庫中,就可以在以后的設(shè)計中進行復用。</p><p> 由于 VHDL 語言是一種描述、
28、模擬、綜合、優(yōu)化和布線的標準硬件描述語言,因此它可以使設(shè)計成果在設(shè)計人員之間方便地進行交流和共享,從而減小硬件電路設(shè)計的工作量,縮短開發(fā)周期。</p><p> 3、基于VHDL的自動售貨機的設(shè)計</p><p><b> 3.1總體設(shè)計</b></p><p><b> 1 原理圖:</b></p>
29、<p><b> 2 設(shè)計思想:</b></p><p> [1]本次設(shè)計題目要求為:</p><p> 可以對4種商品進行售貨,價格分別為0.5元,1.0元,1.5元,2.0元;</p><p> 售貨機可以接受1元,5角硬幣;</p><p> 根據(jù)入的硬幣出貨和找零;</p>&l
30、t;p> 需顯示狀態(tài),以及金額</p><p> 可通過撥碼開關(guān)或按鍵代表金額輸入;</p><p> [2]根據(jù)題目要求可以將設(shè)計過程大概分為商品的選擇,投幣以及數(shù)碼管顯示三塊。商品選擇利用撥碼開關(guān)實現(xiàn),在選定商品的時候,代表對應(yīng)商品的提示燈亮起,且選擇的商品可以多余一樣而少于四樣;投幣可以設(shè)計兩個模塊,第一個是利用撥碼開關(guān)實現(xiàn),另外一種則可以利用鍵盤實現(xiàn);數(shù)碼管顯示要求可以
31、同時、依次顯示選擇物品的總價格、所投錢數(shù)以及應(yīng)找零數(shù);是內(nèi)容直觀可靠。</p><p><b> 3.2設(shè)計過程:</b></p><p> 3.2.1枚舉法設(shè)計:</p><p> 本次要求的自動售貨機所售物品的種類并不多,數(shù)值也并不大,數(shù)碼管的位數(shù)夠多,而所用的芯片引腳也夠多,所以設(shè)計者最先萌生出的念頭就是利用枚舉法將運算提前做好,整
32、個程序只需負責數(shù)碼顯示,且運用大規(guī)模的枚舉法。</p><p><b> 大致程序如下:</b></p><p> -----------------choose what you want (no more than 4)--------------</p><p> process(shift)</p><p>
33、;<b> begin</b></p><p> if (clk'event and clk='1') then</p><p> case shift is</p><p> when "0000" => led <= "0000" ;led0<=&qu
34、ot;0000";led1<="0000"; --0 </p><p> when "0001" => led <= "0001" ;led0<="0101";led1<="0000"; --0.5</p><p> when "0010
35、" => led <= "0010" ;led0<="0000";led1<="0001"; --1.0 </p><p> when "0011" => led <= "0011" ;led0<="0101";led1<="
36、0001"; --1.5</p><p> when "0100" => led <= "0100" ;led0<="0101";led1<="0001"; --2.0</p><p> when "0101" => led <= "
37、;0101" ;led0<="0101";led1<="0010"; --2.5</p><p> when "0110" => led <= "0110" ;led0<="0000";led1<="0011"; --3.0 </p>
38、<p> when "0111" => led <= "0111" ;led0<="0101";led1<="0011"; --3.5 </p><p> when "1000" => led <= "1000" ;led0<="
39、;0000";led1<="0010"; --2.0 </p><p> when "1001" => led <= "1001" ;led0<="0101";led1<="0010"; --2.5 </p><p> when "101
40、0" => led <= "1010" ;led0<="0000";led1<="0011"; --3.0</p><p> when "1011" => led <= "1011" ;led0<="0101";led1<="
41、0011"; --3.5</p><p> when "1100" => led <= "1100" ;led0<="0101";led1<="0011"; --3.5 </p><p> when "1101" => led <= &quo
42、t;1101" ;led0<="0000";led1<="0100"; --4.0 </p><p> when "1110" => led <= "1110" ;led0<="0101";led1<="0100"; --4.5 </p>
43、;<p> when "1111" => led <= "1111" ;led0<="0000";led1<="0101"; --5 </p><p> when others => NULL ;</p><p> end case ; </p>
44、<p><b> end if ;</b></p><p> end process;</p><p> PROCESS(CNT8)</p><p><b> begin</b></p><p> CASE CNT8 IS</p><p> WHEN
45、"000" =>sign<="000";A<=0;</p><p> WHEN "001" =>sign<="001";A<=1;</p><p> WHEN "010" =>sign<="010";A<=2;&l
46、t;/p><p> WHEN "011" =>sign<="011";A<=3;</p><p> when others => NULL ;</p><p><b> end CASE;</b></p><p> end process;</p&
47、gt;<p> process(clk1)</p><p><b> begin</b></p><p> if(clk1'event and clk1='1') then CNT8<=CNT8+1;</p><p><b> end if ;</b></p>
48、<p> end process;</p><p> process(clk1)</p><p><b> begin</b></p><p> if A=0 then</p><p> case led1 is</p><p> WHEN "0000"
49、; => eight0<="0111111";</p><p> WHEN "0001" => eight0<="0000110";</p><p> WHEN "0010" => eight0<="1011011";</p><p
50、> WHEN "0011" => eight0<="1001111";</p><p> WHEN "0100" => eight0<="1100110";</p><p> WHEN "0101" => eight0<="11011
51、01";</p><p> WHEN "0110" => eight0<="1111101";</p><p> WHEN "0111" => eight0<="0000111";</p><p> WHEN "1000" =&
52、gt; eight0<="1111111";</p><p> WHEN "1001" => eight0<="1101111";</p><p> WHEN OTHERS => NULL;</p><p> end case; </p><p> e
53、lsif A=1 then </p><p> CASE led0 IS</p><p> WHEN "0000" => eight0<="0111111";</p><p> WHEN "0101" => eight0<="1101101";</p&
54、gt;<p> WHEN OTHERS => NULL;</p><p> END CASE; </p><p> elsif A=2 then</p><p> case led3 is</p><p> WHEN "0000" => eight0<="0111111&
55、quot;;</p><p> WHEN "0001" => eight0<="0000110";</p><p> WHEN "0010" => eight0<="1011011";</p><p> WHEN "0011" =>
56、 eight0<="1001111";</p><p> WHEN "0100" => eight0<="1100110";</p><p> WHEN "0101" => eight0<="1101101";</p><p> W
57、HEN "0110" => eight0<="1111101";</p><p> WHEN "0111" => eight0<="0000111";</p><p> WHEN "1000" => eight0<="1111111"
58、;;</p><p> WHEN "1001" => eight0<="1101111";</p><p> WHEN OTHERS => NULL;</p><p> end case; </p><p> elsif A=3 then </p><p&g
59、t; CASE led4 IS</p><p> WHEN "0000" => eight0<="0111111";</p><p> WHEN "0101" => eight0<="1101101";</p><p> WHEN OTHERS =>
60、 NULL;</p><p> END CASE; </p><p><b> end if ;</b></p><p> end process ;</p><p> 上述程序并未成功,編譯時出現(xiàn)了“邏輯門超出了該芯片的范圍”,故難以實現(xiàn)設(shè)計功能。由此可見枚舉法并不可取,畢竟將所有的邏輯門都用在數(shù)碼管現(xiàn)實上并不
61、是一個明智的選擇,而這無疑是將簡單的問題復雜化了。所以應(yīng)當將數(shù)碼管顯示程序進行修正。</p><p><b> 3.2.2掃描法:</b></p><p> 鑒于上述方案,修改數(shù)碼管顯示模塊應(yīng)該講所需要的內(nèi)容,如商品實際價格的元、角,投入錢數(shù)的元、角及所需找的零錢的元、角均賦給一個值,讓此值通過數(shù)碼管的位選按位顯示,則可以省去枚舉法顯示的邏輯門數(shù)。</p&g
62、t;<p><b> 修改后的顯示程序:</b></p><p> process (clk)----掃描位選信號</p><p><b> begin</b></p><p> if(clk'event and clk='1') then</p><p&g
63、t; dcount<=dcount+1;</p><p><b> end if;</b></p><p> end process;</p><p> process (clk)-----位選</p><p><b> begin</b></p><p>
64、 if(clk'event and clk='1') then</p><p> s0<=dcount(0);--s0</p><p> s1<=dcount(1);</p><p> s2<=dcount(2);</p><p> case dcount is</p><
65、p> when "000"=>A_dis<=by;--000</p><p> when "001"=>A_dis<=bj;--001</p><p> when "010"=>A_dis<=yuan;--010</p><p> when "01
66、1"=>A_dis<=jiao;--011</p><p> when "100"=>A_dis<=rey;--001</p><p> when "101"=>A_dis<=rej; --000</p><p> when others => A_dis<=&q
67、uot;0000";</p><p><b> end case;</b></p><p><b> end if;</b></p><p> end process;</p><p> process (A_dis)----譯碼模塊</p><p><
68、;b> begin</b></p><p> case A_dis is</p><p> when "0000"=>leds<="0111111";--0</p><p> when "0001"=>leds<="0000110";--
69、1</p><p> when "0010"=>leds<="1011011";--2</p><p> when "0011"=>leds<="1001111";--3</p><p> when "0100"=>leds<
70、="1100110";--4</p><p> when "0101"=>leds<="1101101";--5</p><p> when "0110"=>leds<="1111101";--6</p><p> when "
71、0111"=>leds<="0000111";--7</p><p> when "1000"=>leds<="1111111";--8</p><p> when "1001"=>leds<="1101111";--9 </p>
72、<p> when others=>leds<="0000000";</p><p><b> end case;</b></p><p> end process;</p><p> process(clk) --In this process, a,b,c,d,e,f,g will
73、output</p><p><b> begin</b></p><p> if(clk'event and clk='1') then</p><p> a<=leds(0);</p><p> b<=leds(1);</p><p> c<
74、=leds(2);</p><p> d<=leds(3);</p><p> e<=leds(4);</p><p> f<=leds(5);</p><p> g<=leds(6);</p><p><b> end if;</b></p>&l
75、t;p> end process;</p><p> 3.2.3設(shè)計初稿:</p><p><b> 1,商品選擇:</b></p><p> 本設(shè)計運用撥碼開關(guān)對商品進行選擇,且選擇的商品的樣數(shù)不限。在選擇同時,對應(yīng)的提示燈點亮,表示選擇成功。程序中的shift是對撥碼開關(guān)的控制,shift(3downto0)是分別對四件商品(
76、價格分別為0.5,,10,1.5,2.0)的選擇控制:</p><p> library ieee;</p><p> use ieee.std_logic_1164.all;</p><p> use ieee.std_logic_arith.all;</p><p> use ieee.std_logic_unsigned.all
77、;</p><p> --------------------------------------------------------------------</p><p> entity shift is</p><p> port( clk :in std_logic; --Clock Signal</p>
78、;<p> shift :in std_logic_vector(3 downto 0);</p><p> led :out std_logic_vector(3 downto 0)); </p><p> end shift;</p><p> --------------------
79、------------------------------------------------</p><p> architecture behave of shift is</p><p> signal by,bj :std_logic_vector (3 downto 0);</p><p><b> begin</
80、b></p><p> -----------------choose what you want (no more than 4)--------------</p><p> --------------------1--0.5,2--1.0,3--1.5,4--2.0----------------------</p><p> process(s
81、hift)</p><p><b> begin</b></p><p> if (clk'event and clk='1') then</p><p> case shift is</p><p> when "0000" => led <= "
82、;0000" ; by<="0000";bj<="0000";--0 --------------price</p><p> when "0001" => led <= "0001" ; by<="0000";bj<="0101";--0.5&l
83、t;/p><p> when "0010" => led <= "0010" ; by<="0001";bj<="0000";--1.0 </p><p> when "0011" => led <= "0011" ; by<=&
84、quot;0001";bj<="0101";--1.5</p><p> when "0100" => led <= "0100" ; by<="0001";bj<="0101";--1.5</p><p> when "0101&quo
85、t; => led <= "0101" ; by<="0010";bj<="0000";--2.0</p><p> when "0110" => led <= "0110" ; by<="0010";bj<="0101";-
86、-2.5</p><p> when "0111" => led <= "0111" ; by<="0011";bj<="0000";--3.0 </p><p> when "1000" => led <= "1000" ; by
87、<="0010";bj<="0000";--2.0 </p><p> when "1001" => led <= "1001" ; by<="0010";bj<="0101";--2.5 </p><p> when "
88、1010" => led <= "1010" ; by<="0011";bj<="0000";--3.0</p><p> when "1011" => led <= "1011" ; by<="0011";bj<="0101
89、";--3.5</p><p> when "1100" => led <= "1100" ; by<="0011";bj<="0101";--3.5 </p><p> when "1101" => led <= "1101&qu
90、ot; ; by<="0100";bj<="0000";--4.0 </p><p> when "1110" => led <= "1110" ; by<="0100";bj<="0101";--4.5 </p><p> whe
91、n "1111" => led <= "1111" ; by<="0101";bj<="0000";--5 </p><p> when others => NULL ;</p><p> end case ;</p><p><b> e
92、nd if ;</b></p><p> end process;</p><p> end behave;</p><p> 2,錢幣投入及找錢:</p><p> 利用鍵盤控制投入錢數(shù):</p><p> 鍵盤上的1表示5角,2表示一元,這兩個數(shù)字按一下則表示投入相應(yīng)的錢數(shù),同時做出計算應(yīng)該找
93、的錢數(shù);coin0代表五角,coin1代表一元:</p><p> process(clk) --In this process, two counts will accumulate</p><p><b> begin</b></p><p> if(clk'event and clk='1') then&
94、lt;/p><p> dcount<=dcount+1; </p><p> kcount<=kcount+1;</p><p><b> end if;</b></p><p> end process;</p><p> process(clk) --In this p
95、rocess, the main task is to scan keyboard </p><p><b> begin</b></p><p> if(clk'event and clk='1') then</p><p> if(kcount=0) then</p><p> kr&
96、lt;="1111";</p><p> kc<="0000";</p><p> elsif(kcount=1) then</p><p> keyr<=kr; kr<="ZZZZ";</p><p> elsif(kcount=2) then</p
97、><p> kr<="0000";</p><p> kc<="1111";</p><p> elsif(kcount=3) then</p><p> keyc<=kc;kc<="ZZZZ";</p><p><b>
98、 end if;</b></p><p><b> end if;</b></p><p> end process;</p><p> process(clk) -- change the key flags </p><p><b> begin</b></p&g
99、t;<p> if(clk'event and clk='1') then</p><p> if(kcount=4 and keyr="1111") then</p><p> kflag1<='0';</p><p> elsif(kcount=4) then </p&
100、gt;<p> kflag1<='1';</p><p><b> end if;</b></p><p> kflag2<=kflag1;</p><p><b> end if;</b></p><p> end process; </
101、p><p> process(clk) -- get the coin</p><p><b> begin</b></p><p> if(clk'event and clk='1') then</p><p> if(kcount=5) then</p><p>
102、 if(keyr="1110") then</p><p> case keyc is</p><p> when "1101"=>coin0<=coin0+1; </p><p> when others=>coin0<=coin0; </p><p>&
103、lt;b> end case;</b></p><p> elsif(keyr="1101") then</p><p> case keyc is</p><p> when "1101"=>coin1<=coin1+1; </p><p> when oth
104、ers=>coin1<=coin1; </p><p><b> end case;</b></p><p><b> end if;</b></p><p> coin<=coin0*5+coin1*10;</p><p><b> C<=coin
105、;</b></p><p> yuan<=coin/10;</p><p> jiao<=coin-yuan*10;</p><p> end if; </p><p><b> end if; </b></p><p> end p
106、rocess;</p><p> 利用撥碼開關(guān)表示錢數(shù):</p><p> 利用撥碼開關(guān)表示錢數(shù)比利用鍵盤實現(xiàn)起來要方便得多,首先,撥碼開關(guān)投幣的確定性及穩(wěn)定性遠遠大于鍵盤實現(xiàn),因為鍵盤實現(xiàn)的時候很可能出現(xiàn)竄鍵或者由于去抖不到位而引起的顯示數(shù)與按鍵數(shù)不相符合的情況;但是撥碼開關(guān)也存在一定的問題,比如同掃描鍵盤相比,軟件復位進行的并不徹底,必須手動將開關(guān)復位才能達到預(yù)期效果;</p
107、><p> shift1(3downto0)表示了四個撥碼開關(guān),它們分別代表了0.5元,1元,2元和2元,任意組合之后就可以表示投入的錢數(shù),在投入錢數(shù)大于所選商品總價值之后,便會自動計算出應(yīng)該找回的余額,實現(xiàn)自動找零的功能:</p><p> library ieee;</p><p> use ieee.std_logic_1164.all;</p>
108、<p> use ieee.std_logic_arith.all;</p><p> use ieee.std_logic_unsigned.all;</p><p> --------------------------------------------------------------------</p><p> entity sh
109、ift1 is</p><p> port( clk :in std_logic; --Clock Signal</p><p> shift1 :in std_logic_vector(3 downto 0));</p><p> end shift1;</p><p>
110、 --------------------------------------------------------------------</p><p> architecture behave of shift1 is</p><p> signal yuan,jiao,rey,rej :std_logic_vector (3 downto 0);</p>
111、<p> signal by,bj :std_logic_vector (3 downto 0);</p><p><b> begin</b></p><p> ------------------------put in coins------------------------------</p><p&
112、gt; -----------------1--0.5,2--1.0,3--2.0,4--2.0----------------------</p><p> process(shift1)</p><p><b> begin</b></p><p> if (clk'event and clk='1') th
113、en</p><p> case shift1 is</p><p> when "0000" => yuan<="0000";jiao<="0000";--0 --------------price</p><p> when "0001" => yu
114、an<="0000";jiao<="0101";--0.5</p><p> when "0010" => yuan<="0001";jiao<="0000";--1.0 </p><p> when "0011" => yua
115、n<="0001";jiao<="0101";--1.5</p><p> when "0100" => yuan<="0010";jiao<="0000";--2.0</p><p> when "0101" => yuan&
116、lt;="0010";jiao<="0101";--2.5</p><p> when "0110" => yuan<="0011";jiao<="0000";--3.0 </p><p> when "0111" => yuan&l
117、t;="0011";jiao<="0101";--5.0 </p><p> when "1000" => yuan<="0010";jiao<="0000";--2.0 </p><p> when "1001" => yuan&l
118、t;="0010";jiao<="0101";--2.5 </p><p> when "1010" => yuan<="0011";jiao<="0000";--3.0</p><p> when "1011" => yuan<
119、;="0011";jiao<="0101";--3.5</p><p> when "1100" => yuan<="0100";jiao<="0000";--4.0</p><p> when "1101" => yuan<=
120、"0100";jiao<="0101";--4.5 </p><p> when "1110" => yuan<="0101";jiao<="0000";--5.0 </p><p> when "1111" => yuan<=
121、"0101";jiao<="0101";--5.5 </p><p> when others => NULL ;</p><p> end case ;</p><p> -------------------get money back------------------------------<
122、;/p><p> if(jiao="0101") then</p><p> rej<=jiao-bj;</p><p> rey<=yuan-by;</p><p><b> else</b></p><p> if(bj="0000")
123、 then</p><p> rej<="0000";</p><p> rey<=yuan-by;</p><p><b> else</b></p><p> rej<="0101";</p><p> rey<=yua
124、n-by-"0001";</p><p><b> end if;</b></p><p><b> end if ;</b></p><p><b> end if ;</b></p><p> end process;</p>&l
125、t;p> end behave;</p><p> 3)蜂鳴器與顯示燈:</p><p> Beep和light分別表示蜂鳴器和顯示燈,這兩個輸出顯示設(shè)備都是為了標識交易是否成功的。在未進行交易或者是交易不成功,即投幣總數(shù)小于應(yīng)投幣數(shù)的時候,顯示燈亮;而當投幣數(shù)大于商品售價,即交易成功的時候,蜂鳴器便被寫‘1’,持續(xù)發(fā)出響聲,知道復位;:</p><p>
126、; library ieee;</p><p> use ieee.std_logic_1164.all;</p><p> use ieee.std_logic_arith.all;</p><p> use ieee.std_logic_unsigned.all;</p><p> -----------------------
127、---------------------------------------------</p><p> entity beep is</p><p> port( clk :in std_logic; --Clock Signal</p><p> beep,light :out std_logic
128、);</p><p><b> end beep;</b></p><p> --------------------------------------------------------------------</p><p> architecture behave of beep is</p><p>
129、signal yuan,jiao,rey,rej :std_logic_vector (3 downto 0);</p><p> signal by,bj :std_logic_vector (3 downto 0);</p><p><b> begin</b></p><p> ------------
130、---------------succeed or not----------------------------------------</p><p> process(clk) </p><p><b> begin</b></p><p> if(clk'event and clk='1') then
131、 if((yuan>by)or((yuan=by)and(jiao>bj))or((yuan=by)and(jiao=bj)and((yuan/=0)and(jiao/=0)))) then</p><p> beep<='1';</p><p> light<='0';</p><p><b&g
132、t; else</b></p><p> beep<='0';</p><p> light<='1';</p><p><b> end if;</b></p><p><b> end if ;</b></p>&l
133、t;p> end process ;</p><p> end behave;</p><p><b> 4)顯示函數(shù):</b></p><p> 數(shù)碼管顯示是本設(shè)計的一個難題,因為要同時顯示六位數(shù)字且不可以出現(xiàn)位數(shù)上的顛倒。由于開始嘗試的枚舉法的靜態(tài)顯示出現(xiàn)了邏輯門超出的錯誤,所以只能選擇按位顯示,并將頻率提高到人眼難以察覺。
134、將商品總價格的元角by,bj;投入錢數(shù)的yuan,Jiao;以及算出的應(yīng)該找的零錢數(shù)目rey,rej,都復制給一個中間變量A_dis,再根據(jù)脈沖count自加,從”000”到“111”進行位選,按位顯示上述的值,再通過數(shù)碼管a到f的七位段選,最終可以在數(shù)碼管上清晰地呈現(xiàn)出價格,投幣和找零:</p><p> library ieee;</p><p> use ieee.std_log
135、ic_1164.all;</p><p> use ieee.std_logic_arith.all;</p><p> use ieee.std_logic_unsigned.all;</p><p> --------------------------------------------------------------------</p>
136、<p> entity display is</p><p> port( clk :in std_logic; --Clock Signal</p><p> s0,s1,s2 :out std_logic;</p><p> a,b,c,d,e,f,g :out st
137、d_logic);</p><p> end display;</p><p> --------------------------------------------------------------------</p><p> architecture behave of display is</p><p> signal
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 基于vhdl的自動售貨機設(shè)計
- 基于vhdl自動售貨機設(shè)計與實現(xiàn)
- 自動售貨機設(shè)計
- 自動售貨機設(shè)計
- 自動售貨機的vhdl實現(xiàn)
- 基于plc自動售貨機設(shè)計
- 基于plc的自動售貨機設(shè)計
- 基于vhdl的自動售貨機控制電路設(shè)計
- eda自動售貨機設(shè)計
- 基于plc的自動售貨機設(shè)計
- 基于fpga的自動售貨機設(shè)計
- 基于plc的自動售貨機設(shè)計
- 基于plc的自動售貨機設(shè)計
- 基于labview的飲料自動售貨機設(shè)計
- 基于labview的飲料自動售貨機設(shè)計
- 基于plc控制的自動售貨機設(shè)計
- 基于labview的飲料自動售貨機設(shè)計
- 基于plc投幣飲料自動售貨機設(shè)計
- plc控制的自動售貨機設(shè)計
- 基于plc的自動售貨機設(shè)計畢業(yè)設(shè)計
評論
0/150
提交評論