当前位置:首页 >> 信息与通信 >>

基于fsm自动售货机的设计(原创)


基于有限状态机的自动售货控制系统 基于有限状态机的自动售货控制系统
泰山学院 陈辉
摘要:本文以 VHDL 语言为工具,以 quartusII 为平台,运用 VHDL 有限状态机设计自动售货系统, 摘要 实现了对四种物品的售货,找零功能。 关键词: 关键词:VHDL,状态机,自动售货系统

Automatic vending control system based on FSM
Chen Hui
Abstract: In this paper, VHDL language as a tool to quartusII as the platform, the finite state machine design using VHDL automatic vending system, and sales of four items, give change functions. Keywords: VHDL, state machines, automatic vending system

1.引言 1.引言
有限状态机 FSM(Finite State Machine)及其设计技术是实用数字系统设计中实现高效率、高 可靠逻辑控制的重要途径。 传统的状态机设计方法需进行繁琐的状态分配、绘制状态表、化简次态方程等,而利用 VHDL 可 以避免这些繁琐的过程,直接利用状态转换图进行状态机的描述,所有的状态均可表达为 CASE_WHEN 结构中的一条 CASE 语句,而状态的转移则通过 IF_THEN_ELsE 语句实现。此外,与 VHDL 的其它描述方式相比,状态机的 VHDL 表述丰富多样,程序层次分明,结构清晰,易读易懂;在排 错、修改和模块移植方面也有其独到的特点。

2.自动售货机控制系统的实现
2. 1 商品信息存储
本系统首先要将商品的单价,数量置入到自动售货机,这里用电平模拟输入输出信号。 定义三个输入端口。 item:in std_logic_vector(1 downto 0); --商品选择输入端 ,”00”代表商品一”,01”代表商品二”10”,代表商品三, “11”代表商品四

set: in std_logic ; pri_in:in std_logic_vector(3 downto 0);

--商品信息置入信号 --商品价格

quan_in:in std_logic_vector(3 downto 0); --商品数量 定义一个二维数组,存放四个八位的数据,即四种商品的价格与数量,高四位为价格,低四位为数量。 type ram_type is array(3 downto 0)of std_logic_vector(7 downto 0); signal ram :ram_type; 相关控制程序如下: if set='1' then ram(conv_integer(item))<=pri_in&quan_in; 函数 Conv_Integer()将 std_logic_vector 类型强制转换成整数型。当‘set’为高电平时,将当前物品信息存入。 仿真波形见图 2-1。

图 2-1 物品信息存储波形仿真

2.2 自动售货机控制功能的状态描述 本自动售货系统可划分为五个状态:系统初始化,物品选择,投币处理,输出商品和找零。程 序相关端口说明及变量定义如下: type state_type is (initial_state,item_state,money_state,sell_state,change_state); signal state:state_type; sel,cancel,set: in std_logic; coin0: in std_logic; coin1: in std_logic; item:in std_logic_vector(1 downto 0); --选择、取消、开始 --5 角硬币投入口 --1 元硬币投入口 --商品选择端

change_out :out std_logic_vector(3 downto 0);--找零输出

item_out:out std_logic_vector(3 downto 0);

--商品输出 ,“0001”代表商品一;”0010”代 表商品二; ”0100” 代表商品三; ”1000” 代表商品四

qianbugou :out std_logic; quehuo:out std_logic;--库存不足提示

--投币不足提示

quantity:out std_logic_vector(3 downto 0));

--当前库存数量

variable quan: std_logic_vector(3 downto 0);--变量,存储商品数量 variable pri: std_logic_vector(3 downto 0);--变量,存储商品价格 2.2.1 系统初始化 该状态主要对各输出端口初始化,相关程序如下 when initial_state=> item_out<="0000"; change_out<="0000"; counter<="0000"; qianbugou<='0'; quehuo<='0'; state<=item_state; --出货口关闭 --找零口关闭 --投入钱币总额记录清零 --投币额不足指示关闭 --缺货指示灯灭

2.2.2 物品选择 检测选择了哪种物品,并读取该物品的库存和单价。 库存不足时给予提示。 when item_state=> if sel='1' then for i in 0 to 3 loop quan(i):=ram(conv_integer(item))(i); end loop; for i in 4 to 7 loop pri(i-4):=ram (conv_integer(item))(i); end loop; if quan>0 then --读取商品单价 --读取商品数量 --检测到 sel 键按下

quehuo<='1'; state<=money_state; else quehuo<='0'; state<=initial_state; end if; else item_out<="0000"; state<=item_state; end if; 投币处理 2.2.3 投币处理 该状态记录投入的钱币的数量 when money_state=> if cancel='1' then state<=initial_state; change_out<=counter; elsif sel='1' then state<=sell_state; else state<=money_state; end if; if coin0='1' then counter<=counter+1; elsif coin1='1' then counter<=counter+2; end if; 2.2.4: 2.2.4:输出货物

--当库存容量为零时,指示灯亮 --进入投币状态

--当库存容量不为零时,指示灯灭 --进入初始化状态

--没有按下 sel 键,出货口关闭 --当前状态不变,循环检测 sel 键是否按下

--按下“取消”按钮 --进入初始状态 --返还投入的所有硬币

--按下 sel 键,进入出货状态

-- 没有任何键按下,继续循环检测按键

--投入 5 角硬币 counter 自加 1

--投入 1 元硬币 counter 自加 2

判断投币是否足够,足够则输出商品,并判断是否需要找零,若需要则进入找零状态。投币 不足给予提示,并返回投币状态。 when sell_state =>

if cancel='1' then change_out<=counter; state<=initial_state; elsif

--按下“取消”按钮 --返还投入的所有硬币 --进入初始状态

counter>=pri then –-判断投入的硬币数量是否足够 --投币数足够,将投币数不足指示关闭 then --输出所选物品

qianbugou<=’0’; if item="00"

item_out<="0001"; elsif item="01" then item_out<="0010"; elsif item="10" then item_out<="0100"; else item_out<="1000"; end if; quan:=quan-1; --库存量减一

ram(conv_integer(item))<=pri&quan; --商品数量信息更新 state<=change_state; else qianbugou<=’1’; state<= money_state; end if; 2.2.5 找零 计算并返还剩余的钱币, when change_state=> if cancel='1' then change_out<=counter; state<=initial_state; elsif counter>pri then --按下“取消”按钮 --返还投入的所有硬币 --进入初始状态 --需要找零 --系统进入找零状态 --投币数量不足 --提示投币数不足 --返回投币状态

change_out<=counter-pri;--将多出货币输出 else

change_out<="0000"; state<=initial_state;--返回初始状态 end if; 状态转换图见图 2-2

图 2-2 状态转换图

3. 设计验证 . 通过波形仿真检验该自动售货系统是否能完成对五种情况的处理。四种情形为: (1)投币足够,需要找零。 (2)缺货。 (3)投币足够,不需找零。 (4)投币不足。 首先置入商品的价格与数量,数据见表 3-1
表 3-1 商品信息 商品 商品一 商品二 商品三 商品四 数量 1111 0000 1111 1111 价格 0110 1000 0100 0010

四种情形的波形仿真分别见 图 3-1,图 3-2,图 3-3,图 3-4。

图 3-1

需要找零仿真波形

图 3-2 缺货仿真波形

图 3-3 投币正好仿真波形

图 3-4 投币不足波形仿真

购物过程中,若按下取消键时,则返还所投钱币,波形仿真见图 3-5

图 3-5”取消”键测试仿真波形

将验证数据填表分析,验证结果完全正确。实现了该设计的所有功能。数据统计见表 3-2 表 3-2 验证数据统计
情况 所选物品 (item) 需找零 缺货 投币正 好 投币不 足 商品一(00) 1111 商品二(01) 0000 商品三(10) 1111 商品四(11) 1111 0110 1000 0100 0010 库存 所需金额 投入金额 (count) 1000 0010 0100 0001 输出物品 (item_out) 0001 0000 0100 0000 找零金额 (change_out) 0010 0000 0000 0000 投币不足 指示灯 (qianbugou) 灭 灭 灭 亮 缺货指示 灯 (quehuo) 灭 亮 灭 灭

4 结语 本设计利用 VHDL 语言有限状态机设计自动售货系统, 大大降低了设计难度和时间, 提高了设 计效率和可靠性, 利用语言的灵活性及功能强大的 EDA 工具, 可以轻松完成硬件的功能扩充与升级, 整个设计过程相对于传统的设计方法,有较大的突破。 参考文献
[1]《EDA 技术实用教程》 (第三版)潘松.黄继业著 科学出版社 [2]《EDA 应用技术(第二版) 焦素敏 清华大学出版社,2005 》 [3]《EDA 实验与实践》 周立功.北京航空航天大学出版社,2007


相关文章:
更多相关标签: