【正文】
light=39。039。 else beep=39。039。 light=39。139。 end if。 end if 。end process 。 end behave。4)顯示函數(shù):數(shù)碼管顯示是本設(shè)計(jì)的一個(gè)難題,因?yàn)橐瑫r(shí)顯示六位數(shù)字且不可以出現(xiàn)位數(shù)上的顛倒。由于開始嘗試的枚舉法的靜態(tài)顯示出現(xiàn)了邏輯門超出的錯(cuò)誤,所以只能選擇按位顯示,并將頻率提高到人眼難以察覺。將商品總價(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à)格,投幣和找零: library ieee。use 。use 。use 。entity display is port( clk :in std_logic。 Clock Signal s0,s1,s2 :out std_logic。 a,b,c,d,e,f,g :out std_logic)。 end display。architecture behave of display is signal leds :std_logic_vector (6 downto 0)。 signal A_dis :std_logic_vector (3 downto 0)。 signal dcount :std_logic_vector (2 downto 0)。 signal yuan,jiao,rey,rej :std_logic_vector (3 downto 0)。 signal by,bj :std_logic_vector (3 downto 0)。 begindisplayprocess (clk)掃描位選信號(hào) begin if(clk39。event and clk=39。139。) then dcount=dcount+1。 end if。 end process。 process (clk)位選 begin if(clk39。event and clk=39。139。) then s0=dcount(0)。s0 s1=dcount(1)。 s2=dcount(2)。 case dcount is when 000=A_dis=by。000 when 001=A_dis=bj。001 when 010=A_dis=yuan。010 when 011=A_dis=jiao。011 when 100=A_dis=rey。001 when 101=A_dis=rej。 000 when others = A_dis=0000。 end case。 end if。 end process。 process (A_dis)譯碼模塊 begin case A_dis is when 0000=leds=0111111。0 when 0001=leds=0000110。1 when 0010=leds=1011011。2 when 0011=leds=1001111。3 when 0100=leds=1100110。4 when 0101=leds=1101101。5 when 0110=leds=1111101。6 when 0111=leds=0000111。7 when 1000=leds=1111111。8 when 1001=leds=1101111。9 when others=leds=0000000。 end case。 end process。 process(clk) In this process, a,b,c,d,e,f,g will output begin if(clk39。event and clk=39。139。) then a=leds(0)。 b=leds(1)。 c=leds(2)。 d=leds(3)。 e=leds(4)。 f=leds(5)。 g=leds(6)。 end if。 end process。 end behave。4,心得體會(huì):本次設(shè)計(jì)對(duì)于我這個(gè)VHDL語(yǔ)言的初學(xué)者來說,可謂收獲良多。首先,零基礎(chǔ)到程序的實(shí)現(xiàn),期間反復(fù)嘗試,多次研究,讓我知道了VHDL語(yǔ)言編寫程序的基本架構(gòu),編寫思路,語(yǔ)言實(shí)現(xiàn)形式以及諸多的注意要點(diǎn)。其次,了解到所有的語(yǔ)言都是有其相同之處的,特別是在程序的構(gòu)建及編寫過程上尤為突出——同c語(yǔ)言一樣,程序的實(shí)現(xiàn)應(yīng)按部就班,程序應(yīng)進(jìn)行模塊化,編寫切忌“一步登天”,而應(yīng)循序漸進(jìn),踏踏實(shí)實(shí)按照模塊由淺及深地進(jìn)行。最后,在討論的氛圍中學(xué)習(xí)往往可以在不自覺中收獲頗多。比如本次設(shè)計(jì)的撥碼開關(guān)實(shí)現(xiàn)投幣環(huán)節(jié),就是在眾人的一語(yǔ)之中被點(diǎn)破。原本,掃描鍵盤的反復(fù)嘗試,始終不能達(dá)到預(yù)期的效果,不時(shí)出現(xiàn)了按鍵不穩(wěn)定的效果,就是數(shù)碼管的位選混亂,糾結(jié)一天始終未能找到原因。但在同學(xué)的一句“可以嘗試?yán)脫艽a開關(guān)實(shí)現(xiàn)”的話語(yǔ)中驚醒,很快便實(shí)現(xiàn)了投幣模塊。而借助著撥碼開關(guān)的經(jīng)驗(yàn),加上反復(fù)試驗(yàn)與嘗試之后,很快,掃描鍵盤實(shí)現(xiàn)投幣的問題也引刃而解了。當(dāng)然,本次試驗(yàn)依舊是存在問題的。比如:1)上述中多次提及的按鍵去抖問題,雖然有延時(shí),但是也許是由于延時(shí)并不夠長(zhǎng)的原因,鍵盤投幣的結(jié)果并不那么明顯;2)試驗(yàn)中增加設(shè)計(jì)——試驗(yàn)成功蜂鳴器響,提示燈滅;而購(gòu)買成功時(shí)燈滅蜂鳴器響起。一般情況下只要投入的錢數(shù)大于等于商品的實(shí)際價(jià)格,那么便可以稱作是購(gòu)買成功。但是未投入錢的時(shí)候數(shù)碼管顯示的價(jià)格和投入幣數(shù)是相同的,這種情況是個(gè)意外,并不應(yīng)該包含在交易成功的范圍內(nèi),但是設(shè)計(jì)者的設(shè)計(jì)并未完善,出現(xiàn)了這個(gè)事件點(diǎn)上的蜂鳴器響;3)撥碼開關(guān)實(shí)現(xiàn)的投幣與真實(shí)情況相比較仍然有較大的出入。比如說,投幣是一個(gè)反復(fù)進(jìn)行的動(dòng)作,相當(dāng)于給一個(gè)脈沖或者按鍵一次便相當(dāng)于投入了錢數(shù),程序中的錢數(shù)做加法,數(shù)碼管上的顯示自動(dòng)加,而撥碼開關(guān),只能利用不同的開關(guān)代表不同的錢數(shù),且不能反復(fù)進(jìn)行投幣。因?yàn)閾艽a開關(guān)只有兩個(gè)固定的狀態(tài)——撥上去表示‘1’,放下來表示邏輯’0’。且這兩種狀態(tài)不可能反復(fù)的累加出現(xiàn),所以達(dá)不到真正的自動(dòng)售貨機(jī)的實(shí)現(xiàn)方式。4)由于時(shí)間緊迫且實(shí)驗(yàn)條件有限,加上自身是VHDL語(yǔ)言的初學(xué)者,所以有些模塊還未實(shí)現(xiàn)。比如,復(fù)位模塊。這個(gè)模塊的輸出的軟件復(fù)位是沒有問題,基本都可以實(shí)現(xiàn)的;但是實(shí)現(xiàn)確實(shí)還是存在一些難題的:選擇商品和錢數(shù)實(shí)現(xiàn)的第一種方法均為撥碼開關(guān)實(shí)現(xiàn),雖然其狀態(tài)相對(duì)穩(wěn)定,只要是選定了就不存在跳變等問題,但是軟件復(fù)位之后,這些開關(guān)仍然需要手動(dòng)復(fù)位,尚不能達(dá)到真正意義上的自動(dòng)化。參考文獻(xiàn)[1]譚會(huì)生,【M】.西安:西安電子科技大學(xué)出版社, 2004.[2]潘松,(第三版)科學(xué)出版社 2006[3]姜雪松, 2007.[4] 【M】.北京:北京航空航天大學(xué)出版社,2004