工业控制 | 能源技术 | 汽车电子 | 通信网络 | 安防监控 | 智能电网 | 移动手持 | 无线技术 | 家用电器 | 数字广播 | 消费电子 | 应用软件 | 其他方案

电路设计->基础电路图->其他基础电路图->采用VHDL硬件语言描述自动售货机的逻辑控制电路

采用VHDL硬件语言描述自动售货机的逻辑控制电路

作者:dolphin时间:2012-07-23

  采用VHDL具描述自动售货机的逻辑控制电路及FPGA实现
  VHDL的英文全名是Very-High-Speed Integrated Circuit HardwareDescripTIon Language,诞生于1982年。1987年底,VHDL被IEEE和美国国防部确认为标准硬件描述语言 。自IEEE公布了VHDL的标准版本,IEEE-1076(简称87版)之后,各EDA公司相继推出了自己的VHDL设计环境,或宣布自己的设计工具可以和VHDL接口。
  FPGA(Field-Programmable Gate Array),即现场可编程门阵列,它是在PAL、GAL、CPLD等可编程器件的基础上进一步发展的产物。它是作为专用集成电路(ASIC)领域中的一种半定制电路而出现的,既解决了定制电路的不足,又克服了原有可编程器件门电路数有限的缺点。
  本文采用VHDL作为工具描述了自动售货机控制模块的逻辑控制电路,并在FPGA上实现。该自动售货机能够根据投入硬币额度,按预定的要求在投入硬币大于规定值时送出饮料并找零。
  设计方案
  本文所设计的简易自动售货机可销售矿泉水,假设每瓶1.5元。设两个投币孔,分别接收1元和5角两种硬币,两个输出口,分别输出购买的商品和找零。假设每次只能投入一枚1元或5角硬币,投入1元5角硬币后机器自动给出一瓶矿泉水;投入2元硬币后,在给出一瓶矿泉水的同时找回一枚5角的硬币。另外设置一复位按钮,当复位按钮按下时,自动售货机回到初始状态。
  开发软件选用功能强大的Altera公司的最新可编程逻辑器件开发工具Quartus II 8.0,实现芯片选用Altera公司FLEX10K系列的EPF10K10LC84-4;首先在计算机上完成程序设计、编译及时序仿真,然后将经过验证的设计文件下载到选择的可编程逻辑器件中,并在电子设计自动化实验系统中进行硬件模拟和测试。
  状态机VHDL程序设计
  有限状态机FSM(Finite STate Machine)及其设计技术是实用数字系统设计中实现高效率、高可靠逻辑控制的重要途径。传统的状态机设计方法需进行繁琐的状态分配、绘制状态表、简化次态方程等,而利用VHDL可以避免这些烦琐的过程,直接利用状态转换图进行状态机的描述。此外,与VHDL的其他描述方式相比,状态机的VHDL表述丰富多样,程序层次分明,结构清晰,易读易懂;在排错、修改和模块移植方面也有其独到的特点。
  状态机有摩尔(Moore)型和米立(Mealy)型两种。Moore型状态机的输出信号只与当前状态有关;Mealy型状态机的输出信号不仅与当前状态有关,还与输入信号有关。结合本文设计,由于输出仅与状态有关,选用了Moore型状态机设计自动售货机控制模块,状态转换图如图1所示。

