北郵數(shù)電實驗下 簡易自動售貨機 實驗報告_第1頁
北郵數(shù)電實驗下 簡易自動售貨機 實驗報告_第2頁
北郵數(shù)電實驗下 簡易自動售貨機 實驗報告_第3頁
北郵數(shù)電實驗下 簡易自動售貨機 實驗報告_第4頁
北郵數(shù)電實驗下 簡易自動售貨機 實驗報告_第5頁
已閱讀5頁,還剩15頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、20132014第一學期數(shù)字電路與邏輯設(shè)計實驗報告一 設(shè)計課題及任務(wù)要求1.設(shè)計課題:簡易自動售貨機2.任務(wù)要求:設(shè)計一個簡易的自動售貨機,能夠完成錢數(shù)處理、找零、顯示、退幣等功能?;疽? ·用 2 個數(shù)碼管(disp5,disp4)顯示錢數(shù),以元為單位。用 3 個按鍵(btn0,btn1,btn2)分別表示一元、五元、十元,每按一次按鍵,增加一次相應(yīng)的錢數(shù),上限 99元。·再用 3 個按鍵(btn3,btn4,btn5)分別對應(yīng) 3 種商品,其中,商品甲售價 3 元、商品乙售價 8 元、商品丙售價 12 元; · 買東西時,先輸入錢幣,再按對應(yīng)的商

2、品鍵。每按一次商品鍵,錢數(shù)要相應(yīng)地減少, 同時蜂鳴器提示購買成功。剩余錢數(shù)大于 3 元可繼續(xù)按商品鍵再次購買;當剩余錢數(shù)少于 3 元時,表示錢數(shù)的數(shù)碼管 disp5,disp4 顯示為零, 同時用數(shù)碼管 disp0 顯示退出的錢數(shù)。 ·買東西時,按下商品鍵,若輸入的錢數(shù)少于商品的價格,表示錢數(shù)的數(shù)碼管 disp5, disp4 顯示為零,同時用數(shù)碼管(disp1、disp0)顯示退出的錢數(shù),并用蜂鳴器表示購買失敗。· 按下商品鍵時,用數(shù)碼管 disp2 表示當前購買的商品,1 代表商品甲,2 代表商品乙,3 代表商品丙。· 用 btn7 做為退出功能鍵,退出鍵可以

3、隨時按下,按下后,數(shù)碼管(disp5,disp4)顯示為零,同時數(shù)碼管(disp1、disp0)顯示退出的錢數(shù),表示結(jié)束購買,錢款全部退出。提高要求:·用點陣設(shè)計顯示投幣動畫、出貨動畫,購買成功/失敗動畫;· 允許隨時輸入錢幣,購買時,錢款不足有聲光報警并等待追加錢幣或選擇別的商品; 二 系統(tǒng)設(shè)計1. 設(shè)計思路根據(jù)程序?qū)崿F(xiàn)的功能,可將其分為分頻、防抖、邏輯運算、數(shù)碼管顯示、點陣圖形顯示五大模塊。將其串聯(lián)起來即可完成整體功能。其中,分頻模塊將芯片50M的時鐘信號分為各模塊所需的不同頻率的時鐘。防抖模塊用增加按鍵延時以避免長按按鍵執(zhí)行多次指令的情況,邏輯運算模塊對余額進行加減計

4、算實現(xiàn)要求中加錢、買東西等功能。數(shù)碼管顯示模塊把運算模塊的結(jié)果通過數(shù)碼管進行顯示。在購買失敗時,使能點陣圖形顯示模塊及蜂鳴器,令點陣顯示“X”來提示錯誤,同時蜂鳴器響。2. 程序框圖開始結(jié)束余額清零余額增加相應(yīng)錢數(shù)多余錢退出余額顯示99顯示退出錢數(shù)余額減少相應(yīng)錢數(shù)是是否否BTN7BTN(35)BTN(02)判斷按鍵點陣顯示X蜂鳴器響判斷余額是否足夠判斷余額是否>993. 分塊設(shè)計以下五個模塊通過敏感信號串聯(lián),實現(xiàn)完整功能。·分頻模塊: 分頻器的原理是對輸入的時鐘信號脈沖進行計數(shù),(占空比為50%時),在計數(shù)達到模值一半時,輸出信號翻轉(zhuǎn),從而完成輸出頻率比輸入信號低的脈沖,即分頻

