《電子技術(shù)應(yīng)用》
您所在的位置:首頁 > 可編程邏輯 > 業(yè)界動態(tài) > 一種新型的電子點(diǎn)菜系統(tǒng)

一種新型的電子點(diǎn)菜系統(tǒng)

2008-08-28
作者:王 飛 張有志

??? 摘 要: 為克服傳統(tǒng)點(diǎn)菜方式的弊端,提出一種新型的電子點(diǎn)菜系統(tǒng)。該系統(tǒng)使用VHDL語言設(shè)計(jì),并用FPGA芯片實(shí)現(xiàn)。它功能齊全、使用方便,如在餐飲業(yè)得以推廣,可大大提高服務(wù)質(zhì)量,并節(jié)省許多人力物力。
??? 關(guān)鍵詞: 電子菜單? VHDL? FPGA

?

??? 在目前的餐館里,客人點(diǎn)菜時總要有服務(wù)員在旁邊等候,不僅要記錄客人所點(diǎn)的菜,還要回答客人提出的各種關(guān)于菜的口味等問題。當(dāng)顧客比較多時,服務(wù)員就會應(yīng)接不暇,不僅耽誤了顧客的時間,還影響了顧客對飯店的印象,并且顧客對已點(diǎn)菜的數(shù)量尤其是價錢往往不能很及時地了解。如果采用電子菜譜,客人點(diǎn)菜的時候,基本不需要服務(wù)員的陪伴,而且能實(shí)時地了解菜的特色,且對已點(diǎn)過的菜的數(shù)量和價錢一目了然,方便了顧客的消費(fèi),同時也減輕了餐館的服務(wù)壓力。
??? 本文提出一種電子點(diǎn)菜裝置,并在ALTERA公司的MAX+PLUSII環(huán)境下利用VHDL語言編程,用FPGA芯片得以實(shí)現(xiàn)。它功能齊全、造價低廉、操作簡便,在餐飲業(yè)具有較好的推廣價值。
1 系統(tǒng)功能
??? 該系統(tǒng)的實(shí)物樣圖如圖1所示。

?


??? 該系統(tǒng)共采用兩組9個LED數(shù)碼管、3組LED燈和3組鍵盤。它的功能比較完善:從顧客的角度來講,當(dāng)顧客按下一個菜名鍵時,面板上方的4組8個表示菜的口味的LED燈會點(diǎn)亮;當(dāng)顧客對菜的口味滿意時,通過按面板上方的“+”、“-”鍵來對選菜進(jìn)行增刪操作。在操作過程中,面板上方的數(shù)碼管實(shí)時顯示菜的總價錢、單個菜的數(shù)量和總數(shù)量,顧客點(diǎn)選過的菜旁的LED燈也會自動點(diǎn)亮,使顧客對自己的點(diǎn)菜情況一目了然。從商家的角度來講,商家可以通過更改按鍵上的菜名的標(biāo)簽更改菜的名字,還可以通過面板后面的" title="面的">面的一組鍵盤(如圖1所示)更改菜的單價和口味。更改菜的單價時需要輸入密碼,并且密碼也可以更改,保證商家對菜的信息進(jìn)行任意的控制。
2 系統(tǒng)設(shè)計(jì)
??? 該系統(tǒng)共分11個模塊,其結(jié)構(gòu)如圖2所示。

?


2.1 鍵盤模塊
??? 鍵盤1是菜名鍵,其功能是:當(dāng)顧客點(diǎn)按鍵盤時,從存儲器的相應(yīng)地址里讀取數(shù)據(jù)。數(shù)據(jù)是28位的,高8位是菜的口味,送到菜的口味顯示模塊" title="顯示模塊">顯示模塊里點(diǎn)亮相應(yīng)的LED燈;低20位是菜的單價,送到加減控制模塊" title="控制模塊">控制模塊里等待進(jìn)行加、減運(yùn)算;同時經(jīng)過鍵盤抖動消除電路" title="消除電路">消除電路輸出按鍵有效信號到控制器,作為產(chǎn)生加減的使能信號。
??? 鍵盤2產(chǎn)生加或減信號,信號經(jīng)抖動消除電路后輸出到BCD加減法器,以確認(rèn)是加運(yùn)算還是減運(yùn)算;同時輸出按鍵確認(rèn)信號到控制器,與鍵盤1的按鍵有效信號共同產(chǎn)生加減使能信號控制BCD加減法器進(jìn)行運(yùn)算。
2.2 控制模塊
??? 控制器接收到兩個鍵盤的按鍵有效信號時,首先判斷這兩個信號的順序,必須是鍵盤1的有效信號先到(只判斷最先的一次,往后不計(jì)順序);然后判斷菜的單個數(shù)量和總數(shù)量有無超出范圍。當(dāng)均符合要求時,輸出加減使能信號到加減控制器,然后加減控制器再輸出加(減)數(shù)、被加(減)數(shù)到BCD加減法器完成加(減)運(yùn)算。同時它還根據(jù)鍵盤1、2輸入的計(jì)數(shù)信號產(chǎn)生菜的數(shù)量和總數(shù)量,輸出到數(shù)碼管顯示模塊進(jìn)行顯示。這一部分的VHDL程序如下:
if (scan_f='1' and scan_f'event) then
if(key_valid='1' ?雪 then ???--如果鍵盤1有鍵按下
??? scan_cnt:=scan_cntout;??--鍵盤索引值
??? tempscan:=conv_integer(scan_cnt);
??? eachnum<=temp(tempscan);?--賦菜的數(shù)
??? totalnum<=temptotalnum;???? --量
??? judge:=true;????????????--確認(rèn)鍵盤1首先有鍵按下
??? end if:
??? if(smkey_valid='1' and judge=true)then?--如果隨后鍵盤2有鍵按下
????? ?if(sel='0') then??? ??--如果是加法
??? iftemp(tempscan)>=99then?? ?--判斷數(shù)量是否超出范圍
??? ?? temp(tempscan):=″1100011″;
??? ?? controladd<='0';???--超出范圍,加減使能信號為0
??????? ??elsif temptotalnum>=99 then
????????????????temptotalnum:=″1100011″;
????????? ??????controladd<='0';
??? elsif (temp(tempscan)<99 and temptotalnum<99) then?--在允許范圍內(nèi)
?????? temp(tempscan):=temp(tempscan)+1;
???? ??temptotalnum:=temptotalnum+1; --數(shù)量加1
??? controladd<='1';
??? eachnum<=temp(tempscan);
??? totalnum<=temptotalnum;
?? ?end if;
?????? elsif(sel='1')then??? ???? --如果是減運(yùn)算?穴同樣的方法
????????? ??·?????? ?????????????? 判斷是否少于1,如果是,不予
????????? ??·????? ??????????????? 進(jìn)行減運(yùn)算,否則數(shù)量減1
????????? ??·?????? ?????????????? 并作相應(yīng)賦值?雪
? ??end if;
??? ? end if;
??? end if;
??? if temp(i)>0 then? ???? ? --判斷對應(yīng)索引值的菜是否被選中
??? tempout(j)<='1';???????? ?--如選中,賦1點(diǎn)亮LED燈
??? elsif temp(i)=0 then? ??? --如未選中,賦0
??? tempout(j)<='0';
??? end if;
2.3 顯示模塊
??? 為減少引線數(shù)量,采用動態(tài)顯示技術(shù),其原理參見參考文獻(xiàn)?眼1?演,在此不再贅述。
2.4 信息(包括菜的口味、價錢)調(diào)整模塊
??? 在實(shí)際應(yīng)用中,店方往往要根據(jù)實(shí)際情況對經(jīng)營的菜的價錢種類進(jìn)行調(diào)整或補(bǔ)充。對菜的種類進(jìn)行更換只需要將按鈕上菜的名字更換即可,但是對菜的價錢和特色進(jìn)行便捷的更改,則需要編程實(shí)現(xiàn)。
??? 在這一部分的設(shè)計(jì)中,首先要設(shè)計(jì)一個電子密碼,防止非授權(quán)人員對菜價進(jìn)行更改,同時這個電子密碼應(yīng)具備更改的功能;然后再通過鍵盤輸入更改菜的價錢。原理是將菜單上的菜從0~63一行一行索引,每一個菜的索引值也就是在存儲器中的地址,而存放密碼的位置是第64位,即“01100100”;最后根據(jù)相應(yīng)的地址賦值即可。這一部分的VHDL程序如下:
??? ·(初始化語句)
?? ?·
?? ?·
??? dressout<=″01100100″;???--從存儲器中讀取密碼
??? savedata<=datain;
??? ·
??? ·
??? ·
??? if(key_valid='1' and judgecheck='0') then?? --準(zhǔn)備校對密碼?
???????? if(judgestate=″000″ and savedata(27 downto 24)=butt_code) then??--確認(rèn)是初狀態(tài)
?????? ???? judgestate:=″001″;???????????? ???--校對成功則進(jìn)入
?????? ???? end if;?????????? ??????????????????--下一個狀態(tài)
????if(judgestate=″001″ and savedata(23 downto 20)=butt_code)then
? ??judgestate:=″010″;
????downto 8)=butt_code)then
? ??·(循環(huán)校對)
????·
? ??·
? ??elsif(judgestate=″110″and savedata(3 downto 0)/=butt_code)then
? ??judgestate:=″000″;
?? ??????end if;
?? if(butt_code=″1011″ and judgestate=″111″) then --校對成功
?????? ??judgecheck:='1';????????????--賦校對成功值
????? ? ?ledout<=″011″;???????????--點(diǎn)亮綠燈
????? ? ?judgestate:=″000″;???????--恢復(fù)初值
???elsif(butt_code=″1011″ and judgestate/=″111″) then?? --如果密碼錯誤
??? ???? judgestate:=″000″;?????????????--恢復(fù)初值
??? ???? ledout<=″110″;?????????????????--點(diǎn)亮紅燈
? ?? ????? end if;
?? elsif(key_valid='1' and judgecheck='1')then? - -密碼輸入正確,執(zhí)行以下功能
? ?if(butt_code=″1001″)then?? --如果想要改變密碼
???? ??? ledout<=″101″;
???reset<='1';
?? j:=0;
?????? ??end if;
?? if(reset='1' and butt_code/=″1001″) then
????????? ???if(staterecode=″00″ and j=0 and butt_code/=″1011″) the???--最初狀態(tài)
?? savedata(27 downto 24)<=butt_code;
?? ????? j:=1;?? --進(jìn)入下一個狀態(tài)循環(huán)(語句省略)
??? ???? end if;
?? if (butt_code=″1011″ and j=7) the? --當(dāng)按下確認(rèn)鍵時
????? ???j:=0;
?? ??? staterecode:=″01″;???? --進(jìn)入第二次輸入確認(rèn)密碼
?? ??? check<=reset;
?? end if;
?? if(staterecode=″01″) then? --確認(rèn)是第二次輸入密碼的狀態(tài)
?? if(k=0 and savedata(27 downto 24)=butt_code) then
??? ? k<=1;??????? --進(jìn)入下一狀態(tài)循環(huán)(語句省略)
???else
??? ? k<=0;
?? end if;
??? ? if (butt_code=″1011″ and k=7)then????--如果二次密碼輸入相同,重置語句(語句省略)
??????? ??dressout<=″01100100″;
??????? ??dataout<=savedata;
???elsif(butt_code=″1011″ and k/=7)then
??? ??k<=0;?????? --如果密碼不相同,重新輸入
??? ??ledout<=″101″;
?? ???end if;
?? end if;
? ?end if;
? ?if(key_valid='1'andreset='0'and butt_code/=″1001″) then??? --菜的信息
?? if(namestate=″000″ and butt_code/=″1011″) then? --接收(語句省略)菜的名字,即0~64,如果輸入的數(shù)超過兩個,則以最后兩位為準(zhǔn)
?? if(namestate=″011″?) then
?? if(pricestate=″000″ and butt_code/=″1011″) then
??????? ??savedata(27 downto 24)<=butt_code;
???? ?????pricestate:=″001″;
??????????ledout<=″101″;? --循環(huán)接收(語句省略)菜的信息,包括口味和價錢,如果輸入的數(shù)超過7位,
?? elsif(pricestate=″111″ and butt_code=″1011″) then? --則以最后輸入的7位為準(zhǔn)重置語句(略)
?? end if;
3 仿真結(jié)果
??? 上述設(shè)計(jì)在MAX+PLUSII環(huán)境下仿真成功,并用FPGA芯片F(xiàn)LEX10K實(shí)現(xiàn)。圖3是控制模塊的仿真波形" title="仿真波形">仿真波形。圖中,smkey_valid為鍵盤2的按鍵確認(rèn)信號,sel為加減控制信號,為0時加,為1時減,由鍵盤2 輸入。scan_f為分頻后的信號,由鍵盤1模塊輸入。key_valid為鍵盤1的按鍵確認(rèn)信號。scan_cntout為計(jì)數(shù)信號,當(dāng)key_valid信號為1時,對應(yīng)的scan_cntout即代表此時所按下的鍵盤1的鍵的索引值。controladd為加減使能信號,為1時表示加或減操作有效,可以進(jìn)行加減運(yùn)算,防止加減運(yùn)算超出范圍。numdish和dishled兩個信號控制菜名旁邊的LED燈,前者為行使能,循環(huán)檢測鍵盤1的每一行,逐行使能,使得列使能信號dishled有效時點(diǎn)亮相應(yīng)的LED燈。totalnum為菜的總數(shù),eachnum為當(dāng)前正在操作的菜的數(shù)量。

