第一篇:2012EDA课设自动售货机
基于VHDL自动售货机的设计
摘要
基于FPGA的自动售货机的设计,主要完成的任务是使用VHDl语言,在MAX+PLUSSII上完成电路的设计,程序的编译,基本功能的完善、模拟整个自动售货机的工作过程。电路的设计模块分为几个模块:主控模块、译码模块、顶层模块。各个模块完成不同的任务,合在一起就构成了一个自动售货机。在售货机的设计过程中,使用VHDL语言,根据各个模块的不同功能和它们之间的控制关系进行编写。软件模块直接在MAX+PLUSSII上进行。进入21世纪,随着人们对效率的追求,人工售货已不能不满足人们的需求。对此,自动售货机的设计就用了很大的应用空间和市场。
基于FPGA的自动售货机设计,采用软件开发模块,开发成本底,而且功能设计上有很大的灵活度,需要在软件上进行简单的修该就能实现不同的功能要求,能够满足不同的环境要求。
关键字:自动售货机;FPGA;仿真;VHDL;MAX+PLUSSII
目录
第一章 绪论......................................................................................4 第二章 自动售货机的设计................................................................4 2.1 设计说明.................................................................................4 2.1.1 流程说明.......................................................................4 2.1.2各模块说明....................................................................5 2.1.3各模块的连接.................................................................6 2.2状态之间的转换......................................................................6 第三章 仿真时序图.............................................................................7 3.1主控模块的仿真......................................................................7 谢 辞..............................................................................................10 参考文献............................................................................................11 附录...................................................................................................11
第一章 绪论
随着科技的发展和社会的进步,自动化商业机械有了越来越广泛的的应用,自动售货机作为自动化商业机械的代表被广泛用于公共场所自动售货,给人们的生活带来了极大的方便。特别在发达的国家,自动售货机已经十分普及,自动售货机可售出各种成型包装的小商品,各种袋装,盒装,软瓶装等小商品。因其无需专人值守而可以每天24 小时售货,被称为“无人小超市”。在我国,由于多种原因,自动售货机的市场推广缓慢,随着商品市场的不断繁荣,自动售货机和自动服务设施必将逐步得到广泛的应用。
本文设计研究自动售货机的主要功能模块,主要包括货币处理模块、余额计算模块、显示模块,延时和时控模块。相应的功能有选择货物,多次购买,出货找零。
本文是通过使用VHDL语言,基于KX GW48FPGA芯片,并通过使用MAXPLUSS II软件进行程序设计,模拟仿真,功能验证,以更好的来理解和掌握自动售货机控制系统的工作原理和设计方法,以及学习和掌握基于EDA的电子产品设计方法,进一步加深对VHDL语言以及MAXPLUSS II 软件、FPGA可编程芯片的认识与了解。
FPGA是现场可编程门阵列(Field programmable gates array)的英文简称。是有可编程逻辑模块组成的数字集成电路(IC)。这些逻辑模块之间用可配置的互联资源。设计者可以对这些器件进行编程来完成各种各样的任务
PLD/FPGA是近几年集成电路中发展最快的产品。由于PLD性能的高速发展以及设计人员自身能力的提高,可编程逻辑器件供应商将进一步扩大可编程芯片的领地,将复杂的专用芯片挤向高端和超复杂应用。据IC Insights的数据显示,PLD市场从1999年的29亿美元增长到去年的56亿美元,几乎翻了一番。Matas预计这种高速增长局面以后很难出现,但可编程逻辑器件依然是集成电路中最具活力和前途的产业。
第二章 自动售货机的设计
2.1 设计说明
本文设计的自动售货机可销售cola 和 pepsi两种饮料:售货机可识别1元和0.5元的两种货币,在一次购买过程中,可购买一个或多个商品,系统会自动计算所需钱数和找零的钱数并自动找零。另外有3个发光二极管、6个LCD数码管:两个用来显示所需金额,两个用来显示已付金额,两个用来显示找零数。
2.1.1 流程说明
本文设计的自动售货机当通电时,表示一次销售的开始。顾客选择一种商品或多种商品后就进入投币状态。若不投币,则自动返回初始状态。投币后,系统自动计算所投钱数。若投币够,则出货并找零。若投币不够,如果顾客没有继续投币,则退币并回到初始状态。本系统的投币销售流程图如图1-1所示:
图1-1
2.1.2各模块说明
本文设计的自动售货机总体分三个模块:总控模块,二进制译码模块、BCD码译码模块。
总控模块:总控模块是本系统最重要的模块,该模块大体有5个输入端口和6个输出端口。其输入端口包括clk、coin1(投入一元货币)、coin5(投入0.5元货币)、cola(选择cola)、pepsi(选择pepsi),输出端口有paid(已投入多少钱)、needed(还需多少钱)moneyout(找零)、success(灯亮表示交易成功)、failure(灯亮表示交易失败)、showmoneyout(灯亮表示正在找零)。该模块实现了本系统最重要的交易过程,包括选择商品、投入货币,计算剩余金额,找零出货等。
二进制译码模块:该模块有一个输入端口和两个输出端口。输入端口是一个8位的二进制数输出端口bcd0、bcd1是两个4位的BCD码。该模块的主要的功能是实现将主控模块输出的二进制数(paid、needed、moneyout)转换成BCD码,以便输出到七段数码管上显示出来。该模块的原理是将一个8位的二进制转换成2个4位的BCD码,分为高四位和低四位。
BCD码译码模块:该模块有一个输入端口和一个输出端口
2.1.3各模块的连接
各模块的连接如图1-2和1-3所示:
图1-2 售货机主控系统和译码器模块图
图1-3 售货机顶层模块
2.2状态之间的转换
本文所设计的自动售货机进程可以分为7个状态:a,b,c,d,e,f,g.a为开始状态,当有商品选择键按下时即进入b状态(投币状态)。当有货币投入,但投币不够时,即进入c状态(继续投币),若投币够了,即进入d状态(出货找零),之后进入f状态(延时)后返回a(状态)。
图1-3状态流程图
第三章 仿真时序图
3.1主控模块的仿真
上图表示顾客选择了pepsi饮料后,且投了2个一元的硬币。Success为高电平,代表售货机有饮料售出。且余额为0.7
上图表示顾客选择了pepsi饮料后,且投1个一元的硬币和一个0.5元的硬币。failure为高电平,代表售货机无饮料售出。且余额为已投的金额,将钱退还给顾客。.上图表示自动售货机的译码系统,上图表示将8位数字转换成4位BCD码。
2.2BCD码译码的仿真
上图表示自动售货机的译码系统,上图表示将8位数字转换成4位BCD码。
2.3TOP文件的仿真
上图表示顾客选择了pepsi饮料后,且投了2个一元的硬币。Success为高电平,代表售货机有饮料售出。且余额为0.上图表示顾客选择了pepsi饮料后,且投1个一元的硬币和一个0.5元的硬币。Failure 为高电平,代表售货机无饮料售出。Showout为退币指示灯。.Mout_lcd0和Mout_lcd1,显示退币的金额。Paided _lcd0 和Paided_lcd1 needed _lcd0 和needed_lcd1 分别显示已付金额和还需要的金额数。
第四章 小结
自动售货机系统的设计经过一个星期的设计已经全部完成,能按预期的效果进行多次购买、找零出货、并且在数码管上显示出已投货币的金额、还需金额、找零,同时有指示灯提示交易成功、交易失败、正在找零。在自动售货机系统的3个模块中,最主要的是主控模块,其次的还有二进制译码模块和BCD码译码模块。各模块完成后,将它们组合成完整的自动售货机系统。在设计过程中还需改进的是。本文所用的VHDL语言虽然语法规则与其他计算机高级语言如C语言在很多方面很类似,但它毕竟是硬件描述语言,其本质作用在于描述硬件,因而会受硬件环境的限制。因此,为了达到设计的预期效果,在代码编写前,应做到对硬件电路心中有数,不能一味的追求代码的完美,而应该已实现的硬件电路的性能优劣为标准。
谢 辞
在这里我要感谢我的指导老师
参考文献
(1)潘松,黄继业编著.《EDA技术实用教程 》,2005,科学出版社
(2)徐志军,徐光辉编著.《
CPLD/FPGA的开发与应用 》,电子工业出版社,2001.1(3)http://www.xiexiebang.component shouhuoji port(clk:in std_logic;
coin1:in std_logic;
coin5:in std_logic;
cola:in std_logic;
pepsi:in std_logic;
paid:out std_logic_vector(7 downto 0);
needed:out std_logic_vector(7 downto 0);
success:out std_logic;
failure:out std_logic;
showmoneyout:out std_logic;
moneyout:out std_logic_vector(7 downto 0));end component;component code1 port(b:in std_logic_vector(7 downto 0);
bcd0:out std_logic_vector(3 downto 0);
bcd1:out std_logic_vector(3 downto 0));end component;
signal p,n,mo:std_logic_vector(7 downto 0);
--signal s1,s2,s3,s4,s5,s6:std_logic_vector(3 downto 0);begin
u0:shouhuoji--各模块连接
port map(clk=>clk1,coin1=>C1,coin5=>C5,cola=>P1_5,pepsi=>P2, success=>s,failure=>f,showmoneyout=>showout,paid=>p,needed=>n,moneyout=>mo);u1:code1 port map(b=>p,bcd0=>paid_lcd0,bcd1=>paid_lcd1);u2:code1 port map(b=>n,bcd0=>needed_lcd0,bcd1=>needed_lcd1);u3:code1 port map(b=>mo,bcd0=>Mout_lcd0,bcd1=>Mout_lcd1);
end one;
第二篇:EDA课设
EDA课程设计报告
课题名称:智力竞赛抢答器
班级:11电科2班
姓名:代维宽
学号:201114580207
同组人:闻仔逊
指导老师:贾默伊
任务书
一、用VHDL运用层次化设计方法设计一个小型数字系统
题目:智力竞赛抢答器
二、说明书内容:
1.系统设计要求(功能)2.系统设计方案(包括顶层电路图)3.VHDL源程序及仿真波形图 4.课程设计注释 5.设计解释、说明 6.独特之处
三、成绩评定
1.设计内容及掌握情况
2.说明书。包括电子档(各类文件的可执行性及说明书)和纸质
3.答辩情况
目录
第一章:系统设计
1系统设计要求„„„„„„„„„„„„„„„„„„„1 2系统设计方案„„„„„„„„„„„„„„„„„„„2 第二章:VHDL原程序及仿真波形图
1、抢答启动模块„„„„„„„„„„„„„„„„„„3(1)按键识别子模块„„„„„„„„„„„„„„„„„3(2)倒计时子模块„„„„„„„„„„„„„„„„„„5
2、选手抢答模块„„„„„„„„„„„„„„„„„„7(1)单个选手按键子模块„„„„„„„„„„„„„„„7(2)判断抢答选手子模块„„„„„„„„„„„„„„„9
3、加减分模块„„„„„„„„„„„„„„„„„„„11(1)组别判断子模块„„„„„„„„„„„„„„„„„11(2)加减及寄存器子模块„„„„„„„„„„„„„„„12(3)分数选择输出模块„„„„„„„„„„„„„„„„15
4、显示模块„„„„„„„„„„„„„„„„„„„„16
5、蜂鸣器模块„„„„„„„„„„„„„„„„„„„18
第三章设计心得及总结
智力竞赛抢答器
1系统设计要求
1.设计一智力竞赛抢答器,可同时供8名选手参加比赛。2.给节目主持人设置一个控制开关,控制系统清零和抢答开始。
3.抢答器具有锁存功能和显示功能。抢答开始后,若有选手按动抢答按钮,编号立即锁存,并在LED数码管上显示选手编号,同时扬声器响,禁止其他选手抢答。
4.抢答器具有抢答定时功能,时间由主持人确定。5.参赛选手在设定的时间内抢答有效,定时器停止工作。
6.如果定时时间到,无人抢答,本次抢答无效,系统报警,并封锁输入电路,禁止超时抢答,定时器显示00。
7.为每组设计一个计分电路,0~999分,可加分,也可减分。
对于一个抢答器系统,可将其分为五个模块:选手抢答模块、抢答启动模块、加减分模块、显示模块、蜂鸣器控制模块。整体框图如下:
图一 总体框图
其中抢答启动模块具有启动抢答及启动定时功能,输出使能信号给选手识别模块,以及抢答剩余时间给显示模块;选手识别模块完成锁存抢答信号的功能,并输出选手号给显示模块;蜂鸣器对抢答成功以及超时鸣声报警;显示模块对输入的数据进行显示。
2系统设计方案
智力竞赛抢答器拟由单片CPLDFPGA来实现,经分析设计要求,拟定整个系统由五个单元组成,原理图如下所示:
主要VHDL源程序
1、抢答启动模块
启动模块除了有启动的功能外,还有启动定时的功能。定时时间分为5秒和20秒两种,使用两个按键对应两种限时抢答。
将本模块再划分为2个子模:一个模块完成按键识别的功能,另一模块完成倒计时功能。
1)按键识别子模块
按键的识别即对输入信号进行电平变化检测,电平发生跳变就认为是键被按下。但VHDL程序中一个结构体内不能同时对两个信号进行电平跳变的检测,所以对本模块的程序设计采用状态机来实现,并使用统一的时钟信号来扫描按键的电平状态。模块图如下:
图2 按键识别子模块
对START5和START20两个按键定义三种状态,START5按下为ST1状态,此时两个按键“START5&START20”输入电平为“01”;START20按下为ST2状态,此时电平为“10”;两个都没按下为ST0状态,此时电平为“11”。
本模块程序为:
LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY START_5_20 IS PORT(CLK1,RST,START5,START20:IN STD_LOGIC;
B,A:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);--输出定时初值
S_FLAG:OUT STD_LOGIC);
--置数信号
END ENTITY;ARCHITECTURE ONE OF START_5_20 IS SIGNAL DATAIN:STD_LOGIC_VECTOR(1 DOWNTO 0);TYPE ST_TYPE IS(ST0,ST1,ST2);
--定义状态
SIGNAL C_ST:ST_TYPE;BEGIN
DATAIN<=START5&START20;
--两个输入信号放在一起判断 BEGIN
IF RST='0' THEN
--复位 B<=“0000”;A<=“0000”;C_ST<=ST0;S_FLAG<='0';ELSIF CLK1'EVENT AND CLK1='1' THEN CASE C_ST IS WHEN ST0=> IF DATAIN=“01” THEN
C_ST<=ST1;
--输入信号为01,转ST1状态 S_FLAG<='1';
--置数信号有效 B<=“0000”;A<=“0101”;
--定时初值“05” ELSIF DATAIN=“10” THEN
C_ST<=ST2;
--输入信号为10,转ST1状态
S_FLAG<='1';
--置数信号有效 B<=“0010”;A<=“0000”;
--定时初值“20”
ELSE C_ST<=ST0;--输入信号为11,保持ST0状态
END IF;
C_ST<=ST0;--防按键抖动,为11时才转ST0状态 S_FLAG<='0';
--置数信号无效
ELSE C_ST<=ST1;
--按键没弹起,继续等待
END IF;
ELSE C_ST<=ST2;END IF;PROCESS(RST,CLK1)WHEN ST1=>IF DATAIN=“11” THEN WHEN ST2=>IF DATAIN=“11” THEN C_ST<=ST0;S_FLAG<='0';WHEN OTHERS=>C_ST<=ST0;B<=“0000”;A<=“0000”;END CASE;END IF;END PROCESS;END ARCHITECTURE;本模块仿真波形如图所示。
图3 按键识别模块仿真波形
2)倒计时子模块
倒计时需要1Hz的脉冲输入,每来一个上升沿,进行一次减一运算,将结果输出到TIMEB、TIMEA;置数信号LOAD输入有效,读入B、A端口的数据;输入L_CR信号与选手识别模块连接,当选手抢答成功后,L_CR信号为0,将倒计时清0.;若倒计时到,没有选手抢答,则在SR1输出1使扬声器发声。同时输出信号给选手抢答模块,禁止选手抢答。
图4倒计时模块
本模块程序为:
LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY DE_COUNT IS PORT(CLK2,LOAD,L_CR,RST:IN STD_LOGIC;
B,A:IN STD_LOGIC_VECTOR(3 DOWNTO 0);
TIMEB,TIMEA:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
TIMEOUT,SR1:OUT STD_LOGIC);END ENTITY;ARCHITECTURE TWO OF DE_COUNT IS BEGIN
PROCESS(LOAD,L_CR,RST,CLK2)VARIABLE P1,P0:STD_LOGIC_VECTOR(3 DOWNTO 0);BEGIN
IF LOAD='1' THEN P1:=B;P0:=A;
--指数信号有效,将B、A值读入P1、P0 ELSIF L_CR='0' THEN
--有选手抢答成功,L_CR输入为0,定时时间清0 P1:=“0000”;P0:=“0000”;TIMEOUT<='0';SR1<='1';ELSIF RST='0' THEN P1:=“0000”;P0:=“0000”;TIMEOUT<='0';SR1<='0';
ELSIF(CLK2'EVENT AND CLK2='1')THEN
IF P0=“0000” THEN
IF P1>0 THEN P1:=P1-1;P0:=“1001”;
--若个位为0,十位减1,个位赋为9 END IF;ELSE P0:=P0-1;
--若个位不为0,个位直接减一
IF P0=“0000” AND P1=“0000” THEN TIMEOUT<='0';SR1<='1';
--若时间到,输出锁存信号 END IF;END IF;
END IF;TIMEB<=P1;TIMEA<=P0;END PROCESS;END ARCHITECTURE;
程序中,因为每次减一后的时间值需要保存,用于下次继续减一,所以程序中使用了不完整的IF语句引入寄存器,用于保存每次减一后的时间值。P1、P0定义为变量而不是信号的原因是,变量的赋值是即时的,减一后可以马上进行判断;若定义为信号,不能即时进行判断,并且减一操作后的赋值要经过一个δ延时,程序不好控制。
本模块仿真波形如图所示:
图5 倒计时模块仿真波形
用元件例化语句将以上两个子模块组合,得到整个抢答启动模块。如下图所示:
图6 由两个子模块组成抢答启动模块
两个子模块组合的程序为:
LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY STARTER IS PORT(CLK1,CLK2,L_CR,RST,START5,START20:IN STD_LOGIC;
TIMEB,TIMEA:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
TIMEOUT,SR1:OUT STD_LOGIC);END ENTITY;ARCHITECTURE THREE OF STARTER IS
COMPONENT START_5_20 IS
--调用元件START_5_20声明
PORT(CLK1,RST,START5,START20:IN STD_LOGIC;
B,A:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
S_FLAG:OUT STD_LOGIC);END COMPONENT;COMPONENT DE_COUNT IS
--调用元件DE_COUNT声明
PORT(CLK2,LOAD,L_CR,RST:IN STD_LOGIC;
B,A:IN STD_LOGIC_VECTOR(3 DOWNTO 0);
TIMEB,TIMEA:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
TIMEOUT,SR1:OUT STD_LOGIC);END COMPONENT;SIGNAL m,n:STD_LOGIC_VECTOR(3 DOWNTO 0);SIGNAL p:STD_LOGIC;
--对应图7中的中间信号 BEGIN
--按照图7将两个元件连接起来
U1:START_5_20 PORT MAP(CLK1=>CLK1,START5=>START5,START20=>START20,RST=>RST,B=>m,A=>n,S_FLAG=>p);U2:DE_COUNT PORT MAP(CLK2=>CLK2,B=>m,A=>n,LOAD=>p,RST=>RST,L_CR=>L_CR,TIMEB=>TIMEB,TIMEA=>TIMEA, TIMEOUT=>TIMEOUT,SR1=>SR1);END ARCHITECTURE;
2、选手抢答模块
在一个结构体中用8个进程同时对8个选手按键电平变化的监测是不可实现的,所以将本模块划分为两个子模块:单个选手按键模块和判断抢答选手模块。最后将8个选手按键模块和1个判断抢答选手模块连接起来,得到整个选手抢答模块。
1)单个选手按键子模块
按键输入相当于该实体的时钟信号,键被按下,等于来一个脉冲,输出信号给判断模块进行选手号的判断。只要有选手抢答成功,相关模块会输出信号使8个按键模块的LOCK信号有效,禁止其他选手抢答。如图所示。
图7 单个选手按键模
本模块程序如下:
LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY BUTTON1 IS PORT(LOCK , BUTTON , RST :IN STD_LOGIC;PRESSED:OUT STD_LOGIC);END ENTITY;ARCHITECTURE B1 OF BUTTON1 IS BEGIN
PROCESS(RST , BUTTON)
--使用进程时刻监测RST、BUTTON信号 BEGIN
IF RST='0' THEN
PRESSED<='0';
--复位
IF LOCK='1' THEN
--键被按下并且LOCK信号无效 PRESSED<='1';
--则输出信号给判断模块 END IF;ELSIF BUTTON'EVENT AND BUTTON='0' THEN END IF;END PROCESS;END ARCHITECTURE;
图8 倒计时模块仿真波形
2)判断抢答选手子模块
本子模块接收8个按键子模块的输出信号,如收到1号子模块输出的高电平,则输出选手号“0001”;并发出信号使扬声器发声并控制8个按键子模块使它们的LOCK信号有效,禁止其他选手抢答。本子模块端口设置如图所示。
图9判断选手模块
本子模块程序如下:
LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY IDENTIFIER IS
PORT(PP1,PP2,PP3,PP4,PP5,PP6,PP7,PP8:IN STD_LOGIC;P_NUM:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);LOCK,SR1:OUT STD_LOGIC);END ENTITY;ARCHITECTURE ONE OF IDENTIFIER IS
SIGNAL P:STD_LOGIC_VECTOR(7 DOWNTO 0);BEGIN
P<=PP8&PP7&PP6&PP5&PP4&PP3&PP2&PP1;
--8个输入放在一起判断 BEGIN
CASE P IS
WHEN “00000001”=>P_NUM<=“0001”;LOCK<='0';SR1<='1';--1号选手 WHEN “00000010”=>P_NUM<=“0010”;LOCK<='0';SR1<='1';--2号选手 WHEN “00000100”=>P_NUM<=“0011”;LOCK<='0';SR1<='1';--3号选手 WHEN “00001000”=>P_NUM<=“0100”;LOCK<='0';SR1<='1';--4号选手 WHEN “00010000”=>P_NUM<=“0101”;LOCK<='0';SR1<='1';--5号选手 WHEN “00100000”=>P_NUM<=“0110”;LOCK<='0';SR1<='1';--6号选手 WHEN “01000000”=>P_NUM<=“0111”;LOCK<='0';SR1<='1';--7号选手 WHEN “10000000”=>P_NUM<=“1000”;LOCK<='0';SR1<='1';--8号选手 WHEN OTHERS=>P_NUM<=“0000”;LOCK<='1';SR1<='0';PRO1:PROCESS(P)
--输入若发生变化,马上启动进程进行判断
END CASE;END PROCESS;END ARCHITECTURE;9
图10 判断抢答选手模块仿真波形
所以将以上两个子模块用元件例化语句连接起来,组成整个选手抢答模块,如下图所示
图11 选手抢答模块
实现程序为:
LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY BUTTON IS
PORT(P1,P2,P3,P4,P5,P6,P7,P8,RST,LOCK:IN STD_LOGIC;P_NUM:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);LOCK_S,SR1:OUT STD_LOGIC);END ENTITY;ARCHITECTURE BB1 OF BUTTON IS COMPONENT BUTTON1 IS
--调用元件BUTTON1声明
PORT(LOCK,B,RST:IN STD_LOGIC;PRESSED:OUT STD_LOGIC);END COMPONENT;COMPONENT IDENTIFIER IS
--调用元件IDENTIFIER声明
PORT(PP1,PP2,PP3,PP4,PP5,PP6,PP7,PP8:IN STD_LOGIC;P_NUM:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);10 LOCK,SR1:OUT STD_LOGIC);END COMPONENT;SIGNAL a1,a2,a3,a4,a5,a6,a7,a8:STD_LOGIC;
--定义图12中的中间信号 BEGIN
--按照图12将两个元件连接起来
U1:BUTTON1 PORT MAP(LOCK=>LOCK,B=>P1,RST=>RST,PRESSED=>a1);U2:BUTTON1 PORT MAP(LOCK=>LOCK,B=>P2,RST=>RST,PRESSED=>a2);U3:BUTTON1 PORT MAP(LOCK=>LOCK,B=>P3,RST=>RST,PRESSED=>a3);U4:BUTTON1 PORT MAP(LOCK=>LOCK,B=>P4,RST=>RST,PRESSED=>a4);U5:BUTTON1 PORT MAP(LOCK=>LOCK,B=>P5,RST=>RST,PRESSED=>a5);U6:BUTTON1 PORT MAP(LOCK=>LOCK,B=>P6,RST=>RST,PRESSED=>a6);U7:BUTTON1 PORT MAP(LOCK=>LOCK,B=>P7,RST=>RST,PRESSED=>a7);U8:BUTTON1 PORT MAP(LOCK=>LOCK,B=>P8,RST=>RST,PRESSED=>a8);U9:IDENTIFIER PORT MAP(PP1=>a1,PP2=>a2,PP3=>a3,PP4=>a4,PP5=>a5,PP6=>a6,PP7=>a7,PP8=>a8,P_NUM=>P_NUM,LOCK=>LOCK_S,SR1=>SR1);END ARCHITECTURE;
3、加减分模块
加减分模块要识别按下的按键:加5分按键及减5分按键。所以采用状态机的方法来识别。将本模块划分为三个子模块:组别判断子模块,加减及寄存器子模块,分数选择输出子模块。
1)组别判断子模块
该模块要实现的功能是根据抢答成功的选手编号,判断出该选手属于哪组,并输出使能信号允许该组的分数寄存器进行加减操作。如图所示。
图12 组别判断模块
实现程序为:
LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY DECODE IS PORT(CLK:IN STD_LOGIC;P_NUM:IN STD_LOGIC_VECTOR(3 DOWNTO 0);
EN1,EN2,EN3,EN4:OUT STD_LOGIC);END ENTITY;ARCHITECTURE ONE OF DECODE IS
SIGNAL E:STD_LOGIC_VECTOR(3 DOWNTO 0);BEGIN
PROCESS(CLK)
--引入时钟信号,协调各部分电路的工作
BEGIN IF CLK'EVENT AND CLK='1' THEN
CASE P_NUM IS WHEN “0001”=>E<=“0001”;WHEN “0010”=>E<=“0001”;--
1、2号选手属第一组
WHEN “0011”=>E<=“0010”;WHEN “0100”=>E<=“0010”;--
3、4号选手属第二组 WHEN “0101”=>E<=“0100”;WHEN “0110”=>E<=“0100”;--
5、6号选手属第三组 WHEN “0111”=>E<=“1000”;WHEN “1000”=>E<=“1000”;--
7、8号选手属第四组 WHEN OTHERS=>E<=“0000”;
--其他情况则四个分数锁存器都不工作
END CASE;END IF;
END PROCESS;
EN4<=E(3);EN3<=E(2);EN2<=E(1);EN1<=E(0);END ARCHITECTURE;程序仿真波形如图所示:
图13 组别判断模块仿真波形
2)加减及寄存器子模块
本模块的状态机转换过程为:将ADD和SUB信号并置,并检测其电平变化。当ADD按下时,“ADD&SUB”的电平为“01”,弹起时恢复为“11”。当SUB按下时,“ADD&SUB”的电平为“10”,弹起时恢复为“11”。本模块另外还需实现的功能是寄存功能。如下图所示:
图14 加减及寄存器模块
实现程序如下: LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY COUNTER1 IS PORT(CLK,EN:IN STD_LOGIC;
ADD,SUB:IN STD_LOGIC;
AA2,AA1,AA0:OUT STD_LOGIC_VECTOR(3 DOWNTO 0));END ENTITY;ARCHITECTURE ONE OF COUNTER1 IS SIGNAL A:STD_LOGIC_VECTOR(1 DOWNTO 0);TYPE ST_TYPE IS(ST0,ST1,ST2);SIGNAL C_ST:ST_TYPE;BEGIN A<=ADD&SUB;
--将ADD信号和SUB信号并置在一起判断
PROCESS(CLK)VARIABLE P2,P1,P0:STD_LOGIC_VECTOR(3 DOWNTO 0);BEGIN
IF EN='1' THEN
--使能端有效,才对该分数寄存器进行操作
IF CLK'EVENT AND CLK='1' THEN
CASE C_ST IS
WHEN ST0=>IF A=“01” THEN--A为“01”,说明ADD按下
C_ST<=ST1;
--下一状态转ST1,以等待按键弹起
IF P0=“1001” THEN--个位为9,进1为0,再向十位进1
P0:=“0000”;
IF P1=“1001” THEN
--十位为9,进一为0
P1:=“0000”;
IF P2=“1001” THEN
--百位为9,进一为0
P2:=“0000”;
ELSE P2:=P2+1;
--百位不为9,百位加1
END IF;
ELSE P1:=P1+1;
--十位不为9,加一
END IF;
ELSE P0:=P0+1;
--个位不为9,加一
END IF;
ELSIF A=“10” THEN
--A为“10”,说明SUB按下
C_ST<=ST2;--下一状态转ST2,以等待按键弹起
IF(P2/=0 OR P1/=0 OR P0/=0)THEN
IF P0=“0000” THEN P0:=“1001”;
P1:=P1-1;--个位向十位借1 P2:=P2-1;--十位向百位借1
IF P1=“0000” THEN
ELSE P1:=P1-1;--十位不为0,直接减1
END IF;
P1:=“1001”;
ELSE P0:=P0-1;--个位不为0,直接减1
END IF;
END IF;
ELSE C_ST<=ST0;
END IF;WHEN ST1=>IF A=“11” THEN
--A为“11”,说明按键弹起
C_ST<=ST0;
--回到ST0继续监视按键
ELSE C_ST<=ST1;--否则等待按键弹起
END IF;
C_ST<=ST0;WHEN ST2=>IF A=“11” THEN
ELSE C_ST<=ST2;
END IF;WHEN OTHERS=>C_ST<=ST0;END CASE;END IF;END IF;
AA2<=P2;AA1<=P1;AA0<=P0;
--操作后的分数输出 END PROCESS;END ARCHITECTURE;
加减及寄存器模块仿真波形图如下:
图15 加减及寄存器模块仿真波形
图中,加分按键ADD按下,输出“010”;减分按键SUB按下,输出回到“000”;又来两个加分按键,输出“020”。当EN信号无效时,有按键按下输出不变。
3)分数选择输出模块
四组分数要显示出来,需要12个7段数码管。若只显示当前抢答成功选手的分数,则只需3个数码管。所以设置一个分数选择器,根据抢答成功的选手编号,选择其分数输出给显示模块显示。
程序为:
LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY MUXX IS PORT(P_NUM,AA2,AA1,AA0,BB2,BB1,BB0:IN STD_LOGIC_VECTOR(3 DOWNTO 0);
CC2,CC1,CC0,DD2,DD1,DD0:IN STD_LOGIC_VECTOR(3 DOWNTO 0);
D2,D1,D0:OUT STD_LOGIC_VECTOR(3 DOWNTO 0));END ENTITY;ARCHITECTURE ONE OF MUXX IS BEGIN
PROCESS(P_NUM)
--P_NUM为选手编号
BEGIN
CASE P_NUM IS
WHEN “0001”=>D2<=AA2;D1<=AA1;D0<=AA0;WHEN “0010”=>D2<=AA2;D1<=AA1;D0<=AA0;--1号和2号选手为一组 WHEN “0011”=>D2<=BB2;D1<=BB1;D0<=BB0;WHEN “0100”=>D2<=BB2;D1<=BB1;D0<=BB0;--3号和4号选手为一组 WHEN “0101”=>D2<=CC2;D1<=CC1;D0<=CC0;WHEN “0110”=>D2<=CC2;D1<=CC1;D0<=CC0;--5号和6号选手为一组 WHEN “0111”=>D2<=DD2;D1<=DD1;D0<=DD0;WHEN “1000”=>D2<=DD2;D1<=DD1;D0<=DD0;--7号和8号选手为一组 WHEN OTHERS=>D2<=“0000”;D1<=“0000”;D0<=“0000”;
END CASE;
END PROCESS;END ARCHITECTURE;仿真波形如图所示。
图16分数选择输出模块仿真波形
4、显示模块
本模块根据送来的数据:抢答成功选手号,选手分数、倒计时时间,将相应的字形码送数码管显示。端口设置如图所示。
图17显示模块
图18数码管分配
显示0,“00111111”;3F;显示1,“00000110”;06;显示2,“01011011”;5B;显示3,“01001111”;4F;显示4,“01100110”;66;显示5,“01101101”;6D;显示6,“01111101”;7D;显示7,“00000111”;07;显示8,“01111111”;7F;显示9,“01101111”;6F;显示10,“00000000”;00;
17图中,BT为数码管的位选信号,SG为数码管的段选信号。另外图18为数码管的分配。左起第一位为选手编号,第3、4位为该选手的分数,最后两位为倒计时。程序如下:
LIBRARY IEEE;16
USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY DISPLAY IS
PORT(CLK:IN STD_LOGIC;SCORE2,SCORE1,SCORE0,P_NUMBER,TIMEB,TIMEA:IN BT,SG:OUT STD_LOGIC_VECTOR(7 DOWNTO 0));
STD_LOGIC_VECTOR(3 DOWNTO 0);END ENTITY;ARCHITECTURE ONE OF DISPLAY IS SIGNAL CNT8:STD_LOGIC_VECTOR(2 DOWNTO 0);SIGNAL A:STD_LOGIC_VECTOR(3 DOWNTO 0);BEGIN P1:PROCESS(CLK)
BEGIN
IF CLK'EVENT AND CLK='1' THEN
--时钟信号一来,显示下一位 CNT8<=CNT8+1;END IF;END PROCESS;BEGIN
CASE CNT8 IS
WHEN “000”=>BT<=“10000000”;A<=P_NUMBER;--第一位显示选手号
WHEN “001”=>BT<=“01000000”;A<=“1010”;
--第二位不用,灭
WHEN “010”=>BT<=“00100000”;A<=SCORE2;
--第三位显示分数百位
WHEN “011”=>BT<=“00010000”;A<=SCORE1;
--第四位显示分数十位
WHEN “100”=>BT<=“00001000”;A<=SCORE0;
--第五位显示分数个位
WHEN “101”=>BT<=“00000100”;A<=“1010”;
--第六位不用,灭
WHEN “110”=>BT<=“00000010”;A<=TIMEB;
--第七位显示倒计时十位
WHEN “111”=>BT<=“00000001”;A<=TIMEA;
--第八位显示倒计时个位 END CASE;P2:PROCESS(CNT8)
END PROCESS;BEGIN
CASE A IS
--根据数据选择相应的字形码送数码管显示
WHEN “0000”=>SG<=“00111111”;WHEN “0001”=>SG<=“00000110”;
WHEN “0010”=>SG<=“01011011”;WHEN “0011”=>SG<=“01001111”;
WHEN “0100”=>SG<=“01100110”;WHEN “0101”=>SG<=“01101101”;
WHEN “0110”=>SG<=“01111101”;WHEN “0111”=>SG<=“00000111”;
WHEN “1000”=>SG<=“01111111”;WHEN “1001”=>SG<=“01101111”;
WHEN “1010”=>SG<=“00000000”;WHEN OTHERS=>NULL;END CASE;P3:PROCESS(A)END PROCESS;END ARCHITECTURE;本模块仿真波形如图所示。
图19显示模块仿真波形
5、蜂鸣器模块
当SR1鸣声信号来时,输出CLK2(2KHz)驱动蜂鸣器发声。CLK1用于扫描SR1的电平变化,SR1上升沿来到,允许CLK2输出,并持续一段时间。模块图如下:
图20蜂鸣器模块
本模块程序如下:
LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY SPEAKER IS PORT(CLK1,SR1,CLK2:IN STD_LOGIC;
S:OUT STD_LOGIC);END ENTITY;ARCHITECTURE ONE OF SPEAKER IS TYPE ST_TYPE IS(ST0,ST1);SIGNAL C_ST:ST_TYPE;SIGNAL A:STD_LOGIC;BEGIN PROCESS(CLK1)
VARIABLE P:STD_LOGIC_VECTOR(7 DOWNTO 0);--P用于定时,使蜂鸣器发声持续
BEGIN
IF CLK1'EVENT AND CLK1='1' THEN
CASE C_ST IS WHEN ST0=>IF SR1='1' THEN
--SR1信号有上升沿
P:=“00111111”;18
C_ST<=ST1;A<='1';--蜂鸣器发声,开始定时
ELSE C_ST<=ST0;A<='0';--否则等待
END IF;
P:=P-1;C_ST<=ST1;
A<='0';--定时到,蜂鸣器停止发声 IF SR1='1' THEN
C_ST<=ST1;--等待系统复位 END IF;WHEN ST1=>IF P/=0 THEN
--定时还没到,等待
ELSE
ELSE C_ST<=ST0;--复位
END IF;WHEN OTHERS=>C_ST<=ST0;A<='0';END CASE;END IF;S<=CLK2 AND A;
--只有A为1时,蜂鸣器才发声 END PROCESS;END ARCHITECTURE;本模块的仿真波形如图所示。
图21 蜂鸣器模块仿真波形
3设计心得及总结
刚开始确定这个课题时,我首先确定了要用到哪些知识,主要是VHDL程序的设计,软件的仿真。首先我查阅课本质料,找了不少关于这方面的程序,尽量的把它们都弄懂了。然后我确定了总体方案,把整体方案划分成了几个模块,形成了一个整体的框架,然后各个击破。有了总体的思路做指导我很快我就仿真调试好了抢答启动模块选手抢答模块,这样一来就增加了我的信心,一鼓作气拿下了以后的模块。当然任何事情都不会一帆风顺,也遇到许多难题,不懂的地方我就请叫老师和同学,最后所有的模块都被我一个一个的做出来了,我很高兴,觉得我这两天来的努力没有白费。
此次课程设计不仅加强了我对专业知识的学习与了解,更有许多的感慨,主要有以下几点:
(1)加强了我们动手、思考和解决问题的能力。我们很少能有这种机会来锻炼自己,通过这次课程设计,起到了很好的锻炼效果。
(2)我在做课程设计同时也是对课本知识的巩固和加强,课本 的知识太多,平时课间的学习并不能很好的理解程序的功能,所以在这次课程设计过程中,我们了解了很多程序的功能,并且对于其在实际中的使用有了更多的认识。
(3)我们两人一组相互合作,共同解决问题也认识到了团队精神的重要性
最后,我要感谢老师和同学们给我的帮助,没有你们的帮助,我是不能完成此次课程设计的,真的很感谢你们!
第三篇:基于EDA的自动售货机系统的设计 开题报告
毕业设计开题报告
课题名称:基于学院: 专业: EDA的自动售货机系统的设计 电子电气工程学院 电子信息工程
一 自动售货机设计简介
自动售货是20世纪70年代在日本、欧美发展起来的一种全新的消费方式,自动售货机又被称为24小时营业的微型自助超市,它的售货领域非常广泛,是发达国家商品零售的一种主要方式。自动售货机作为一种先进的消费方式,已经成为城市现代文明发达程度的重要标志,其新颖、时尚的购物方式,24小时营业的特点给人们生活带来了便利,美化了城市环境,受到消费者的欢迎。但是在我国自动售货机的普及还不及发达国家,主要原因是我国EDA技术的应用水平长期落后于发达国家。
本设计要实现自动售货机的基本功能,如投币处理、商品选择、购货撤销、异常退币、计算存货等功能。利用Altera公司的开发软件QUARTUS II平台,采用Verilog hdl硬件描述语言编程的设计方法设计系统核心电路的硬件程序,与一般的软件开发不同,Verilog hdl编程更需要熟悉一些底层的硬件知识,特别是数字逻辑电路的设计,因此Verilog hdl编程的方法、思路都要更多的与硬件电路联系起来。完成系统各个功能模块的硬件程序设计后,在软件平台上进行编译和电路仿真,最后生成的目标文件下载到实验台内的FPGA芯片以实现该系统,并在实验台上对设计进行验证。(1)自动售货机主要功能
自动售货机控制要求对机内商品信息进行识别,对投入的货币进行运算,并根据所投入的货币数值判断是否能够购买某种商品,并做出相应的反应。本文设计的自动售货机控制系统主要可以实现投币处理、计算投币总额、输出商品,输出找零等功能,系统工作流程如图1 所示。
(2)自动售货机的几个过程
在自动售货机控制系统的工作过程中,可分为三个状态:初始状态、投币状态和找零状态。在每一个状态中完成特定的功能。
首先,在初始状态下,自动售货机通电,初始化机内商品信息(包括商品种类、每种商品的数量以及价格)。当顾客购买商品时,可根据自己需要通过按键选择其中一种商品(且只限一种),然后进入下一状态,即投币状态。
在投币状态下,当投入硬币总额大于或等于商品价格,并且按确认购买键后将进入找零状态;若按取消键,售货机退出所投硬币,返回到初始状态。
投币结束,若投入的硬币等于或大于商品单价,且确认购买,则商品将送出送货口,并计算输出找零硬币。出货找零结束时表示一次自动售货过程完成,重新返回到初始状态,计算此时商品信息,并等待下一次售货过程的到来。
(3)自动售货机的基本模块
自动售货机控制系统的功能模块逻辑上划分为商品信息存储模块、商品选择模块、投币处理模块,找零模块和显示模块。商品信息存储模块
该模块的功能是将商品的单价、数量存储到自动售货机中,price、quantity 分别表示商品的单价与数量数据信号,item 为商品的种类。商品选择模块
该模块功能是对商品进行选择与购买。当对四种商品进行选择时,由sel 的选择信号的个数来表示所选择的商品类型。get 为对商品进行确认购买的信号。投币处理模块
该模块是对投入的硬币进行处理的过程,输出参数coin 为投币数值计数器,以0.5 元为单位进行计算。整个模块功能类似于计钱器,可准确计算投入的硬币数,记录并保存投入的总币值。找零模块
该模块主要完成找零操作。通过计钱器coin 计算余额,然后输出找零的控制信号act5、act10。显示模块
该模块用来显示钱数和商品数量。用于钱数显示时,将计钱器coin转换成BCD 码,然后经译码器译码并显示。用于商品数量显示时,将计算得出的最终商品数量quantity 先转换成BCD 码,然后经译码器译码并显示。
二
国内外EDA技术发展简介
EDA概述
人类社会已进入到高度发达的信息化社会,信息社会的发展离不开电子产品的进步。现代电子产品在性能提高、复杂度增大的同时,价格却一直呈下降趋势,而且产品更新换代的步伐也越来越快,实现这种进步的主要原因就是生产制造技术和电子设计技术的发展。前者以微细加工技术为代表,目前已进展到深亚微米阶段,可以在几平方厘米的芯片上集成数千万个晶体管;后者的核心就是EDA技术。EDA是指以计算机为工作平台,融合了应用电子技术、计算机技术、智能化技术最新成果而研制成的电子CAD通用软件包,主要能辅助进行三方面的设计工作:IC设计,电子电路设计以及PCB设计。没有EDA技术的支持,想要完成上述超大规模集成电路的设计制造是不可想象的,反过来,生产制造技术的不断进步又必将对EDA技术提出新的要求。2 EDA技术简介
EDA(Electronic Design Automation),即电子设计自动化,是指利用计算机完成电子系统的设计。EDA技术是以计算机和微电子技术为先导的,汇集了计算机图形学、拓扑学、逻辑学、微电子工艺与结构学和计算数学等多种计算机应用学科最新成果的先进技术。EDA技术以计算机为工具,代替人完成数字系统的逻辑综合、布局布线和设计仿真等工作。设计人员只需要完成对系统功能的描述,就可以由计算机软件进行处理,得到设计结果,而且修改设计如同修改软件一样方便,可以极大地提高设计效率。2.1 EDA技术的发展概况
从20世纪60年代中期开始,人们就不断开发出各种计算机辅助设计工具来帮助设计人员进行电子系统的设计。电路理论和半导体工艺水平的提高,对EDA技术的发展起到了巨大的作用,使EDA作用范围从PCB板设计延伸到电子线路和集成电路设计,直至整个系统的设计,也使IC芯片系统应用、电路制作和整个电子生产过程都集成在一个环境之中。根据电子设计技术的发展特征,EDA技术发展大致分为三个阶段。(1)CAD阶段
第一阶段的特点是一些单独的工具软件,主要有PCB布线设计、电路模拟、逻辑模拟、以及版图的绘制等,通过计算机的使用,从而将设计人员从大量繁重重复的计算和绘图工作中解脱出来。20世纪80年代,随着集成电路规模的增大,EDA技术有了较快的发展。许多软件公司等进入市场,开始供应带电路图编辑工具和逻辑模拟工具的EDA软件。这个时期的软件产品主要针对产品开发,按照设计、分析、生产和测试等多个阶段,不同阶段分别使用不同的软件包,每个软件只能完成其中一项工作,通过顺序循环使用这些软件,可完成设计的全过程。(2)CAE阶段
这个阶段在集成电路与电子设计方法学以及设计工具集成化方面取得了许多成果。各种设计工具,如原理图输入、编译与连接、逻辑模拟、测试码生成、版图自动布局已齐全。由于采用了统一数据管理技术,因而能够将各个工具集成为一个CAE系统。按照设计方法学制定的设计流程,可以实现从设计输入到版图输出的全程设计自动化。这个阶段主要采用基于单元库的半定制设计方法,采用门阵列与标准单元设计的各种ASIC得到了极大的发展,将集成电路工业推入了ASIC时代。(3)EDA阶段
20世纪90年代以来,微电子技术以惊人的速度发展,其工艺水平达到了深亚微米级,此阶段主要出现了以高级语言描述、系统仿真和综合技术为特征的第三代EDA技术,不仅极大地提高了系统的设计效率,而且使设计人员摆脱了大量的辅助性及基础性工作,将精力集中于创造性的方案与概念的构思上。它的特征为:第一,高层综合的理论与方法取得较大进展,将EDA设计层次由RT级提高到了系统级(又称行为级),并划分为逻辑综合和测试综合。第二,采用硬件描述语言HDL来描述10万门以上的设计,并形成了VHDL和VerilogHDL两种标准硬件描述语言。第三,采用平面规划技术对逻辑综合和物理版图设计进行联合管理,作到在逻辑综合早期设计阶段就考虑到物理设计信息的影响。第四,可测性设计。第五,为带有嵌入IP模块ASIC设计提供软硬件协同系统设计工具。2.2 EDA技术的基本特征
EDA技术代表了当今电子设计技术的最新发展方向,它的基本特征是:设计人员按照“自顶向下”的设计方法,对整个系统进行方案设计和功能划分,系统的关键电路用一片或几片专用集成电路(ASIC)实现,然后采用硬件描述语言(HDL)完成系统行为级设计,最后通过综合器和适配器生成最终的目标器件[3]。这样的设计方法被称为高层次的电子设计方法。下面介绍与EDA基本特征有关的几个概念。
(1)“自顶向下”的设计方法
10年前,电子设计的基本思路还是选择标准集成电路“自底向上”(Bottom-Up)的构造出一个新的系统,这样的设计方法就如同一砖一瓦地建造金字塔,不仅效率低、成本高而且还容易出错。(2)高层次设计
高层次设计提供了一种“自顶向下”(Top-Down)的全新的设计方法,这种设计方法首先从系统设计入手,在顶层进行功能方框图的划分和结构设计。在方框图一级进行仿真、纠错,并用硬件描述语言对高层次的系统行为进行描述,在系统一级进行验证。然后用综合优化工具生成具体门电路的网表,其对应的物理实现级可以是印刷电路板或专用集成电路。由于设计的主要仿真和调试过程是在高层次上完成的,这不仅有利于早期发现结构设计上的错误,避免设计工作的浪费,而且也减少了逻辑功能仿真的工作量,提高了设计的一次成功率。(3)硬件描述语言 硬件描述语言(HDL-Hardware Description Language)是一种用于设计硬件电子系统的计算机语言,它用软件编程的方式来描述电子系统的逻辑功能、电路结构和连接形式,与传统的门级描述方式相比,它更适合大规模系统的设计。
本次设计使用VERILOG HDL语言,Verilog HDL语言最初是于1983年由Gateway Design Automation公司为其模拟器产品开发的硬件建模语言。那时它只是一种专用语言。由于他们的模拟、仿真器产品的广泛使用,Verilog HDL 作为一种便于使用且实用的语言逐渐为众多设计者所接受。在一次努力增加语言普及性的活动中,Verilog HDL语言于1990年被推向公众领域。Open Verilog International(OVI)是促进Verilog发展的国际性组织。1992年,OVI决定致力于推广Verilog OVI标准成为IEEE标准。这一努力最后获得成功,Verilog 语言于1995年成为IEEE标准,称为IEEE Std 1364-1995。完整的标准在Verilog硬件描述语言参考手册中有详细描述。
下面列出的是Verilog硬件描述语言的主要能力: * 基本逻辑门,例如and、or和nand等都内置在语言中。
* 用户定义原语(UDP)创建的灵活性。用户定义的原语既可以是组合逻辑原语,也可以是时序逻辑原语。
* 开关级基本结构模型,例如pmos 和nmos等也被内置在语言中。* 提供显式语言结构指定设计中的端口到端口的时延及路径时延和设计的时序检查。
* 可采用三种不同方式或混合方式对设计建模。这些方式包括:行为描述方式—使用过程化结构建模;数据流方式—使用连续赋值语句方式建模;结构化方式—使用门和模块实例语句描述建模。
* Verilog HDL中有两类数据类型:线网数据类型和寄存器数据类型。线网类型表示构件间的物理连线,而寄存器类型表示抽象的数据存储元件。
* 能够描述层次设计,可使用模块实例结构描述任何层次。
* 设计的规模可以是任意的;语言不对设计的规模(大小)施加任何限制。* Verilog HDL不再是某些公司的专有语言而是IEEE标准。
* 人和机器都可阅读Verilog 语言,因此它可作为EDA的工具和设计者之间的交互语言。
* Verilog HDL语言的描述能力能够通过使用编程语言接口(PLI)机制进一步扩展。PLI是允许外部函数访问Verilog 模块内信息、允许设计者与模拟器交互的例程集合。
* 设计能够在多个层次上加以描述,从开关级、门级、寄存器传送级(RTL)到算法级,包括进程和队列级。
* 能够使用内置开关级原语在开关级对设计完整建模。* 同一语言可用于生成模拟激励和指定测试的验证约束条件,例如输入值的指定。
* Verilog HDL 能够监控模拟验证的执行,即模拟验证执行过程中设计的值能够被监控和显示。这些值也能够用于与期望值比较,在不匹配的情况下,打印报告消息。
* 在行为级描述中,Verilog HDL不仅能够在RTL级上进行设计描述,而且能够在体系结构级描述及其算法级行为上进行设计描述。
* 能够使用门和模块实例化语句在结构级进行结构描述。
* Verilog HDL 的混合方式建模能力,即在一个设计中每个模块均可以在不同设计层次上建模。
* Verilog HDL 还具有内置逻辑函数,例如&(按位与)和|(按位或)。* 对高级编程语言结构,例如条件语句、情况语句和循环语句,语言中都可以使用。
* 可以显式地对并发和定时进行建模。* 提供强有力的文件读写能力。
* 语言在特定情况下是非确定性的,即在不同的模拟器上模型可以产生不同的结果;例如,事件队列上的事件顺序在标准中没有定义。
三
本次毕业设计主要内容 四
进度安排
五 主要参考文献
第四篇:软件工程_自动售货机
自动售货机
信息1101 施敏宇 18号
下面是自动售货机系统的需求陈述,试建立它的对象模型、动态模型和功能模型: 自动售货机系统是一种无人售货系统。售货时,顾客把硬币投入机器的投币口中,机器检查硬币的大小、重量、厚度及边缘类型。有效的硬币是一元币、五角币、五分币、二分币、一分币。其他货币被认为是假币。机器拒绝接受假币,并将其从退币孔退出。当机器接受了有效的硬币之后,就把硬币送入硬币储藏器中。顾客支付的货币根据硬币的面值进行累加。自动售货机装有货物分配器。每个货物分配器中包含零个或多个价格相同的货物。顾客通过选择货物分配器来选择货物。如果货物分配器中有货物,而且顾客支付的货币值不小于该货物的价格,货物将被分配到货物传送孔送给顾客,并将适当的零钱返还到退币孔。如果分配器是空的,则和顾客支付的货币值相等的硬币将被送回到退币孔。如果顾客支付的货币值少于所选择的分配器中货物的价格,机器将等待顾客投进更多的货币。如果顾客决定不买所选择的货物,他投放进的货币将从退币孔中退出。
面向对象的分析
面向对象分析方法的核心思想是利用面向对象概念和方法为软件需求构造一组相关模型(对象模型,动态模型和功能模型),来获得关于问题域的全面认识。
这三个模型从不同的角度对系统进行描述,其中:对象模型描述了系统静态的、结构化的数据性质;动态模型描述了系统顺势的、行为化的控制性质;功能模型描述了变化的系统的功能性质。这三个模型都涉及到数据。控制和操作等共同的概念,但每种模型描述的侧重有所不同。它们各自以不同侧面反应系统的实质内容,综合起来则全面反映了目标系统的需求。
对象模型是三个模型中最关键的。它的作用是描述系统的静态结构,包括构成系统的类和对象、它们的属性和操作以及它们之间的联系。UML中类图适用于建立对象模型,状态图适用于建立动态模型。每个类的动态行为用一张状态图来表示,各个类的状态图通过事件合并起来,构成系统的动态模型。也就是说,动态模型是基于事件共享而相互关联的一组状态图的集合。建立对象模型大体上按照下列顺序进行:寻找问题域内的对象,识别出对象间的关系、定义属性和服务。事实上,分析工作不可能严格按照预定顺序进行,系统的模型往往需要反复构造多遍才能建成。
注:对象硬币计算器和对象硬币检测器可以作为对象自动售货器的一部分,它们的属性作为自动售货器的属性。
建立动态模型
对于仅存数静态数据的系统来说,动态模型并没有什么实际意义。然而在开发交互式系统时,动态模型却起着很重要的作用。如果收集输入信息是目标系统的一项主要工作,则在开发这类应用系统时建立正确的动态模型是至关重要的。
建立动态模型的步骤:
(1)编写典型的对话脚本;
(2)从脚本中提取出事件,联系该事件与其目标对象;
(3)组织事件的顺序和状态(采用状态图描绘);
(4)比较各个不同对象的状态图,检查对象之间的一致性,确保事件之间的匹配。
提示投币投币购买提示是假币,退币假币检查硬币否真币存储硬币,计算货币总值确认投完硬币是请求选择货物选择货物检测货物存量无货提示无货计算比较货币总值和货物价格确认确认顾客购买小于提示货物不足,确认顾客购买不购买送出货物,请求取货不购买退币请求取退币提示显示交易完毕
功能模型
功能模型描述了系统的所有计算。功能模型指出发生了什么,动态模型确定什么时候发生,而对象模型确定发生的客体。功能模型表明一个计算如何从输入值得到输出值,它不考虑计算的次序。功能模型由多张数据流图组成。数据流图用来表示从源对象到目标对象的数据值的流向,它不包含控制信息,控制信息在动态模型中表示,同时数据流图也不表示对象中值的组织,值的组织在对象模型中表示。
数据流图中包含有处理、数据流、动作对象和数据存储对象。
1.处理
数据流图中的处理用来改变数据值。最低层处理是纯粹的函数,一张完整的数据流图是一个高层处理。
2.数据流
数据流图中的数据流将对象的输出与处理、处理与对象的输入、处理与处理联系起来。在一个计算机中,用数据流来表示一中间数据值,数据流不能改变数据值。
3.动作对象
动作对象是一种主动对象,它通过生成或者使用数据值来驱动数据流图。
4.数据存储对象
数据流图中的数据存储是被动对象,它用来存储数据。它与动作对象不一样,数据存储本身不产生任何操作,它只响应存储和访问的要求。
有效币特征假币退假币假币检查硬币有效币硬币送入硬币储藏器计算面值货物价格有货货币总值硬币顾客投币顾客不足等待顾客投币顾客取消购买,退币顾客判断货币是否足够足够选择货物判断分配器货物存量无货分配货物,找零货物,硬币硬币退币
第五篇:软件工程课程设计(自动售货机)
《软件工程》课程设计报告
一、问题描述
(一)关于自动售货机
自动售货机像磁卡电话、银行柜员机一样,以方便、新颖、文明、昼夜服务等特点,成为发达国家不可缺少的便民配套设施。如今的自动售货机可以为顾客提供多种服务。顾客可以根据自己的需要选择商品并投入钱币,售货机接收钱币,售出商品。
(二)自动售货机的设计
自动售货机系统是一种无人售货系统。售货时,顾客把硬币投入机器的投币口中,机器检查硬币的大小、重量、厚度及边缘类型。有效的硬币是一元币、五角币、一角币、五分币和一分币。其它货币都被认为是假币。机器拒收假币,并将其从退币孔退出。当机器接收了有效的硬币之后,将之送入硬币储藏器。顾客支付的货币根据硬币的面值进行累加。
自动售货机装有货物分配器,每个分配器中包含0 个或多个价格相同的货物。顾客通过选择货物分配器来选择货物。如果有货,且顾客支付的货币值不小于该货物的价格,货物将被分配到货物传送孔送给顾客,并将找零返回到退币孔。如果无货,则和顾客支付的货币值相等的硬币将被送到退币孔。如果顾客支付的货币值小于所选货物的价格,机器将等待顾客投进更多的货币。如果顾客决定不买所选择的货物,他投放进的硬币将从退币孔中退出。
二、需求分析
(一)UML自动售货机系统功能需求:
自动售货机系统是一种无一元等3个硬币投币口。顾客确认购货后,售货机可根据硬币的面值进行累加。
自动售货机装有货物分配器。每个货物分配器中包含零个或多个价格相同的货物。顾客通过 1 选择货物分配器来选择货物。如果货物分配器中有货物,而且顾客支付的货币值不小于该货物的价格,货物将被分配到货物传送孔送给顾客,并将适当的零钱返回到退币孔。如果分配器是空的,则和顾客支付的货币值相等的硬币将被送加到退币孔。如果顾客支付的货币值少于所选择的分配器中的货物的价格,机器将等待顾客投进更多的货币。如果顾客决定不买所选择的货物,将所投硬币从退币孔退出。
(二)UML自动售货机系统控制要求:
根据售货机自动控制系统的流程可以知道自动售货机的主要系统包括:计币系统、比较系统、选择系统、饮料供应系统、退币系统和报警系统。
1.计币系统:
当有顾额色买饮料时,投入的钱币经过感应器,感应器记忆投币的个数关且传送到检测系统(即电子天平)和计币系统。只有当电子天平测量的重量少于误差值时,允许计币系统进行叠加钱币,叠加的钱币数据存放在数据寄存器中。如果不正确时,认为是假币。既定出投币,既定出系统,等待新顾客。
2.比较系统:
投入完毕后,系统会把钱币数据和可以购买饮料的价格进行区间比较,当投入的钱币小于2元时,指示灯亮,显示投入的钱币不足。此时可以再投币或选择退币。当投稿的钱币在2~3元之间时,汔水选择指示灯长亮。当大于3元时,汔水和咖啡的指示灯同时长亮。此时可以选择饮料或选择退币。
3.选择系统:
比较电路完成后选择电路指示灯是长亮的,当按下汽水或咖啡选择时,相应的选择指示灯由长亮转为以1秒为周期闪烁。当饮料供应完毕时,闪烁同时停止。
4.饮料供应系统:
当按下选择按钮时,相应的电磁阀(Y4或Y6)和电机(Y3或Y5)同时启动。在饮料输出的同时,减去相应的购买钱币数。当饮料输出达到8秒时,电磁阀首先关断,小电机继续工作0.5秒后停机。此小电机的作用是:在输出饮料时,加快输出。在电磁阀关断时,给电磁阀加压作用,加速电磁阀的关断。(注:由于该售货机是长期使用,电磁阀使用过多时,返回弹力减少,不能完全关断会出现漏饮料的现象。此时电机Y3和Y5延长工作0.5秒起到电磁阀加压的作用,使电磁阀可以完好的关断。)
5.退币系统:
当顾客购完饮料后,多余的钱币只要按下退币按钮。系统就会把数据寄存器D2内的钱币数首先除以10得到整数部分,是1元钱需要退回的数量,存放在D10里。余数存放在D11里。再用D11除以5得到的整数部分是5角钱需要退回的数量,存放在D12里。余数存放在D13里。最后D13里面的数值,就是1角钱需要退回的数量。在选择退币的同时启动3个退币电机。3个感应器开始计数,当感应器记录的个数等于数据寄存器退回的币数时,退币电机停止运转。
6.报警系统:
报警系统如果是非故障报警,只要通过网络通知送液车或者送币车即可。但是如果是故障报警则需要通知维修人员到现声进行维修。同时停止服务,避免造成顾客的损失。
(三)业务流程图
钱币记录仪对钱币前端接受顾客投的进行识别币判断退出钱币发送信息到分配器判断没有货物时发送信息到前端发送货物4
(四)数据流程图
钱币钱币记录仪对分配器反钱币钱币进行计算与货物价格进货物发放行比较取走零钱与购买的货物
三、各种UML图型及其分析
(一)用例图
1.顾客的用例图
inputCoinchooseSodaCustomer
2.自动售货机的用例图
RegisterDispenserFrontSodaMachine
(二)类图
(三)序列图
理想状态(不找零钱)的序列图
:Front:Register:Dispenser : Customer1: inputCoin()2: accept()3: getCustomerInput()4: checkForSoda()5: returnSodaFree()6: displayPrompt()7: chooseSoda()8: sendChooseToDis()9: checkAvailability()10: releaseSoda()11: releaseSoda()8 1.没有货物的序列图
:Front:Register:Dispenser : Customer1: inputCoin()2: accept()3: getCustomerInput()4: checkForSoda()5: returnSodaFree()6: displayPrompt()7: chooseSoda()8: sendChooseToDis()9: checkAvailability()10: releaseSoda()11: displayPrompt()12: sendReturnCoin()13: returnCoinToFront()14: returnCoin()9 2.3.需找零钱的序列图
:Front:Register:Dispenser : Customer1: inputCoin()2: accept()3: getCustomerInput()4: checkForSoda()5: returnSodaFree()6: displayPrompt()7: chooseSoda()8: sendChooseToDis()9: checkAvailability()10: releaseSoda()11: sendSodaPrice()12: checkForChange()13: releaseChange()14: receiveSoda()15: receiveChange()10
没有零钱找给顾客
:Front:Register:Dispenser : Customer1: inputCoin()2: accept()3: getCustomerInput()4: checkForSoda()5: returnSodaFree()6: displayPrompt()7: chooseSoda()8: sendChooseToDis()9: checkAvailability()10: releaseSoda()11: sendSodaPrice()12: checkForCharge()13: returnNoCharge()14: returnCoinToFront()15: displayPrompt()16: returnSodaToDispenser()17: returnCoin()11 4.5.完整的序列图
:Front:Register:Dispenser : Customer1: inputCoin()2: accept()3: getCustomerInput()4: checkForSoda()5: returnNoCharge()6: returnCoinToFront()7: displayPrompt()8: returnCoin()9: End()10: returnSodaFree()11: displayPrompt()12: chooseSoda()13: sendChooseToDispenser()14: checkAvailability()15: returnUnavailability()16: displayPrompt()17: sendReturnCoin()18: returnCoinToFront()19: returnCoin()20: End()21: releaseSoda()22: sendSodaFrice()23: checkForCharge()24: returnNoCharge()25: returnCoinToFront()26: displayPrompt()27: returnSodaToDispenser()28: returnCoin()29: End()30: releaseCharge()31: receiveSoda()32: receiveCharge()33: End()34: receiveSoda()35: End()12
(四)协作图
1.理想状态的协作图
3: getCustomerInput()9: checkAvailability()4: checkForSoda():Registe:Dispensrer8: sendChooseToDis()2: accept()5: returnSodaFree()1: inputCoin()10: releaseSoda()7: chooseSoda():Front : Customer6: displayPrompt()11: releaseSoda()2.没有货物的协作图
1: inputCoin()7: chooseSoda():Front : Customer6: displayPrompt()11: displayPrompt()14: returnCoin()13: returnCoinToFront()8: sendChooseToDis()2: accept()5: returnSodaFree()12: sendReturnCoin()10: releaseSoda()3: getCustomerInput()9: checkAvailability()4: checkForSoda():Registe:Dispensrer 3.需找零钱的协作图
1: inputCoin()7: chooseSoda():Front : Customer6: displayPrompt()14: receiveSoda()15: receiveChange()13: releaseChange()8: sendChooseToDis()2: accept()5: returnSodaFree()10: releaseSoda()3: getCustomerInput()12: checkForChange()9: checkAvailability()4: checkForSoda():Registe:Dispensrer11: sendSodaPrice()4.没有零钱找给顾客的协作图
1: inputCoin()7: chooseSoda():Front : Customer6: displayPrompt()15: displayPrompt()17: returnCoin()13: returnNoCharge()14: returnCoinToFront()8: sendChooseToDis()16: returnSodaToDispenser()2: accept()5: returnSodaFree()3: getCustomerInput()10: releaseSoda()12: checkForCharge()9: checkAvailability()4: checkForSoda():Registe:Dispensrer11: sendSodaPrice()
完整的协作图
29: End()33: End()35: End()1: inputCoin()12: chooseSoda():Front : Customer7: displayPrompt()8: returnCoin()11: displayPrompt()16: displayPrompt()19: returnCoin()26: displayPrompt()28: returnCoin()31: receiveSoda()13: sendChooseToDispenser()32: receiveCharge()27: returnSodaToDispenser()34: receiveSoda()10: returnSodaFree()5: returnNoCharge()15: returnUnavailability()6: returnCoinToFront()21: releaseSoda()18: returnCoinToFront()24: returnNoCharge()14: checkAvailability()25: returnCoinToFront()30: releaseCharge()2: accept()17: sendReturnCoin():Dispenser4: checkForSoda()3: getCustomerInput()22: sendSodaFrice()23: checkForCharge():Register15 5.(五)状态图
提示投币do/ 请求投币do/ 提示是假币假币do/ 检查硬币真币否购买do/ 存储硬币,计算货币总值do/ 确认投完硬币有do/ 请求选择商品选择货品do/ 提示无货无货do/ 检测货品存量有货计算小于do/ 比较货币总值和货物价值do/ 提示货币不足不小于确认do/ 确认顾客购买do/ 送出货品,请求取货有零钱退币无零钱do/ 请求退币不购买显示do/ 提示交易完成17
(六)活动图
1.投币的活动图
投币确认投币完成2.选择货物的活动图
请求选择输入货物确认选择货物ID 3.前端的活动图
接受货币显示可购显示面值货物过小显示没有该货物接受饮料显示没有零钱找零钱退货币 19
货币记录仪的活动图
接受从前端来的钱币判断钱币发送信息给分配仪发送货物金额给前端返回钱币计算零钱20 4.5.分配器的活动图
接受货币启示录仪的信息发送货物提示没有该货物 21
(七)组件图
CustomerSodaMachineFrontRegisterDispenserDB_0
(八)配置图
Clint数据库
(九)数据模型图