自动售货机课程设计
唐 山 学 院
《EDA技术》 课 程 设 计
题 目 自动售货机控制器设计
系 (部)
班 级
姓 名
学 号
指导教师
年 月 日至 月 日 共 周
年 月 日
课程设计任务书
课程设计成绩评定表
目 录
1 引言 ........................................................................................................................................ 1
2 VHDL介绍 ............................................................................................................................. 2
2.1硬件描述语言VHDL ................................................................................................... 2
2.2VHDL语言的特点 ........................................................................................................ 3
3 Quartus II介绍 ........................................................................................................................ 4
3.1 Quartus II软件介绍 ...................................................................................................... 4
3.2 Quartus II软件界面介绍 .............................................................................................. 4
3.2.1代码输入界面 ..................................................................................................... 4
3.2.2编译界面 ............................................................................................................. 5
3.2.3波形仿真界面 ..................................................................................................... 5
4自动售货机控制器设计与仿真 ............................................................................................. 7
4.1设计内容 ....................................................................................................................... 7
4.2输入与输出说明 ........................................................................................................... 7
4.3状态转换图 ................................................................................................................... 8
4.4程序及仿真波形分析 ................................................................................................... 8
5引脚设定及下载分析 ........................................................................................................... 18
5.1引脚设定 ..................................................................................................................... 18
5.2程序下载 ..................................................................................................................... 18
5.3结果分析 ..................................................................................................................... 19
6设计总结 ............................................................................................................................... 20
参考文献 .................................................................................................................................. 21
附录 .......................................................................................................................................... 22
1 引言
VHDL的英文全名是VHSIC(Very High Speed Integrated Circuit)Hardware Descriptiong Language, 翻译成中文就是超高速集成电路硬件描述语言,诞生于1982年。1987年底,VHDL被美国国防部确认为标准硬件描述语言 。
自IEEE公布了VHDL的标准版本,IEEE-1076之后,各EDA公司相继推出了自己的VHDL设计环境,或宣布自己的设计工具可以和VHDL接口。1993年,IEEE对VHDL进行了修订,从更高的抽象层次和系统描述能力上扩展VHDL的内容,公布了新版本的VHDL,即IEEE标准的1076-1993版本。
现在,VHDL和Verilog作为IEEE的工业标准硬件描述语言,又得到众多EDA公司的支持,在电子工程领域,已成为事实上的通用硬件描述语言。有专家认为,在新的世纪中,VHDL于Verilog语言将承担起大部分的数字系统设计任务。目前,它在中国的应用多数是用在FPGA/CPLD/EPLD的设计中。当然在一些实力较为雄厚的单位,它也被用来设计ASIC。
随着EDA技术的高速发展,电子系统的设计技术和工具发生了深刻的变化,大规模可编程逻辑器件CPLD/FPGA的出现,给设计人员带来了诸多方便。利用它进行产品开发,不仅成本低、周期短、可靠性高,而且具有完全的知识产权。利用VHDL语言设计自动售货机,使其实现自动售货,找零钱等功能,突出了其作为硬件描述语言的良好的可读性、可移植性和易读性等优点。此程序通过下载到特定芯片后,可应用于实际的自动售货机系统中。
本文基于FPGA开发系统,在QuartusII 7.2软件平台上,完成了自动售货机控制器的设计和与仿真,并下载到试验箱进行硬件实现。首先,本文介绍了QuartusII 7.2软件的基本使用方法和VHDL硬件描述语言的特点,采用VHDL 硬件描述语言描述自动售货机控制器,完成对电路的功能仿真;在设计过程中,重点探讨了自动售货机控制器的设计思路和功能模块划分;然后,初步探讨了电路逻辑综合的原理,该软件对自动售货机控制器电路进行了逻辑综合;最后,使用EDA实验开发系统进行电路的下载和验证,验证结果表明设计的自动售货机控制器完成了预期的功能。
2 VHDL介绍
2.1硬件描述语言VHDL
VHDL是一种硬件描述语言,它可以对电子电路和系统的行为进行描述。硬件描述语言(VHDL)是一种用于设计硬件电子系统的计算机语言,它用软件编程的方式来描述电子系统的逻辑功能、电路结构和连接形式,与传统的门级描述方式相比,它更适合大规模系统的设计。VHDL语言可读性强,易于修改和发现错误。早期的硬件描述语言,如ABEL、HDL、AHDL,由不同的EDA厂商开发,互不兼容,而且不支持多层次设计,层次间翻译工作要由人工完成。为了克服以上不足,1985年美国国防部正式推出了高速集成电路硬件描述语言VHDL,1987年IEEE采纳VHDL为硬件描述语言标准(IEEE-STD-1076)。
传统的硬件电路设计方法是采用自下而上的设计方法,即根据系统对硬件的要求,详细编制技术规格书,并画出系统控制流图;然后根据技术规格书和系统控制流图,对系统的功能进行细化,合理地划分功能模块,并画出系统的功能框图;接着就进行各功能模块的细化和电路设计;各功能模块电路设计、调试完成后,将各功能模块的硬件电路连接起来再进行系统的调试,最后完成整个系统的硬件设计。采用传统方法设计数字系统,特别是当电路系统非常庞大时,设计者必须具备较好的设计经验,而且繁杂多样的原理图的阅读和修改也给设计者带来诸多的不便。为了提高开发的效率,增加已有开发成果的可继承性以及缩短开发周期,各ASIC研制和生产厂家相继开发了具有自己特色的电路硬件描述语言(Hardware Description Language,简称HDL)。但这些硬件描述语言差异很大,各自只能在自己的特定设计环境中使用,这给设计者之间的相互交流带来了极大的困难。因此,开发一种强大的、标准化的硬件描述语言作为可相互交流的设计环境已势在必行。于是,美国于1981年提出了一种新的、标准化的HDL,称之为VHSIC(Very High Speed Integrated Circuit) Hardware Description Language,简称VHDL。这是一种用形式化方法来描述数字电路和设计数字逻辑系统的语言。设计者可以利用这种语言来描述自己的设计思想,然后利用电子设计自动化工具进行仿真,再自动综合到门电路,最后用PLD实现其功能。
VHDL是一种全方位的硬件描述语言,包括系统行为级。寄存器传输级和逻辑门多个设计层次,支持结构、数据流和行为三种描述形式的混合描述,因此VHDL几乎覆盖了以往各种硬件语言的功能,整个自顶向下或由下向上的电路设计过程都可以用VHDL来完成。VHDL还具有以下优点:
(1)VHDL的宽范围描述能力使它成为高层进设计的核心,将设计人员的工作重心提高到了系统功能的实现与调试,而花较少的精力于物理实现。
(2)VHDL可以用简洁明确的代码描述来进行复杂控制逻辑设计,灵活且方便,而且也便于设计结果的交流、保存和重用。
(3)VHDL的设计不依赖于特定的器件,方便了工艺的转换。
(4)VHDL是一个标准语言,为众多的EDA厂商支持,因此移植性好。 关于VHDL语言,最后需要说明的是:与常规的顺序执行的计算机程序不同,VHDL从根本上讲是并发执行的。因此,,我们通常称之为代码,而不是程序。在VHDL中,只有在进程(PROCESS)、函数(FUNCTION)和过程(PROCEDURE)内部的语句才是顺序执行的。
2.2VHDL语言的特点
具有良好的可读性,即容易被计算机接受,也容易被读者理解。使用期长,不会因工艺变化而使描述过时。因为VHDL的硬件描述与工艺无关,当工艺改变时,只需修改相应程序中的属性参数即可。
当电路系统采用VHDL语言设计其硬件时,与传统的电路设计方法相比较,具有如下的特点:
第一层次是行为描述。所谓行为描述,实质上就是对整个系统的数学模型的描述。一般来说,对系统进行行为描述的目的是试图在系统设计的初始阶段,通过对系统行为描述的仿真来发现设计中存在的问题。在行为描述阶段,并不真正考虑其实际的操作和算法用何种方法来实现,而是考虑系统的结构及其工作的过程是否能到达系统设计的要求。
第二层次是RTL方式描述。这一层次称为寄存器传输描述(又称数据流描述)。如前所述,用行为方式描述的系统结构的程序,其抽象程度高,是很难直接映射到具体逻辑元件结构的。要想得到硬件的具体实现,必须将行为方式描述的VHDL语言程序改写为RTL方式描述的VHDL语言程序。也就是说,系统采用RTL方式描述,才能导出系统的逻辑表达式,才能进行逻辑综合。
第三层次是逻辑综合。即利用逻辑综合工具,将RTL方式描述的程序转换成用基本逻辑元件表示的文件(门级网络表)。此时,如果需要,可将逻辑综合的结果以逻辑原理图的方式输出。此后可对综合的结果在门电路级上进行仿真,并检查其时序关系。
由自上而下的设计过程可知,从总体行为设计开始到最终的逻辑综合,每一步都要进行仿真检查,这样有利于尽早发现设计中存在的问题,从而可以大大缩短系统的设计周期。
由于目前众多制造PLD芯片的厂家,其工具软件均支持VHDL语言的编程。所以利用VHDL语言设计数字系统时,可以根据硬件电路的设计需要,自行利用PLD设计自用的ASIC芯片,而无需受通用元器件的限制。
3 Quartus II介绍
3.1 Quartus II软件介绍
Quartus II 是Altera公司单芯片可编程系统(SOPC)设计的综合性环境,也是适合SOPC的最全面的设计环境。拥有现场可编程门阵列(FPGA)和复杂可编程逻辑器件(CPLD)设计的所有解决方案。Altera的Quartus II可编程逻辑软件属于第四代PLD开发平台,该平台支持一个工作组环境下的设计要求,其中包括支持原理图、VHDL、VerilogHDL以及AHDL(Altera Hardware Description Language)等多种设计输入形式,内嵌自有的综合器以及仿真器,可以完成从设计输入到硬件配置的完整PLD设计流程。
Quartus II也支持第三方的仿真工具,对第三方EDA工具的良好支持也使用户可以在设计流程的各个阶段使用熟悉的第三方EDA工具。Quartus II还支持层次化设计,可以在一个新的编辑环境中对使用不同输入设计方式完成的模块进行调用,从而解决了原理图与HDL混合输入设计的问题,并且在输入之后,Quartus II的编译器将给出设计输入的错误报告。
Quartus II可以在XP、Linux以及Unix上使用,除了可以使用Tcl脚本完成设计流程外,提供了完善的用户图形界面设计方式。具有运行速度快,界面统一,功能集中,易学易用等特点。
Quartus II支持Altera的IP核,包含了LPM/MegaFunction宏功能模块库,使用户可以充分利用成熟的模块,简化了设计的复杂性、加快了设计速度。
Maxplus II 作为Altera的上一代PLD设计软件,由于其出色的易用性而得到了广泛的应用。目前Altera已经停止了对Maxplus II 的更新支持,Quartus II 与之相比不仅仅是支持器件类型的丰富和图形界面的改变。Altera在Quartus II 中包含了许多诸如SignalTap II、Chip Editor和RTL Viewer的设计辅助工具,集成了SOPC和HardCopy设计流程,并且继承了Maxplus II 友好的图形界面及简便的使用方法。
Altera 公司的Quartus II 作为一种可编程逻辑的设计环境, 由于其强大的设计能力和直观易用的接口,越来越受到数字系统设计者的欢迎。
3.2 Quartus II软件界面介绍
3.2.1代码输入界面
新建一个工程,选择File→New Project Wizard,在出现的对话框中输入工作路径和工程名称(应与实体名称相同),新建完工程后,选择File→New→VHDL File,然后新出现的空白窗口中输入代码,代码输入界面如图3-1所示:
图3-1 代码输入界面
3.2.2编译界面
代码输入完毕后,选择Processing→Start Compilation
或直接单击(Start Compilation)进行编译,编译界面如图3-2所示:
图3-2 编译界面
3.2.3波形仿真界面
编译没有错误后,选择File→New→Vector Waveform File,自己设置输入的值,设置好后单击进行波形仿真,仿真前界面如图3-3所示:
图3-3波形仿真前界面
仿真后界面如图3-4所示:
图3-4波形仿真后界面
4 自动售货机控制器设计与仿真
4.1设计内容
(1)设计一个自动售货机,此机能出售1元、5元、10元三种商品,出售哪种商品可由顾客按动相应的一个按键即可,并同时用数码管显示出此商品的价格;
(2)顾客投入硬(纸)币的钱数也是有1元、5元、10元三种,但每次只能投入其中的一种币,此操作通过按动相应的一个按键来模拟,并用数码管将投币额显示出来;
(3)顾客投币后,按一次确认键,如果投币额不足时则报警,报警时间3秒。如果投币额足够时自动送出货物(送出的货物用相应不同的指示灯显示来模拟),同时多余的钱应找回,找回的钱数用数码管显示出来;
(4)顾客一旦按动确认键3秒后,自动售货机即可自动恢复到初始状态,此时才允许顾客进行下一次购货操作;
(5)售货机还应具有供商家使用的累加卖货额的功能,累加的钱数要用数码管显示,显示2位即可。此累加器只有商家可以控制清零;
(6)此售货机要设有一个由商家控制的整体复位控制。
4.2输入与输出说明
(1)输入:
price1、price5、price 10分别控制选择1元、5元、10元三种商品; put1、put5、put10分别是顾客投入硬(纸)币的钱数1元、5元、10元; ok是确认输入,rst是由商家控制的整体复位控制输入。 (2)输出:
warning是警告输出(当按下“确认”后,若投入金额低于商品价格,则输出警告);
out1、out,out10分别是1元、5元、10元三种商品输出指示;
digitprice用于显示商品价格,digitput用于显示用户投入金额,digitback用于显示找回给用户的金额;
sumhigh表示累加的卖货额的高位,sumlow表示累加的卖货额的低位,累加的卖货额最高显示到99。
4.3状态转换图
状态转换图如图4-1所示:
图4-1状态转换图
4.4程序及仿真波形分析
(1) S0为初始状态,当顾客选择1元、5元或10元三种商品时分别跳转至S1、S2、S3状态,否则停留在S0状态,选择货物的钱数在数码管上显示出来,程序代码如下所示:
when s0=>warning
digitprice
if (price1='1' and price5='0' and price10='0') then nx
elsif (price1='0' and price5='1' and price10='0') then nx
elsif (price1='0' and price5='0' and price10='1') then
nx
else
nx
(2)当顾客投币为1元、5元或10元时,若当前为S1状态,则分别跳转至S4、S5、S6三种状态,投币钱数显示在数码管上,否则停留在S1状态,程序如下所示:
when s1=> digitprice
elsif (put1='0' and put5='1' and put10='0') then nx
elsif put1='0' and put5='0' and put10='1' then nx
nx
when s4=> digitprice
nx
when s5=> digitprice
nx
when s6=> digitprice
nx
此种情况下的仿真波形如图4-2所示:
图4-2仿真波形图
由图可知,当选中1元商品时,数码管digitprice显示1,其他数码管显示0,若顾客投入1元钱时,数码管digitput显示1,按下ok后,out1为“1”,数码管digitback显示0;若顾客投入5元钱时,数码管digitput显示5,按下ok后,out1为“1”,数码管digitback显示4;若顾客投入10元钱时,数码管digitput显示10,按下ok后,out1为“1”,数码管digitback显示9。
(3)当顾客投币为1元、5元或10元时,若当前为S2状态,则分别跳转至S7、S8、S9三种状态,投币钱数显示在数码管上,否则停留在S2状态,程序如下所示:
when s7=>digitprice
elsif(put1='1' and put5='0' and put10='0')then nx
nx
when s22=>digitprice
nx
when s23=>digitprice
if(put1='1' and put5='0' and put10='0')then nx
nx
when s24=>digitprice
nx
when s25=>digitprice
nx
end if;
此种情况下的仿真波形如图4-3和图4-4所示,由图4-3可知,当选中5元商品时,数码管digitprice显示5,若顾客投入1元钱时,数码管digitput显示1,按下ok后,out5为“0”,数码管digitback显示1,warning为“1”,三个上升沿即3秒后复位;若顾客投入5元钱时,数码管digitput显示5,按下ok后,out5为“1”,数码管digitback显示0;若顾客投入10元钱时,数码管digitput显示10,按下ok后,out5为“1”,数码管digitback显示5。
图4-3仿真波形图
由于此售货机具有累加投币功能,所以若选中5元商品,投入5个1元的,也可以买到一个5元商品, 数码管digitprice显示5,数码管digitput显示由1到5, 按下ok后,out5为“1”,数码管digitback显示0,其仿真波形图如图4-4所示:
图4-4仿真波形图
(4)当顾客投币为1元、5元或10元时,若当前为S3状态,则分别跳转至S10、S11、S12三种状态,投币钱数显示在数码管上,否则停留在S3状态,程序如下所示:
when s3=>digitprice
elsif (put1='0' and put5='1' and put10='0') then nx
elsif (put1='0' and put5='0' and put10='1') then nx
when s10=>digitprice
elsif(put1='1' and put5='0' and put10='0')then nx
nx
end if;
when s26=>digitprice
nx
when s27=>digitprice
nx
when s28=>digitprice
nx
when s29=>digitprice
nx
when s30=>digitprice
nx
when s31=>digitprice
nx
when s32=>digitprice
else
nx
when s33=>digitprice
nx
when s34=>digitprice
nx
when s11=>digitprice
elsif(put1='0' and put5='1' and put10='0')then nx
nx
when s35=>digitprice
nx
when s12=>digitprice
nx
此种情况下的仿真波形如下图,由4-5图可知,当选中10元商品时,数码管digitprice显示10,若顾客投入1元钱时,数码管digitput显示1,按下ok后,out10为“0”,数码管digitback显示1,warning为“1”,三个上升沿即3秒后复位;若顾客投入5元钱时,数码管digitput显示5,按下ok后,out10为“0”,数码管digitback显示5,warning为 “1”,三个上升沿即3秒后复位;若顾客投入10元钱时,数码管digitput显示10,按下ok后,out10为“1”,数码管digitback
显示0。
图4-5仿真波形图
由于此售货机具有累加投币功能,所以若想买10元的商品,顾客可以投入两个5元的或投入10个1元的,其仿真波形分别如图4-6和图4-7所示:
图4-6投两个5元仿真波形图
图4-7投10个1元仿真波形图
(5)延时子程序如下所示: if(a='1') then temp:=temp+1; if(temp=3)then b
3个上升沿即表示3秒的延时,当按下ok后经过3个上升沿自动售货机将复位进入S0状态。
(6)累加售货额程序
process(out1,out5,out10,clk) variable t:integer range 0 to 3;
variable temp3,temp4:integer range 0 to 9; begin
if(rst='1')then temp3:=0; temp4:=0;
elsif(clk'event and clk='1'and(out1='1' or out5='1' or out10='1'))then t:=t+1;
if(t=3 and out1='1')then
temp3:=temp3+1;
end if;
if(t=3 and out5='1')then temp3:=temp3+5; end if;
if(t=3 and out10='1')then temp4:=temp4+1; end if;
if(temp3>9)then temp4:=temp4+1; temp3:=temp3-10; end if;
if(t=4)then t:=0; end if; end if;
sumlow
程序中t表示延时,当上升沿到来并且有商品输出时,t开始加1,当加到4时在重新计数。当延时3秒并且有商品输出时,累加售货额将开始累加钱数并显示在数码管上,当累加的售货额低于10元时,sumhigh不变,sumlow加数,当累加售货额不低于10元时,sumlow显示的结果为sumlow-10的结果,sumhigh进行加数。例如,若先卖出了一个5元的商品,则sumlow显示5,sumhigh显示0;若再卖出一个10元的商品,则低位sumlow显示仍为5,高位sumhigh会显示1。
5 引脚设定及下载分析
5.1引脚设定
选择Assignments→Pins然后设定引脚,引脚设定界面如图5-1所示:
图5-1引脚设定界面
5.2程序下载
引脚设定好后,将下载盒子插到USB接口,点击
,选择Hardward和start
当下载到100%时,就可以通过试验箱进行验证,下载验证如图5-2所示:
图5-2程序下载验证
图5-2显示的是卖了两个10元的商品和一个5元的商品,累加的金额为25元。
5.3结果分析
通过上面的步骤将程序代码下载到实验箱的FPGA芯片中,并验证了在仿真中的结果的正确性。自动售货机能出售1元、5元、10元三种商品,出售哪种商品可由顾客按动相应的一个按键即可,并同时用数码管显示出此商品的价格;顾客投入硬(纸)币的钱数也是有1元、5元、10元三种,但每次只能投入其中的一种币,此操作通过按动相应的一个按键来模拟,并同时用数码管将投币额显示出来;顾客投币后,按一次确认键,如果投币额不足时则报警,报警时间3秒。如果投币额足够时自动送出货物(送出的货物用相应不同的指示灯显示来模拟),同时多余的钱应找回,找回的钱数用数码管显示出来;顾客一旦按动确认键3秒后,自动售货机即可自动恢复到初始状态,此时才允许顾客进行下一次购货操作;此售货机设有一个由商家控制的整体复位控制,当整体复位信号有效时,所有输出均为零。
例如,当选中1元商品时,数码管digitprice显示1,其他数码管显示0,若顾客投入1元钱时,数码管digitput显示1,按下ok后,out1为“1”,数码管digitback显示0;若顾客投入5元钱时,数码管digitput显示5,按下ok后,out1为“1”,数码管digitback显示4;若顾客投入10元钱时,数码管digitput显示10,按下ok后,out1为“1”,数码管digitback显示9。当选中5元商品时,数码管digitprice显示5,若顾客投入1元钱时,数码管digitput显示1,按下ok后,out5为“0”,数码管digitback显示1,warning为“1”,三个上升沿即3秒后复位;若顾客投入5元钱时,数码管digitput显示5,按下ok后,out5为“1”,数码管digitback显示0;若顾客投入10元钱时,数码管digitput显示10,按下ok后,out5为“1”,数码管digitback显示5。当选中10元商品时,数码管digitprice显示10,若顾客投入1元钱时,数码管digitput显示1,按下ok后,out10为“0”,数码管digitback显示1,warning为“1”,三个上升沿即3秒后复位;若顾客投入5元钱时,数码管digitput显示5,按下ok后,out10为“0”,数码管digitback显示5,warning为 “1”,三个上升沿即3秒后复位;若顾客投入10元钱时,数码管digitput显示10,按下ok后,out10为“1”,数码管digitback显示0。
6 设计总结
通过这两周的课程设计,我深深的体会到了课程设计的重要性,课程设计不仅可以让我们将这学期的理论知识运用到实际设计中,而且在设计期间可以考察我们独立思考的能力和动手操作的能力,加深了对课本知识的理解。做课程设计需要我们自己编程序,自己仿真,自己下载到试验箱上并验证结果的正确与否。在进行下载验证的时候,我遇到了关于如何用数码管显示的问题,我以前只会用七段译码管去显示数字,而不知道如何用普通的数码管显示,后来经过向同学请教,终于弄明白了普通数码管的使用原理。还有一个实现起来比较困难的功能就是如何用10个1元的钱币去买1个10元商品,后来经过不断的修改程序、添加状态、仿真调试,最终出现了正确的仿真波形,将管脚对应好并下载成功后,实现了预期的功能,这使我非常高兴。
通过这次的课程设计,我已经可以熟练地使用QuartusII软件完成程序的编写、编译、仿真、下载等操作步骤,并且当编译出现错误后,能够找到错误原因,并且可以自己调试将问题解决,实现了预期所要求的自动售货、找零、警告、复位等功能,这更加深了我对EDA这门课程的兴趣。
总之,这次的课程设计使我得到了很多,学到了很多在课本上学不到的知识,我觉得这对以后我们找工作是非常有用的,所以我非常感谢学校能给我们这么一个机会,同时也非常感谢我们的指导老师,谢谢她们这两周对我们的耐心指导。
参考文献
[1] Voknei A.Pedroni.《VHDL数字电路设计教程》.电子工业出版社,2008.5 [2] 潘松,黄继业.《EDA技术实用教程》(第二版).科学出版社,2005.2 [3] 焦素敏.《EDA应用技术》.清华大学出版社,2002.4
[4] 曾繁泰,陈美金.VHDL程序设计[M].北京:清华大学出版社,2001
[5] 张昌凡等.可编程逻辑器件及VHDL设计技术[M].广州:华南理工大学出版社,2001
附录
library ieee;
use ieee.std_logic_1164.all; entity sell is
port(price1,price5,price10,put1,put5,put10,ok,clk,rst:in std_logic; warning,out1,out5,out10:buffer std_logic;
digitprice,digitput,digitback:out integer range 0 to 15; sumhigh,sumlow:buffer integer range 0 to 9); end sell;
architecture sell of sell is
type state is(s0,s1,s2,s3,s4,s5,s6,s7,s8,s9,s10,
s11,s12,s13,s14,s15,s16,s17,s18,s19,s20,s21,s22,s23, s24,s25,s26,s27,s28,s29,s30,s31,s32,s33,s34,s35); signal pr,nx:state; signal a,b:std_logic; begin
process(clk,rst)
variable temp:integer range 0 to 3; begin
if (rst='1')then pr
elsif (clk'event and clk='1') then pr
-- temp:=0; end if; end if; end process;
process(price1,price5,price10,put1,put5,put10,ok,b,pr) begin
if((pr=s0)or(pr=s1)or(pr=s2)or(pr=s3)or(pr=s4)or(pr=s5)or(pr=s6) or(pr=s7)or(pr=s8)or(pr=s9)or(pr=s10)or(pr=s11)or(pr=s12)) then
a
s0=>warning
if (price1='1' and price5='0' and price10='0') then nx
elsif (price1='0' and price5='1' and price10='0') then nx
elsif (price1='0' and price5='0' and price10='1') then nx
nx
when s1=>digitprice
elsif (put1='0' and put5='1' and put10='0') then nx
elsif put1='0' and put5='0' and put10='1' then nx
nx
when s4=>digitprice
nx
when s5=>digitprice
nx
when s6=>digitprice
if (ok='1') then nx
nx
when s2=>digitprice
elsif (put1='0' and put5='1' and put10='0') then nx
elsif (put1='0' and put5='0' and put10='1') then nx
nx
when s7=>digitprice
elsif(put1='1' and put5='0' and put10='0')then nx
nx
when s22=>digitprice
nx
when s23=>digitprice
nx
when s24=>digitprice
nx
end if;
when s25=>digitprice
nx
when s8=>digitprice
nx
when s9=>digitprice
nx
when s3=>digitprice
elsif (put1='0' and put5='1' and put10='0') then nx
elsif (put1='0' and put5='0' and put10='1') then nx
nx
when s10=>digitprice
elsif(put1='1' and put5='0' and put10='0')then nx
nx
when s26=>digitprice
else
nx
when s27=>digitprice
nx
when s28=>digitprice
nx
when s29=>digitprice
nx
when s30=>digitprice
nx
when s31=>digitprice
nx
when s32=>digitprice
nx
when s33=>digitprice
if(put1='1' and put5='0' and put10='0')then
nx
else
nx
end if;
when s34=>digitprice
nx
else
nx
end if;
when s11=>digitprice
nx
elsif(put1='0' and put5='1' and put10='0')then
nx
else
nx
end if;
when s35=>digitprice
nx
else
nx
end if;
when s12=>digitprice
nx
else
nx
end if;
when s13=>out1
digitprice
if (b='1') then
nx
else
nx
end if;
when s14=>out1
digitprice
if (b='1') then
nx
else
nx
end if;
when s15=>out1
digitprice
if (b='1') then
nx
else
nx
end if;
when s16=>out1
digitprice
if (b='1') then
nx
else
nx
end if;
when s17=>out1
digitprice
if (b='1') then
nx
else
nx
end if;
when s18=>out1
digitprice
if (b='1') then
nx
else
nx
end if;
when s19=>out1
digitprice
if (b='1') then
nx
else
nx
end if;
when s20=>out1
digitprice
if (b='1') then
nx
else
nx
end if;
when s21=>out1
digitprice
if (b='1') then
nx
else
nx
end if;
end case;
end process;
process(out1,out5,out10,clk)
variable t:integer range 0 to 3;
variable temp3,temp4:integer range 0 to 9;
begin
if(rst='1')then
temp3:=0;
temp4:=0;
elsif(clk'event and clk='1'and(out1='1' or out5='1' or out10='1'))then t:=t+1;
if(t=3 and out1='1')then
temp3:=temp3+1;
end if;
if(t=3 and out5='1')then
temp3:=temp3+5;
end if;
if(t=3 and out10='1')then
temp4:=temp4+1;
end if;
if(temp3>9)then
temp4:=temp4+1;
temp3:=temp3-10;
end if;
if(t=4)then
t:=0;
end if; end if;
sumlow