自动售货机状态转换图


  图1 自动售货机状态转换图
  1)状态定义:S0表示初态,S1表示投入5角硬币,S2表示投入1元硬币,S3表示投入1元5角硬币,S4表示投入2元硬币。
  2)输入信号:取投币信号为输入逻辑变量,用两位的矢量state_inputs表示。state_inputs(0)表示投入1元硬币,state_inputs(1)表示投入5角硬币。输入信号为1表示投入硬币,输入信号为0表示未投入硬币。
  3)输出信号:给出矿泉水和找零为两个输出变量,用两位的矢量comb_outputs表示。comb_outputs(0)表示输出货物,comb_outputs(1)表示找5角零钱。输出信号为1表示输出货物或找零,输出信号为0表示不输出货物或不找零。
  根据图1所示的状态转换图,用VHDL中的CASE_WHEN结构和IF_THEN_ELSE语句实现控制功能,源程序如下:
  LIBRARY IEEE; --库和程序包的使用说明
  USE IEEE.STD_LOGIC_1164.ALL;
  ENTITY sellmachine IS --实体定义
  PORT(clk,reset: IN std_logic;
  state_inputs:IN std_logic_vector(0 TO 1);
  comb_outputs:OUT std_logic_vector(0 TO 1));
  END sellmachine;
  ARCHITECTURE state OF sellmachine IS --结构体
  TYPE fsm_st IS (S0,S1,S2,S3,S4); --状态枚举类型定义
  SIGNAL current_state,next_state:fsm_st; --状态信号的定义
  BEGIN
  reg:PROCESS(reset,clk) --时序进程
  BEGIN
  IF reset='1' THEN current_state=S0; --异步复位
  ELSIF rising_edge(clk) THEN
  current_state=next_state; --状态转换
  END IF;
  END PROCESS;
  corn:PROCESS(current_state,state_inputs) --组合进程
  BEGIN
  CASE current_state IS
  WHEN S0=comb_outputs="00"; --现态S0
  IF state_inputs="00" THEN next_state=S0; --输入不同,次态不同
  ELSIF state_inputs="01" THEN next_state=S1;
  ELSIF state_inputs="10" THEN next_state=S2;
  END IF;
  WHEN S1=comb_outputs="00"; --现态S1
  IF state_inputs="00" THEN next_state=S1; --输入不同,次态不同
  ELSIF state_inputs="01" THEN next_state=S2;
  ELSIF state_inputs="10" THEN next_state=S3;
  END IF;
  WHEN S2=comb_outputs="00"; --现态S2
  IF state_inputs="00" THEN next_state=S2; --输入不同,次态不同
  ELSIF state_inputs="01" THEN next_state=S3;
  ELSIF state_inputs="10" THEN next_state=S4;
  END IF;
  WHEN S3=comb_outputs="10"; --现态S3
  IF state_inputs="00" THEN next_state=S0; --输入不同,次态不同
  ELSIF state_inputs="01" THEN next_state=S1;
  ELSIF state_inputs="10" THEN next_state=S2;
  END IF;
  WHEN S4=comb_outputs="11"; --现态S4
  IF state_inputs="00" THEN next_state=S0; --输入不同,次态不同
  ELSIF state_inputs="01" THEN next_state=S1;
  ELSIF state_inputs="10" THEN next_state=S2;
  END IF;
  END CASE;
  END PROCESS;
  END state;
  编译、仿真及FPGA实现
  在Altera公司的可编程逻辑器件集成开发平台Quartus II 8.0下完成程序的编辑、编译并进行时序仿真。
  1)编译:编译是EDA设计中的核心环节。软件将对设计输入文件进行逻辑化简、综合和优化, 适当地用一片或多片器件进行适配,最后产生编程用的编程文件。主要包括设计编译和检查、逻辑优化和综合、适配和分割、布局和布线、生成编程数据文件等过程。自动售货机控制模块VHDL文件编译报告如图2所示。

编译报告


  图2 编译报告
  报告中给出了进行编译的时间、采用的开发软件的版本、顶层设计实体名、选用器件的系列和型号、时序分析情况、占用资源情况及引脚使用情况等信息。
  2)时序仿真:编译后对系统和各模块进行时序仿真,分析其时序关系,估计设计的性能及检查和消除竞争冒险是非常有必要的。仿真前,先利用波形编辑器建立波形文件,仿真结果将会生成报告文件和输出信号波形,从中便可以观察到各个节点的信号变化。若发现错误,则返回设计输入中修改设计逻辑。自动售货机控制模块仿真波形如图3所示。

时序仿真波形


  图3 时序仿真波形
  3) FPGA实现:将编译阶段生成的编程数据文件通过Quartus II 下载到芯片EPF10K10LC84-4中,并在电子设计自动化实验系统中进行测试得到了正确的结果。



评论

技术专区