VHDL自动售邮票机的代码
- 格式:doc
- 大小:169.00 KB
- 文档页数:4
自动售货机设计实验报告一设计题目:g) 自动售货机设计FPGA模块模拟自动售货机的工作过程,要求如下(1)售货机有两个进币孔,可以输入硬币和纸币,售货机有两个进币孔,一个是输入硬币,一个是输入纸币,硬币的识别范围是5角和1 元的硬币,纸币的识别范围是1 元、5 元,10 元,20元,50元,100元。
乘客可以连续多次投入钱币。
(2)顾客可以选择的商品种类有16种,价格分别为1-16元,顾客可以通过输入商品的编号来实现商品的选择。
即有一个小键盘(0-9按键)来完成,比如输入15时要先输入1,再输入5。
(3)顾客选择完商品后,可以选择需要的数量。
然后可以继续选择商品及其数量,每次可以选择最多三个商品。
然后显示出所需金额。
顾客此时可以投币,并且显示已经投币的总币值。
当投币值达到或超过所需币值后,售货机出货,并扣除所需金额,并找出多余金额。
在投币期间,顾客可以按取消键取消本次操作,钱币自动退出。
二程序代码:三程序实现功能:FPGA模块模拟自动售货机:(1)售货机有两个进币孔,分别输入硬币和纸币,硬币的识别范围是5角和1 元的硬币,纸币的识别范围是1 元、5 元,10 元,20元,50元,100元。
乘客可以连续多次投入钱币。
(2)顾客可以选择的商品种类有16种,价格分别为1-16元,顾客可以通过输入商品的编号来实现商品的选择。
(3)顾客选择完商品后,可以选择需要的数量。
然后可以继续选择商品及其数量,每次最多选择最种商品,每种商品最多购买三个。
然后显示出所需金额。
顾客此时可以投币,并且显示已经投币的总币值。
当投币值达到或超过所需币值后,售货机出货,并扣除所需金额,并找出多余金额。
在投币期间,顾客可以按取消键取消本次操作,钱币自动退出。
四程序功能模块分析:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;实体说明:entity sellor isport ( clk:in std_logic; --系统时钟sel,cancel,reset: in std_logic; --选择、取消、开始(用于进入初始状态)变量定义:coin: in std_logic_vector(1 downto 0); --5角硬币、1元硬币crash:in std_logic_vector(5 downto 0); --100元、50元、20元、10元、5元、一元纸币item: in std_logic_vector(3 downto 0); --16种商品quantity:in std_logic_vector(1 downto 0); --商品数量(一次最多购买3件)change_out :out std_logic_vector(10 downto 0); --找零item_out :out std_logic_vector(3 downto 0); --是否购买了商品(1表示有商品出来、0表示没有商品出来)change :out std_logic ); --是否有找零end sellor;结构体说明:architecture behave of sellor issignal price:std_logic_vector(7 downto 0);signal counter: std_logic_vector(10 downto 0); --币数计数器signal total_price:std_logic_vector(10 downto 0); --控制系统的时钟信号type state_type is (initial_state,item1_state,quantity_state,money_state,sell_state,change_state);signal state:state_type;signal temp:std_logic_vector(1 downto 0);signal quan:std_logic_vector(3 downto 0);begincom:process(reset,sel,clk)beginif (clk'event and clk='1')thenif reset='1' then state<=initial_state;temp<="00";quan<="0000";end if;case state iswhen initial_state=>item_out<="0000"; --出票口关闭change_out<="00000000000"; --找零口关闭total_price<="00000000000"; --票价总额记录清零counter<="00000000000";--投入钱币总额记录清零change<='0';state<=item1_state; 设定initial_state选择物品程序:when item1_state=>if temp<"11" thenelse state<=money_state;end if;when quantity_state=>if(cancel='1')then --按下“取消”按钮state<=initial_state;else 取消操作程序if quantity="00" thenitem_out<="0000";change<='0';change_out<="00000000000";state<=initial_state;else 当选择0个商品total_price<=total_price+price*quantity;temp<=temp+1;quan<=quan+quantity;if (sel='1') then state<=item1_state;elsestate<=money_state;end if;end if;end if;货币识别:when money_state=>if(cancel='1')then --按下“取消”按钮state<=initial_state;end if;case crash is --纸币识别end case;case coin is --硬币识别end case;if counter>=total_price thenstate<=sell_state;--系统进入出票状态end if;购物操作程序:when sell_state =>if(cancel='1')thenitem_out<="0000";change<='1';change_out<=counter; --按下“取消”按钮state<=initial_state;elseif counter>=total_price thenitem_out<=quan; --判断是否还有找零state<=change_state; --系统进入找零状态elseitem_out<="0000";state<=initial_state;end if;end if;when change_state=>if(cancel='1')thenitem_out<="0000";change<='1';change_out<=counter; --按下“取消”按钮state<=initial_state;elseif counter>total_price thenchange<='1';change_out<=counter-total_price;item_out<=quan;elsechange<='0';change_out<="00000000000";state<=initial_state;end if;end if;end case;end if;end process;end behave;五、仿真波形六、个人总结与感想:良好的沟通与分工是十分重要的,这对程序的实现和质量具有至关重要的作用。
北华大学电子系统综合实习报告学院 : 电气信息工程学院专业班级 : 通信工程姓名 : 闫梦迪学号 :指导老师 : 董胜实习时间 : 2015.11.30 — 12.11目录1.实习题目……………………………………………………………P32.实习目的……………………………………………………………P33.实习技术要求………………………………………………………P34.实现过程……………………………………………………………P35.功能及代码…………………………………………………………P56.仿真及硬件测试……………………………………………………P97.实习心得…………………………………………………………P128. 教师评语…………………………………………………………P14一.实习题目自动售货机设计二.实习目的通过本课题的研究,可以掌握电子控制系统的基本原理与其实现,通过对各个模块的编程及其仿真,对QuartusII软件的使用有所了解。
每个波形模块的VHDL实现加深了硬件描述语言的学习。
最终的顶层文件的调试,更是体现了综合知识的运用。
三.实习技术要求本设计要实现自动售货机的基本功能,如货物信息存储、商品选择、进程控制、硬币处理、余额计算、显示等功能。
利用软件QuartusII 平台,采用VHDL硬件描述语言编程的设计方法设计系统核心电路的硬件程序,与一般的软件开发不同,VHDL编程更需要熟悉一些底层的硬件知识,特别是数字逻辑电路的设计,因此VHDL编程的方法、思路都要更多的与硬件电路联系起来。
完成系统各个功能模块的硬件程序设计后,在软件平台上进行编译和电路仿真,最后生成的目标文件下载到实验台内的FPGA芯片以实现该系统,并在实验台上对设计进行验证。
四.实现过程1)、根据设计要求实现过程分两部分:a、面向客户端模块设计基于Quartus2软件环境下,应用VHEDL语言进行程序设计。
以clk输入端口进行商品选择,coin1输入端口做钱数输入,Finish输入端口做确认,进而完成商品购买。
毕业设计说明书(论文)作者: 学号:系:专业:题目: 基于VHDL的地铁自动售票机系统设计指导者:(姓名) (专业技术职务)评阅者:(姓名) (专业技术职务)2014 年 5 月毕业设计(论文)评语学生姓名:班级、学号:题目:综合成绩:毕业设计(论文)评语毕业设计说明书(论文)中文摘要毕业设计说明书(论文)外文摘要本科毕业设计说明书(论文)第Ⅰ页共Ⅰ页目次1 引言 (1)1.1 研究意义 (1)1.2 研究背景 (1)1.3 研究任务 (2)1.4 研究内容 (2)2 理论基础 (3)2.1 FPGA (3)2.2 VHDL语言 (4)2.3 QuartusⅡ软件 (6)3 课题设计 (9)3.1 设计要求 (9)3.2 系统分析与设计方案 (9)4 程序仿真 (16)4.1 自动售票机主控模块的波形仿真 (16)4.2 车票选择模块的波形仿真 (17)4.3 纸、硬币处理模块的波形仿真 (18)4.4 自动找零、出票模块的波形仿真 (19)4.5 整个售票机系统的波形仿真图 (20)5硬件验证 (22)5.1 上箱过程 (22)5.2 上箱结果 (23)结论 (25)致谢 (26)参考文献 (27)附录 (28)1 引言自动售票机主要的控制模块可以用多种语言设计完成。
但这些语言有较大的差异,不利于后期的修改和使用者之间的交流。
而VHDL语言是一种功能强大、标准化的硬件描述语言。
用VHDL语言设计程序时可以先分块编写再合并,所以能够编写出多层次的程序,与此同时,VHDL语言编写的程序避免了其他语言只能在各自环境中使用的缺陷。
本章主要讨论了地铁的起源、发展,以及随着社会的发展,为了简化购票流程,从而设计出了自动售票机来代替人工售票等。
1.1 研究意义近年来,国民经济快速发展,城市的各项设施也越来越好,进而人们对交通的要求也不断增加。
因此,安全又快捷的地铁就出现了。
地铁的速度较快,且在行驶过程的载客数较多,这是公交所不具备的,而且它的出现增加了乘客的选择,也可以很好的缓解交通拥挤的情况。
摘要本文主要介绍了利用VHDL设计语言和Altera公司的MAX+PLUS II软件开发平台, 来设计实现地铁自动售票系统的核心控制部分的功能:站点选择,票数选择,投币处理,余额计算,自动出票等功能。
在本设计中采用了有限状态机的设计方法,将整个售票系统的控制部分化分为五个状态: 选站状态,选票状态,投币状态,出票状态和余额找零状态。
最后通过对程序的调试以及相应部分功能的仿真,验证了整个系统的原理和本设计方案的正确性。
由于采用了有限状态机的设计方法,使得本系统运行可靠性高,非法状态易控制。
关键词: FPGA,CPLD, VHDL语言,MAX+PLUS II 软件,有限状态机, ,地铁自动售票系统目录第一章绪论 (1)1.1 电子器件的发展和现状 (1)1.2 设计方法的发展 (3)1.3 层次化的设计与VHDL的应用 (5)1.4 本课题的提出与意义 (8)1.5 本课题研究内容 (8)第二章 VHDL语言介绍 (10)2.1什么是VHDL (10)2.2 VHDL语言的特点 (10)2.3 VHDL的设计流程 (11)2.4 VHDL程序的基本结构 (13)第三章 MAX+PLUS II软件介绍 (14)3.1 MAX+PLUS II简介 (14)3.2Max+PlusⅡ开发系统的特点 (15)3.3 Max+PlusⅡ功能简介 (16)3.4 Max+plusⅡ设计过程 (20)第四章地铁售票系统的设计与实现 (24)4.1 课题要求 (24)4.2设计分析 (24)4.3状态机设计 (26)第五章结束语 (33)附录 (34)参考文献 (41)致谢 (42)第一章绪论1.1 电子器件的发展和现状电子技术的发展总是同电子器件的发展密切相关的,由于电子器件的不断更新换代,电子技术得到了飞速发展,当今信息技术被广泛应用在国民经济的方方面面。
多媒体技术的普及、高速宽带网络的建设、数字电视的出现以及与我们日常生活息息相关的各种家用电器,都离不开微处理器、存储器和一些采用行业标准的专用芯片。
自动售货机VHDL程序与仿真(1)自动售货机VHDL程序如下:--文件名:pl_auto1.vhd。
--功能:货物信息存储,进程控制,硬币处理,余额计算,显示等功能。
--说明:显示的钱数coin的以5角为单位。
--最后修改日期:2004.3.23。
library ieee;use ieee.std_logic_arith.all;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity PL_auto1 isport ( clk:in std_logic; --系统时钟set,get,sel,finish: in std_logic; --设定、买、选择、完成信号coin0,coin1: in std_logic; --5角硬币、1元硬币price,quantity :in std_logic_vector(3 downto 0); --价格、数量数据item0 , act:out std_logic_vector(3 downto 0); --显示、开关信号y0,y1 :out std_logic_vector(6 downto 0); --钱数、商品数量显示数据act10,act5 :out std_logic); --1元硬币、5角硬币end PL_auto1;architecture behav of PL_auto1 istype ram_type is array(3 downto 0)of std_logic_vector(7 downto 0);signal ram :ram_type; --定义RAMsignal item: std_logic_vector(1 downto 0); --商品种类signal coin: std_logic_vector(3 downto 0); --币数计数器signal pri,qua:std_logic_vector(3 downto 0); --商品单价、数量signal clk1: std_logic; --控制系统的时钟信号begincom:process(set,clk1)variable quan:std_logic_vector(3 downto 0);beginif set='1' then ram(conv_integer(item))<=price & quantity;act<="0000";--把商品的单价、数量置入到RAM elsif clk1'event and clk1='1' then act5<='0'; act10<='0';if coin0='1' thenif coin<"1001"then coin<=coin+1; --投入5角硬币,coin自加1else coin<="0000";end if;elsif coin1='1' thenif coin<"1001"then coin<=coin+2; --投入1元硬币,coin自加2else coin<="0000";end if;elsif sel='1' then item<=item+1; --对商品进行循环选择elsif get='1' then --对商品进行购买if qua>"0000" and coin>=pri then coin<=coin-pri;quan:=quan-1;ram(conv_integer(item))<=pri & quan;if item="00" then act<="1000"; --购买时,自动售货机对4种商品的操作elsif item="01" then act<="0100";elsif item="10" then act<="0010";elsif item="11" then act<="0001";end if;end if;elsif finish='1' then --结束交易,退币(找币)if coin>"0001" then act10<='1';coin<=coin-2; --此IF语句完成找币操作elsif coin>"0000" then act5<='1'; coin<=coin-1;else act5<='0'; act10<='0';end if;elsif get='0' then act<="0000";for i in 4 to 7 looppri(i-4)<=ram (conv_integer(item))(i); --商品单价的读取end loop;for i in 0 to 3 loopquan(i):=ram(conv_integer(item))(i); --商品数量的读取end loop;end if;end if;qua<=quan;end process com;m32:process(clk) --此进程完成对32Mhz的脉冲分频variable q: std_logic_vector( 24 downto 0);beginif clk'event and clk='1' then q:=q+1;end if;if q="111111111111111111111111" then clk1<='1';else clk1<='0';end if;end process m32;code0:process(item) --商品指示灯译码begincase item iswhen "00"=>item0<="0111";when "01"=>item0<="1011";when "10"=>item0<="1101";when others=>item0<="1110";end case;end process;code1: process (coin) --钱数的BCD到七段码的译码begincase coin iswhen "0000"=>y0<="0000001";when "0001"=>y0<="1001111";when "0010"=>y0<="0010010";when "0011"=>y0<="0000110";when "0100"=>y0<="1001100";when "0101"=>y0<="0100100";when "0110"=>y0<="0100000";when "0111"=>y0<="0001111";when "1000"=>y0<="0000000";when "1001"=>y0<="0000100";when others=>y0<="1111111";end case;end process;code2: process (qua) --单价的BCD到七段码的译码begincase qua iswhen "0000"=>y1<="0000001";when "0001"=>y1<="1001111";when "0010"=>y1<="0010010";when "0011"=>y1<="0000110";when "0100"=>y1<="1001100";when "0101"=>y1<="0100100";when "0110"=>y1<="0100000";when "0111"=>y1<="0001111";when "1000"=>y1<="0000000";when "1001"=>y1<="0000100";when others=>y1<="1111111";end case;end process;end behav;(2)程序仿真图8.21.2 系统仿真全图图8.21.3 系统仿真图-预置部分图21.4 系统仿真图-商品种类选择部分图8.21.5 系统仿真图-投币部分图8.21.6 系统仿真图-购买、找币结束交易部分。
自动售货机控制模块VHDL程序设计及FPGA实现 近年来,随着集成电路技术的迅猛发展,特别是可编程逻辑器件的高速发展, EDA(Electronic Design Automation,电子设计自动化)技术成为电子设计工程师的新宠。
EDA技术以计算机为工具完成数字系统的逻辑综合、布局布线和设计仿真等工作。
电路设计者只需要完成对系统功能的描述,就可以由计算机软件进行系统处理,最后得到设计结果,并且修改设计方案如同修改软件一样方便。
利用EDA工具可以极大地提高设计效率。
利用硬件描述语言编程来表示逻辑器件及系统硬件的功能和行为,是EDA设计方法的一个重要特征。
VHDL(Very High Speed Integrated Circuit Hardware Description Language,超高速集成电路硬件描述语言)是硬件描述语言的一种,对系统硬件的描述功能很强而语法又比较简单。
VHDL具有强大的行为描述能力,设计者可以不懂硬件的结构,只需集中精力进行电子系统的设计和性能优化;具有方便的逻辑仿真与调试功能,在设计早期就能查验系统的功能,方便地比较各种方案的可行性及其优劣。
目前,VHDL作为IEEE的工业标准硬件描述语言,得到众多EDA公司的支持,在电子工程领域已经成为事实上通用硬件描述语言。
本文采用VHDL作为工具描述了自动售货机控制模块的逻辑控制电路,并在FPGA上实现。
该自动售货机能够根据投入硬币额度,按预定的要求在投入硬币大于规定值时送出饮料并找零。
设计方案 本文所设计的简易自动售货机可销售矿泉水,假设每瓶1.5元。
设两个投币孔,分别接收1元和5角两种硬币,两个输出口,分别输出购买的商品和找零。
假设每次只能投入一枚1元或5角硬币,投入1元5角硬币后机器自动给出一瓶矿泉水;投入2元硬币后,在给出一瓶矿泉水的同时找回一枚5角的硬币。
另外设置一复位按钮,当复位按钮按下时,自动售货机回到初始状态。
自动售邮票机的设计一、摘要:通过参考文献资料仔细分析自动售货机的原理本文详细的介绍了(Very High Speed Integrated Circuit Hardware Description Language)语言的一些特点及语法结构;介绍了自动售货机系统的基本原理、系统组成和主要功能;并分析讨论了用VHDL语言开发自动售货机系统的设计流程。
本设计利用Altera公司的开发软件Quartus II平台,采用VHDL硬件描述语言编程的设计方法设计系统核心电路的硬件程序,在Quartus II软件平台上进行编译和电路仿真,最后生成的目标文件下载到实验台内的FPGA芯片以实现该系统,并在实验台上对设计进行了验证。
最终完成的自动售货机系统具有投币处理、商品选择、购货撤销、异常退币、计算存货等主要功能,整个系统的开发体现了在Quartus II软件平台上用VHDL 设计数字控制系统的实用性。
二、综述电子技术的发展,特别是专用集成电路(ASIC)设计技术的日趋进步和完善,推动力数字系统设计的迅猛发展。
电子设计自动化(EDA)工具给电子设计带来了巨大的变革,尤其是硬件描述语言的出现和发展,解决了传统用电路原理设计系统工程时的诸多不便,成为电子电路设计人员的最得力助手。
学习VHDL 已日益成为我国高等学校学生和工程技术人员的迫切需要。
本设计是利用VHDL,用模块合成的方式来完成的。
根据自动售票机的功能以及顾客的各种买卖行为,将其分为几大模块来处理。
目前最通用的硬件描述语言有VHDL与Verilog两种。
1982年美国国防部的一个分支专案要求所有的数字电路必须用VHDL语言设计。
1983年的IBH及TI等公司在此专案规定下,开始开发VHDL。
随后IEEE1076号标准。
后来将一种可配合集成工具的VHDL程序包,特别命名为IEEE1076.3,并成为1076号IEEE标准的一部分。
最近,新标准包IEEE1076.4被开发出来,成为建立ASIC 及FPGA的模型函数库。
北邮数电实验VHDL源代码完整版注:北邮信通院数电实验,大二下共四次实验,以下为四次实验的完整代码,仅供参考,希望学弟学妹在抄代码的时候了解每一行代码的含义。
知识是自己的。
别忘了,北邮的未来靠你们。
注意事项:1学校部分电脑打不开07版word文件(后缀docx),建议大家准备一份TXT以防万一2运行出错时可能是你输入有误,比如中文和英文符号弄错了3数电实验很简单,但要心细,一定要按老师说的做4数电实验报告千万不要抄袭,老师判断力很强实验一:半加器老师会给出,全加器是画图,怎么画书上有,不用源代码。
实验二:(1)3位二进制数比较器LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY comp3 ISPORT(A:IN STD_LOGIC_VECTOR(2 DOWNTO 0);B:IN STD_LOGIC_VECTOR(2 DOWNTO 0);YA,YB,YC:OUT STD_LOGIC);END comp3;ARCHITECTURE behave OF comp3 ISBEGINPROCESS(A,B)BEGINIF(A>B)THENY A<='1';YB<='0';YC<='0';ELSIF(A<B)THENY A<='0';YB<='1';YC<='0';ELSEY A<='0';YB<='0';YC<='1';END IF;END PROCESS;END behave;(2)4选1数据选择器LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY mux4 ISPORT(A:IN STD_LOGIC_VECTOR(1 DOWNTO 0);D0,D1,D2,D3:IN STD_LOGIC;Y,YB:OUT STD_LOGIC);END mux4;ARCHITECTURE behave OF mux4 ISBEGINPROCESS(A,D0,D1,D2,D3)BEGINCASE A ISWHEN"00"=> Y<=D0;YB <= NOT D0;WHEN"01"=> Y<=D1;YB <= NOT D1;WHEN"10"=> Y<=D2;YB <= NOT D2;WHEN"11"=> Y<=D3;YB <= NOT D3;WHEN OTHERS=> Y<='Z';YB<='Z';END CASE;END PROCESS;END behave;(3)8421码转换为格雷码LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY trans1 ISPORT(A:IN STD_LOGIC_VECTOR(3 DOWNTO 0);B:OUT STD_LOGIC_VECTOR(3 DOWNTO 0)); END trans1;ARCHITECTURE trans_gray OF trans1 ISBEGINB(0)<=A(0)XOR A(1);B(1)<=A(1)XOR A(2);B(2)<=A(2)XOR A(3);B(3)<=A(3);END trans_gray;(4)8421码转换为余三码LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY sunyu_trans2 ISPORT(A:IN STD_LOGIC_VECTOR(3 DOWNTO 0);B:OUT STD_LOGIC_VECTOR(3 DOWNTO 0)); END sunyu_trans2;ARCHITECTURE trans_ex3 OF sunyu_trans2 IS BEGINPROCESS(A)BEGINCASE A ISWHEN"0000"=> B<="0011";WHEN"0001"=> B<="0100";WHEN"0010"=> B<="0101";WHEN"0011"=> B<="0110";WHEN"0100"=> B<="0111";WHEN"0101"=> B<="1000";WHEN"0110"=> B<="1001";WHEN"0111"=> B<="1010";WHEN"1000"=> B<="1011";WHEN"1001"=> B<="1100";WHEN OTHERS=> B<="ZZZZ";END CASE;END PROCESS;END trans_ex3;(5)数码管译码器LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY sunyu_encoder ISPORT(A:IN STD_LOGIC_VECTOR(3 DOWNTO 0);B:OUT STD_LOGIC_VECTOR(6 DOWNTO 0);C:OUT STD_LOGIC_VECTOR(5 DOWNTO 0)); END sunyu_encoder;ARCHITECTURE encoder_arch OF sunyu_encoder IS BEGINPROCESS(A)BEGINC<="011111";CASE A ISWHEN"0000"=> B<="1111110";--0WHEN"0001"=> B<="0110000";--1WHEN"0010"=> B<="1101101";--2WHEN"0011"=> B<="1111001";--3WHEN"0100"=> B<="0110011";--4WHEN"0101"=> B<="1011011";--5WHEN"0110"=> B<="1011111";--6WHEN"0111"=> B<="1110000";--7WHEN"1000"=> B<="1111111";--8WHEN"1001"=> B<="1111011";--9WHEN OTHERS=> B<="ZZZZZZZ";END CASE;END PROCESS;END encoder_arch;实验三:注:以下的AAA(1)(2)(3)(4)为课前做好的,但课上老师要求有了些变化,实际上机的代码在下面BBB中AAA(1)带异步复位的四位二进制减计数器LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY count_1 ISPORT(clk,reset:IN STD_LOGIC;q:OUT STD_LOGIC_VECTOR(3 DOWNTO 0));END count_1;ARCHITECTURE a OF count_1 ISSIGNAL q_temp:STD_LOGIC_VECTOR(3 DOWNTO 0);BEGINPROCESS(clk,reset)BEGINIF reset='0' THENq_temp <="1111";ELSIF clk'EVENT AND clk='1' THENq_temp <=q_temp-1;END IF;END PROCESS;q<= q_temp;END a;(2)带异步复位的8421码十进制计数器LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY count_BCD ISPORT(clk,reset:IN STD_LOGIC;q:OUT STD_LOGIC_VECTOR(3 DOWNTO 0));END count_BCD;ARCHITECTURE a OF count_BCD ISSIGNAL q_temp:STD_LOGIC_VECTOR(3 DOWNTO 0); BEGINPROCESS(clk,reset)BEGINIF reset='0' THENq_temp <="0000";ELSIF clk'EVENT AND clk='1' THENIF q_temp="1001" THENq_temp <="0000";ELSE q_temp <=q_temp+1;END IF;END IF;END PROCESS;q<= q_temp;END a;(3)分频器LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY div_12 ISPORT(clk:IN STD_LOGIC;clear:IN STD_LOGIC;clk_out:OUT STD_LOGIC);END div_12;ARCHITECTURE a OF div_12 ISSIGNAL temp:INTEGER RANGE 0 TO 11;BEGINp1:PROCESS(clear,clk)BEGINIF clear='0'THENtemp<=0;ELSIF clk'EVENT AND clk='1' THENIF temp=11 THENtemp<=0;ELSE temp<=temp+1;END IF;END IF;END PROCESS p1;p2:PROCESS(temp)BEGINIF temp<6 THENclk_out<='0';ELSE clk_out<='1';END IF;END PROCESS p2;END a;(4)带异步复位的四位环形计数器LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY ring ISPORT(clk,reset:IN STD_LOGIC;countout:OUT STD_LOGIC_VECTOR(3 DOWNTO 0)); END ring;ARCHITECTURE behave OF ring ISSIGNAL nextcount:STD_LOGIC_VECTOR(3 DOWNTO 0); BEGINPROCESS(clk,reset) --0001-0010-0100-1000-0001 BEGINIF reset='0' THEN nextcount<="0001";ELSIF clk'EVENT AND clk='1' THENCASE nextcount ISWHEN"0001"=> nextcount<="0010"; WHEN"0010"=> nextcount<="0100"; WHEN"0100"=> nextcount<="1000";WHEN OTHERS=> nextcount<="0001";END CASE;END IF;END PROCESS;countout<=nextcount;END behave;BBBLIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY count_BCD ISPORT(clk,reset:IN STD_LOGIC;q:OUT STD_LOGIC_VECTOR(3 DOWNTO 0));END count_BCD;ARCHITECTURE a OF count_BCD ISSIGNAL q_temp:STD_LOGIC_VECTOR(3 DOWNTO 0); BEGINPROCESS(clk,reset)BEGINIF reset='1' THENq_temp <="0000";ELSIF clk'EVENT AND clk='1' THENIF q_temp="1001" THENq_temp <="0000";ELSE q_temp <=q_temp+1;END IF;END IF;END PROCESS;q<= q_temp;END a;LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY ring ISPORT(clk,reset:IN STD_LOGIC;--clk_out:out STD_LOGIC;countout:OUT STD_LOGIC_VECTOR(3 DOWNTO 0)); END ring;ARCHITECTURE behave OF ring ISSIGNAL nextcount:STD_LOGIC_VECTOR(3 DOWNTO 0); SIGNAL temp:STD_LOGIC;BEGINp1:PROCESS(clk)V ARIABLE count:integer range 0 to 25000000;BEGINIF( clk'EVENT AND clk='1' )THENIF (count=25000000) THENcount:=0;temp<=not temp;ELSE count:=count+1;END IF;END IF;END PROCESS p1;--clk_out<=temp;p2:PROCESS(temp,reset) --0001-0010-0100-1000-0001 BEGINIF reset='1' THEN nextcount<="0001";ELSIF temp'EVENT AND temp='1' THENCASE nextcount ISWHEN"0001"=> nextcount<="0010"; WHEN"0010"=> nextcount<="0100"; WHEN"0100"=> nextcount<="1000";WHEN OTHERS=> nextcount<="0001";END CASE;END IF;END PROCESS p2;countout<=nextcount;END behave;LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY div_12new ISPORT(clk:IN STD_LOGIC;clear:IN STD_LOGIC;clk_out:OUT STD_LOGIC);END div_12new;ARCHITECTURE a OF div_12new ISSIGNAL temp:STD_LOGIC;BEGINPROCESS(clear,clk)V ARIABLE count:integer range 0 to 5;BEGINif (clear='1') thencount:=0;ELSIF( clk'EVENT AND clk='1' )THENIF (count=5) THENcount:=0;temp<=not temp;ELSE count:=count+1;END IF;END IF;END PROCESS;clk_out<=temp;END a;实验四:这个稍有难度,而且书上没有多少参考代码,仔细研究哦~(1)数码管显示012345library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity nixietube1 isport(clk: in std_logic;partout:out std_logic_vector(6 downto 0);catout: out std_logic_vector(5 downto 0));end nixietube1;architecture a of nixietube1 issignal part: std_logic_vector(6 downto 0);signal cat: std_logic_vector(5 downto 0);signal tempclk: std_logic;signal count: integer range 0 to 50000;beginp1:process(clk)beginif(clk'event and clk='1')thenif count=50000 thencount<=0;tempclk<= not tempclk;elsecount<=count+1;end if;end if;end process p1;p2:process(tempclk)beginif(tempclk'event and tempclk='1')thencase cat iswhen"111110"=> cat<="011111";part<="1111110"; --0 when"011111"=> cat<="101111";part<="0110000"; --1 when"101111"=> cat<="110111";part<="1101101"; --2 when"110111"=> cat<="111011";part<="1111001"; --3 when"111011"=> cat<="111101";part<="0110011"; --4 when"111101"=> cat<="111110";part<="1011011"; --5 when others => cat<="011111";part<="1111110"; --0 end case;end if;end process p2;catout<=cat;partout<=part;end a;(2)数码管滚动显示012345library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity shiyan12new2 isport(clk: in std_logic;partout:out std_logic_vector(6 downto 0);catout: out std_logic_vector(5 downto 0));end shiyan12new2;architecture a of shiyan12new2 issignal part: std_logic_vector(6 downto 0);signal cat: std_logic_vector(5 downto 0);signal number: std_logic_vector(5 downto 0); signal tempclk: std_logic;--a clk(div 1)signal move: std_logic;--a clk(div 2)beginp1:process(clk)--div 1 (cat 0-5)variable count:integer range 0 to 50000:=0;beginif(clk'event and clk='1')thenif(count=50000)thencount:=0;tempclk<= not tempclk;elsecount:=count+1;end if;end if;end process p1;p2:process(tempclk)beginif tempclk'event and tempclk='1' thencase cat iswhen"011111"=>cat<="101111"; when"101111"=>cat<="110111"; when"110111"=>cat<="111011"; when"111011"=>cat<="111101"; when"111101"=>cat<="111110";when others =>cat<="011111";end case;end if;end process p2;catout<=cat;p3:process(clk)--div 2 (one cat and change) about 1Hz variable count:integer range 0 to 25000000:=0; beginif (clk'event and clk='1') thenif (count=25000000) thencount:=0;move<=not move;elsecount:=count+1;end if;end if;end process p3;p4:process(tempclk,move)--make numbersvariable judge1:integer range 0 to 1:=0;-- 1 when "move" come variable judge2:integer range 0 to 1:=0;beginif (move'event and move='1') thenjudge1:=1;end if;if (tempclk'event and tempclk='1') thenif (judge1=0) then--when move donnot comecase number iswhen"011111"=>number<="101111"; when"101111"=>number<="110111"; when"110111"=>number<="111011"; when"111011"=>number<="111101"; when"111101"=>number<="111110";when others =>number<="011111";end case;judge2:=0;elsecase number iswhen"011111"=>number<="110111"; when"101111"=>number<="111011"; when"110111"=>number<="111101"; when"111011"=>number<="111110"; when"111110"=>number<="101111";when others =>number<="011111";end case;judge2:=1;end if;end if;if judge2=1 thenjudge1:=0;end if;end process p4;p5:process(number)begincase number iswhen"011111"=>part<="1111110";when"101111"=>part<="0110000"; when"110111"=>part<="1101101";when"111011"=>part<="1111001";when"111101"=>part<="0110011";when"111110"=>part<="1011011";when others =>part<="1111110";end case;end process p5;partout<=part;end a;(3)数码管滚动显示012345,且用全灭的数码管填充右边,直至全灭library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity shiyan12new3 isport(clk: in std_logic;partout:out std_logic_vector(6 downto 0);catout: out std_logic_vector(5 downto 0));end shiyan12new3;architecture a of shiyan12new3 issignal part: std_logic_vector(6 downto 0);signal cat: std_logic_vector(5 downto 0);signal number: std_logic_vector(5 downto 0);signal tempclk: std_logic;--a clk(div 1)signal move: std_logic;--a clk(div 2)beginp1:process(clk)--div 1 (cat 0-5)variable count:integer range 0 to 50000 :=0;beginif(clk'event and clk='1')thenif(count=50000)thencount:=0;tempclk<= not tempclk;elsecount:=count+1;end if;end if;end process p1;p2:process(tempclk)variable count: integer range 0 to 11;variable temp:std_logic_vector(5 downto 0);beginif (move'event and move='1')thenif count=11 thencount:=0;elsecount:=count+1;end if;end if;if tempclk'event and tempclk='1' thencase temp iswhen"011111"=>temp:="101111"; when"101111"=>temp:="110111"; when"110111"=>temp:="111011"; when"111011"=>temp:="111101"; when"111101"=>temp:="111110";when others =>temp:="011111";end case;end if;case count iswhen 0 =>cat<=(temp or "000000");--cat is active low when 1 =>cat<=(temp or "000001");when 2 =>cat<=(temp or "000011");when 3 =>cat<=(temp or "000111");when 4 =>cat<=(temp or "001111");when 5 =>cat<=(temp or "011111");when 6 =>cat<=(temp or "111111");when 7 =>cat<=(temp or "111110");when 8 =>cat<=(temp or "111100");when 9 =>cat<=(temp or "111000");when 10=>cat<=(temp or "110000");when 11=>cat<=(temp or "100000");end case;catout<=cat;end process p2;p3:process(clk) --div 2 (one cat and change)about 1Hzvariable count:integer range 0 to 25000000:=0;beginif (clk'event and clk='1') thenif (count=25000000) thencount:=0;move<=not move;elsecount:=count+1;end if;end if;end process p3;p4:process(tempclk,move)--make numbersvariable judge1:integer range 0 to 1:=0;-- 1 when "move" come variable judge2:integer range 0 to 1:=0;beginif (move'event and move='1') thenjudge1:=1;end if;if (tempclk'event and tempclk='1') thenif (judge1=0) then--when move donnot comecase number iswhen"011111"=>number<="101111"; when"101111"=>number<="110111"; when"110111"=>number<="111011"; when"111011"=>number<="111101"; when"111101"=>number<="111110";when others =>number<="011111";end case;judge2:=0;elsecase number iswhen"011111"=>number<="110111"; when"101111"=>number<="111011"; when"110111"=>number<="111101"; when"111011"=>number<="111110"; when"111110"=>number<="101111";when others =>number<="011111";end case;judge2:=1;end if;end if;if judge2=1 thenjudge1:=0;end if;end process p4;p5:process(number)begincase number is when"011111"=>part<="1111110"; when"101111"=>part<="0110000"; when"110111"=>part<="1101101"; when"111011"=>part<="1111001"; when"111101"=>part<="0110011"; when"111110"=>part<="1011011"; when others =>part<="1111110"; end case;end process p5;partout<=part;end a;。
基于VHDL编程FPGA的地铁自动售票机地铁自动售票机一、设计要求1、功能描述用于模仿地铁售票自动售票,完成地铁售票的核心控制功能。
2、功能要求售票机有两个进币孔,一个是输入硬币,识别的范围是一元硬币;一个是纸币,识别的范围是一元、两元、五元、十元、二十元。
乘客可以连续屡次投入钱币。
乘客一次只能选择一个出站口,购置车票时,乘客先选出站口,有六个出站口可供选择,再选择所需的票数,然后投币,投入的钱币到达或者超过所需金额时,售票机自动出票,并找零。
本次交易结束后,等待下一次交易。
在选择出站口、所需票数以及在投币期间,乘客可以按取消键取消操作,钱币自动退出。
二、实验分析1、买票时,乘客按下开始键,售票机进入站台选择程序,乘客选择出站口后,可以按取消键重新选择,否那么售票机自动进入票数选择程序,同样这时可以按下取消键重新开始选择出站口以及票数。
2、中选择好出站口以及所需票数时,乘客可以投硬币或者用纸币,当所投的钱币总额大于或者等于票价时,售票机自动出票以及找零。
期间,可以按下取消键重新开始选择,并退出所有的钱币。
3、乘客假设还没选择出站口或者票数,就投币或者使用纸币,售票时机自动退出所有的钱币。
4、有六个站台可供乘客选择,每个乘客最多可以买3张票,六个站台编号为1到6,票价从2元依次递增到7。
三、系统流程图四、程序源代码LIBRARY IEEE;USE IEEE.std_logic_1164.ALL; USE IEEE.std_logic_arith.ALL; USE IEEE.std_logic_unsigned.ALL; ENTITY metrosell IS PORT(clk:in std_logic; startselect:in std_logic; sure:in std_logic; save your forward step(s)coin1y:in std_logic; pmoney1y:in std_logic; pmoney2y:in std_logic; pmoney5y:in std_logic; pmoney10y:in std_logic; moneypmoney20y:in std_logic; moneycancel:in std_logic; number:in std_logic_vector(3 downto 0); the ticketsplatform:in std_logic_vector(3 downto 0); want to reachmoneystorage:out std_logic; acceptmo:out std_logic; stamp:outstd_logic; --set the clock signal --start to select the platform --this button is to --1 yuan coin--1 yuan paper money --2 yuan paper money --5 yuan paper money --10 yuan paper --20 yuan paper --cancel the forward step(s) --choose the number of --choose the platform you --to store the money --accept the money --stamp outgatecharge:out std_logic_vector(3 downto 0); --the mount of charge,up to 15 yuanchargegate:out std_logic --charge outgate ); END metrosell;ARCHITECTURE sell OF metrosell IStype state_type is(initial_type,selectp_type,selectnum_type,insert_type,stamp_type,char ge_type); --define six typessignal state:state_type; --define a shared state BEGINmain:process(clk,state,startselect,platform,number,coin1y,pmoney1y,pm oney2y,pmoney5y,pmoney10y,pmoney20y,cancel,sure)variable univalence :integer range 0 to 7; --the univalence of the ticket variable total_money :integer range 0 to 21; --the price of theticket(s) variable selectp_alr:std_logic; --the flag of select platform typevariable selectnum_alr:std_logic; --the flag of select number type variable stamp_alr:std_logic; --the flag of the stamp gate variable charge_alr:std_logic; --the flag of the charge gatevariable money_reg:integer range 0 to 21; --the mount of money put in variable coin1y_f:std_logic; --the flag of one yuan coin variable pmoney1y_f:std_logic; --the flag of one yuan paper moneyvariable pmoney2y_f:std_logic; --the flag of two yuan paper money variable pmoney10y_f:std_logic; --the flag of ten yuan paper money variable pmoney20y_f:std_logic; --the flag of twelve yuan paper money variable pmoney5y_f:std_logic; --the flag of five yuan paper money variable charge_reg:integer range 0 to 15; beginif(rising_edge(clk)) then case state iswhen initial_type => variablesunivalence:=0; selectp_alr:='0'; selectnum_alr:='0'; stamp_alr:='0'; charge_alr:='0'; money_reg:=0; total_money:=0; coin1y_f:='0';pmoney1y_f:='0'; pmoney2y_f:='0'; pmoney5y_f:='0';--the register of charge --initialize some pmoney10y_f:='0';pmoney20y_f:='0'; moneystorageif(selectp_alr='0'and cancel='0') then --choose the platformif(platform=\ elsif(platform=\ elsif(platform=\ elsif(platform=\elsif(platform=\ elsif(platform=\ elsif(platform=\ else null; end if; elsif(selectp_alr='1'and cancel='1')then state。
目录一、概述 (1)二、自动售货机控制系统的实现............. 错误!未定义书签。
1、自动售货机功能描述及控制系统组成... 错误!未定义书签。
2、自动售货机控制功能的状态描述....... 错误!未定义书签。
3、自动售货机功能控制模块的VHDL实现 (3)4、投币输入信号电路的设计与实现 (4)5、自动售货机控制系统功能仿真 (5)三、结束语 (6)四、参考文献 (7)自动售货机控制系统的VHDL实现一、概述有限状态机FSM(Finite State Machine)及其设计技术是实用数字系统设计中实现高效率、高可靠逻辑控制的重要途径。
传统的状态机设计方法需进行繁琐的状态分配、绘制状态表、化简次态方程等,而利用VHDL可以避免这些繁琐的过程,直接利用状态转换图进行状态机的描述,所有的状态均可表达为CASE_WHEN结构中的一条CASE语句,而状态的转移则通过IF_THEN_ELsE语句实现。
此外,与VHDL的其它描述方式相比,状态机的VHDL表述丰富多样,程序层次分明,结构清晰,易读易懂;在排错、修改和模块移植方面也有其独到的特点。
二、自动售货机控制系统的实现1、自动售货机功能描述及控制系统组成设计一个自动售货机的逻辑控制电路。
它有两个投币口分别为一元投币口和五角投币口,假设每次只能投入一枚一元或五角硬币,投入一元五角硬币后机器自动给出一瓶饮料,投入两元硬币后,在给出一瓶饮料的同时找回一枚五角的硬币。
图1为自动售货机控制系统方框图,由投币信号处理模块和功能控制模块组成。
投币找钱信号出货图1 自动售货机控制系统2、自动售货机控制功能的状态描述取投币信号为输入逻辑变量,投入一枚一元硬币时用A=1表示,未投入时A=0。
投入一枚五角硬币用B=1表示,未投入时B=0。
给出饮料和找钱为两个输出变量,分别用Z和Y 表示,给出饮料时Z=1,不给时Z=0,找回一枚五角硬币时Y=1,不找时Y=0。
根据上面的功能描述,可用三个状态S0,S1,S2表示,未投币前的初始状态为S0,投入五角硬币以后为S1,投入一元硬币后(包括投入一枚一元硬币和投入两枚五角硬币的情况)为S2,再投入一枚五角硬币后电路返回S0,同时输出为Z=1,Y=0;如果投入的是一枚一元硬币,则电路也应能返回S0,同时输出为Z=1,Y=1。
自动售货机界面操作及显示VHDL语言目录1摘要...1 2.正文...1 2.1系统设计...1 2.2单元电路设计...1 2.3软件设计...1 2.4系统测试...2 3.结论...4 4.经验体会 (4)参考文献 (4)附录A:系统电路原理图及引脚锁定图 (5)附录B:程序设计的源代码 (6)摘要自动售货机是根据投入的钱币自动付货的机器,是一种全新的商业零售形式。
本论文主要介绍了VHDL的特点和应用;以自动售货机的设计为例,详细说明了其实现过程,并给出了实现代码和时序仿真波形。
主要创新点是可以实现多种商品的选择(这里是四种),而且价格和数量都是可调的;并可显示机器内商品剩余数量。
关键词:电子设计自动化;超高速集成电路硬件描述语言;自动售货机正文2.1.系统设计设计一台自动售货机,要求具备货物信息存储、进程控制、硬币处理、余额计算、自动找零、状态显示等功能。
预先设定该自动售货机可自动出售4种不同的商品,基本货币单位为1元。
2.2.单元电路设计分析系统设计要求,不然得知自动售货机系统可以通过多进程设计的方法实现。
其中,最主要也是最核心的进程控制自动售货机的货物信息储备、购买、价格计算、找币等功能,其他进程则负责选择商品种类、消费品种单价和剩余数量、消费余额的显示译码等。
自动售货机的系统框图如下图所示:其中,clk为输入时钟脉冲信号,set为货物信息存储信号,get为购买信号,sel为货物品种选择信号,finish为购买完成信号,coin为1元的投币,price[3.0]和quantity[3.0]分别为商品的价格和剩余数量。
输出信号中,item[3.0]为商品种类并译码输出,act[3.0]为提示是否可购买的译码输出,y0[3.0]、y1[3.0]、y3[3.0]分别为商品的单价译码输出、剩余商品的数量显示、投币的硬币数量。
2.3.软件设计(如果用到软件要写)设计平台:QuartusII 7.2自动售货机的工作流程如下:当置数信号set为高电平时,对商品的单价、数量进行相应的设置;在每一次购买前,先对投入的硬币数量进行清零;购买时,首先以1元为基本单位对投入的硬币数量进行计数并在数码管上进行显示;当选择信号sel高电平有效时,选择所要购买的商品种类;当get信号高电平有效时,购买所选择的商品;当finish信号高电平有效时,结束交易并完成找币操作;当get信号为低电平是,则显示商品的单价及其剩余数量和剩余的钱数。
辽宁工程技术大学集成电路EDA技术课程设计报告题目指导教师院(系、部)专业班级学号姓名日期自动售票机的设计李书艳电信学院______ 电子09-2班____________ 0906040202陈磊一、摘要20世纪90年代,国际上电子和计算机技术较先进的国家,一直在积极探索新的电子电路设计方法,并在设计方法、工具等方面进行了彻底的变革,取得了巨大成功。
在电子技术设计领域,可编程逻辑器件(如CPLD、FPGA )的应用,已得到广泛的普及,这些器件为数字系统的设计带来了极大的灵活性。
这些器件可以通过软件编程而对其硬件结构和工作方式进行重构,从而使得硬件的设计可以如同软件设计那样方便快捷。
这一切极大地改变了传统的数字系统设计方法、设计过程和设计观念,促进了EDA技术的迅速发展。
EDA设计是当代电子信息人才必须要掌握的一门技术,本次课程设计中我运用VHDL语言和QuaertusU软件完成了自动售邮票机的设计。
着重介绍了VHDL语言的特点,在设计中体现了其基本原理、系统组成和主要功能;并分析讨论了用VHDL语言开发自动售货机系统的设计流程。
最终完成的自动售货机系统具有投币处理、商品选择、购货撤销、异常退币、计算存货等主要功能。
二、综述VHDL语言是一种用于电路设计的高级语言。
VHDL翻译成中文就是超高速集成电路硬件描述语言,主要是应用在数字电路的设计中。
除了含有许多具有硬件特征的语句外,VHDL的语言形式、描述风格以及语法是十分类似于一般的计算机高级语言。
EDA技术就是以计算机为工具,设计者在EDA软件平台上,用硬件描述语言VHDL完成设计文件,然后由计算机自动地完成逻辑编译、化简、分割、综合、优化、布局、布线和仿真,直至对于特定目标芯片的适配编译、逻辑映射和编程下载等工作。
EDA技术的出现,极大地提高了电路设计的效率和可操作性,减轻了设计者的劳动强度。
本次课程设计将运用VHDL设计一款自动售邮票机,培养EDA操作技巧。
《自动售货机》实验报告一.设计课程的任务要求基本要求:1.用2个数码管(disp5,disp4)显示钱数,以元为单位。
用3个按键(btn0,btn1,btn2)分别表示一元、五元、十元,每按一次按键,增加一次相应的钱数,上限99元。
2.再用3个按键(btn3,btn4,btn5)分别对应3种商品,其中,商品甲售价3元、商品乙售价8元、商品丙售价12元;3.买东西时,先输入钱币,再按对应的商品键。
每按一次商品键,钱数要相应地减少,同时有声光(蜂鸣器或发光二极管)提示购买成功。
剩余钱数大于3元可继续按商品键再次购买;当剩余钱数少于3元时,表示钱数的数码管disp5,disp4显示为零,同时用数码管disp0显示退出的钱数。
4.买东西时,按下商品键,若输入的钱数少于商品的价格,表示钱数的数码管disp5,disp4显示为零,同时用数码管(disp1、disp0)显示退出的钱数,并用蜂鸣器或发光二极管闪烁表示购买失败。
5.按下商品键时,用数码管disp2表示当前购买的商品,1代表商品甲,2代表商品乙,3代表商品丙。
6.用btn7做为退出功能键,退出键可以随时按下,按下后,数码管(disp5,disp4)显示为零,同时数码管(disp1、disp0)显示退出的钱数,表示结束购买,钱款全部退出。
提高要求:7.用点阵设计显示投币动画、出货动画,购买成功/失败动画;8.允许随时输入钱币,购买时,钱款不足有声光报警并等待追加钱币或选择别的商品;9.商品数量管理,有缺货提示;10.用点阵动态显示商品名称和库存数量等。
自拟其它功能二.系统设计(包括设计思路、总体框图、分块设计)1.设计思路:本实验为设计一个自动售货机。
由于本实验题目逻辑不太复杂,所以有两种设计思路可以选择。
第一种是用顺序结构和if when逻辑判断来实现。
第二种是用状态机来实现。
我选择的使用第一种。
总体来说可以将其分为两个大块。
第一个是接受键盘命令并通过逻辑判断向LED灯和数码管发出命令。
自动售货机实验报告一、设计任务设计一个自动售货饮料机,设每瓶饮料元,投币口有两个,1元硬币(one)或5角硬币(half),每个时刻可以输入其中一种硬币,自动售货机有找零钱功能,oute为出货,outm 为找零。
二、设计过程1.设计思路:状态定义:s0表示初态,s1表示投入5角,s2表示投入1元,s3表示投入1元5角,s4表示投入2元,s5表示投入2元5角,s6表示投入3元。
输入信号:state_outputs(0)表示输入货物,comb_outputs(1)表示找5角硬币,输入信号为1 表示投入硬币,输入信号为1表示未投入硬币。
输出信号:comb_outputs(0)表示输出货物,comb_outputs(1)表示找5角零钱,输出信号为1表示输出货物或找零,输入信号为0表示不输出货物或找零。
根据设计要求分析,得到状态转化图如下图所示,其中状态为s0、S1、S2、S3、S4、S5、S6;输入为state_inputs(0,1);输出为comb_outouts(0,1);输入仅与状态有关,因此将输入写在状态圈内部。
002.设计步骤:(1)创建工程。
打开QuartusII,创建一个新的工程并命名。
根据实验室条件,选择的芯片为cyclone系列中的EP1C6Q240C8芯片。
输入VHDL文本文件。
新建文本文件VHDL file。
输入程序并保存。
程序如下:library ieee;use autosell isport(clk,reset :in std_logic;state_inputs:in std_logic_vector(0 to 1);comb_outputs:out std_logic_vector(0 to 1)); end autosell;architecture be of autosell istype fsm_st is(s0,s1,s2,s3,s4,s5,s6);signal current_state,next_state:fsm_st;beginreg:process(reset,clk)beginif reset='1'then current_state<=s0;elsif rising_edge(clk)thencurrent_state<=next_state;end if;end process;com:process(current_state,state_inputs)begincase current_state iswhen s0=>comb_outputs<="00";ifstate_inputs="00" then next_state<=s0;elsif state_inputs="01" then next_state<=s1;elsif state_inputs="10" then next_state<=s2; end if;when s1=>comb_outputs<="00";ifstate_inputs="00" then next_state<=s1;elsif state_inputs="01" then next_state<=s2;elsif state_inputs="10" then next_state<=s3; end if;when s2=>comb_outputs<="00";ifstate_inputs="00" then next_state<=s2;elsif state_inputs="01" then next_state<=s3;elsif state_inputs="10" then next_state<=s4; end if;when s3=>comb_outputs<="00";ifstate_inputs="00" then next_state<=s3;elsif state_inputs="01" then next_state<=s4;elsif state_inputs="10" then next_state<=s5; end if;when s4=>comb_outputs<="00";ifstate_inputs="00" then next_state<=s4;elsif state_inputs="01" then next_state<=s5;elsif state_inputs="10" then next_state<=s6;end if;when s5=>comb_outputs<="10";ifstate_inputs="00" then next_state<=s0;elsif state_inputs="01" then next_state<=s1;elsif state_inputs="10" then next_state<=s2;end if;when s6=>comb_outputs<="11";ifstate_inputs="00" then next_state<=s0;elsif state_inputs="01" then next_state<=s1;elsif state_inputs="10" then next_state<=s2;end if;end case;end process;end be;(2)编程序。
通信线路EDA课程项目--关于VHDL语言模拟地铁售票控制系统设计项目组负责人:胡弘正通信0903(200985250321)项目组成员:刘上校通信0903(200985250317)邹娟通信0901(200985250103)完成日期:遥遥无期一、设计要求:功能描述:用于模仿地铁售票的自动售票,完成地铁售票的核心控制功能。
功能要求:售票机有两个进币孔,一个是输入硬币,一个是输入纸币,硬币的识别范围是5角和1 元的硬币,纸币的识别范围是1 元、2 元,5 元,10 元。
乘客可以连续多次投入钱币。
乘客可以选择的种类为2 元和4 元,乘客一次只能选择一个出站口。
购买车票时,乘客先选择出站名,然后选择所需的票数,再进行投币,投入的钱币达到所需金额时,售票机自动出票,并找出余额,本次交易结束,等待下一次的交易。
在投币期间,乘客可以按取消键取消本次操作,钱币自动退出。
功能描述:用于模仿地铁售票的自动售票,完成地铁售票的核心控制功能。
功能要求:售票机有两个进币孔,一个是输入硬币,一个是输入纸币,硬币的识别范围是5角和1 元的硬币,纸币的识别范围是1 元、2 元,5 元,10 元。
乘客可以连续多次投入钱币。
乘客可以选择的种类为2 元和4 元,乘客一次只能选择一个出站口。
购买车票时,乘客先选择出站名,然后选择所需的票数,再进行投币,投入的钱币达到所需金额时,售票机自动出票,并找出余额,本次交易结束,等待下一次的交易。
在投币期间,乘客可以按取消键取消本次操作,钱币自动退出。
二.课题分析1.买车票时,乘客按“开始选择”按钮,接着选择出站口接着选择购票数量(根据提示,一次购票数限制在3张以内);然后按“开始投币”按钮,投入钱币;当投入的钱币达到所需金额时,售票机自动出票,并找出余额。
考虑到控制整个售票机的物理体积,余额将全部采用5角硬币的形式找出。
2.选择出站口或投币过程中,乘客都可以按“取消”按钮取消该次交易。
选择出站口的过程中,若按“取消”,则售票机直接回到初始状态;投币过程中,若按“取消”,则售票机将乘客已经投入的钱币全部退出,再回到初始状态。
自动售货机的设计与实现摘要:本文介绍了VHDL的特点和应用,以自动售货机为例,详细说明了其实现过程。
本系统使用VHDL 语言编写,用状态基来实现各功能,使用MAXPLUSⅡ进行仿真,模拟各模块的实现。
本文详细介绍如何运用VHDL语言及MAXPLUSⅡ进行仿真,本文设计的自动售货机实现了选择货物,投币,找零,显示,多次交易,在一次购买中选择多个货物等自动售货机的基本功能。
本文给出了各个模块的源程序、各模块的连接图以及各个模块的仿真图,并做出了详细的分析。
关键词:VHDL语言,MAXPLUSⅡ,自动售货机Design and implementation of vending machine Electronics and Information Science and Technology Candidate:JiangHuiAdvisor:CaiJianhuaAbstract: This article introduces the characteristics and application of VHDL, with a example of designing vending machines, describes detailedly the implementation process. The system uses the VHDL language, realizing every function uses state machines, applying MAXPLUS Ⅱto simulate in order to realize the function every modules.This article describes the use of VHDL language and MAXPLUS Ⅱ simulation, to achieve the vending machine's basic functions , as choose good, coin, give change, buy good more than one time, choose more than one good in one time, display, and so on. This article gives the original program of every modules and the simulating diagram of every modules and the combination of all of the modules, gives detail analyse of every simulating diagram as well.Keywords:VHDL language,MAXPLUSⅡ,Vending machine引言随着科技的发展和社会的进步,自动化商业机械有了越来越广泛的应用,自动售货机作为自动化商业机械的代表被广泛用于公共场所自动售货,给人们的生活带来了极大的方便。
#include<stdio.h>#include<stdlib.h>#include<string.h>#include "goods.h"bool GetCharge(int Sum,int Money);void Getsmalcharge(int Money,int *ChargeNum); int KouLing();char ChooseJieMian();char SaleCenter();void loadGoodsFrom* gs);char ManageCenter();void KunCun();void Sale();void ShangJia();void TongJiFun();Goods goods[3];TongJi tj[3];void init(){for(int i = 0; i < 3; ++i){tj[i].jrxl = 0;tj[i].jrzje = 0;}}void main(){//初始化init();int op = 0;//读取商品信息loadGoodsFrom);char c = ChooseJieMian();while(true){system("cls");if( c == '1'){c = SaleCenter();}else if(c == '2'){op = KouLing();if(op == 1){//进入管理界面c = ManageCenter();//system("pause");}else if(op == 0){//进去销售界面c = SaleCenter();}}}}//----------------------------------------------------/*** @return 1销售界面2管理界面*/char SaleCenter(){char state='N';int Sum=0;char Pro = 'd';// printf("\n********************************\n");while(true){state='N';Sum=0;while(!(Pro == 'c' || Pro == 'a' || Pro == 'b' || Pro == 'q')){system("cls");printf("\n\t*******************************************");printf("\n\t*********顾客您好,请选择商品**************\n");printf("\n\t·a·商品%s ·b·商品%s ·c·商品%s ·q·管理\n",goods[0].name,goods[1].name,goods[2].name);printf("\n\t -%d- -%d- -%d- (单位:件)",goods[0].totalCount,goods[1].totalCount,goods[2].totalCount);printf("\n\t*******************************************\n\t\t");Pro = getchar();}if(Pro == 'q')break;switch(Pro){case 'a':{Sum=Sum+2;printf("\n\t·商品A价格为%d,请投币·",Sum);}break;case 'A':{Sum=Sum+2;printf("\n\t·商品A价格为%d,请投币·",Sum);}break;case 'b':{Sum=Sum+3;printf("\n\t·商品B价格为%d,请投币·",Sum);}break;case 'B':{Sum=Sum+3;printf("\n\t·商品B价格为%d,请投币·",Sum);}break;case 'c':{Sum=Sum+6;printf("\n\t·商品C价格为%d,请投币·",Sum);}break;case 'C':{Sum=Sum+6;printf("\n\t·商品C价格为%d,请投币·",Sum);}break;default:{printf("\n\t输入物品有误!!!!\n");}break;};int Money;bool st=false;while(!st){// printf("\n输入金额:");scanf("%d",&Money);getchar();st=GetCharge(Sum,Money);};Pro = 'd';system("PAUSE");}return '2';}bool GetCharge(int Sum,int Money){int ChargeNum[4];for(int i=0;i<4;i++){ChargeNum[i]=0;}if(Sum>Money){printf("\n\t·所投金额不足支付所选商品,请重新投币·");return false;}else if(Sum==Money){printf("\n\t·所投金额等于商品价格,请在商品出口处拿取商品·\n");//销售成功的操作if(Sum == goods[0].price){goods[0].totalCount --;Sale();tj[0].jrxl ++;tj[0].jrzje += Sum;}else if(Sum == goods[1].price){goods[1].totalCount --;Sale();tj[1].jrxl ++;tj[1].jrzje += Sum;}else if(Sum == goods[2].price){goods[1].totalCount --;Sale();tj[2].jrxl ++;tj[2].jrzje += Sum;}return true;}else{int Result=Money-Sum;Getsmalcharge(Result,ChargeNum);printf("\n\t·所投金额大于商品价格,为您找零%d元·\n",Result);printf("\n\t\t-壹元面值%d张-\n",ChargeNum[0]);printf("\n\t\t-贰元面值%d张-\n",ChargeNum[1]);printf("\n\t\t-伍元面值%d张-\n",ChargeNum[2]);printf("\n\t\t-拾元面值%d张-\n",ChargeNum[3]);printf("\n\t·请在商品出口处拿取商品·\n");// printf("\n余额为%d元,应找零\n1 元%d张\n2 元%d张\n5 元%d张\n10元%d张\n",Result,ChargeNum[0],ChargeNum[1],ChargeNum[2],ChargeNum[3]);}//end if//销售成功的操作if(Sum == goods[0].price){goods[0].totalCount --;Sale();tj[0].jrxl ++;tj[0].jrzje += Sum;}else if(Sum == goods[1].price){goods[1].totalCount --;Sale();tj[1].jrxl ++;tj[1].jrzje+= Sum;}else if(Sum == goods[2].price){goods[2].totalCount --;Sale();tj[2].jrxl ++;tj[2].jrzje+= Sum;}return true;}/**成功卖出操作的后台操作*/void Sale(){FILE* fp;if ((fp = fopen("d:\\goods.out", "w")) == NULL){printf ("未找到文件d:\\goods.out...系统将退出\n ");exit(0);}fprintf(fp,"%s %d %d\n",goods[0].name,goods[0].totalCount,goods[0].price);fprintf(fp,"%s %d %d\n",goods[1].name,goods[1].totalCount,goods[1].price);fprintf(fp,"%s %d %d\n",goods[2].name,goods[2].totalCount,goods[2].price);//关闭文件fclose(fp);fp = NULL;}//------------------------------------void Getsmalcharge(int Money,int *ChargeNum){if(Money<0)return;int Sum=Money;int charge[4]={1,2,5,10};ChargeNum[3]=Sum/charge[3];Sum=Sum%charge[3];ChargeNum[2]=Sum/charge[2];Sum=Sum%charge[2];ChargeNum[1]=Sum/charge[1];Sum=Sum%charge[1];ChargeNum[0]=Sum/charge[0];Sum=Sum%charge[0];}/***@return 1 口令正确0 口令错误,并返回销售界面*/int KouLing(){char kl[50];int count = 0,ret = 0;char rkl[50] = "admin";while(strcmp(rkl,kl) != 0){if(count == 0){printf("\n\t*******************************************");printf("\n\t****************管理口令验证***************\n");printf("\n\t·Tip·忘记口令,输入“cancel”,进入销售界面\n");printf("\n\t*******************************************\n\t\t");}else{printf("\n\t*******************************************");printf("\n\t****************管理口令验证***************\n");printf("\n\t·Tip·忘记口令,输入“cancel”,进入销售界面\n");printf("\n\t*******************************************");printf("\n\t\t\t\t输入错误次数:%d次\n\t\t",count);}count++;scanf("%s",kl);system("CLS");if(strcmp(kl,"cancel") == 0)break;}if(strcmp(kl,"cancel") == 0)ret = 0;elseret = 1;return ret;}/*** @ return '1' , '2'*/char ChooseJieMian(){char c = '3';while(true){system("cls");printf("\n\t*******************************************");printf("\n\t****************界面选择*******************\n");printf("\n\t·1·-销售界面- ·2·-管理界面-\n");printf("\n\t*******************************************\n\t\t");c = getchar();if(c == '1' || c == '2')break;}system("cls");return c;char ManageCenter(){while(true){int op = 7;while( !(op == 1|| op == 2 || op == 3 || op == 4|| op == 5 || op == 6)){system("cls");printf("\n\t*******************************************");printf("\n\t*************欢迎您,管理员****************\n");printf("\n\t·1·-库存查询- ·2·-商品上架-\n");printf("\n\t·3·-销售查询- ·4·-会计查询-\n");printf("\n\t·5·-结算功能- ·6·-销售界面-\n");printf("\n\t*******************************************\n\t\t");scanf("%d",&op);}bool flag = false;switch(op){case 1:{KunCun();}break;case 2:{ShangJia();}break;case 3:{TongJiFun();}break;case 4:{}break;case 5:{}break;case 6:{flag = true;}break;default:break;}if(flag)break;elsesystem("PAUSE");}return '1';}*从文件里读取商品信息@return 商品列表*/void loadGoodsFrom* gs){//获得FILE 指针FILE* fp;if ((fp = fopen("d:\\goods.out", "r")) == NULL){printf ("未找到文件d:\\goods.out...系统将退出\n ");exit(0);}//Goods gs[3];int i = 0;while(!feof(fp)){fscanf(fp,"%s %d %d",gs[i].name,&gs[i].totalCount,&gs[i].price);i++;}//关闭文件fclose(fp);fp = NULL;}void KunCun(){int i = 0;printf("\n\t·商品名称··商品价格(元)··商品余量(件)·\n");for(i = 0; i < 3; ++i){printf("\n\t-%s-\t\t-%d-\t\t-%d-\n",goods[i].name,goods[i].price,goods[i].totalCount);}}void ShangJia(){printf("\n\t·Tip·正数增加,负数减少商品\n");int gs1 = 0,gs2 = 0,gs3 = 0;printf("\n\t\t-商品%s(余%d件): ",goods[0].name,goods[0].totalCount);scanf("%d",&gs1);printf("\n\t\t-商品%s(余%d件): ",goods[1].name,goods[1].totalCount);scanf("%d",&gs2);printf("\n\t\t-商品%s(余%d件): ",goods[2].name,goods[2].totalCount);scanf("%d",&gs3);goods[0].totalCount = gs1 + goods[0].totalCount < 0 ? 0:gs1 + goods[0].totalCount;goods[1].totalCount = gs2 + goods[1].totalCount < 0 ? 0:gs2 + goods[1].totalCount;goods[2].totalCount = gs3 + goods[2].totalCount < 0 ? 0:gs3 + goods[2].totalCount;//写文件//获得FILE 指针FILE* fp;if ((fp = fopen("d:\\goods.out", "w")) == NULL){printf ("未找到文件d:\\goods.out...系统将退出\n ");exit(0);}fprintf(fp,"%s %d %d\n",goods[0].name,goods[0].totalCount,goods[0].price);fprintf(fp,"%s %d %d\n",goods[1].name,goods[1].totalCount,goods[1].price);fprintf(fp,"%s %d %d\n",goods[2].name,goods[2].totalCount,goods[2].price);//关闭文件fclose(fp);fp = NULL;}void TongJiFun(){printf("\n\t·今日商品销售情况一览·\n");printf("\n\t\t-商品%s %d件共%d元-\n",goods[0].name,tj[0].jrxl,tj[0].jrzje);printf("\n\t\t-商品%s %d件共%d元-\n",goods[1].name,tj[1].jrxl,tj[1].jrzje);printf("\n\t\t-商品%s %d件共%d元-\n",goods[2].name,tj[2].jrxl,tj[2].jrzje);printf("\n\t·共计%d件,%d元·\n",tj[0].jrxl + tj[1].jrxl+tj[2].jrxl,tj[0].jrzje+tj[1].jrzje+tj[2].jrzje);}//Goods.htypedef struct _Goods{char name[50];int totalCount;int price;}Goods;typedef struct _TongJi{int jrxl;int jrzje;}TongJi;。
自动售邮票机代码:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity xrg4 isport(clk,clk1:in bit;coin1,coin5,coin10:in std_logic; --投入1、5、10角硬币reset,reset1:in std_logic; --清零信号,1有效six,eight:in std_logic; --6,8角的邮票light:out std_logic; --购买成功指示灯retlight:out std_logic_vector(3 downto 0) );--找回的硬币end entity xrg4;architecture xxrr of xrg4 istype state is (s0,s1,s2);--状态机signal n_state:state;--次态signal c_state:state;--现态signal touru:std_logic_vector(3 downto 0); --投入硬币面值signal tincoint:std_logic_vector(4 downto 0);--计算出硬币总值(进程中)signal stamp:std_logic_vector(3 downto 0); --邮票面值signal ret:std_logic_vector(3 downto 0); --找零值signal zong:std_logic_vector(4 downto 0); --状态机硬币总值 beginp1:process(clk1) --次态给现态beginif reset1='1'then c_state<=s2;elsif clk1'event and clk1='1'thenc_state<=n_state;end if;end process p1;p2:process(clk) --投入钱并计算总值beginif reset1='1'then tincoint<="00000";elsif clk'event and clk='1' thenif coin1='1'then touru<="0001";elsif coin5='1'then touru<="0101";elsif coin10='1'then touru<="1010";elsif coin1='0' and coin5='0' and coin10='0' thentouru<="0000";end if;tincoint<=touru+tincoint;end if;end process p2;p3:process(c_state) --进行购买,找零,退钱beginzong<=tincoint;case c_state iswhen s0=> if six='1' then stamp<="0110";n_state<=s1; --选通6角或8角邮票elsif eight='1' then stamp<="1000"; n_state<=s1; elsezong<="00000";ret<="0000";light<='0';n_state<=s0;end if;when s1=> if zong<stamp thenif reset='1' then ret<=zong(3 downto 0); n_state<=s2;end if;elsif zong>=stamp then light<='1';ret<=(zong-stamp);end if; when s2=> if six='1'or eight='1'thenret<=zong(3 downto 0);light<='0';zong<="00000";n_state<=s0;end if;end case;end process p3;p4:process(ret) --找钱,退钱的相应指示灯begincase ret iswhen "0000" => retlight<="0000"; when "0001" => retlight<="0001";when "0010" => retlight<="0010"; when "0011" => retlight<="0011";when "0100" => retlight<="0100"; when "0101" => retlight<="0101";when "0110" => retlight<="0110"; when "0111" => retlight<="0111";when "1000" => retlight<="1000"; when "1001" => retlight<="1001";when others => null;end case;end process p4;end xxrr;波形图:欢迎您的下载,资料仅供参考!致力为企业和个人提供合同协议,策划案计划书,学习资料等等打造全网一站式需求。
自动售邮票机代码:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
entity xrg4 is
port(clk,clk1:in bit;
coin1,coin5,coin10:in std_logic; --投入1、5、10角硬币
reset,reset1:in std_logic; --清零信号,1有效
six,eight:in std_logic; --6,8角的邮票
light:out std_logic; --购买成功指示灯
retlight:out std_logic_vector(3 downto 0) );--找回的硬币
end entity xrg4;
architecture xxrr of xrg4 is
type state is (s0,s1,s2);--状态机
signal n_state:state;--次态
signal c_state:state;--现态
signal touru:std_logic_vector(3 downto 0); --投入硬币面值
signal tincoint:std_logic_vector(4 downto 0);--计算出硬币总值(进程中)signal stamp:std_logic_vector(3 downto 0); --邮票面值
signal ret:std_logic_vector(3 downto 0); --找零值
signal zong:std_logic_vector(4 downto 0); --状态机硬币总值
begin
p1:process(clk1) --次态给现态
begin
if reset1='1'then c_state<=s2;
elsif clk1'event and clk1='1'then
c_state<=n_state;
end if;
end process p1;
p2:process(clk) --投入钱并计算总值
begin
if reset1='1'then tincoint<="00000";
elsif clk'event and clk='1' then
if coin1='1'then touru<="0001";
elsif coin5='1'then touru<="0101";
elsif coin10='1'then touru<="1010";
elsif coin1='0' and coin5='0' and coin10='0' then touru<="0000";
end if;
tincoint<=touru+tincoint;
end if;
end process p2;
p3:process(c_state) --进行购买,找零,退钱
begin
zong<=tincoint;
case c_state is
when s0=> if six='1' then stamp<="0110";n_state<=s1; --选通6角或8角邮票elsif eight='1' then stamp<="1000"; n_state<=s1;
else zong<="00000";ret<="0000";light<='0';n_state<=s0;
end if;
when s1=> if zong<stamp then
if reset='1' then ret<=zong(3 downto 0); n_state<=s2;
end if;
elsif zong>=stamp then light<='1';ret<=(zong-stamp);
end if;
when s2=> if six='1'or eight='1'then
ret<=zong(3 downto 0);light<='0';zong<="00000";
n_state<=s0;
end if;
end case;
end process p3;
p4:process(ret) --找钱,退钱的相应指示灯
begin
case ret is
when "0000" => retlight<="0000"; when "0001" => retlight<="0001";
when "0010" => retlight<="0010"; when "0011" => retlight<="0011"; when "0100" => retlight<="0100"; when "0101" => retlight<="0101"; when "0110" => retlight<="0110"; when "0111" => retlight<="0111"; when "1000" => retlight<="1000"; when "1001" => retlight<="1001"; when others => null;
end case;
end process p4;
end xxrr;
波形图:。