自动售饮料机销售verilog设计
verilog自动售货机资料

齐齐哈尔大学SOPC课程设计(论文)题目:饮料自动提取机的设计院(系):通信与电子工程学院专业班级:电子091学号: **********学生姓名:**指导教师:**起止时间:2011.12.19-2011.12.30摘要饮料自动售货机是台机电一体化的自动化装置,再接收到货币已输入的前提下,靠触摸控制按钮输入信号使控制器启动相关位置的机械装置完成规定动作,将货物输出。
当顾客按下需要买的商品所对应的按键时,数码管上显示出该商品的的价格,然后顾客需要将货币投入投币口,数码管上显示出所投币额。
当按下确认键,则自动售货机将对投入的货币与商品的价格进行比较。
如果投入的币额足够时,则自动送出商品,并且把多余的钱找回,在数码管上显示出来。
本课程设计设想采用专用集成电路芯片实现饮料自动提取机的功能。
在本次设计中,系统开发平台为Quarter2,硬件描述语言是VerilogHDL。
设计方案中,售货机具备硬币识别及找零功能,并能完成四种商品的出售。
依据设计方案和设计平台完成了程序编写和程序调试,通过运行程序及时序波形的仿真有效验证了设计的正确性,初步实现了设计目标。
关键词: 自动售货机 VerilogHDL QuarterⅡ目录第1章绪论 (1)1.1饮料自动提取机概况 (1)1.2本文研究内容 (2)1.3目的与意义 (2)第2章系统设计方案 (3)2.1饮料自动提取机总体设计方案 (3)2.2系统的参数 (4)第3章饮料自动提取机的基本原理 (5)3.1饮料自动提取机功能 (5)3.2饮料自动提取机的基本组成 (5)3.2.1 投币信号产生的设计 (5)3.2.2 时钟电路的设计 (5)3.2.3 数码显示的设计 (6)第4章饮料自动提取机软件设计 (7)4.1软件实现功能综述 (7)4.2计数功能的设计 (7)4.2.1 计数功能接口电路 (7)4.2.2 计数功能程序设计 (7)4.3投币功能的设计 (8)4.3.1 投币功能的接口电路 (8)4.3.2 投币功能程序设计 (8)4.4显示功能的设计 (9)4.4.1 显示功能的接口电路 (9)4.4.2 显示功能程序设计 (9)4.5显示功能的设计 (12)4.5.1 显示功能的接口电路 (12)4.5.2 显示功能程序设计 (12)第5章饮料自动提取机系统的仿真分析 (14)5.1系统原理图 (14)5.2计数功能的仿真分析 (14)5.3投币功能的仿真分析 (15)5.4取货功能的仿真分析 (15)5.5总体功能的仿真分析 (16)第6章课程设计总结 (18)参考文献 (19)第1章绪论1.1饮料自动提取机概况近年来,集成电路技术的迅猛发展,特别是可编程逻辑器件的高速发展,电子设计自动化EDA技术成为电子设计工程师的新宠。
Verilog语言的自动售货机

完成时间:2010/7/30word格式-可编辑-感谢下载支持一、实验目的1)设计一个自动售货机,此机能出售1元、2元、5元、10元的四种商品。
出售哪种商品可有顾客按动相应的一个按键即可,并同时用数码管显示出此商品的价格。
2)顾客投入硬币的钱数也是有1元、2元、5元、10元四种,但每次只能投入其中的一种硬币,此操作通过按动相应的一个按键来模拟,并同时用数码管将投币额显示出来。
3)顾客投币后,按一次确认键,如果投币额不足时则报警,报警时间3秒(可用点阵模拟报警)。
如果投币额足够时自动送出货物(送出的货物用相应不同的指示灯显示来模拟),同时多余的钱应找回,找回的钱数用数码管显示出来。
4)顾客一旦按动确认键3秒后,自动售货机即可自动恢复到初始状态,此时才允许顾客进行下一次购货操作。
5)售货机还应具有供商家使用的累加卖货额的功能,累加的钱数要用数码管显示,显示2位即可。
此累加器只有商家可以控制清零。
6)此售货机要设有一个由商家控制的整体复位控制。
二、实验原理首先应搭建识别模块,将代表每种硬币的拨码开关信号转变为BCD码进行累加。
当累加完成后,将累加结果与代表商品的BCD码相比较。
如果大于售出商品并对两个BCD码求差,求差的结果作为找钱信号;如果等于直接售出商品;小于则报警。
至于统计卖钱额,则是对售出的商品进行累加。
三、分析与设计思路可分为以下模块1)分频模块。
2)计时模块。
用于控制确认键后到恢复初始化的3秒计时。
3)识别模块。
将每种硬币、货品的拨码开关信号转变为编码。
4)清零模块。
用于销售总额的清零。
5)初始化模块6)控制模块。
用于数据读入、投币不足、交易成功状态的控制及转化。
7)显示模块四、程序代码段moduleautoseller(clk,g,m,yes,read,zero,led_dig,led_seg,led_c,led_r,led);inputclk,yes,read,zero;〃确定键,商家读取键,清零键word格式-可编辑-感谢下载支持input[3:0]g,m;//货品及投币选择键outputled_dig,led_seg,led_c,led_r,led;//数码管输出及点阵输出regf_100;〃分频时钟regf_1;reg[3:0]goods,money,led,change,g_c;integerr,a,b,a_tmp2,a_tmp1;integerret=0;〃用于控制各状态间的转换reg[9:0]count;reg[7:0]led_c,led_r,led_dig,led_seg;reg[1:0]state;integeri;regx;always@(posedgeclk)//分频模块beginif(a_tmp2==999)beginf_100=~f_100;a_tmp2<=0;endelsea_tmp2<=a_tmp2+1;endalways@(posedgeclk)beginif(a_tmp1==9999999)beginf_1=~f_1;a_tmp1<=0;endelsea_tmp1<=a_tmp1+1;endalways@(posedgef_1)beginif(ret!=0)//用于按确认键后的计时begina=a+1;endelsebegina=0;endendalways@(posedgef_100)beginif(zero==0)//清零word格式-可编辑-感谢下载支持begincount=0;endif(read!=0)//非商家读取模式(普通读写模式)begin//识别模块case(g)//表每种货品的拨码开关信号转变为编码4'b0001:begingoods=1;end4'b0010:begingoods=2;end4'b0100:begingoods=5;end4'b1000:begingoods=10;enddefault:begingoods=0;endendcasecase(m)//表每种硬币的拨码开关信号转变为编码4'b0001:beginmoney=1;end4'b0010:beginmoney=2;end4'b0100:beginmoney=5;end4'b1000:beginmoney=10;enddefault:beginmoney=0;endendcase if(a==3)//初始化beginret=0;led=4'b0000;led_c=8'b0000_0000;led_r=8'b1111_1111;x=0;endif(yes==0)//按确定键beginif(money<goods)//金钱不足beginchange=0;ret=1;endelsebegin//金钱足够change=money-goods;ret=2;if(x==0)//交易成功销售总额增加begincount=count+goods;x=1;endendendg_c=goods;//显示模块word格式-可编辑-感谢下载支持if(ret==1)//金额不足,数码管报警begin led_c=8'b1111_1111;led_r=8'b0000_0000;endif(ret==2)〃交易成功begincase(goods)//LED灯显示货物1:beginled=4'b0001;end2:beginled=4'b0010;end5:beginled=4'b0100;end10:beginled=4'b1000;endendcaseg_c=change;endcase(state)//显示选择的货物0:beginr=g_c%10;led_dig=8'b1111_1011;case(r)0:beginled_seg=8'b1111_1100;end1:beginled_seg=8'b0110_0000;end2:beginled_seg=8'b1101_1010;end3:beginled_seg=8'b1111_0010;end4:beginled_seg=8'b0110_0110;end5:beginled_seg=8'b1011_0110;end6:beginled_seg=8'b1011_1110;end7:beginled_seg=8'b1110_0000;end8:beginled_seg=8'b1111_1110;end9:beginled_seg=8'b1111_0110;endendcaseend1:beginr=g_c/10;led_dig=8'b0111_1111;case(r)0:beginled_seg=8'b1111_1100;end1:beginled_seg=8'b0110_0000;end2:beginled_seg=8'b1101_1010;end3:beginled_seg=8'b1111_0010;end4:beginled_seg=8'b0110_0110;end5:beginled_seg=8'b1011_0110;end6:beginled_seg=8'b1011_1110;end7:beginled_seg=8'b1110_0000;end8:beginled_seg=8'b1111_1110;end9:beginled_seg=8'b1111_0110;endendcaseend//显示投入的钱数及余额2:beginr=money%10;led_dig=8'b1110_1111;case(r)0:beginled_seg=8'b1111_1100;end1:beginled_seg=8'b0110_0000;end2:beginled_seg=8'b1101_1010;end3:beginled_seg=8'b1111_0010;end4:beginled_seg=8'b0110_0110;end5:beginled_seg=8'b1011_0110;end6:beginled_seg=8'b1011_1110;end7:beginled_seg=8'b1110_0000;end8:beginled_seg=8'b1111_1110;end9:beginled_seg=8'b1111_0110;endendcase end3:beginr=money/10;led_dig=8'b1111_0111;case(r)0:beginled_seg=8'b1111_1100;end1:beginled_seg=8'b0110_0000;end2:beginled_seg=8'b1101_1010;end3:beginled_seg=8'b1111_0010;end4:beginled_seg=8'b0110_0110;end5:beginled_seg=8'b1011_0110;end6:beginled_seg=8'b1011_1110;end7:beginled_seg=8'b1110_0000;end8:beginled_seg=8'b1111_1110;end9:beginled_seg=8'b1111_0110;endendcase endendcasestate=state+1;endif(read==O)〃商家读取模式begincase(i)//显示销售总额0:beginb=count/10;led_dig=8'b1111_1110;case(b)0:beginled_seg=8'b1111_1100;end1:beginled_seg=8'b0110_0000;end2:beginled_seg=8'b1101_1010;end3:beginled_seg=8'b1111_0010;end4:beginled_seg=8'b0110_0110;end5:beginled_seg=8'b1011_0110;end6:beginled_seg=8'b1011_1110;end7:beginled_seg=8'b1110_0000;end8:beginled_seg=8'b1111_1110;end9:beginled_seg=8'b1111_0110;endendcase end1:beginb=count%10;led_dig=8'b1111_1101;case(b)0:beginled_seg=8'b1111_1100;end1:beginled_seg=8'b0110_0000;end2:beginled_seg=8'b1101_1010;end3:beginled_seg=8'b1111_0010;end4:beginled_seg=8'b0110_0110;end5:beginled_seg=8'b1011_0110;end6:beginled_seg=8'b1011_1110;end7:beginled_seg=8'b1110_0000;end8:beginled_seg=8'b1111_1110;end9:beginled_seg=8'b1111_0110;endendcase endendcasei=i+1;if(i==2)begini=0;endendendendmodule五、对应变量的管脚配置表Named:NodeName Direction Location1/elk Input PIN732/g[o:Input PIN1873/g[i Input PIN18?4Input:PIN1905g[习Input:PIN179尸D led[3]Output PIML6S7■/led[Z Output PIN1678・/led[f Output PIN163/led[0:Output PIN160号・10・/Output PIN3111■/led.®Output PIM3012 1心5]Output PIHZ913■/ledcL4:Output PINZ814・/led15]Output PIN2415・/ledcE2:Output PDN2516・led.cLi:Output PIN2617■_Z ledc[(J]Output PIN27IS•—hdd g[7]Output PIH37四■/leddig[&]Output PIN3920■/leddig[5;Output PIM6021leddig[4;Output PIN57・222ledd g[j]Output PIN5523■_Z ledcig[2]Output PIN5624g[l"Output PIH53Z5■/leddig[a;Output PIN6136■/lecijLT]Output PIM3627・2ledjL6]Output PIN3828・1刨」囚Output PIN1029■/ledjK Output PI卜L15301曲」[割Output PIN」斗Output PINL2 31■/lecijtr32■/1罚」[1]Output PIN1^・/ledjLO]Output PINL7兰兰・/ledr[0]Output PIM1734、丄ledseg[7]Output PIM6735■_Z ledseg[6]Output PIM6536sclfieg[5'Output PIM6457■/leds亡Output PIN6338・/led£eg[5[]Output PIM6839l£dseg[2;Output PIM6940■_Z ledseg[l]Output PIM7041sd-fiegpj]Output PIM7142/rri[Ci Input PIM17743/m[l:Input FIN」764+rri[2]In叫t PIM17545E[3Input PIM174-46read Input PIM19647/yes Input PIM151书/2ero Input PIM202书。
基于FPGA的自动售货机-课程设计

武汉理工大学《电子线路EDA》课程设计说明书绪论自动售货机(Vending Machine,VEM)是能根据投入的钱币自动付货的机器。
自动售货机是商业自动化的常用设备,它不受时间、地点的限制,能节省人力、方便交易。
是一种全新的商业零售形式,又被称为24小时营业的微型超市。
能分为三种:饮料自动售货机、食品自动售货机、综合自动售货机。
它能够在无人操作的情况下根据程序自动地销售商品。
自动售货机不受工作时间及地点限制的特点,使其实现了一种提高营业额的同时又降低了成本的销售模式。
进入21世纪之后,自动售货机的发展进一步加快,智能化的自动售货机正在逐步进入普通民众的生活之中,在未来,自动售货机的发展将会更加迅速,更加智能的自动售货机会让人们的生活更加便利。
VHDL主要用于描述数字系统的结构,行为,功能和接口。
除了含有许多具有硬件特征的语句外,VHDL的语言形式和描述风格与句法是十分类似于一般的计算机高级语言。
VHDL的程序结构特点是将一项工程设计,或称设计实体(可以是一个元件,一个电路模块或一个系统)分成外部(或称可视部分,及端口)和内部(或称不可视部分),既涉及实体的内部功能和算法完成部分。
在对一个设计实体定义了外部界面后,一旦其内部开发完成后,其他的设计就可以直接调用这个实体。
这种将设计实体分成内外部分的概念是VHDL系统设计的基本点。
因此,此次运用VHDL语言来实现一个简易的自动售货机是一个很有意义并且非常有乐趣的课题!关键词:自动售货机 VHDL1 课程设计实验要求1.1 初始条件设计一个自动售货机控制器,具有投币和选择商品等功能。
可出售四种商品,分别为纯净水(2元)、可乐(4.5元)、牛奶(5元)、果汁(5.5元)。
在购买过程中,采取投币方式,只能投入5元、10元或20元三种规格的纸币,且一次只能投入一张纸币。
1.2 要求完成的主要任务1.顾客通过按键选择某种商品后,由数码管显示该商品价格。
顾客投币过程中,数码管显示投币额。
verilog设计 自动售货机

自动售货机1、设计说明本设计是以现场可编程逻辑器件(FPGA)为核心的自动售货机,利用Modesim 软件编写verilog硬件描述语言程序以实现自动售货功能。
1.1、系统设计描述(1)用四个发光二极管分别模拟售出价值为2元、5元、7元和10元的商品,购买者可以通过开关选择任意一种标价中的小商品;(2)灯亮时表示该小商品售出;(3)用开关分别模拟1元、5元,10元和20元货币投入,用四支发光二极管代表投入的货币的面值;(4)每次只能售出一种小商品,当所投硬币达到或超过购买者所选面值时,售出货物并找回剩余的硬币,回到初始状态;(5)当所投硬币值不足面值时,可通过一个复位键退回所投硬币,回到初始状态。
系统框图如图1.1所示:图1.1 系统框图2、详细状态描述2.1 初始状态rst为复位键,低电平有效,实现系统复位。
2.2 选商品状态分别有价格为2元、5元、7元和10元的商品,每次选择商品前,设置一个标志位btn_sel_goods表示选择商品状态。
此自动售货机每一次售货时只能一次选择一种商品,当同时选择两种以上时,选择商品无效,数码管显示清零,重新进行商品选择。
选择商品后,数码管显示所选商品价格。
2.3 投币状态当选好商品后,开始投币。
同样有一标志位btn_price表示投币金额。
投币口只接受面值为1元、5元10元和20元的货币,可以同时投入多种面值钱币。
投完币后,先有一个确认买商品的过程,若投了币但又不购买商品了,就将全部投币金额退回;若确认购买商品,则进入下一状态。
2.4 找零状态投完币,并确认购买商品后,进入找零状态。
首先要将所投的金额与所选商品的价格做比较,若所投金额小于商品价格,则退回所投钱币;若大于等于商品价格,则两者做差,得到需要找零的钱。
3、仿真结果分析设置测试程序各参数,运行tb文件,仿真结果如下图3.1、3.2所示。
图3.1图3.1所示,商品价格选择为7元,即btn_sel_goods=2'b10,投币总额大于商品价格的情况,上图中btn_mony从右到左依次代表投币1元、10元、20元、10元、20元、1元、20元和10元,共92元。
基于FPGA的自动售货机设计