?


??? 下面對仿真結(jié)果進(jìn)行說明。第一個key_vaild信號觸發(fā)時,響應(yīng)在011號菜,然后按下“+”,觸發(fā)smkey_vaild,使controladd為1,sel信號為0,表示加使能, totalnum和eachnum分別加1,在隨后的numdish為01時,dishled變成0001(表示第3個菜選中)。在后面的操作中又點(diǎn)中了011號菜(選擇一個比較特殊的情況),并按下“+”,totalnum和eachnum分別加1,隨即又點(diǎn)了“-”,使得這兩個信號各減了1。接下來001號菜被選中,并按下“+”,totalnum變成了2,而eachnum為1,然后按下101,并沒有操作,按下111后再按下“-”,但是因?yàn)橹安]有選擇過,所以信號無變化。隨后numdish掃描到01,dishled為0101表示選中了001號和011號菜。
??? 圖4是信息調(diào)整模塊的仿真波形。圖中,dressout為存儲器的地址,key_valid為按鍵有效信號(實(shí)際上不應(yīng)該是有規(guī)律的,這里只是為了方便起見),write、read分別為寫、讀信號,cs為使能信號,butt_code為4×3鍵盤的輸入按鍵編碼值,datain、dataout分別表示從存儲器讀入數(shù)據(jù)和向存儲器輸出數(shù)據(jù),ledout為表示目前狀態(tài)的三個LED燈,從左到右依次為綠、黃、紅,綠色。紅色表示輸入密碼的正誤,黃色表示正在重設(shè)密碼。

