EDA 课程设计
硬件描述语言 VHDL 程序设计
————自动售货机
一. 设计内容
本次设计的自动售货机只销售 cola 与 pepsi 两种饮料,售价均为 1.5 元。顾客可
以由两个不同投币孔分别投入 5 角硬币或 1 元硬币。一次交易只能购买一瓶,且自动
找零。只要按下取消键就会马上无条件退币。
二. 设计说明
用两个按键电路代替两种币值的投币孔,以 LED 点亮的数量显示各投币种类的
投入数量,在以 4Hz 闪烁的 LED 来显示退币种类与数量。本设计采用 1024Hz 的系统
时钟信号来控制所有买卖行为。
三. 自动售货机外观示意图
四. 自动售货机构成模块:
产生退币闪烁信号的电路模块
投入壹圆硬币的处理电路模块
投入五角硬币的处理电路模块
饮料选择处理电路模块
确认与取消处理电路模块
退币处理电路模块
出货并计算存货电路模块
实体定义了系统的输入输出端口信号,顾客由 4 种操作行为,即投币、选择、确定
与取消。结构体定义功能模块之间整体共享的传递信号,以整合所有块的功能。这些信
号将成为各个功能块外部输入或输出信号。
五. 设计程序及注释如下:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
entity vendor is
port(
reset :in std_logic; --系统内部给其他顾客重新操作的复位信号
Led_pepsi_ok
Led_cola_ok
Led_pepsi_sel
Select_cola
Select_pepsi
Led_pepsi
Ok_buy
Led_buy
Cancel_buy
Led_cancel
Led_five
Led_ten
Led_five_return
Led_ten_return
Led_cola_out
Led_pepsi_out
clk :in std_logic;
--由外接信号发生器提供的 1024Hz 系统时钟信号
ok_buy :in std_logic; --购买确认的按键信号
cancel_buy :in std_logic; --购买取消的按键信号
coin_5 :in std_logic; --投入五角硬币的动作按键
coin_10 :in std_logic; --投入壹圆硬币的动作按键
select_cola :in std_logic; --选择可口可乐的按键信号
select_pepsi :in std_logic; --选择百事可乐的按键信号
led_cola_ok :out std_logic; --灯亮显示还有可口可乐
led_pepsi_ok :out std_logic; --灯亮显示还有百事可乐
led_cola_sel :out std_logic; --灯亮显示可口可乐选择键被按
led_pepsi_sel :out std_logic; --灯亮显示百事可乐选择键被按
led_buy :out std_logic; --灯亮显示按了购买确认键
led_cancel :out std_logic; --灯亮显示按了购买取消键
led_five :out std_logic_vector(2 downto 0);
--3 个 LED,投入 1 个五角硬币亮一个 LED
led_ten :out std_logic_vector(1 downto 0);
--2 个 LED,投入 1 个壹圆硬币亮一个 LED
led_five_return :out std_logic_vector(2 downto 0);
--3 个 LED,以每秒 4 次的闪烁代表退出的硬币
led_ten_return :out std_logic_vector(2 downto 0);
--2 个 LED,以每秒 4 次的闪烁代表退出的硬币
led_cola_out :out std_logic;--灯亮显示可口可乐已出货
led_pepsi_out :out std_logic --灯亮显示百事可乐已出货
);
end;
architecture arch of vendor is
signal ok :std_logic;--用来维持 ok_buy 的状态
signal cancel :std_logic;--用来维持 cancel_buy 的状态
signal money_ok :std_logic;--投入金额正确
signal return_clk :std_logic;--退币的闪烁信号 4Hz
signal cola_choice :std_logic;--用来维持 select_cola 的状态
signal pepsi_choice :std_logic;--用来维持 select_pepsi 的状态
signal total_amount_five:integer range 0 to 15;--五角硬币的累计投入金额
signal total_amount_ten :integer range 0 to 20;--壹圆硬币的累计投入金额
signal cola_out :std_logic;--可口可乐已经出货的信号
signal pepsi_out :std_logic;--百事可乐已经出货的信号
begin
return_clock:block --产生退币闪烁信号的电路模块
signal count:std_logic_vector(7 downto 0);
begin
process(reset,clk)
begin
if reset='1' then count<="00000000"; --高电平复位
return_clk<='0';
elsif rising_edge(clk) then --时钟上升沿有效
count<=count+"00000001";
if count(7)='1' then return_clk<='1';-- 退币
else return_clk<='0';
end if;
end if;
end process;
end block;
coin_10_counting:block --投入壹圆硬币的处理电路模块
signal no_coin_ten:integer range 0 to 2;
begin
process(reset,coin_10)
begin
if reset='1' then total_amount_ten<=0; --复位
no_coin_ten<=0;
led_ten<="00";
elsif rising_edge(coin_10) then --按下投入一元硬币的按钮
total_amount_ten<=total_amount_ten+10;
if no_coin_ten<2 then --投入一元钱
led_ten(no_coin_ten)<='1'; --灯亮几盏表示投入多少个硬币
no_coin_ten<=no_coin_ten+1;
else no_coin_ten<=2; --投入两元钱
end if;
end if;
end process;
end block;
评论3