基于FPGA的自动售货机设计
自动售货机最基本的功能就是为顾客提供可供选择的物品并接受付款,然后交付所选物品。
自动售货机还需要具备一些其他的功能,例如在货品数量低于设定值时警报,更新商家的库存信息等。
基于FPGA的自动售货机设计包括以下步骤:
1. 确定自动售货机的物品种类和数量,并选择相应的电机、传感器和显示器等组件。
2. 设计自动售货机的控制电路,包括接口电路、逻辑电路和中央处理器(CPU)等。
其中,FPGA可以作为逻辑电路的核心部件,负责控制整个自动售货机的操作流程。
3. 利用Verilog HDL编写FPGA的逻辑设计,并通过仿真和测试确保正确性和可靠性。
FPGA的逻辑设计应该能够控制电机的旋转、传感器的检测和显示器的显示等操作。
4. 将FPGA的逻辑设计下载到实验板上并测试它的功能和性能。
在测试过程中需要注意电机的工作效率、传感器的准确性和显示器的清晰度等方面的问题。
5. 将整个自动售货机装在一个外壳中,并测试整个系统的可靠性和用户友好性。
在测试过程中需要关注售货机的操作流程、货品存储和取出的方便程度以及付款方式的安全性等方面的问题。
综上所述,基于FPGA的自动售货机设计需要充分考虑到售货机的各个方面,包括物品种类、控制电路、逻辑设计和用户体验等,以提供高质量和可靠性的售货机。
verilog自动售货机课程设计

verilog自动售货机课程设计一、课程目标知识目标:1. 学生理解Verilog硬件描述语言的基本语法和结构;2. 学生掌握利用Verilog设计简单的数字电路,如自动售货机逻辑控制单元;3. 学生了解自动售货机的工作原理及其在数字电路设计中的应用;4. 学生能够识别并描述自动售货机系统的各个模块及其功能。
技能目标:1. 学生能够运用Verilog语言编写自动售货机的基本控制代码;2. 学生通过实际操作,能够模拟自动售货机的运行流程,完成商品选择、支付及出货过程;3. 学生能够利用仿真工具对自动售货机的设计进行验证和调试,解决基本问题。
情感态度价值观目标:1. 学生培养对数字电路设计和Verilog编程的兴趣和热情;2. 学生通过团队协作,培养沟通能力和合作精神;3. 学生在设计过程中,认识到科技对生活的改变,增强创新意识和服务社会的责任感。
课程性质:本课程为电子信息类学科实践课程,结合理论知识,强调学生的动手能力和实际问题解决能力。
学生特点:学生为高中年级,具有一定的电子信息技术基础和编程经验,对新鲜事物充满好奇。
教学要求:注重理论与实践相结合,通过项目驱动的教学方式,引导学生主动探索,提高学生的实践操作能力。
在教学过程中,关注学生的学习反馈,及时调整教学策略,确保课程目标的实现。
将目标分解为具体的学习成果,以便于后续的教学设计和评估。
二、教学内容1. 自动售货机工作原理介绍:分析自动售货机的系统结构,包括投币模块、选择模块、出货模块等,让学生理解各个模块的功能和相互关系。
教材关联章节:第五章 数字电路设计与应用,第3节 自动售货机实例。
2. Verilog基础知识回顾:回顾Verilog的基本语法、数据类型、运算符等,为后续编程打下基础。
教材关联章节:第三章 Verilog语言基础,第1-3节。
3. 自动售货机控制逻辑设计:指导学生利用Verilog编写自动售货机的控制代码,包括投币、选择商品、出货等模块。
自动售货机fpga与verilog代码