5、。在本實驗中,防抖模塊需要用到200Hz時鐘,數(shù)碼管需要50KHz時鐘,點陣需要2.5MHz時鐘。通過設(shè)置時鐘翻轉(zhuǎn)時temp的值來改變分頻比N。N=2*(temp+1)·防抖模塊: 在程序執(zhí)行過程中會持續(xù)掃描按鍵輸入,當按鍵持續(xù)按下時則會進行多次信號輸入,但實際情況只按下按鍵一次。為避免此問題,需要使按鍵信號輸入到之后程序前通過防抖模塊,即用一個模20計數(shù)器計數(shù)時鐘周期,在一個周期內(nèi)只輸出一個有效電平。·邏輯運算模塊: 此模塊是算法的核心模塊。以200Hz時鐘和七個按鍵作為輸入,設(shè)置變量sum和money0、money1(余額的各位和十位)。當檢測到btn0btn2之一按下

6、時,根據(jù)對應(yīng)按鍵判斷sum,若大于等于99、95、90,則余額顯示99,若小于該數(shù),sum加上1、5、10元(99元封頂)。同理,btn3btn5之一按下時,判斷sum,若大于等于3,扣除相應(yīng)錢數(shù),若小于3,退出錢數(shù)sum賦值給disp0。同時,購買商品種類1、2、3賦值給disp2。當btn7按下時,disp1和disp0顯示sum,同時disp2、disp4和disp5清零。其中,數(shù)碼管的賦值用sum做除法及取余后得到的money1和money0實現(xiàn)。·數(shù)碼管顯示模塊: 首先使用分頻系數(shù)為1000的分頻器產(chǎn)生50KHz的時鐘。用模5計數(shù)器產(chǎn)生5個計數(shù)狀態(tài),決定數(shù)碼管接通的電路和二

7、極管點亮的數(shù)字,在時鐘頻率很高時可以同時顯示5個數(shù)字。將邏輯運算模塊中賦值過的disp0、disp1、disp2、disp4和disp5賦值給DOUT7,數(shù)碼管選通信號賦值給CatL。·點陣圖形顯示模塊: 首先使用分頻系數(shù)為20的分頻器產(chǎn)生2.5MHz的時鐘。r為模8計數(shù)器,產(chǎn)生8個計數(shù)狀態(tài),決定點陣選通的行和該行中點亮的點(行低電平選通,列高電平選通)。當掃描頻率達到一定大小時,8x8點陣會同時點亮。三 仿真波形及波形分析由于整個程序功能較復雜,故進行分塊仿真。1. 分頻模塊仿真由于50M時鐘頻率太高,在仿真時對輸入時鐘頻率和分頻系數(shù)做了修改。(f=500KHz,分頻系數(shù)N=10)

8、。仿真圖如下,實現(xiàn)了分頻。2. 防抖模塊仿真在仿真時,需將end time設(shè)置長一些,才能看到防抖的結(jié)果。仿真圖如下,延時為100ms。持續(xù)按下btn1,僅輸出一個有效脈沖。3. 邏輯運算模塊仿真可以看到當按下不同按鍵,sum的值會相應(yīng)按鍵功能進行加減。例如,按下btn0時,sum為1,再次按下btn0,sum累加為2。4. 數(shù)碼管顯示模塊仿真輸出為0、1、2、4、5。掃描頻率高時,五個數(shù)碼管循環(huán)一起顯示數(shù)字。5. 點陣圖形顯示模塊仿真點陣模塊仿真類似數(shù)碼管仿真情況。掃描頻率高時,八行點陣循環(huán)一起顯示。四 源程序LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;

9、use ieee.std_logic_unsigned.all;ENTITY sIS PORT(bn0,bn1,bn2,bn3,bn4,bn5,bn7:IN STD_LOGIC; -按鍵輸入信號clk,reset:IN STD_LOGIC; -50M時鐘輸入信號DOUT7: OUT STD_LOGIC_VECTOR(6 DOWNTO 0); -數(shù)碼管七段選通信號CatL: OUT STD_LOGIC_VECTOR(5 DOWNTO 0); -數(shù)碼管選通信號col,row:OUT STD_LOGIC_VECTOR(7 DOWNTO 0); -點陣行列選通信號beep:out STD_LOGIC

10、-蜂鳴器輸出信號 ); END s;ARCHITECTURE behave OF s ISSIGNAL disp0,disp1,disp2,disp4,disp5:STD_LOGIC_VECTOR(6 DOWNTO 0); -數(shù)碼管選通信號SIGNAL btn0,btn1,btn2,btn3,btn4,btn5,btn7,enable:STD_LOGIC:='0' -通過防抖模塊后各按鍵SIGNAL clk_50k,clk_200,clk_2500k:STD_LOGIC; -50MHz、200Hz、2.5MHz時鐘信號SIGNAL Q:STD_LOGIC_VECTOR(3 do

11、wnto 0); -數(shù)碼管顯示模塊模5計數(shù)器SIGNAL temp1:INTEGER RANGE 0 TO 499; -時鐘計數(shù)器SIGNAL temp2:INTEGER RANGE 0 TO 9; -時鐘計數(shù)器SIGNAL temp:INTEGER RANGE 0 TO 124999; -時鐘計數(shù)器signal r:STD_LOGIC_VECTOR(7 DOWNTO 0); -點陣中間變量SIGNAL count_BTN0:INTEGER RANGE 0 TO 20; -防抖計數(shù)器SIGNAL count_BTN1:INTEGER RANGE 0 TO 20; -防抖計數(shù)器SIGNAL co

12、unt_BTN2:INTEGER RANGE 0 TO 20; -防抖計數(shù)器SIGNAL count_BTN3:INTEGER RANGE 0 TO 20; -防抖計數(shù)器SIGNAL count_BTN4:INTEGER RANGE 0 TO 20; -防抖計數(shù)器SIGNAL count_BTN5:INTEGER RANGE 0 TO 20; -防抖計數(shù)器SIGNAL count_BTN7:INTEGER RANGE 0 TO 20; -防抖計數(shù)器BEGINp1:PROCESS(clk,reset) -200Hz分頻BEGINIF reset='0' THENtemp<=

13、0;ELSIF clk'event AND clk='1' THENIF temp=124999 THEN -分頻系數(shù)(124999+1)*2=250000temp<=0;clk_200<=NOT clk_200;ELSEtemp<=temp+1;END IF;END IF;END PROCESS p1;p2:PROCESS(clk_200,bn0) -btn0防抖(5ms*20=100ms)BEGINIF(clk_200'event AND clk_200 = '1') THENIF(bn0 = '1') TH

14、ENIF count_BTN0 = 20 THENcount_BTN0 <= count_BTN0;ELSEcount_BTN0 <= count_BTN0+ 1;END IF;IF count_BTN0= 19 THEN btn0<= '1'ELSEbtn0<= '0'END IF;ELSEcount_BTN0<= 0;END IF;ELSEEND IF;END PROCESS p2;p3:PROCESS(clk_200,bn1) -btn1防抖(5ms*20=100ms)BEGINIF(clk_200'event AND

15、 clk_200 = '1') THENIF(bn1= '1') THENIF count_BTN1 = 20 THENcount_BTN1 <= count_BTN1;ELSEcount_BTN1 <= count_BTN1+ 1;END IF;IF count_BTN1= 19 THEN btn1<= '1'ELSEbtn1<= '0'END IF;ELSEcount_BTN1<= 0;END IF;ELSEEND IF;END PROCESS p3;p4:PROCESS(clk_200,bn2)

16、 -btn2防抖(5ms*20=100ms)BEGINIF(clk_200'event AND clk_200 = '1') THENIF(bn2= '1') THENIF count_BTN2= 20 THENcount_BTN2 <= count_BTN2;ELSEcount_BTN2 <= count_BTN2 + 1;END IF;IF count_BTN2= 19 THEN btn2<= '1'ELSEbtn2<= '0'END IF;ELSEcount_BTN2<= 0;END I

17、F;ELSEEND IF;END PROCESS p4;p5:PROCESS(clk_200,bn3) -btn3防抖(5ms*20=100ms)BEGINIF(clk_200'event AND clk_200 = '1') THENIF(bn3 = '1') THENIF count_BTN3= 20 THENcount_BTN3 <= count_BTN3;ELSEcount_BTN3 <= count_BTN3 + 1;END IF;IF count_BTN3= 19 THEN btn3<= '1'ELSEbtn

18、3<= '0'END IF;ELSEcount_BTN3<= 0;END IF;ELSEEND IF;END PROCESS p5;p6:PROCESS(clk_200,bn4) -btn4防抖(5ms*20=100ms)BEGINIF(clk_200'event AND clk_200 = '1') THENIF(bn4 = '1') THENIF count_BTN4 = 20 THENcount_BTN4 <= count_BTN4;ELSEcount_BTN4 <= count_BTN4 + 1;END I

19、F;IF count_BTN4= 19 THEN btn4<= '1'ELSEbtn4<= '0'END IF;ELSEcount_BTN4<= 0;END IF;ELSEEND IF;END PROCESS p6;p7:PROCESS(clk_200,bn5) -btn5防抖(5ms*20=100ms)BEGINIF(clk_200'event AND clk_200 = '1') THENIF(bn5 = '1') THENIF count_BTN5 = 20 THENcount_BTN5 <=

20、 count_BTN5;ELSEcount_BTN5 <= count_BTN5 + 1;END IF;IF count_BTN5= 19 THEN btn5<= '1'ELSEbtn5<= '0'END IF;ELSEcount_BTN5<= 0;END IF;ELSEEND IF;END PROCESS p7;p8:PROCESS(clk_200,bn7) -btn7防抖(5ms*20=100ms)BEGINIF(clk_200'event AND clk_200 = '1') THENIF(bn7 = 

21、9;1') THENIF count_BTN7 = 20 THENcount_BTN7 <= count_BTN7;ELSEcount_BTN7<= count_BTN7 + 1;END IF;IF count_BTN7= 19 THEN btn7<= '1'ELSEbtn7<= '0'END IF;ELSEcount_BTN7<= 0;END IF;ELSEEND IF;END PROCESS p8;P9:process(clk_200,btn0,btn1,btn2,btn3,btn4,btn5,btn7) -邏輯運算模塊

22、variable money0,money1:INTEGER RANGE 0 TO 9;variable sum:INTEGER RANGE 0 TO 99; BEGINIF(clk_200'event AND clk_200 = '1') THEN IF btn0='1' THEN -btn0按下,判斷滿額情況,加錢1元 enable<='0' if sum>=99 then -滿額,sum=99 sum:=99; else sum:=sum+1; end if; ELSIF btn1='1'THEN -bt

23、n1按下,判斷滿額情況,加錢5元 enable<='0' if sum>=95 then -滿額,sum=99 sum:=99; else sum:=sum+5; end if ELSIF btn2='1'THEN -btn2按下,判斷滿額情況,加錢10元 enable<='0' if sum>=90 then -滿額,sum=99 sum:=99; else sum:=sum+10; end if; ELSIF btn3='1'THEN -btn3按下,判斷足額情況,減錢3元,disp2顯示1 IF su

24、m>=3 then disp2<="0110000" sum:=sum-3; IF sum<3 THEN CASE sum IS -不足額,disp1清零,disp0顯示退出錢數(shù) WHEN 0=>disp0<="1111110" WHEN 1=>disp0<="0110000" WHEN 2=>disp0<="1101101" WHEN OTHERS=>disp0<="0000000" END CASE; sum:=0; disp

25、1<="1111110" ELSE NULL; END IF; ELSE enable<='1' END IF; ELSIF btn4='1'THEN -btn4按下,判斷足額情況,減錢8元,disp2顯示2 IF sum>=8 then disp2<="1101101" sum:=sum-8; IF sum<3 THEN CASE sum IS -不足額,disp1清零,disp0顯示退出錢數(shù) WHEN 0=>disp0<="1111110" WHEN 1=&

26、gt;disp0<="0110000" WHEN 2=>disp0<="1101101" WHEN OTHERS=>disp0<="0000000" END CASE; sum:=0; disp1<="1111110" ELSE NULL; END IF; ELSE enable<='1' END IF; ELSIF btn5='1'THEN -btn5按下,判斷足額情況,減錢12元,disp2顯示3 IF sum>=12 then s

27、um:=sum-12; disp2<="1111001" IF sum<3 THEN CASE sum IS -不足額,disp1清零,disp0顯示退出錢數(shù) WHEN 0=>disp0<="1111110" WHEN 1=>disp0<="0110000" WHEN 2=>disp0<="1101101" WHEN OTHERS=>disp0<="0000000" END CASE; sum:=0; disp1<="1

28、111110" ELSE NULL; END IF; ELSE enable<='1' END IF; ELSIF btn7='1'THEN -btn7按下,disp0和disp1顯示退出錢數(shù),其余清零 CASE money1 IS -money1賦值給disp1,作為十位數(shù)字 WHEN 0=>disp1<="1111110" WHEN 1=>disp1<="0110000" WHEN 2=>disp1<="1101101" WHEN 3=>di

29、sp1<="1111001" WHEN 4=>disp1<="0110011" WHEN 5=>disp1<="1011011" WHEN 6=>disp1<="1011111" WHEN 7=>disp1<="1110000" WHEN 8=>disp1<="1111111" WHEN 9=>disp1<="1111011" WHEN OTHERS=>disp1<=

30、"0000000" END CASE; CASE money0 IS -money0賦值給disp0,作為個位數(shù)字 WHEN 0=>disp0<="1111110" WHEN 1=>disp0<="0110000" WHEN 2=>disp0<="1101101" WHEN 3=>disp0<="1111001" WHEN 4=>disp0<="0110011" WHEN 5=>disp0<="

31、1011011" WHEN 6=>disp0<="1011111" WHEN 7=>disp0<="1110000" WHEN 8=>disp0<="1111111" WHEN 9=>disp0<="1111011" WHEN OTHERS=>disp0<="0000000" END CASE; sum:=0; disp2<="1111110" enable<='0' ELSE

32、null; END IF; money1:=sum/10; -money1為整型sum除以10的結(jié)果 money0:=sum rem 10; -money0為整型sum除以10的余數(shù) CASE money1 IS - -money1賦值給disp5顯示 WHEN 0=>disp5<="1111110" WHEN 1=>disp5<="0110000" WHEN 2=>disp5<="1101101" WHEN 3=>disp5<="1111001" WHEN 4=&g

33、t;disp5<="0110011" WHEN 5=>disp5<="1011011" WHEN 6=>disp5<="1011111" WHEN 7=>disp5<="1110000" WHEN 8=>disp5<="1111111" WHEN 9=>disp5<="1111011" WHEN OTHERS=>disp5<="0000000" END CASE; CASE mo

34、ney0 IS -money0賦值給disp4顯示 WHEN 0=>disp4<="1111110" WHEN 1=>disp4<="0110000" WHEN 2=>disp4<="1101101" WHEN 3=>disp4<="1111001" WHEN 4=>disp4<="0110011" WHEN 5=>disp4<="1011011" WHEN 6=>disp4<="1

35、011111" WHEN 7=>disp4<="1110000" WHEN 8=>disp4<="1111111" WHEN 9=>disp4<="1111011" WHEN OTHERS=>disp4<="0000000" END CASE;ELSE NULL;END IF;END PROCESS p9;p10:PROCESS(clk,reset) -50kHz分頻BEGINIF reset='0' THENtemp1<=0;ELSI

36、F clk'event AND clk='1' THENIF temp1=499 THENtemp1<=0;clk_50k<=NOT clk_50k;ELSEtemp1<=temp1+1;END IF;END IF;END PROCESS p10;p11:PROCESS(clk_50k,reset) -模5計數(shù)器BEGINIF reset='0' THENQ <= "1111"ELSIF(clk_50k'event and clk_50k='1')THENIF Q = "010

37、0" THENQ <= "0000"ELSEQ <= Q+1;END IF;END IF;END PROCESS p11;p12:PROCESS(Q) -數(shù)碼管顯示BEGINCASE Q ISWHEN "0000"=>DOUT7<=disp0;CatL<="111110" WHEN "0001"=>DOUT7<=disp1;CatL<="111101" WHEN "0010"=>DOUT7<=disp2;C

38、atL<="111011" WHEN "0011"=>DOUT7<=disp4;CatL<="101111" WHEN "0100"=>DOUT7<=disp5;CatL<="011111" WHEN OTHERS=>DOUT7<="1111111"CatL<="111111"END CASE;END PROCESS p12;p13:PROCESS(clk,reset) -2500kHz分頻BEG

39、IN IF clk_50k'event AND clk_50k='1' THENIF temp2=9 THENtemp2<=0;clk_2500k<=NOT clk_2500k;ELSEtemp2<=temp2+1;END IF;END IF;END PROCESS p13;p14: process(enable,clk_2500k) -點陣顯示“X”BEGINif enable='1'thenif(clk_2500k'event and clk_2500k='1')then case r iswhen &quo

40、t;01111111"=> col<="10000001"r<="10111111" -行選通,列選擇點亮的位置when "10111111"=> col<="01000010"r<="11011111"when "11011111"=> col<="00100100"r<="11101111"when "11101111"=> col<=&

41、quot;00011000"r<="11110111"when "11110111"=> col<="00011000"r<="11111011"when "11111011"=> col<="00100100"r<="11111101"when "11111101"=> col<="01000010"r<="11111110"

42、when "11111110"=> col<="10000001"r<="01111111"when others=>col<="11111111"r<="01111111" end case;row<=r; beep<='1'else null;end if;else col<="00000000"beep<='0' -蜂鳴器響end if;end process p14;END behave;五 功能說明及資源利用情況1. 功能說明·swt0為reset鍵,置1開啟,置0關(guān)閉。·btn0btn2為加錢按下,按一下分別給余額(disp4和disp5顯示)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論