自动售货机 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技术成为电子设计工程师的新宠。
基于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编写自动售货机的控制代码,包括投币、选择商品、出货等模块。
自动投币售货机的控制系统设计verilog

工学院二级项目报告二级项目题目:自动投币售货机的控制系统设计指导教师:系别:电子工程系专业:通信工程完成时间:2017年9月目录1. 项目内容与要求 (3)2. 画出投币售货机的控制系统的状态表,状态图,和状态编码方式 (4)3. 用Verilog实现售货机的控制系统描述,并进行仿真 (5)3.1 time.v (5)3.2 state.v (7)3.3 仿真 (10)4. 用C/C++语言实现售货机的有限状态机,并进行测试和仿真 (11)4.1 gcov代码 (11)4.2 仿真 (14)1. 项目内容与要求投币售货机的接收中国的硬币1元和5角,当售货机收到1.5元时出货,无法找零。
(1.5元可以是3个5角,或是1个1元和1个5角)项目以仿真形式完成。
1.画出投币售货机的控制系统的状态表,状态图,和状态编码方式。
2.用Verilog实现售货机的控制系统描述,并进行仿真。
要求仿真测试中给出Code Coverage数据,Code Coverage概念可见PDF 文档。
3.用C/C++语言实现售货机的有限状态机,并进行测试和仿真。
同样要求有测试的Code Coverage数据,具体的工具可用gcc自带的gcov或者是VC的coverage工具4.秋季学期开学前,每个小组需提交一份项目的报告,并作PPT陈述。
2.画出投币售货机的控制系统的状态表,状态图,和状态编码方式3.用Verilog实现售货机的控制系统描述,并进行仿真3.1 time.v`timescale 1ns/1nsmodule times;reg T;reg clk;reg reset;wire A;wire P;state FSM(T,reset,clk,A,P);initial beginreset=0;clk = 0;#80 reset=1;#20 $stop;endalways #10 clk=~clk; initial beginT=1;#20;T=1;#20;T=0;#20;reset=~reset;T=1; #20T=0;#20;endstate uut(.reset(reset),.clk(clk),.T(T),.A(A),.P(P));endmodule3.2 state.vmodule state(T,clk,reset,A,P);input T,clk,reset;output A,P;reg A,P;reg[2:0]y,Y;parameter[2:0] start=2'b000,half=2'b001,one=2'b010,reject=2'b011,paid=2'b100;always @(negedge reset or posedge clk)if(reset==0)y<=start;else y<=Y;//Define the next state always@(T or y) beginY = 3'b000 ;A=0;P=0;case(y)start:beginif(T) Y=one;else if(!T) Y=half;A=1;P=0;endhalf:beginif(T) Y=paid;else if(!T) Y=one;A=1;P=0;endone:beginif(T) Y=reject;else if(!T) Y=paid;A=1;P=0;endreject:beginif(T) Y=reject;else if(!T) Y=paid;A=0;P=0;endpaid:beginif(T) Y=one;else if(!T) Y=half;A=1;P=1;endendcaseendendmodule3.3 仿真4.用C/C++语言实现售货机的有限状态机,并进行测试和仿真4.1 gcov代码-: 0:Source:fsm.c-: 0:Graph:fsm.gcno-: 0:Data:fsm.gcda-: 0:Runs:10-: 0:Programs:1-: 1:#include <stdio.h>-: 2:-: 3:typedef enum //定义状态-: 4:{-: 5: START, //初始-: 6: STATE1, //收入0.5 RMB-: 7: STATE2, //收入1.0 RMB-: 8: REJECT, //找零-: 9: PAID, //出货-: 10:}STATE;-: 11:10: 12:int main()-: 13:{10: 14: int input = 0;10: 15: int input0 = 0; //投入零钱不符合要求时,用于保存原有数据10: 16: int a=1 ;-: 17:10: 18: STATE current_state = START;-: 19:116: 20: while(a<=1)-: 21: {-: 22:96: 23: switch(current_state) //状态转换情况-: 24: {-: 25: case START:-: 26:18: 27: input0 = input;18: 28: printf("accepting\n");18: 29: scanf("%d",&input);-: 30:-: 31:18: 32: if(input == 0)-: 33: {9: 34: current_state = STATE1;9: 35: printf("receive 0.5 RMB\n");-: 36: }9: 37: else if(input == 1)-: 38: {1: 39: current_state = STATE2;1: 40: printf("receive 1.0 RMB\n");-: 41: }-: 42: else-: 43: {8: 44: printf("error,return your money\n");8: 45: input = input0;-: 46: }18: 47: break;-: 48:-: 49: case STATE1:-: 50:23: 51: input0 = input;23: 52: printf("accepting\n");23: 53: scanf("%d",&input);-: 54:23: 55: if(input == 0)-: 56: {#####: 57: current_state = STATE2;#####: 58: printf("receive 1.0 RMB\n");-: 59: }23: 60: else if(input == 1)4.2 仿真输入1元,1元,售货机出货物,且找零输入2元,不符合投币要求,显示错误,退出程序此时代码覆盖率为62.30%,输入不同,代码率也会有所变化所能得到的最高代码覆盖率为95.08%,情况之一如下,输入2 0 1 1 1 1 0 0 2 1 2 最后三行为所生成文件。
基于FPGA自动售货机

摘要本课题是基于Verilog HDL语言的小型自动售货机。
采用Verilog HDL在ModelsimSE6.2B软件平台进行编译和仿真。
在此次设计中,主要采用有限状态机(FSM)的设计,在投币选货状态和找零状态在这两个状态间进行转移。
从而实现货物的选择、货币运算、出货控制、余额显示以及找零等功能。
该售货机系统能够识别两种硬币,两种纸币。
有五种不同价格的商品可供选择,并且通过显示译码电路,可在LED显示器显示余额,同时具备找零、机器存有硬币不足LED 亮起报警、缺货LED亮起报警等功能。
现代的自动售货机有使用方便快捷,可以全天候24小时工作,占地少,成本低,维护简单等优点,有着广阔的前景。
采用FPGA方式用Verilog HDL硬件描述语言,设计简易的自动售货机,其编程简单,开发周期短,硬件运行速度快,开发成本低,稳定性高等优点。
关键词:自动售货机; Verilog HDL;有限状态机;Modelsim;ABSTRACTThis topic design a simple vending machine is based on the FPGA chip. EP2C35 chip, and DE2 development board for the hardware platform, the use of Verilog HDL to compile and simulation in the Quartus Ⅱ software platform, and through the DE2 development achieve the basic functions of a Si mple vending machine.board by to download code to the chip. In this design,it used of finite state machine (FSM) design, choice of goods state, shipment status and give change coin state in the three inter-state transfer, in order to achieve the choice of goods, monetary operations, the cargo control, features such as display and give change. The vending machine system to identify three kinds of coins, there are five kinds of goods at different prices to choose from, and by showing decoding circuit, in DE2 onboard LED display shows the balance, both functions give change. Modern vending machines are convenient, it can work 24 hours a day, covers an area of small, low cost, simple maintenance, there are broad prospects. Manner with the use of FPGA hardware description language Verilog HDL, design simple vending machine, the programming is simple, short development cycles, fast hardware, the development of low cost, high stability.Key words: vending machines; Verilog HDL; Finite state machine; FPGA; DE2 development board;目录绪论..............................................................1 第一章系统方案设计...............................................31.1 人机交换界面设计..........................................31.2 系统方案设计..............................................41.2.1 系统方案确定..........................................5 第二章系统各模块硬件设计.........................................72.1 DE2开发板介绍.............................................72.2 自动售货机各模块设计.....................................82.2.1 自动售货机主体设计...................................82.2.2 LED显示设计方案.....................................92.2.3 货币输入信号设计方案................................102.2.4 出货显示设计方案....................................11 第三章系统的软件设计............................................123.1 EDA工具软件介绍.........................................133.2 软件设计总方案...........................................143.3 售货机主芯片程序设计方案................................153.4 BCD-LED七段数码显示译码器...............................173.5 硬币输入信号程序设计方案................................183.6 出货显示程序设计方案....................................193.7 自动售货机各部分组合连接设计............................20 第四章调试及仿真...............................................214.1 用Quartus Ⅱ完成PFGA设计步骤...........................214.2 自动售货机波形仿真结果..................................214.2.1 自动售货机波形仿真..................................214.2.2 输入信号处理程序波形仿真............................234.2.3 BCD-LED七段数码显示译码器波形仿真..................234.2.4 出货显示译码器波形仿真..............................244.2.5 自动售货机主芯片程序仿真波形.......................254.3 下载、仿真及测试..........................................25 结论..............................................................26 致谢.............................................................27 参考文献..........................................................28 附录1(程序源代码)...............................................29 附录2(整体设计原理图)...........................................35绪论自动售货机最早出现在二十世纪五、六十年代的西欧,英国是较早实行自动售货机售货的国家之一。
自动售货机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实现自动售货机

东华理工大学EDA课程设计报告课程设计题目:自动售货控制系统设计学院机械与电子工程学院学生姓名王磊班级080612学号********指导老师黄乡生(教授)2011年6月18日摘要本设计是以现场可编程逻辑器件(FPGA)为核心的自动售货机,利用QuartusII软件编写verilog HDL 硬件描述语言程序以实现自动售货功能。
本程序要求能够完成对货物信息的存取,硬币处理,余额计算,取消购物时退款和显示功能。
关键字:FPGA、Verilog HDL、自动售货机、QuartueIIAbstractThis design is an auto-vendingmachine based on field programmavle logic devices(FPGA).We use QuartusII to write procedure in verilog HDL which is a language to describe hardware.The procedure will realize the function of auto-vending machine.Keywords:FPGA、Verilog HDL、auto-vending machine、QuartueII一、设计要求设计一个自动售货控制系统,它能够完成对货物信息的存取,硬币处理余额计算,取消购物时退款和显示等功能。
(1)假定自动售货机可以出售四种货物,每种商品的数量和单价在初始化时设定,并存储在存储器中。
(2)采用模拟开关信号模拟5角和1元硬币购物,并通过按键选择所需商品。
(3)系统能够根据用户输入的硬币,判断累计货物是否足够,当所投硬币累计达到或者超过购买者所选商品价格时,则根据顾客的要求自动售货,并找回剩余的硬币,然后回到初始状态。
当所投硬币不够时,则给出提示,并通过一个复位键退回所有硬币,然后回到初始状态。
二、设计提示系统框图如下:系统按功能可以分为信号输入、控制器、译码显示等模块。
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元。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
SOPC及EDA技术课程结业报告题目:基于状态机的自动售货机设计院(系)电气工程及其自动化姓名学号班号基于状态机的自动售货机设计一.实验目的1. 学习FPGA入门知识,了解FPGA的编程形式;2. 掌握Quartus II的使用步骤;3. 掌握基于状态机原理的自动售货机设计过程。
二.实验原理自动售货机是可完成无人自动售货,集光、机、电一体化的商业自动化设备。
自动售货机不受任何场地限制,方便快捷,可以每天24小时售货,因此深受上班族的欢迎,很多城市的公共场所里面都放置有自动售货机,出售的商品五花八门,从饮料、零食、香烟、糖果,到牙刷、方便面、自动照相机。
近年来,我国的自动售货机行业突飞猛进:在汽车总站、商厦、医院、小区、学校等地区纷纷涌现出自动售货机的踪迹。
这种方便快捷的购物方式越来越受到人们的青睐,同时也是现代化城市配套设施的需求。
因为自动售货机作为社会上完成商品零售和综合服务的独立设施,所以必须要求它的结构可靠、稳定而且执行效率高。
传统的自动售货机控制系统采用单片机作为控制核心,这样不仅会在输入输出接口上做大量的工作,而且系统的抗干扰性也比较差。
可编程控制器(Programmable Logical Controller,简称PLC)是综合了计算机技术、自动控制技术和通讯技术而发展起来的一种新型的工业控制装置,它具有可靠性高、编程简单、维护方便等优点,已在工业控制领域得到广泛地应用。
PLC是以CPU为核心, 综合了计算机技术和通信技术发展起来的一种通用的工业自动控制装置, 是现代工业控制的三大支柱(PLC、机器人和CAD/CAM) 之一。
PLC的工作原理与计算机的工作原理基本是一致的, 可以简单地表述为在系统程序的管理下, 通过运行应用程序完成用户任务。
但是PLC也有它自己的特点, PLC在确定了工作任务, 装入了专用程序后成为一种专用机, 它采用循环扫描工作方式, 系统工作任务管理及应用程序执行都是用循环扫描方式完成的。
目前,可编程控制器在国内外已广泛应用于钢铁、石油、化工、电力、建材、机械制造、汽车、轻纺、交通运输、环保等各行各业。
自动售货机以其新奇、文明、高档、灵活方便等优点深受广大市民青睐。
自动售货机最基本的功能是对投入的货币进行运算,并根据所投入的货币数值判断是否能够购买某种商品, 并做出相应的反映。
因此, 售货机应能够辨识机内包含的商品, 能够对所投入的币值进行累计, 并提供所要购买的商品。
当按下选择商品的按钮时,自动售货机根据投入的币值, 起动电机, 提取商品到出货口, 顾客取出商品,完成此次交易。
在实际生活中,我们见到的售货机可以销售一些简单的日用品,如饮料、常用药品和小的生活保健用品等。
售货机的基本功能就是对投入的货币进行运算,并根据货币数值判断是否能够购买某种商品,并做出相应的反应。
举一个简单的例子来说明。
例如:售货机中有8种商品,其中01号商品(代表第一种商品)价格为1.50元,02商品为2.50元,其余类推。
现投入1个1元硬币,当投入的货币超过01商品的价格时,01商品的选择按钮处应有变化,提示可以购买,其他商品同比。
当按下选择01商品的价格时,售货机进行减法运算,从投入的货币总值中减去01商品的价格同时启动相应的电机,提取01号商品到出货口。
此时售货机继续进行等待外部命令,如继续交易,则同上,如果此时不再购买而按下退币按钮,售货机则要进行退币操作,退回相应的货币,并在程序中清零,完成此次交易。
由此看来,售货机一次交易要涉及加法运算、减法运算以及在退币时的除法运算,这是它的内部功能。
还要有货币识别系统和货币的传动来实现完整的售货、退币功能。
为简单计,本次实验只要求设计一个简单的自动售货机逻辑电路。
它的投币口每次只能投入一枚五角或一元的硬币。
投入一元五角钱硬币后机器自动给出一杯饮料;投入两元(两枚一元)硬币后,在给出饮料的同时找回一枚五角的硬币,投币时只能一个一个地投。
三.实验步骤及实验结果1.电路变量分析根据设计要求,共有七个变量。
clk:时钟输入;reset:系统复位信号;half_dollar:代表投入五角硬币;one_dollar:代表投入一元硬币;half_out:售货机找回一枚五角硬币信号;dispense:机器售出一瓶饮料;collect:提示投币者取走饮料。
2.状态转换图的确定该电路一共用3个状态就可以完成设计要求。
状态idle,表示为投入任何硬币状态;状态half,表示投入五角钱的状态;状态one,表示投入一元钱的状态。
当投入一元五角钱时,给出一杯饮料并转到状态idle;投入两元(两枚一元)硬币后,在给出饮料的同时找回一枚五角的硬币并转到状态idle,状态装换图如下图1所示:图 1 自动售货机状态图图1中如果当前状态为idle(即未投入硬币),则投入五角钱即输入为01则状态转到half,在状态half下再投入五角钱则转到one;在idle状态投入一元钱即输入为10则直接转到状态one,在one状态下如果再投入五角钱,则输出dispense为1、half_out为0,表示机器售出一瓶饮料,售货机不找回五角硬币。
3.利用Quartus II软件仿真实现3.1新建工程machine_sell选择File>New Project Wizard,新建工程文件,输入工程名为machine_sell (注意此处工程名与工程的顶层实体名必须一致)。
在Available devices列表中选择FPGA型号EP2C70F896C6(本实验为仿真实验,此处不作硬性要求)。
3.2设计输入在当前工程下,选择File>New菜单,接着选择Verilog HDL File,单击OK,打开Text Editor。
选择File>Save as菜单,将文件保存到工程下,文件名为machine_sell,保存类型为Verilog HDL File,则生成machine_sell.v文件。
3.3Verilog语言描述利用Verilog HDL语言编写的源程序如下:module machine_sell(one_dollar,half_dollar,collect,half_out, dispense,reset,clk);parameter idle=2'b00, half=2'b01, one=2'b10; //代表投入币值的几种情况 input one_dollar,half_dollar,reset,clk;output collect,half_out,dispense;reg collect,half_out,dispense;reg[1:0] D;always@(posedge clk)beginif(reset)begindispense=0;collect=0;half_out=0;D=idle;endelsecase(D)idle:if(half_dollar)begindispense=0;collect=0;half_out=0;D=half;endelse if(one_dollar) begindispense=0;collect=0;half_out=0;D=one;endelsebegindispense=0;collect=0;half_out=0;D=idle;endhalf:if(half_dollar)begindispense=0;collect=0;half_out=0;D=one;endelse if(one_dollar) begindispense=1;collect=1;half_out=0;D=idle;endelsebegindispense=0;collect=0;half_out=0;D=half;endone:if(half_dollar)begindispense=1;collect=1;half_out=0;D=idle;endelse if(one_dollar)begindispense=1;collect=1;half_out=1;D=idle;endelsebegindispense=0;collect=0;half_out=0;D=one;endendcaseendendmodule3.4仿真电路图保存上述源程序,进行综合编译。
编译无误后,生成仿真电路图(RTL viewer)如下图2所示:图 2 自动售货机仿真电路图3.5仿真结果在同一工程下创建波形文件(Vector Waveform File)machine_sell.vwf如下图3所示:图 3 波形文件单击Simulator Settings,将Simulation mode设置为Functional,最后单击仿真按钮启动功能仿真。
仿真结果如下图4所示:图 4 仿真波形图由图4所示仿真结果可知:当reset为1时,系统复位,状态机的状态为初始状态idle。
投入五角硬币,状态转到half状态,再投入五角状态转到one状态,再投入五角状态回到idle状态,同时输出信号dispense和collect为1,驱动执行机构售出一瓶饮料,并提示投币者取走饮料。
四.实验结果分析1.本次仿真实验通过对自动售货机状态转换图的分析得出其工作原理,并根据工作原理编写出Verilog HDL源程序;2.通过仿真验证,该设计能较好的实现自动售货机的基本功能;3.根据仿真结果,仿真输出与理论值相比有一定的延时,这是系统误差,难以消除。
五.实验结论及总结通过此次仿真实验—基于状态机的自动售货机的设计,我掌握了Quartus II 软件的基本使用方法以及Verilog HDL语言的语法特点,可以初步编写一些逻辑功能较为简单的源程序。
同时,通过此次实验,我掌握了设计工作的完整流程,为以后的课程设计积累了宝贵的经验。
最后,实验过程中难免遇到一些问题,我们要冷静分析,找出原因。
总之,通过此次实验,我学到了许多有益的知识。