深圳大学课程论文题目设计一个自动售货机成绩专业课程名称、代码年级姓名学号时间年月设计一个自动售货机基本要求:可以对3种不同种类的货物进行自动售货,价格分别为A=1.00, B=1.50, C=1.60。
售货机可以接受1元,5角,1角三种硬币(即有三种输入信号IY,IWJ,IYJ),并且在7段数码管(二位代表元,一位代表角)显示已投入的总钱数,选择货物的输入信号Ia,Ib,Ic,输出指示信号为Sa, Sb ,Sc 分别表示售出相应的货物,同时输出的信号yuan, jiao代表找零,并显示在7段数码管上。
规格说明:1.按一下button1按钮,表示购买货物A,第一个LED灯亮;按两下button1按钮,表示购买货物B,第二个LED灯亮;按三下button1按钮,表示购买货物C,第三个LED灯亮。
2.LED灯亮后,开始输入硬币。
button2按一下,输入1元,按两下,输入两元,以此类推;Button3按一下输入5角,按两下代表1元,以此类推;button4按一下输入1角,按两下输入2角,以此类推。
7段数码管显示已投入的总钱数,再次按下button1键,7段数码管显示找零数目,同时指示货物的LED灯熄灭。
3.本实验使用FPGA板:Sparant6XC6SLX16CSG324C(建project时,需要选择该芯片的型号)。
论文要求:1.论文的格式采用标准的深圳大学以论文、报告等形式考核专用答题纸;2.论文中应完包括ASM图, 以及VerilogHDL代码,并且代码应该与ASM图相一致.3.论文应包括该电路的VerilogHDL仿真.4.论文应该有FPGA开发的布局布线后结果.5.报告应该有实验成功的开发板截图.1.状态图售货机FSM本设计需要2个状态机,一个是售货机工作状态机,一个是按键消抖用的FSM2. Verilog 代码:`timescale 1ns / 1psmodule automat(clk_in,reset,cs,Led,seg,button1_in,button2_in,button3_in,button4_in );input clk_in,reset;input button1_in,button2_in,button3_in,button4_in;output [2:0] Led;output [3:0] cs;output [7:0] seg;reg [7:0] seg;reg [3:0] cs;reg [2:0] Led;reg [6:0] total;reg [4:0] state;reg [2:0] state1,state2,state3,state4;reg [4:0] cnt1,cnt2,cnt3,cnt4;reg button1,button2,button3,button4;reg [6:0] ones,tens;reg clk;reg [23:0] divcnt;parameter wait0 = 3'b001;parameter delay = 3'b010;parameter wait1 = 3'b100;parameter idle = 5'b00001;parameter selA = 5'b00010;parameter selB = 5'b00100;parameter selC = 5'b01000;parameter count = 5'b10000;always @ (posedge clk_in or negedge reset) /// clk_dividerbeginif (!reset)beginclk <= 1'b0;divcnt <= 0;endelse if (divcnt == 99999)beginclk <= 1'b1;divcnt <= 0;endelse if (divcnt == 49999)beginclk <= 1'b0;divcnt <= divcnt + 1;endelsedivcnt <= divcnt + 1;endalways @ (posedge clk or negedge reset) // 7seg scan clk=1Khz beginif (!reset)begincs <= 4'b1101;seg <= 8'b00111000;endelse if (cs == 4'b1101)begincs <= 4'b1110;case(ones)0: seg <= 8'b10000001;1: seg <= 8'b11001111;2: seg <= 8'b10010010;3: seg <= 8'b10000110;4: seg <= 8'b11001100;5: seg <= 8'b10100100;6: seg <= 8'b10100000;7: seg <= 8'b10001111;8: seg <= 8'b10000000;9: seg <= 8'b10000100;default: seg <= 8'b01110000;endcaseendelse if (cs == 4'b1110)begincs <= 4'b1101;case(tens)0: seg <= 8'b00000001;1: seg <= 8'b01001111;2: seg <= 8'b00010010;3: seg <= 8'b00000110;4: seg <= 8'b01001100;5: seg <= 8'b00100100;6: seg <= 8'b00100000;7: seg <= 8'b00001111;8: seg <= 8'b00000000;9: seg <= 8'b00000100;default: seg <= 8'b01110000;endcaseendendalways @ (total) //total decode beginif (total < 10 && total >= 0)begintens = 0;ones = total;endelse if (total < 20 && total >= 10)begintens = 1;ones = total - 10;endelse if (total < 30 && total >= 20) begintens = 2;ones = total - 20;endelse if (total < 40 && total >= 30) begintens = 3;ones = total - 30;endelse if (total < 50 && total >= 40) begintens = 4;ones = total - 40;endelse if (total < 60 && total >= 50) begintens = 5;ones = total - 50;endelse if (total < 70 && total >= 60) begintens = 6;ones = total - 60;endelse if (total < 80 && total >= 70) begintens = 7;ones = total - 70;endelse if (total < 90 && total >= 80) begintens = 8;ones = total - 80;endelse if (total < 100 && total >= 90) begintens = 9;ones = total - 90;endelsebegintens = 9;ones = 9;endendalways @ (posedge clk or negedge reset) // undo key jitter fsm for button1_in beginif (!reset)beginbutton1 <= 1'b0;cnt1 <= 0;state1 <= wait0;endelsebeginbutton1 <= 1'b0;case (state1)wait0: beginif (button1_in)state1 <= delay;elsestate1 <= wait0;enddelay: beginif (cnt1 == 24)begincnt1 <= 0;if (button1_in)beginbutton1 <= 1'b1;state1 <= wait1;endelsestate1 <= wait0;endelsebegincnt1 <= cnt1 + 1;state1 <= delay;endendwait1: beginif (button1_in)state1 <= wait1;elsestate1 <= wait0;enddefault: state1 <= wait0;endcaseendendalways @ (posedge clk or negedge reset) // undo key jitter fsm for button2_in beginif (!reset)beginbutton2 <= 1'b0;cnt2 <= 0;state2 <= wait0;endelsebeginbutton2 <= 1'b0;case (state2)wait0: beginif (button2_in)state2 <= delay;elsestate2 <= wait0;enddelay: beginif (cnt2 == 24)begincnt2 <= 0;if (button2_in)beginbutton2 <= 1'b1;state2 <= wait1;endelsestate2 <= wait0;endelsebegincnt2 <= cnt2 + 1;state2 <= delay;endendwait1: beginif (button2_in)state2 <= wait1;elsestate2 <= wait0;enddefault: state2 <= wait0;endcaseendendalways @ (posedge clk or negedge reset) // undo key jitter fsm for button3_in beginif (!reset)beginbutton3 <= 1'b0;cnt3 <= 0;state3 <= wait0;endelsebeginbutton3 <= 1'b0;case (state3)wait0: beginif (button3_in)state3 <= delay;elsestate3 <= wait0;enddelay: beginif (cnt3 == 24)begincnt3 <= 0;if (button3_in)beginbutton3 <= 1'b1;state3 <= wait1;endelsestate3 <= wait0;endelsebegincnt3 <= cnt3 + 1;state3 <= delay;endendwait1: beginif (button3_in)state3 <= wait1;elsestate3 <= wait0;enddefault: state3 <= wait0;endcaseendendalways @ (posedge clk or negedge reset) // undo key jitter fsm for button3_in beginif (!reset)beginbutton4 <= 1'b0;cnt4 <= 0;state4 <= wait0;endelsebeginbutton4 <= 1'b0;case (state4)wait0: beginif (button4_in)state4 <= delay;elsestate4 <= wait0;enddelay: beginif (cnt4 == 24)begincnt4 <= 0;if (button4_in)beginbutton4 <= 1'b1;state4 <= wait1;endelsestate4 <= wait0;endelsebegincnt4 <= cnt4 + 1;state4 <= delay;endendwait1: beginif (button4_in)state4 <= wait1;elsestate4 <= wait0;enddefault: state4 <= wait0;endcaseendendalways @ (posedge clk or negedge reset) //FSM for automat beginif (!reset)begintotal <= 0;Led <= 3'b000;state <= idle;endelsebegincase (state)idle: beginLed <= 3'b000;if (button1)state <= selA;elsestate <= idle;endselA: begintotal <= 0;Led <= 3'b100;if (button1)state <= selB;else if (button2)beginstate <= count;total <= total + 10;endelse if (button3)beginstate <= count;total <= total + 5;endelse if (button4)beginstate <= count;total <= total + 1;endelsestate <= selA;endselB: beginLed <= 3'b010;if (button1)state <= selC;else if (button2)beginstate <= count;total <= total + 10;endelse if (button3)beginstate <= count;total <= total + 5;endelse if (button4)beginstate <= count;total <= total + 1;endelsestate <= selB;endselC: beginLed <= 3'b001;if (button2)beginstate <= count;total <= total + 10;endelse if (button3)beginstate <= count;total <= total + 5;endelse if (button4)beginstate <= count;total <= total + 1;endelsestate <= selC;endcount: beginif (button2)beginstate <= count;total <= total + 10;endelse if (button3)beginstate <= count;total <= total + 5;endelse if (button4)beginstate <= count;total <= total + 1;endelse if (button1 && (total >= 10) && Led == 3'b100)begintotal <= total - 10;state <= idle;endelse if (button1 && (total >= 15) && Led == 3'b010)begintotal <= total - 15;state <= idle;endelse if (button1 && (total >= 16) && Led == 3'b001)begintotal <= total - 16;state <= idle;endelsestate <= count;enddefault: state <= idle;endcaseendendendmodule3.仿真:Tb代码:`timescale 1ns / 1psmodule tb;reg clk_in;reg reset;reg button1_in;reg button2_in;reg button3_in;reg button4_in;wire [3:0] cs;wire [2:0] Led;wire [7:0] seg;automat uut (.clk_in(clk_in),.reset(reset),.cs(cs),.Led(Led),.seg(seg),.button1_in(button1_in),.button2_in(button2_in),.button3_in(button3_in),.button4_in(button4_in) );initial begin// Initialize Inputsclk_in = 0;reset = 0;button1_in = 0;button2_in = 0;button3_in = 0;button4_in = 0;#1000;reset = 1;#1000;button1_in = 1;#2000000button1_in = 0;#2000000button1_in = 1;#2000000button1_in = 0;#2000000button1_in = 1;#2000000button1_in = 0;#2000000button1_in = 1;#2000000button1_in = 0;#2000000button1_in = 1;#2000000button1_in = 0;#2000000button1_in = 1;#50000000button1_in = 0;//delay 50ms#50000000button2_in = 1;#50000000button2_in = 0;#50000000button3_in = 1;#50000000button3_in = 0;#50000000button4_in = 1;#50000000button4_in = 0;#50000000button1_in = 1;#50000000button1_in = 0;endalways#5 clk_in = ~clk_in;endmodule把button1_in 仿真成与物理电路一样有大约十几秒的抖动Button1 正确的忽略掉抖动产生的影响,产生了一个周期的脉冲买A=1元仿真的过程:button1一来state进入买selA状态button2一来state 进入count状态且total+10 (total=投进钱总数剩10)即表示投进了1元,button3一来total = 15 表示投进了1.5元,button4一来total = 16 表示投了1.6元,最后按button1 出货和找零,total=6表示找零0.6角4.实物展示:本设计下载平台是Nexys3™BoardUcf:#clkNet "clk_in" LOC=V10 | IOSTANDARD=LVCMOS33;Net "clk_in" TNM_NET = sys_clk_pin;TIMESPEC TS_sys_clk_pin = PERIOD sys_clk_pin 100000 kHz;Net "reset" LOC = T10 | IOSTANDARD = LVCMOS33; #Bank = 2, pin name = IO_L29N_GCLK2, Sch name = SW0## LedsNet "Led<0>" LOC = U16 | IOSTANDARD = LVCMOS33; #Bank = 2, pin name = IO_L2P_CMPCLK, Sch name = LD0Net "Led<1>" LOC = V16 | IOSTANDARD = LVCMOS33; #Bank = 2, pin name = IO_L2N_CMPMOSI, Sch name = LD1Net "Led<2>" LOC = U15 | IOSTANDARD = LVCMOS33; #Bank = 2, pin name = IO_L5P, Sch name = LD2#Net "seg<7>" LOC = M13 | IOSTANDARD = LVCMOS33; #Bank = 1, pin name = IO_L61N, Sch name = DP## 7 segment displayNet "seg<6>" LOC = T17 | IOSTANDARD = LVCMOS33; #Bank = 1, pin name = IO_L51P_M1DQ12, Sch name = CANet "seg<5>" LOC = T18 | IOSTANDARD = LVCMOS33; #Bank = 1, pin name = IO_L51N_M1DQ13, Sch name = CBNet "seg<4>" LOC = U17 | IOSTANDARD = LVCMOS33; #Bank = 1, pin name = IO_L52P_M1DQ14, Sch name = CCNet "seg<3>" LOC = U18 | IOSTANDARD = LVCMOS33; #Bank = 1, pin name = IO_L52N_M1DQ15, Sch name = CDNet "seg<2>" LOC = M14 | IOSTANDARD = LVCMOS33; #Bank = 1, pin name = IO_L53P, Sch name = CENet "seg<1>" LOC = N14 | IOSTANDARD = LVCMOS33; #Bank = 1, pin name = IO_L53N_VREF, Sch name = CFNet "seg<0>" LOC = L14 | IOSTANDARD = LVCMOS33; #Bank = 1, pin name = IO_L61P, Sch name = CGNet "seg<7>" LOC = M13 | IOSTANDARD = LVCMOS33; #Bank = 1, pin name = IO_L61N, Sch name = DPNet "cs<0>" LOC = N16 | IOSTANDARD = LVCMOS33; #Bank = 1, pin name = IO_L50N_M1UDQSN, Sch name = AN0Net "cs<1>" LOC = N15 | IOSTANDARD = LVCMOS33; #Bank = 1, pin name = IO_L50P_M1UDQS, Sch name = AN1Net "cs<2>" LOC = P18 | IOSTANDARD = LVCMOS33; #Bank = 1, pin name =IO_L49N_M1DQ11, Sch name = AN2Net "cs<3>" LOC = P17 | IOSTANDARD = LVCMOS33; #Bank = 1, pin name = IO_L49P_M1DQ10, Sch name = AN3## ButtonsNet "button1_in" LOC = A8 | IOSTANDARD = LVCMOS33; #Bank = 0, pin name = IO_L33N, Sch name = BTNUNet "button2_in" LOC = C4 | IOSTANDARD = LVCMOS33; #Bank = 0, pin name = IO_L1N_VREF, Sch name = BTNLNet "button3_in" LOC = C9 | IOSTANDARD = LVCMOS33; #Bank = 0, pin name = IO_L34N_GCLK18, Sch name = BTNDNet "button4_in" LOC = D9 | IOSTANDARD = LVCMOS33; # Bank = 0, pin name = IO_L34P_GCLK19, Sch name = BTNR实物图:。
基于Verilog HDL的自动售货机设计与仿真

