《电子技术应用》
您所在的位置:首页 > 可编程逻辑 > 业界动态 > 一种新型的电子点菜系统

一种新型的电子点菜系统

2008-08-28
作者:王 飞 张有志

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

 

    在目前的餐馆里,客人点菜时总要有服务员在旁边等候,不仅要记录客人所点的菜,还要回答客人提出的各种关于菜的口味等问题。当顾客比较多时,服务员就会应接不暇,不仅耽误了顾客的时间,还影响了顾客对饭店的印象,并且顾客对已点菜的数量尤其是价钱往往不能很及时地了解。如果采用电子菜谱,客人点菜的时候,基本不需要服务员的陪伴,而且能实时地了解菜的特色,且对已点过的菜的数量和价钱一目了然,方便了顾客的消费,同时也减轻了餐馆的服务压力。
    本文提出一种电子点菜装置,并在ALTERA公司的MAX+PLUSII环境下利用VHDL语言编程,用FPGA芯片得以实现。它功能齐全、造价低廉、操作简便,在餐饮业具有较好的推广价值。
1 系统功能
    该系统的实物样图如图1所示。

 


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

 


2.1 键盘模块
    键盘1是菜名键,其功能是:当顾客点按键盘时,从存储器的相应地址里读取数据。数据是28位的,高8位是菜的口味,送到菜的口味显示模块" title="显示模块">显示模块里点亮相应的LED灯;低20位是菜的单价,送到加减控制模块" title="控制模块">控制模块里等待进行加、减运算;同时经过键盘抖动消除电路" title="消除电路">消除电路输出按键有效信号到控制器,作为产生加减的使能信号。
    键盘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(tempscan)+1;
       temptotalnum:=temptotalnum+1; --数量加1
    controladd<='1';
    eachnum<=temp(tempscan);
    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=0 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='1'andreset='0'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 仿真结果
    上述设计在MAX+PLUSII环境下仿真成功,并用FPGA芯片FLEX10K实现。图3是控制模块的仿真波形" title="仿真波形">仿真波形。图中,smkey_valid为键盘2的按键确认信号,sel为加减控制信号,为0时加,为1时减,由键盘2 输入。scan_f为分频后的信号,由键盘1模块输入。key_valid为键盘1的按键确认信号。scan_cntout为计数信号,当key_valid信号为1时,对应的scan_cntout即代表此时所按下的键盘1的键的索引值。controladd为加减使能信号,为1时表示加或减操作有效,可以进行加减运算,防止加减运算超出范围。numdish和dishled两个信号控制菜名旁边的LED灯,前者为行使能,循环检测键盘1的每一行,逐行使能,使得列使能信号dishled有效时点亮相应的LED灯。totalnum为菜的总数,eachnum为当前正在操作的菜的数量。

 


    下面对仿真结果进行说明。第一个key_vaild信号触发时,响应在011号菜,然后按下“+”,触发smkey_vaild,使controladd为1,sel信号为0,表示加使能, totalnum和eachnum分别加1,在随后的numdish为01时,dishled变成0001(表示第3个菜选中)。在后面的操作中又点中了011号菜(选择一个比较特殊的情况),并按下“+”,totalnum和eachnum分别加1,随即又点了“-”,使得这两个信号各减了1。接下来001号菜被选中,并按下“+”,totalnum变成了2,而eachnum为1,然后按下101,并没有操作,按下111后再按下“-”,但是因为之前并没有选择过,所以信号无变化。随后numdish扫描到01,dishled为0101表示选中了001号和011号菜。
    图4是信息调整模块的仿真波形。图中,dressout为存储器的地址,key_valid为按键有效信号(实际上不应该是有规律的,这里只是为了方便起见),write、read分别为写、读信号,cs为使能信号,butt_code为4×3键盘的输入按键编码值,datain、dataout分别表示从存储器读入数据和向存储器输出数据,ledout为表示目前状态的三个LED灯,从左到右依次为绿、黄、红,绿色。红色表示输入密码的正误,黄色表示正在重设密码。

 


    在这里也可以根据前面的做法将操作时的数值显示在数码管上,既可以另加数码管,也可以利用原来的价钱显示数码管。但在此设计中,采用的是LED灯显示状态。主要是为了简化电路,毕竟店方不是经常更改菜的信息。
    下面对仿真结果进行说明。在这个例子中,假设初始密码是5555555,开机时从地址01100100读入储存的密码5555555,当按键连续输入7个5时,密码校对完成,可以开始操作。当按下1001号键(更改密码)时,假设需要更改成4444448,连续输入两次4444448无误后即更改密码成功。dataout为4444448,随后输入菜号33(因为存储量很少,本文没有进行BCD与二进制的转换),表示对这个菜的信息进行更改。按确认键后,本例中故意输入8位菜的信息(应该输入7位)55515554以验证系统的容错能力。结果超过7位的数据系统可以成功地识别,并只取后7位5515554,dataout为5515554,完成信息修改。 
参考文献
1 林明权. VHDL数字控制系统设计范例. 北京:电子工业出版社,2003

本站内容除特别声明的原创文章之外,转载内容只为传递更多信息,并不代表本网站赞同其观点。转载的所有的文章、图片、音/视频文件等资料的版权归版权所有权人所有。本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如涉及作品内容、版权和其它问题,请及时通过电子邮件或电话通知我们,以便迅速采取适当措施,避免给双方造成不必要的经济损失。联系电话:010-82306118;邮箱:aet@chinaaet.com。