版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、<p> 基于VHDL的自動(dòng)售貨機(jī)的設(shè)計(jì)</p><p><b> 姓名</b></p><p><b> 班級(jí):</b></p><p><b> 學(xué)號(hào):</b></p><p><b> 指導(dǎo)老師:</b></p>&
2、lt;p><b> 摘要:</b></p><p><b> 1)EDA:</b></p><p> EDA技術(shù)就是以計(jì)算機(jī)為工具,設(shè)計(jì)者在EDA軟件平臺(tái)上,用硬件描述語言VHDL完成設(shè)計(jì)文件,然后由計(jì)算機(jī)自動(dòng)地完成邏輯編譯、化簡、分割、綜合、優(yōu)化、布局、布線和仿真,直至對(duì)于特定目標(biāo)芯片的適配編譯、邏輯映射和編程下載等工作。EDA技術(shù)
3、的出現(xiàn),極大地提高了電路設(shè)計(jì)的效率和可操作性,減輕了設(shè)計(jì)者的勞動(dòng)強(qiáng)度。 </p><p> 利用EDA工具,電子設(shè)計(jì)師可以從概念、算法、協(xié)議等開始設(shè)計(jì)電子系統(tǒng),大量工作可以通過計(jì)算機(jī)完成,并可以將電子產(chǎn)品從電路設(shè)計(jì)、性能分析到設(shè)計(jì)出IC版圖或PCB版圖的整個(gè)過程的計(jì)算機(jī)上自動(dòng)處理完成。 </p><p> 現(xiàn)在對(duì)EDA的概念或范疇用得很寬。包括在機(jī)械、電子、通信、航空航天、化工、礦產(chǎn)、
4、生物、醫(yī)學(xué)、軍事等各個(gè)領(lǐng)域,都有EDA的應(yīng)用。目前EDA技術(shù)已在各大公司、企事業(yè)單位和科研教學(xué)部門廣泛使用。</p><p><b> 2)售貨機(jī)簡介:</b></p><p> 一般的自動(dòng)售貨機(jī)由錢幣裝置、指示裝置、貯藏售貨裝置等組成。錢幣裝置是售貨機(jī)的核心分選錢幣的種類,計(jì)算金額。如果投入的金額達(dá)到購買物品的數(shù)值即發(fā)出售貨信號(hào),并找出余錢。指示裝置用以指示顧客
5、所選商品的品種。</p><p> 3)現(xiàn)狀及發(fā)展趨勢(shì):</p><p> 從自動(dòng)售貨機(jī)的發(fā)展趨勢(shì)來看,它的出現(xiàn)是由于勞動(dòng)密集型的產(chǎn)業(yè)構(gòu)造向技術(shù)密集型社會(huì)轉(zhuǎn)變的產(chǎn)物。大量生產(chǎn)、大量消費(fèi)以及消費(fèi)模式和銷售環(huán)境的變化,要求出現(xiàn)新的流通渠道;而相對(duì)的超市、百貨購物中心等新的流通渠道的產(chǎn)生,人工費(fèi)用也不斷上升;再加上場地的局限性以及購物的便利性等這些因素的制約,無人自動(dòng)售貨機(jī)作為一種必須的機(jī)器
6、便應(yīng)運(yùn)而生了。 </p><p> 從廣義來講投入硬幣、紙幣、信用卡等后便可以銷售商品的機(jī)械,從狹義來講就是自動(dòng)銷售商品的機(jī)械。從供給的條件看,自動(dòng)售貨機(jī)可以充分補(bǔ)充人力資源的不足,適應(yīng)消費(fèi)環(huán)境和消費(fèi)模式的變化,24小時(shí)無人售貨的系統(tǒng)可以更省力,運(yùn)營時(shí)需要的資本少、面積小,有吸引人們購買好奇心的自身性能,可以很好地解決人工費(fèi)用上升的問題等各項(xiàng)優(yōu)點(diǎn)。</p><p> 現(xiàn)在,自動(dòng)售貨機(jī)產(chǎn)
7、業(yè)正在走向信息化并進(jìn)一步實(shí)現(xiàn)合理化。例如實(shí)行聯(lián)機(jī)方式,通過電話線路將自動(dòng)售貨機(jī)內(nèi)的庫存信息及時(shí)地傳送各營業(yè)點(diǎn)的電腦中,從而確保了商品的發(fā)送、補(bǔ)充以及商品選定的順利進(jìn)行。并且,為防止地球暖化,自動(dòng)售貨機(jī)的開發(fā)致力于能源的節(jié)省,節(jié)能型清涼飲料自動(dòng)售貨機(jī)成為該行業(yè)的主流。在夏季電力消費(fèi)高峰時(shí),這種機(jī)型的自動(dòng)售貨機(jī)即使在關(guān)掉冷卻器的狀況下也能保持低溫,與以往的自動(dòng)售貨機(jī)相比,它能夠節(jié)約10-15%的電力。進(jìn)入21世紀(jì)時(shí),自動(dòng)售貨機(jī)也將進(jìn)一步向節(jié)
8、省資源和能源以及高功能化的方向發(fā)展。 </p><p> 關(guān)鍵字:EDA技術(shù) 廣泛使用 自動(dòng)售貨機(jī)</p><p><b> 目錄</b></p><p> 1、引言 3</p><p> 1
9、.1設(shè)計(jì)的目的 3</p><p> 1.2設(shè)計(jì)的基本內(nèi)容 3</p><p> 2、EDA 和VHDL簡介
10、 4</p><p> 2.1 EDA的簡介 4</p><p> 2.2VHDL語言的特點(diǎn) 5</p><p> 3、基于VHDL的智力競賽搶答器
11、的模塊設(shè)計(jì) 6</p><p> 3.1智力競賽搶答器的組成原理 6</p><p> 3.2搶答器模塊的設(shè)計(jì) 6</p><p> 3.2
12、.1搶答鑒別模塊的設(shè)計(jì) 7</p><p> 3.2.2倒計(jì)時(shí)模塊的設(shè)計(jì) 8</p><p> 3.2.3計(jì)分模塊的設(shè)計(jì) 10</p>
13、;<p> 3.2.4數(shù)碼管顯示選擇模塊的設(shè)計(jì) 16</p><p> 3.2.5譯碼顯示模塊的設(shè)計(jì) 17</p><p> 3.2.6蜂鳴器控制模塊的設(shè)計(jì) 2
14、0</p><p> 附表 22</p><p> 參考文獻(xiàn) 23</p><p><b> 1、引言</b&
15、gt;</p><p><b> 1.1 設(shè)計(jì)的目的</b></p><p> 本次設(shè)計(jì)是基于“學(xué)以致用”四字。首先,在學(xué)習(xí)了VHDL語言之后,必須有一個(gè)較為完整的設(shè)計(jì)才能更為深刻和透徹地了解學(xué)習(xí)這門語言的意義及使用方法,糾正在以往設(shè)計(jì)中存在的問題并大致對(duì)設(shè)計(jì)有一定的認(rèn)識(shí),逐步建立正確設(shè)計(jì)思想。其次,本設(shè)計(jì)可以將所有的相關(guān)學(xué)科的知識(shí),如模擬電路,數(shù)字電路,單片機(jī)原
16、理等等課程融會(huì)貫通,由點(diǎn)及面得學(xué)習(xí)。與此同時(shí),在題目的選擇上將其確定為“自動(dòng)售貨機(jī)”是因?yàn)檫@個(gè)題目的實(shí)際效益較為明顯,最貼近于生活。而我們?cè)O(shè)計(jì)者就應(yīng)該選擇那些和生活息息相關(guān)的題材來進(jìn)行學(xué)習(xí)和研究,這樣才能有助于專業(yè)知識(shí)的生活化,普及化。讓更多的人意識(shí)到自己的生活充滿了電子設(shè)計(jì),也讓電子設(shè)計(jì)。最后,可以通過自動(dòng)售貨機(jī)的設(shè)計(jì)鞏固和綜合運(yùn)用所學(xué)課程,加強(qiáng)動(dòng)手能力,提高分析、解決計(jì)算機(jī)技術(shù)實(shí)際問題的獨(dú)立工作能力,本設(shè)計(jì)以撥碼開關(guān)信號(hào)來控制商品選
17、擇及價(jià)格投入,應(yīng)用二極管和數(shù)碼顯示管為主要部件來模擬真實(shí)的自動(dòng)售貨機(jī)。通過課程設(shè)計(jì)深入理解VHDL語言的精髓和掌握運(yùn)用所學(xué)的知識(shí),達(dá)到課程設(shè)計(jì)的目標(biāo)。</p><p> 1.2設(shè)計(jì)的基本內(nèi)容</p><p> 設(shè)計(jì)一個(gè)有四樣商品的自動(dòng)售貨機(jī),其價(jià)格分別為0.5,1.0,1.5,2.0。利用撥碼開關(guān)對(duì)商品進(jìn)行任意選擇,小于等于四個(gè)即可。選擇完后,對(duì)應(yīng)貨品的燈亮,數(shù)碼管上會(huì)顯示出所選貨品總
18、共的價(jià)格。同樣用四個(gè)撥碼開關(guān)代表投入的錢數(shù),分別為0.5,1.0,2.0,2.0,撥碼選擇投入的錢數(shù)之后,數(shù)碼管上同時(shí)顯示所投錢數(shù),而另外兩個(gè)數(shù)碼管則顯示出了應(yīng)該找回的錢。在交易成功之時(shí)(即投幣數(shù)大于購買價(jià)格)蜂鳴器響起,否則指示燈亮。</p><p> 2、EDA 和VHDL簡介</p><p> 2.1 EDA的簡介</p><p> EDA技術(shù)是在電子C
19、AD技術(shù)基礎(chǔ)上發(fā)展起來的計(jì)算機(jī)軟件系統(tǒng),是指以計(jì)算機(jī)為工作平臺(tái),融合了應(yīng)用電子技術(shù)、計(jì)算機(jī)技術(shù)、信息處理及智能化技術(shù)的最新成果,進(jìn)行電子產(chǎn)品的自動(dòng)設(shè)計(jì)。利用EDA工具,電子設(shè)計(jì)師可以從概念、算法、協(xié)議等開始設(shè)計(jì)電子系統(tǒng),大量工作可以通過計(jì)算機(jī)完成,并可以將電子產(chǎn)品從電路設(shè)計(jì)、性能分析到設(shè)計(jì)出IC版圖或PCB版圖的整個(gè)過程在計(jì)算機(jī)上自動(dòng)處理完成?,F(xiàn)在對(duì)EDA的概念或范疇用得很寬。包括在機(jī)械、電子、通信、航空航天、化工、礦產(chǎn)、生物、醫(yī)學(xué)、軍
20、事等各個(gè)領(lǐng)域,都有EDA的應(yīng)用。目前EDA 技術(shù)已在各大公司、企事業(yè)單位和科研教學(xué)部門廣泛使用。例如在飛機(jī)制造過程中,從設(shè)計(jì)、性能測試及特性分析直到飛行模擬,都可能涉及到EDA技術(shù)。本文所指的EDA技術(shù),主要針對(duì)電子電路設(shè)計(jì)、PCB設(shè)計(jì)和IC設(shè)計(jì)。EDA 設(shè)計(jì)可分為系統(tǒng)級(jí)、電路級(jí)和物理實(shí)現(xiàn)級(jí)。</p><p> VHDL 的英文全名是 Very-High-Speed Integrated Circuit Har
21、dwareDescription Language,VHDL主要用于描述數(shù)字系統(tǒng)的結(jié)構(gòu),行為,功能和接口。除了含有許多具有硬件特征的語句外,VHDL的語言形式和描述風(fēng)格與句法是十分類似于一般的計(jì)算機(jī)高級(jí)語言。VHDL的程序結(jié)構(gòu)特點(diǎn)是將一項(xiàng)工程設(shè)計(jì),或稱設(shè)計(jì)實(shí)體(可以是一個(gè)元件,一個(gè)電路模塊或一個(gè)系統(tǒng))分成外部(或稱可視部分,及端口)和內(nèi)部(或稱不可視部分),既涉及實(shí)體的內(nèi)部功能和算法完成部分。在對(duì)一個(gè)設(shè)計(jì)實(shí)體定義了外部界面后,一旦其內(nèi)部
22、開發(fā)完成后,其他的設(shè)計(jì)就可以直接調(diào)用這個(gè)實(shí)體。這種將設(shè)計(jì)實(shí)體分成內(nèi)外部分的概念是VHDL系統(tǒng)設(shè)計(jì)的基本點(diǎn)。</p><p> 2.2VHDL語言的特點(diǎn)</p><p> VHDL 語言能夠成為標(biāo)準(zhǔn)化的硬件描述語言并獲得廣泛應(yīng)用,它自身必然具有很多其他硬件描述語言所不具備的優(yōu)點(diǎn)。歸納起來,VHDL 語言主要具有以下優(yōu)點(diǎn):</p><p> ?。?) VHDL 語言
23、功能強(qiáng)大,設(shè)計(jì)方式多樣</p><p> VHDL 語言具有強(qiáng)大的語言結(jié)構(gòu),只需采用簡單明確的VHDL語言程序就可以描述十分復(fù)雜的硬件電路。同時(shí),它還具有多層次的電路設(shè)計(jì)描述功能。此外,VHDL 語言能夠同時(shí)支持同步電路、異步電路和隨機(jī)電路的設(shè)計(jì)實(shí)現(xiàn),這是其他硬件描述語言所不能比擬的。VHDL 語言設(shè)計(jì)方法靈活多樣,既支持自頂向下的設(shè)計(jì)方式,也支持自底向上的設(shè)計(jì)方法;既支持模塊化設(shè)計(jì)方法,也支持層次化設(shè)計(jì)方法。
24、</p><p> ?。?) VHDL 語言具有強(qiáng)大的硬件描述能力</p><p> VHDL 語言具有多層次的電路設(shè)計(jì)描述功能,既可描述系統(tǒng)級(jí)電路,也可以描述門級(jí)電路;描述方式既可以采用行為描述、寄存器傳輸描述或者結(jié)構(gòu)描述,也可以采用三者的混合描述方式。同時(shí),VHDL 語言也支持慣性延遲和傳輸延遲,這樣可以準(zhǔn)確地建立硬件電路的模型。VHDL 語言的強(qiáng)大描述能力還體現(xiàn)在它具有豐富的數(shù)據(jù)類
25、型。VHDL 語言既支持標(biāo)準(zhǔn)定義的數(shù)據(jù)類型,也支持用戶定義的數(shù)據(jù)類型,這樣便會(huì)給硬件描述帶來較大的自由度。</p><p> (3) VHDL 語言具有很強(qiáng)的移植能力</p><p> VHDL 語言很強(qiáng)的移植能力主要體現(xiàn)在:對(duì)于同一個(gè)硬件電路的 VHDL 語言描述,它可以從一個(gè)模擬器移植到另一個(gè)模擬器上、從一個(gè)綜合器移植到另一個(gè)綜合器上或者從一個(gè)工作平臺(tái)移植到另一個(gè)工作平臺(tái)上去執(zhí)行。
26、</p><p> ?。?) VHDL 語言的設(shè)計(jì)描述與器件無關(guān)</p><p> 采用 VHDL 語言描述硬件電路時(shí),設(shè)計(jì)人員并不需要首先考慮選擇進(jìn)行設(shè)計(jì)的器件。這樣做的好處是可以使設(shè)計(jì)人員集中精力進(jìn)行電路設(shè)計(jì)的優(yōu)化,而不需要考慮其他的問題。當(dāng)硬件電路的設(shè)計(jì)描述完成以后,VHDL 語言允許采用多種不同的器件結(jié)構(gòu)來實(shí)現(xiàn)。</p><p> ?。?) VHDL 語言
27、程序易于共享和復(fù)用</p><p> VHDL 語言采用基于庫 ( library) 的設(shè)計(jì)方法。在設(shè)計(jì)過程中,設(shè)計(jì)人員可以建立各種可再次利用的模塊,一個(gè)大規(guī)模的硬件電路的設(shè)計(jì)不可能從門級(jí)電路開始一步步地進(jìn)行設(shè)計(jì),而是一些模塊的累加。這些模塊可以預(yù)先設(shè)計(jì)或者使用以前設(shè)計(jì)中的存檔模塊,將這些模塊存放在庫中,就可以在以后的設(shè)計(jì)中進(jìn)行復(fù)用。</p><p> 由于 VHDL 語言是一種描述、
28、模擬、綜合、優(yōu)化和布線的標(biāo)準(zhǔn)硬件描述語言,因此它可以使設(shè)計(jì)成果在設(shè)計(jì)人員之間方便地進(jìn)行交流和共享,從而減小硬件電路設(shè)計(jì)的工作量,縮短開發(fā)周期。</p><p> 3、基于VHDL的自動(dòng)售貨機(jī)的設(shè)計(jì)</p><p><b> 3.1總體設(shè)計(jì)</b></p><p><b> 1 原理圖:</b></p>
29、<p><b> 2 設(shè)計(jì)思想:</b></p><p> [1]本次設(shè)計(jì)題目要求為:</p><p> 可以對(duì)4種商品進(jìn)行售貨,價(jià)格分別為0.5元,1.0元,1.5元,2.0元;</p><p> 售貨機(jī)可以接受1元,5角硬幣;</p><p> 根據(jù)入的硬幣出貨和找零;</p>&l
30、t;p> 需顯示狀態(tài),以及金額</p><p> 可通過撥碼開關(guān)或按鍵代表金額輸入;</p><p> [2]根據(jù)題目要求可以將設(shè)計(jì)過程大概分為商品的選擇,投幣以及數(shù)碼管顯示三塊。商品選擇利用撥碼開關(guān)實(shí)現(xiàn),在選定商品的時(shí)候,代表對(duì)應(yīng)商品的提示燈亮起,且選擇的商品可以多余一樣而少于四樣;投幣可以設(shè)計(jì)兩個(gè)模塊,第一個(gè)是利用撥碼開關(guān)實(shí)現(xiàn),另外一種則可以利用鍵盤實(shí)現(xiàn);數(shù)碼管顯示要求可以
31、同時(shí)、依次顯示選擇物品的總價(jià)格、所投錢數(shù)以及應(yīng)找零數(shù);是內(nèi)容直觀可靠。</p><p><b> 3.2設(shè)計(jì)過程:</b></p><p> 3.2.1枚舉法設(shè)計(jì):</p><p> 本次要求的自動(dòng)售貨機(jī)所售物品的種類并不多,數(shù)值也并不大,數(shù)碼管的位數(shù)夠多,而所用的芯片引腳也夠多,所以設(shè)計(jì)者最先萌生出的念頭就是利用枚舉法將運(yùn)算提前做好,整
32、個(gè)程序只需負(fù)責(zé)數(shù)碼顯示,且運(yùn)用大規(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> 上述程序并未成功,編譯時(shí)出現(xiàn)了“邏輯門超出了該芯片的范圍”,故難以實(shí)現(xiàn)設(shè)計(jì)功能。由此可見枚舉法并不可取,畢竟將所有的邏輯門都用在數(shù)碼管現(xiàn)實(shí)上并不
61、是一個(gè)明智的選擇,而這無疑是將簡單的問題復(fù)雜化了。所以應(yīng)當(dāng)將數(shù)碼管顯示程序進(jìn)行修正。</p><p><b> 3.2.2掃描法:</b></p><p> 鑒于上述方案,修改數(shù)碼管顯示模塊應(yīng)該講所需要的內(nèi)容,如商品實(shí)際價(jià)格的元、角,投入錢數(shù)的元、角及所需找的零錢的元、角均賦給一個(gè)值,讓此值通過數(shù)碼管的位選按位顯示,則可以省去枚舉法顯示的邏輯門數(shù)。</p&g
62、t;<p><b> 修改后的顯示程序:</b></p><p> process (clk)----掃描位選信號(hào)</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è)計(jì)初稿:</p><p><b> 1,商品選擇:</b></p><p> 本設(shè)計(jì)運(yùn)用撥碼開關(guān)對(duì)商品進(jìn)行選擇,且選擇的商品的樣數(shù)不限。在選擇同時(shí),對(duì)應(yīng)的提示燈點(diǎn)亮,表示選擇成功。程序中的shift是對(duì)撥碼開關(guān)的控制,shift(3downto0)是分別對(duì)四件商品(
76、價(jià)格分別為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表示一元,這兩個(gè)數(shù)字按一下則表示投入相應(yīng)的錢數(shù),同時(shí)做出計(jì)算應(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ù)比利用鍵盤實(shí)現(xiàn)起來要方便得多,首先,撥碼開關(guān)投幣的確定性及穩(wěn)定性遠(yuǎn)遠(yuǎn)大于鍵盤實(shí)現(xiàn),因?yàn)殒I盤實(shí)現(xiàn)的時(shí)候很可能出現(xiàn)竄鍵或者由于去抖不到位而引起的顯示數(shù)與按鍵數(shù)不相符合的情況;但是撥碼開關(guān)也存在一定的問題,比如同掃描鍵盤相比,軟件復(fù)位進(jìn)行的并不徹底,必須手動(dòng)將開關(guān)復(fù)位才能達(dá)到預(yù)期效果;</p
107、><p> shift1(3downto0)表示了四個(gè)撥碼開關(guān),它們分別代表了0.5元,1元,2元和2元,任意組合之后就可以表示投入的錢數(shù),在投入錢數(shù)大于所選商品總價(jià)值之后,便會(huì)自動(dòng)計(jì)算出應(yīng)該找回的余額,實(shí)現(xiàn)自動(dòng)找零的功能:</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分別表示蜂鳴器和顯示燈,這兩個(gè)輸出顯示設(shè)備都是為了標(biāo)識(shí)交易是否成功的。在未進(jìn)行交易或者是交易不成功,即投幣總數(shù)小于應(yīng)投幣數(shù)的時(shí)候,顯示燈亮;而當(dāng)投幣數(shù)大于商品售價(jià),即交易成功的時(shí)候,蜂鳴器便被寫‘1’,持續(xù)發(fā)出響聲,知道復(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è)計(jì)的一個(gè)難題,因?yàn)橐瑫r(shí)顯示六位數(shù)字且不可以出現(xiàn)位數(shù)上的顛倒。由于開始嘗試的枚舉法的靜態(tài)顯示出現(xiàn)了邏輯門超出的錯(cuò)誤,所以只能選擇按位顯示,并將頻率提高到人眼難以察覺。
134、將商品總價(jià)格的元角by,bj;投入錢數(shù)的yuan,Jiao;以及算出的應(yīng)該找的零錢數(shù)目rey,rej,都復(fù)制給一個(gè)中間變量A_dis,再根據(jù)脈沖count自加,從”000”到“111”進(jìn)行位選,按位顯示上述的值,再通過數(shù)碼管a到f的七位段選,最終可以在數(shù)碼管上清晰地呈現(xiàn)出價(jià)格,投幣和找零:</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等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 基于vhdl的自動(dòng)售貨機(jī)設(shè)計(jì)
- 基于vhdl自動(dòng)售貨機(jī)設(shè)計(jì)與實(shí)現(xiàn)
- 自動(dòng)售貨機(jī)設(shè)計(jì)
- 自動(dòng)售貨機(jī)設(shè)計(jì)
- 自動(dòng)售貨機(jī)的vhdl實(shí)現(xiàn)
- 基于plc自動(dòng)售貨機(jī)設(shè)計(jì)
- 基于plc的自動(dòng)售貨機(jī)設(shè)計(jì)
- 基于vhdl的自動(dòng)售貨機(jī)控制電路設(shè)計(jì)
- eda自動(dòng)售貨機(jī)設(shè)計(jì)
- 基于plc的自動(dòng)售貨機(jī)設(shè)計(jì)
- 基于fpga的自動(dòng)售貨機(jī)設(shè)計(jì)
- 基于plc的自動(dòng)售貨機(jī)設(shè)計(jì)
- 基于plc的自動(dòng)售貨機(jī)設(shè)計(jì)
- 基于labview的飲料自動(dòng)售貨機(jī)設(shè)計(jì)
- 基于labview的飲料自動(dòng)售貨機(jī)設(shè)計(jì)
- 基于plc控制的自動(dòng)售貨機(jī)設(shè)計(jì)
- 基于labview的飲料自動(dòng)售貨機(jī)設(shè)計(jì)
- 基于plc投幣飲料自動(dòng)售貨機(jī)設(shè)計(jì)
- plc控制的自動(dòng)售貨機(jī)設(shè)計(jì)
- 基于plc的自動(dòng)售貨機(jī)設(shè)計(jì)畢業(yè)設(shè)計(jì)
評(píng)論
0/150
提交評(píng)論