电子技术Electronic Technology电子技术与软件工程Electronic Technology & Software Engineering 基于Verilog H D L的自动售货机设计与仿真李红科王庆春贾晓菲(安康学院电子与信息工程学院陕西省安康市725000 )摘要:本文应用Verilog H D L语言采用自顶而下的方法设计自动售货机,整个系统包括商品选择、确认、投币、找零和出货等模块。
在Modelsim平台进行功能仿真验证,经过仿真验证设计正确,符合设计要求。
关键词:Verilog H D L;自动售货机;模块设计1引言随着集成电路产业快速发展,电路集成度越来越高,以计算机辅助为基础的电子设计自动化(EDA Electronics Design Automation)技术成为集成电路设计重要工具m,Verilog HDL硬件描述语言是以文字形式描述数字系统硬件电路结构和行为的语言,只需描述电路的功能和电路模块之间的相互关系,设计者更加专注电路设计整体性能,使电路更加优化,提高设计效率|21。
自动售货机是一种常见的智能自动化设备,由于不受人直接参与,所以广泛应用在办公楼、操场、高速服务K等场所,大大降低时间、地点的限制,在节省人力资源方面有着明显优势。
2自动售货机设计思路有限状态机(FSM Finite-state Machine)是•种用来进行对象行为建模的工具,其作用是表示有限个状态以及这些状态之间相互转移和动作等行为的数学模型。
有限状态机广泛应用于建模行为、硬件电路设计、软件工程和网络协议等的设计。
在数字系统设计中,当某一事物发生连续变化时,可以采用有限状态机设计思路提高设计效率,增加程序可读性,降低错误概率,有限状态机设计思路是数字系统中最常用的设计方法之一 [3]。
2.1自动售货机系统总体设计该售货机电路设计要求:(1)每次只能出售一种商品。
(2)所售商品种类:售货机只售4种商品,所售商品编号分 别用四位二进制数从右向左表示为0001、0010、0100、1000,对应价格分别为2元、3元、4元、5元。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
自动售饮料机销售控制单元设计设计要求:每次投币一枚,分为5角和1元两种硬币,每瓶饮料的价格是2.5元。
当投入2.5元时,则售一瓶饮料,若投入3元,则售一瓶饮料后,找零5角。
●自动售饮料机系统框图:●用状态机法设计该系统的销售控制单元:1.画状态转换图:确定输入输出:输入:时钟信号clk、复位信号reset, 五角输入信号wjin ,一元输入信号yyin,每次投币一枚输出:销售信号sell ,五角找零信号wjout状态划分:采用MOORE型状态机,应考虑所有可能的状态,售货机内钱币的数量,共有七个状态:S0:投币时,售货机内没有硬币S1: 投币时,售货机内已有5角S2: 投币时,售货机内已有1元S3:投币时,售货机内已有1元5角S4:投币时,售货机内已有2元S5:投币时,售货机内已有2元5角S6:投币时,售货机内已有3元说明:箭头上的参数表示输入信号:wjin yyin 圈里的参数表示:状态/sell wjout2. 状态编码:S0=3`b000;S1=3`b001;S2=3`b011;S3=3`b010;S4=3`b110;S5=3`b111;S6=3`b101:3.用Verilog_HDL对状态转换图进行描述描述方式:将CS 、NS、OL混合描述。
销售控制单元的Verilog_HDL程序:module auto_sell(wjin,yyin,clk,reset,sell,wjout);input clk,reset; //时钟、复位信号input wjin,yyin; //输入output sell,wjout; //输出reg sell,wjout;reg current_state; //现态寄存器parameter S0=3`b000;S1=3`b001;S2=3`b011;S3=3`b010;S4=3`b110;S5=3`b111;S6=3`b101;//状态编码always @(posedge clk or posedge reset)beginif (reset)s0;current_state=else(current_state)caseS0://0yuanbeginsell=0;wjout =0;if(wjin) current_state = S1;else if(yyin) current_state= S2;endS1://0.5yuanbeginsell=0;wjout =0;if(wjin) current_state= S2;else if(yyin) current_state= S3;endS2://1yuanbeginsell=0;wjout =0;if(wjin) current_state= S3;else if(yyin) current_state=S4;endS3: //1.5yuanbeginsell=0;wjout =0;if(wjin) current_state= S4;else if(yyin) current_state= S5;endS4://2yuanbeginsell=0;wjout =0;if(wjin) current_state= S5;else if(yyin) current_state=S6;endS5://2.5yuanbeginsell=1;wjout =0;if(wjin) current_state= S1;else if(yyin) current_state=S2;endS6://3yuanbeginsell=1; wjout =1;if(wjin) current_state= S1;else if(yyin) current_state=S2;enddefault: begin current_state= S0; sell=0;wjout =0; endendcaseendendmodule若用带流水线的MEALY型状态机实现:状态划分:可划分成五种状态:S0: 投币时,售货机内没有硬币S1: 投币时,售货机内已有5角S2: 投币时,售货机内已有1元S3:投币时,售货机内已有1元5角S4:投币时,售货机内已有2元说明:箭头上的参数表示wjin yyin/sell wjoutS0=0;S1=1;S2=2;S3=3;S4=4;3.用 Verilog_HDL对状态转换图进行描述描述方式:将CS 、NS、OL混合描述。
module sell(yyin,wjin, wjout,sell,reset,clk);input yyin,wjin,reset,clk; //输入output wjout,sell; //输出reg wjout,sell;reg[2:0] D; //状态寄存器parameter S0=0,S1=1,S2=2,S3=3,S4=4;//状态编码及定义always @(posedge clk)beginif(reset)e ndwjout=0;D=S0;begin sell=0;case(D)//0yuanS0:if(wjin) D=S1;D=S2;else if(yyin)//0.5yuanS1:if(wjin) D=S2;else if(yyin) D=S3;S2: //1yuanif(wjin) D=S3;if(yyin)D=S4;elseS3: //1.5yuanif(wjin) D=S4;begin D=S0; sell=1; wjout=0; endif(yyin)else//2yuanS4:if(wjin) begin sell=1; wjout=0;D=S0; endbegin D=S0;sell=1; wjout=1;end elseif(yyin)default: //其他状态begin sell=0;wjout=0;D=S0;endendcaseendendmodule改进后的程序:module sell(yyin,wjin, wjout,sell,reset,clk);input yyin,wjin,reset,clk;output wjout,sell;reg wjout,sell,wjqq,wjreset,yyqq,yyreset;reg[2:0] D;parameter S0=0,S1=1,S2=2,S3=3,S4=4;always@(negedge wjin or posedge wjreset)if(wjreset==1)wjqq=0;else if(wjqq==0)wjqq=1;else wjqq=0;always@(negedge yyin or posedge yyreset)if(yyreset==1)yyqq=0;else if(yyqq==0)yyqq=1;else yyqq=0;always @(posedge clk)beginif(!reset)wjreset=0;yyreset=0;endwjout=0;D=S0;begin sell=0;case(D)//0yuanS0:begin wjreset=0;yyreset=0;if(wjqq) begin D=S1; wjreset=1;endif(yyqq) beginD=S2;yyreset=1;endelseend//0.5yuanS1:Begin wjreset=0;yyreset=0;if(wjqq) begin D=S2; wjreset=1;endyyreset=1; endD=S3;beginif(yyqq)elseendS2: //1yuanbegin wjreset=0;yyreset=0;if(wjqq) begin D=S3; wjreset=1;endif(yyqq) begin D=S4;yyreset=1;endelseend//1.5yuanS3:begin wjreset=0;yyreset=0;if(wjqq) begin D=S4; wjreset=1;endif(yyqq) begin sell=1; wjout=0;D=S0; yyreset=1;end end else//2yuanS4:begin wjreset=0;yyreset=0;if(wjqq)begin sell=1; wjout=0;D=S0; wjreset=1;endif(yyqq) begin sell=1; wjout=1; yyreset=1;D=S0;end elseenddefault: //其他状态begin sell=0;wjout=0;D=S0;endendcaseendendmodule。