深圳职业技术学院Shenzhen Polytechnic 数字系统设计技术课程设计课题名称:电子售货机学院:电子与通信工程学院班级:组员:学号:指导老师:目录一、设计方案 (1)1、功能简介 (1)2、开发测试环境选择 (1)二、售货机EDA程序设计 (1)1、定义端口与信号说明 (1)1.1输入端口 (1)1.2输出端口 (1)1.3信号 (2)2、状态模块说明 (2)2.1状态转换图 (2)2.2购买1元商品模块 (2)2.2购买5元商品模块 (3)2.3购买7元商品模块 (4)2.4顶层电路结构 (4)三、小结 (5)四、附录 (5)1、使用说明 (5)2、参考文献资料 (5)3、附表 (6)一、设计方案1、功能简介本文采用状态机的方法所设计的简易电子售货机可出售1元、5元、7元的商品,可接受1元、5元、10元的投币,可显示选择商品的价格,可找回购买后的余额。
若投币金额充足则自动给出对应的商品和自动找零,且在投币购买过程中若投币余额不足会发出警告。
在商品购买、找零完毕后,售货机会回到初始状态,顾客可进行下次购买。
另设有初始化按钮,按下之后售货机回到初始状态。
2、开发测试环境选择开发和仿真软件选择了Altera公司的综合性PLD/FPGA开发软件Quartus II 8.0,首先在Quartus II 8.0下进行程序设计,编译通过后用Quartus II 8.0进行功能仿真并检查对应的功能。
二、售货机EDA程序设计1、定义端口与信号说明1.1输入端口reset:异步复位端口,低电平有效;clk:时钟信号端口,控制状态的转换;item1:1元商品选择端口;item5:5元商品选择端口;item7:7元商品选择端口;ok:商品选择确认端口;coin1:1元投币信号端口;coin5:5元投币信号端口;coin10:10元投币信号端口。
1.2输出端口zhaoqian:退钱信号端口;jiage:对应商品价格显示端口;get1:1元商品输出端口:get5:5元商品输出端口;get7:7元商品输出端口;warn:投币金额不足提示窗口。
1.3信号s0:初始状态信号;rmb1:购买1元商品模块信号;rmb5:购买5元商品模块信号;rmb7:购买7元商品模块信号;now_state:当前信号保存变量;next_state:下一时钟上升沿读取信号保存变量。
2、状态模块说明2.1状态转换图本程序状态机设计包含4个状态s0:初始态;rmb1:1元商品购买;rmb5:5元商品购买;rmb7:7元商品购买。
2.2购买1元商品模块本模块处理当顾客选择1元商品后的处理,执行流程如下:首先价格端口显示价格为1元,顾客在按下确认键,ok<=’1’后,若投币1元,则get1<=’1’给出1元商品、zhaoqian<=0退钱0元;若投币5元,则get1<=‘1’给出1元商品、zhaoqian<=4退钱4元;若投币10元,则get1<=‘1’给出1元商品、zhaoqian<=9退钱9元。
仿真结果见图1:2.2购买5元商品模块本模块处理当顾客选择5元商品后的处理,执行流程如下:首先价格端口显示价格为5元,顾客在按下确认键,ok<=’1’后,若投币1元,则warn<=‘1’投币金额不足提示,zhaoqian<=1退钱1元;若投币5元,则get5<=‘1’给出5元商品、zhaoqian<=0退钱0元;若投币10元,则get5<=‘1’给出5元商品、zhaoqian<=5退钱5元;仿真结果见图2:2.3购买7元商品模块本模块处理当顾客选择7元商品后的处理,执行流程如下:首先价格端口显示价格为7元,顾客在按下确认键,ok<=’1’后,若投币1元,则warn<=‘1’投币金额不足提示,zhaoqian<=1退钱1元;若投币5元,则gwarn<=‘1’投币金额不足提示、zhaoqian<=5退钱5元;若投币10元,则get7<=‘1’给出7元商品、zhaoqian<=3退钱7元;仿真结果见图3:2.4顶层电路结构将售货机的VHDL生成IC连接如图4:三、小结在学期期末,我们进行了FPGA的课程设计,按老师的要求我们组选择了电子售货机的项目,并用Quartus II 8.0软件进行了程序的编写和仿真。
在设计的过程中我们小组遇到了很多的问题,在本次自动售货机我们采用状态机的方法进行设计,但我们自身对状态机的理解不够透彻导致在设计的过程中软件编译时的语法逻辑检测无法通过,比如Error (10028): Can't resolve multiple constant drivers for net "next_state.s0" at shjv.vhd(44),在并行进程中对同一信号进行了多次赋值导致了并行信号冲突问题;Error: Zero-time oscillation in node "|shouhuoji|Add0~22" at time 10.0 ns. Check the design or vector source file for combinational loop,在功能仿真时出现了“死锁”问题,最后通过查找资料,改变设计思路的方式基本解决问题。
在设计过程中我们小组经历多次失败,程序也换了很多版本,通过努力最终基本达到任务要求,虽然编写的程序存在情况考虑不足等BUG,但我们也明白了这不仅仅在意的是结果,而更注重的是过程。
四、附录1、使用说明本程序仿真方法如下:例如:在建立好仿真文件后,在开始的信号周期内为复位端reset送低电平,若要购买1元商品则在下一个时钟周期中将item1、ok以及coin1、coin5或coin10置高,则程序会给出对应的jiage、zhaoqian的处理结果。
其他模块仿真方法同理。
2、参考文献资料a.数字电路EDA设计 / 顾斌等编著. 西安电子科技大学出版社,2004.2(2010.2重印)b.FPGA/CPLD应用技术:Verilog语言版 / 王静霞主编. 北京电子工业出版社,2011.1c.百度文库3、附表简易电子售货机源代码library ieee;use ieee.std_logic_1164.all;entity shouhuoji isport(reset,clk,item1,item5,item7,coin1,coin5,coin10,ok:in std_logic;zhaoqian:out integer range 0 to 10;jiage:out integer range 0 to 10;get1,get5,get7,warn:out std_logic);end shouhuoji;architecture data of shouhuoji istype state is(s0,rmb1,rmb5,rmb7);signal next_state,now_state:state;--signal tt:integer range 0 to 50000000;begin--process(tt,clkk) --设定1s周期clk--begin-- if(clkk'event and clkk='1') then tt<=tt+1;-- if(tt=5) then-- tt<=0;clk<=not clk;-- end if;-- end process;process(clk,reset)beginif(reset='0')thennow_state<=s0;elsif(clk'event and clk='1')thennow_state<=next_state;end if;end process;process(now_state,item1,item5,item7,coin1,coin5,coin10,ok,display) begincase now_state iswhen s0=>get1<='0';get5<='0';get7<='0';warn<='0';zhaoqian<=0;if(item1='1')thennext_state<=rmb1;jiage<=1;warn<='0'; --1元购买模块elsif(item5='1')thennext_state<=rmb5;jiage<=5;warn<='0'; --5元购买模块elsif(item7='1')thennext_state<=rmb7;jiage<=7;warn<='0'; --7元购买模块elsenext_state<=s0;jiage<=0;warn<='0';end if;--------------------------------------------------------------rmb1when rmb1=>get1<='0';get5<='0';get7<='0';warn<='0';if(ok='1')thenif(coin1='1')thenget1<='1';get5<='0';get7<='0';warn<='0';zhaoqian<=0;next_state<=s0;elsif(coin5='1')thenget1<='1';get5<='0';get7<='0';warn<='0';zhaoqian<=4;next_state<=s0;elsif(coin10='1')thenget1<='1';get5<='0';get7<='0';warn<='0';zhaoqian<=9;next_state<=s0;end if;else next_state<=rmb1;end if;--------------------------------------------------rmb5when rmb5=>get5<='0';get7<='0';warn<='0';if(ok='1')thenif(coin1='1')thenget1<='0';get5<='0';get7<='0';warn<='1';zhaoqian<=1;next_state<=rmb5;elsif(coin5='1')thenget1<='0';get5<='1';get7<='0';warn<='0';zhaoqian<=0;next_state<=s0;elsif(coin10='1')thenget1<='0';get5<='1';get7<='0';warn<='0';zhaoqian<=5;next_state<=s0;end if;else next_state<=rmb5;end if;---------------------------------------------rmb7 when rmb7=>get1<='0';get5<='0';get7<='0';warn<='0';if(ok='1')thenif(coin1='1')thenget1<='0';get5<='0';get7<='0';warn<='1';zhaoqian<=1;next_state<=rmb7;elsif(coin5='1')thenget1<='0';get5<='0';get7<='0';warn<='1';zhaoqian<=5;next_state<=rmb7;elsif(coin10='1')thenget1<='0';get5<='0';get7<='1';warn<='0';zhaoqian<=3;next_state<=s0;end if;else next_state<=rmb7;end if;end case;end process;end data;。