?


??? 在這里也可以根據(jù)前面的做法將操作時的數(shù)值顯示在數(shù)碼管上,既可以另加數(shù)碼管,也可以利用原來的價錢顯示數(shù)碼管。但在此設(shè)計(jì)中,采用的是LED燈顯示狀態(tài)。主要是為了簡化電路,畢竟店方不是經(jīng)常更改菜的信息。
??? 下面對仿真結(jié)果進(jìn)行說明。在這個例子中,假設(shè)初始密碼是5555555,開機(jī)時從地址01100100讀入儲存的密碼5555555,當(dāng)按鍵連續(xù)輸入7個5時,密碼校對完成,可以開始操作。當(dāng)按下1001號鍵(更改密碼)時,假設(shè)需要更改成4444448,連續(xù)輸入兩次4444448無誤后即更改密碼成功。dataout為4444448,隨后輸入菜號33(因?yàn)榇鎯α亢苌?本文沒有進(jìn)行BCD與二進(jìn)制的轉(zhuǎn)換),表示對這個菜的信息進(jìn)行更改。按確認(rèn)鍵后,本例中故意輸入8位菜的信息(應(yīng)該輸入7位)55515554以驗(yàn)證系統(tǒng)的容錯能力。結(jié)果超過7位的數(shù)據(jù)系統(tǒng)可以成功地識別,并只取后7位5515554,dataout為5515554,完成信息修改。?
參考文獻(xiàn)
1 林明權(quán). VHDL數(shù)字控制系統(tǒng)設(shè)計(jì)范例. 北京:電子工業(yè)出版社,2003

本站內(nèi)容除特別聲明的原創(chuàng)文章之外,轉(zhuǎn)載內(nèi)容只為傳遞更多信息,并不代表本網(wǎng)站贊同其觀點(diǎn)。轉(zhuǎn)載的所有的文章、圖片、音/視頻文件等資料的版權(quán)歸版權(quán)所有權(quán)人所有。本站采用的非本站原創(chuàng)文章及圖片等內(nèi)容無法一一聯(lián)系確認(rèn)版權(quán)者。如涉及作品內(nèi)容、版權(quán)和其它問題,請及時通過電子郵件或電話通知我們,以便迅速采取適當(dāng)措施,避免給雙方造成不必要的經(jīng)濟(jì)損失。聯(lián)系電話:010-82306118;郵箱:aet@chinaaet.com。
主站蜘蛛池模板: 国产成人a大片大片在线播放 | 免费在线观看h片 | 日韩三级影视 | 精品女同一区二区三区在线观看 | 日韩欧美一卡二区 | 在线观看免费毛片 | 欧美黄色成人 | 中文字幕在线一区 | 国产成人精品亚洲2020 | 在线国产视频一区 | 黄色污污视频 | 成人免费在线观看视频 | 插菊综合 | 亚洲娇小黑人巨大交 | 国产青草视频免费观看97 | 日韩亚洲一区中文字幕在线 | 久久精品一区二区三区日韩 | 天天干天天射天天爽 | 久久久国产精品免费 | 国产日韩精品视频一区二区三区 | 2020在线不卡观看视频 | 国产人成精品综合欧美成人 | 天天操夜夜艹 | 亚洲成人精品久久 | 黄 色 片 在 线 看 | 日本视频中文字幕 | 欧美视频中文字幕 | 天天操天天摸天天射 | 日韩美女视频在线 | 欧美成人免费高清网站 | 日韩精品成人a在线观看 | 日韩精品福利在线 | 日韩三级免费 | 亚洲毛片视频 | 在线观看一级毛片免费 | 特级黄色网 | 国产色婷婷免费视频 | 羞羞网站在线观看 | 亚洲高清影院 | 99爱视频99爱在线观看免费 | 成年性生交大片免费看 |