📄 +vhdl.txt
字号:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
--entity setup
entity automaticseller is
port(
--input declaration
clk: in std_logic; --system signal
ok,cancel,reset: in std_logic,
Choosing200,Choosing150,Choosing100: in std_logic; --when comuser chooses drink cost $2/$1.5/$1
Put_In100 ,Put_In50,Put_In10: in std_logic; --when comuser puts in coin $1/$0.5/$0.1
Coin_Out: in std_logic; --when comuser wants the coin out
--output declaration
Drink_Out : out std_logic_vector(4 downto 0); --signal of drink out
Money_Over : out std_logic; --after comuser put in enough money and click’OK’and refuse money in
Money_Show :out std_logic_vector(4 downto 0); --show the comuser the money in
Money_Owe : out std_logic; --before comuser put in enough money and click’OK’
Output100,Output50,Output10: out std_logic; --when coin out
--state showing led
led_light_W:out std_logic; --led shows the state of wait
led_light_S:out std_logic; --led shows the state of shopping
led_light_D:out std_logic; --led shows the state of drink out
led_light_C:out std_logic; --led shows the state of change out );
end automaticseller;
--architecture setup
architecture behave of automaticseller is
type states is(WAIT_STATE,SHOPPING_STATE,CHANGEOUT_STATE,DRINKOUT_STATE);
signal state:states;
signal Trade_Already:std_logic; --after the drink out
signal OWE:std_logic_vector(4 downto 0);--the money comuser needs to pay to get the drink
signal exchange:std_logic_vector(4 downto 0); --this signal is used as an exchange
signal IMM:std_logic_vector(4 downto 0); --inner money memory
begin
--devide process into two sides for make the programme clearer and easier
--the first side is show the relation between states
process(clk,reset)
begin
if(reset=’1’)then
state<=WAIT_STATE; --this fuction used only by manager
elsif (clk’event and clk=’1’) then
case state is
when WAIT_STATE=>
if(Choosing200='1' or Choosing150='1' or Choosing100='1')then
state<=SHOPPING_STATE;
else state<=WAIT_STATE;
end if;
when SHOPPING_STATE=>
if(cancel='1')then
state<=CHANGEOUT_STATE;
elsif(IMM>=OWE)then
if ok='1'then
state<=DRINKOUT_STATE;
else state<=SHOPPING_STATE;
end if;
else state<=SHOPPING_STATE;
end if;
when DRINKOUT_STATE=>
if(Trade_Already='1')then
state<=CHANGEOUT_STATE;
end if;
when CHANGEOUT_STATE=>
if(exchange="0")then
state<=WAIT_STATE;
else state<=CHANGEOUT_STATE;
end if;
when others=>
state<=WAIT_STATE;
end case;
end if;
end process;
--the second side is the caculation in the states
process(clk)
variable exchange1:std_logic_vector(4 downto 0); --this variable store exchange
variable Drink_Out_E:std_logic_vector(4 downto 0); --drink out exchange variable
begin
if (clk’event and clk=’1’) then
case state is
when WAIT_STATE=>
if(Choosing200='1')then
OWE<="10100";
Drink_Out_E:="10100";
elsif(Choosing150='1')then
OWE<="01111";
Drink_Out_E:="01111";
else OWE<="01010";Drink_Out_E:="01010";
end if;
when SHOPPING_STATE=>
Money_Show<=IMM;
if(cancel='1')then
exchange1:=IMM;
Money_Over<='0';
Money_Owe<='0';
elsif(IMM>=OWE)then
exchange1:=IMM;
Money_Over<='1';
Money_Owe<='0';
elsif(ok='1')then
Money_Owe<='1';
end if;
if(IMM<OWE)then
if(Put_In10='1')then
IMM<=IMM+"00001";
elsif(Put_In50='1')then
IMM<=IMM+"00101";
elsif(Put_In100='1')then
IMM<=IMM+"01010";
end if;
end if;
exchange<=exchange1;
when DRINKOUT_STATE=>
Drink_Out<=Drink_Out_E;
Trade_Already<='1';
when CHANGEOUT_STATE=>
Money_Over<='0';
if(exchange1>0)then
if(Coin_Out='1')then
If(exchange>"01010")then
exchange1:=exchange-"01010";
Output10<='1';
elsif(exchange>"00101")then
exchange1:=exchange-"00101";
Output50<='1';
else exchange1:=exchange-"00001";
Output100<='1';
end if;
else Output10<=Coin_Out;
Output50<=Coin_Out;
Output100<=Coin_Out;
end if;
end if;
exchange<=exchange1;
Money_Show<=exchange;
end case;
end if;
end process;
--output definition
with state select
led_light_W<=’1’when WAIT_STATE
'0’when others;
with state select
led_light_S<=’1’when SHOPPING_STATE
‘0’when others;
with state select
led_light_D<=’1’when DRINKOUT_STATE
‘0’when others;
with state select
led_light_C<=’1’when CHANGEOUT_STATE
‘0’when others;
end behave;
顾客先选择所需的饮料(共分3种:2元、1元5角、1元),然后进行投币,本系统可以识别1元、5角、1角三种硬币,信号Money Show将从始至终显示目前机器中的钱币数,顾客按下确定(OK)键结束投币,若所投金额不足,则系统将提示欠费,顾客可以选择继续投币到钱足够在按下确定(OK)键,则机器出货然后找零,也可以选择取消交易(cancel按钮),机器将退出所投钱币。在以上任何一时刻若顾客所投的钱币超过购买饮料所需要的钱数,系统将提示超额,并且拒绝收取顾客继续投入的钱币。机器在退币或者找零时将按照1元、5角、1角的顺序进行。
任何顾客的非法操作可能引起系统的逻辑混乱,在该情况下,管理员可以通过重置按钮(Reset)对机器进行恢复。
自动售货机电路的VHDL程序
☆☆1.1用户需求
★要求本程序实现一个自动售货机电路,要求有以下功能:
1☆ 机器有一个投币孔,每次只能投入一枚硬币,但可以连续投入多枚硬币,机器能够识别的硬币金额为1元、5角和1角,顾客可选择的饮料价格有1元、1元5角和2元三种。每次只能售出1瓶饮料。
2☆ 购买饮料时先选择饮料的价格再投币,当投入的硬币总额达到或超过饮料价格后,机器发出指示信号并拒收继续投入的硬币。顾客投币后,按动确定键,机器将发出饮料和找零硬币,若所投金额不足,则发出欠资信号指示,在欠资情况下,顾客可以继续投币购买,也可按取消键,机器将退出所投入的全部金额。
3☆ 顾客投入硬币后,如果未按确定键而按取消键,机器也将退出所投的全部金额。
4☆ 找零钱或退币时,按由大到小原则处理,即金额超过1元的,先退1元硬币,超过5角时,先退5角,才退1角。
★为方便管理员,额外添加的功能:
☆ 重置(Reset)功能 添加Reset按钮,用于因外部原因引起系统逻辑混乱或顾客进行非法操作时将系统中的所有参数强行清零。
☆☆1.2需求分析
★ 需要以下状态可以满足设计要求:等待状态、购买状态、出货状态、找零状态
★ 需要以下信号可以满足设计要求:
1☆ 输入信号有:顾客使用的选择2元、1元5角、1元饮料的按钮、投入1元、5角、1角三种硬币时系统的识别信号、确定按钮、取消按钮、找零按钮;管理员使用的重置按钮;系统内部的时钟信号。
2☆ 输出信号有:当投入钱超额时的超额拒收信号、投入钱金额不足时的欠费信号、找零时的1元、5角、1角信号、出货种类信号、以及显示给顾客当前钱数的信号。
3☆ 为了方便测试和维护,增加4个灯分别指示现在所处的状态。
☆☆1.3状态的设计
☆1.3.1所需的状态
☆1.3.2状态间的关系
☆1.3.3状态转移图
☆☆1.4信号的设计
☆1.4.1输入信号
☆1.4.2输出信号
☆1.4.3指示灯信号
☆1.4.4系统内的过渡信号
☆☆1.5状态—信号—响应表
☆1.5.1输入信号的状态—信号—响应表
☆1.5.2输出信号的状态—信号—响应表(以上部分暂时保密)
☆☆1.6编码
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -