学海荡舟手机网

主页 > 实用文摘 > 教育文摘_18 > > 详细内容

一种新型的电子点菜系统_EDAPLD论文

摘要:为克服传统点菜方式的弊端,提出一种新型的电子点菜系统。该系统使用vhdl语言设计,并用fpga芯片实现。它功能齐全、使用方便,如在餐饮业得以推广,可大大提高服务质量,并节省许多人力物力。

    关键词:电子菜单 vhdl fpga

在目前的餐馆里,客人点菜时总要有服务员在旁边等候,不仅要记录客人所点的菜,还要回答客人提出的各种关于菜的口味等问题。当顾客比较多时,服务员就会应接不暇,不仅耽误了顾客的时间,还影响了顾客对饭店的印象,并且顾客对已点菜的数量尤其是价钱往往不能很及时地了解。如果采用电子菜谱,客人点菜的时候,基本不需要服务员的陪伴,而且能实时地了解菜的特色,且对已点过的菜的数量和价钱一目了然,方便了顾客的消费,同时也减轻了餐馆的服务压力。

本文提出一种电子点菜装置,并在altera公司的max+plusii环境下利用vhdl语言编程,用fpga芯片得以实现。它功能齐全、造价低廉、操作简便,在餐饮业具有较好的推广价值。

1 系统功能

该系统的实物样图如图1所示。

该系统共采用两组9个led数码管、3组led灯和3组键盘。它的功能比较完善:从顾客的角度来讲,当顾客按下一个菜名键时,面板上方的4组8个表示菜的口味的led灯会点亮;当顾客对菜的口味满意时,通过按面板上方的“十”、“—”键来对选菜进行增删操作。在操作过程中,面板上方的数码管实时显示菜的总价钱、单个菜的数量和总数量,顾客点选过的菜旁的led灯也会自动点亮,使顾客对自己的点菜情况一目了然。从商家的角度来讲,商家可以通过更改按键上的菜名的标签更改菜的名字,还可以通过面板后面的一组键盘(如图1所示)更改菜的单价和口味。更改菜的单价时需要输入密码,并且密码也可以更改,保证商家对菜的进行任意的控制。

2 系统设计

该系统共分11个模块,其结构如图2所示。

图1

    2.1 键盘模块

键盘1是菜名键,其功能是:当顾客点按键盘时,从存储器的相应地址里读取数据。数

据是28位的,高8位是菜的口味,送到菜的口味显示模块里点亮相应的led灯;低20位是菜的单价,送到加减控制模块里等待进行加、减运算;同时经过键盘抖动消除电路输出按键有效信号到控制器,作为产生加减的使能信号。

键盘2产生加或减信号,信号经抖动消除电路后输出到bcd加减法器,以确认是加运算还是减运算;同时输出按键确认信号到控制器,与键盘1的按键有效信号共同产生加减使能信号控制bcd加减法器进行运算。

2.2 控制模块

控制器接收到两个键盘的按键有效信号时,首先判断这两个信号的顺序,必须是键盘1的有效信号先到(只判断最先的一次,往后不计顺序);然后判断菜的单个数量和总数量有无超出范围。当均符合要求时,输出加减使能信号到加减控制器,然后加减控制器再输出加(减)数、被加(减)数到bcd加减法器完成加(减)运算。同时它还根据键盘1、2输入的计数信号产生菜的数量和总数量,输出到数码管显示模块进行显示。这一部分的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); ——赋菜的数

totalnum<=temptotalnum; ——量

judge:=true; ——确认键盘1首先有键按下

end if;

if(smkey_valid=`1`and judge=true)then

——如果随后键盘2有键按下

if(sel=`0`)then ——如果是加法

iftemp(tempscan)>=99then ——判断数量是否超出范围

temp(tempscan):="1100011";

controladd<=`0`; ——超出范围,加减使能信号

为0

elsif temptotalnum>=99 then

temptotalnum:="1100011";

controladd<=`0`;

elsif(temp(tempscan)<99 and temptotalnum<99)then

——在允许范围内

temp(tempscan):=temp(tempsean)+1;

temptotalnum:=temptotalnum+1;——数量加1

controladd<=`1`;

eachnum<=temp(tempsean);

totalnum<=temptotalnum;

end if;

elsif(sel=`1`)then ——如果是减运算(同样的方法

· 判断是否少于1,如果是,不予

· 进行减运算,否则数量减1

· 并作相应赋值)

end if;

end if;

end if;

if temp(i)>0 then ——判断对应索引值的菜是否

被选中

tempout(j)<=`1`; ——如选中,赋1点亮led灯

elsif temp(i)0 then ——如未选中,赋0

tempout(j)<=`0`;

end if;

    2.3 显示模块

为减少引线数量,采用动态显示技术,其原理参见参考文献[1],在此不再赘述。

2.4 (包括菜的口味、价钱)调整模块

在实际应用中,店方往往要根据实际情况对经营的菜的价钱种类进行调整或补充。对菜的种类进行更换只需要将按钮上菜的名字更换即可,但是对菜的价钱和特色进行便捷的更改,则需要编程实现。

在这一部分的设计中,首先要设计一个电子密码,防止非授权人员对菜价进行更改,同时这个电子密码应具备更改的功能;然后再通过键盘输入更改菜的价钱。原理是将菜单上的菜从0~63一行一行索引,每一个菜的索引值也就是在存储器中的地址,而存放密码的位置是第64位,即“01100100”;最后根据相应的地址赋值即可。这一部分的vhdl程序如下:

·(初始化语句)

dressout<="01100100"; ——从存储器中读取密码

savedata<=datain;

if(key_valid=`1`and judgecheck=`0`) then

——准备校对密码

if(judgestate="000" and savedata(27 downto 24)

=butt_code)then ——确认是初状态

judgestate:="001"; ——校对成功则进入

end if; ——下一个状态

if(judgestate="001" and savedata(23 downto 20)

=butt_code)then

judgestate:="010";

downto 8)=butt_code)then

·(循环校对)

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"; ——点亮绿灯

judgestate:="000"; ——恢复初值

elsif(butt_code="1011" and judgestate/="111")then

——如果密码错误

judgestate:="000"; ——恢复初值

ledout<="110"; ——点亮红灯

end if;

elsif(key_valid=`1` and judgecheck=`1`)then

——密码输入正确,执行以下功能

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 ——最初状态

savedata(27 downto 24)<=butt_code;

j:=1;

——进入下一个状态循环(语句省略)

end if;

if(butt_code="1011" and j=7) the ——当按下确认键时

j:=0;

staterecode:="01"; ——进入第二次输入确认密码

check<=reset;

end if;

if(staterecode="01")then——确认是第二次输入密码的

状态

if(k=o and savedata(27 downto 24)=butt_code)then

k<=1;

——进入下一状态循环(语句省略)

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=`l`andreset=`o`and butt_code/="1001") then

——菜的

if(namestate="000" and butt_code/="1011") then

——接收(语句省略)菜的名字,即0~64,如果输入

的数超过两个,则以最后两位为准

if(namestate="011") then

if(pricestate="000" and butt_code/="1011") then

savedata(27 downto 24)<=butt_code;

pricestate:="001";

ledout<="101";

——循环接收(语句省略)菜的,包括口味和价钱,如

果输入的数超过7位,

elsif(pricestate="111" and butt_code="1011") then

——则以最后输入的7位为准

——重置语句(略)

end if;

图3和图4

3 仿真结果

上述设计在 max+plusii环境下仿真成功,并用fpga 芯片 flex10k实现。图3是控制模块的仿真波形。图中,smkey_valid为键盘2的按键确认信号,sel为加减控制信号,为0时加,为1时减,由键盘2输入。scan_f为分频后的信号,由键盘1模块输入。key_valid为键盘1的按键确认信号。scan_cntout为计数信号,当key_valid信号为1时,对应的scan_cntout即代表此时所按下的键盘1的键的索引值。controla

[1]