通信线路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. 选择出站口或投币过程中,乘客都可以按“取消”按钮取消
该次交易。选择出站口的过程中,若按“取消”,则售票机直接回
到初始状态;投币过程中,若按“取消”,则售票机将乘客已经投
入的钱币全部退出,再回到初始状态。
3. 客一次只能选择一个出站口,根据乘坐的站数确定票价。假
设乘客购票所在站到终点站共有 15 站。若乘坐 1-8 站,则票价为
2 元/张;若乘坐 9-16 站,则票价为 4 元/张。16 个站用长度位
4 的二进制向量编码表示,即 0001 表示乘坐 1 站,0010 表示乘坐
2 站,依次类推,1111 表示乘坐 15 站(到终点站)。
4. 票机有 2 个进币端口。硬币口可识别 5 角和 1 元 2 种硬币,
拟用长度为 2 的一比特热位(one-hot)编码方式表示,即 01 表
示 5 角,10 表示 1 元。纸币口类似,用长度为 4 的一比特热位编
码方式表示。乘客可以连续多次投入钱币,并且可以以任意顺序
投入硬币和纸币。
5. 票机设有钱币“暂存杆”,其有 3 个状态:退币状态、等待状
态、进币状态,分别用 00、01、10 表示。退币状态下,“暂存杆”
将乘客投入的钱币推出;等待状态下,投入的钱币被“暂存杆”
挡住暂存;进币状态下,“暂存杆”将乘客投入的钱币推入售票机
内部。
三、系统流程图:
初始状态
按“开始选择”
选择出站口
选择购票数
按“开始投币”
按“取消”
投入钱币
按“取消”
退回钱币
钱币入库
钱币足够
出票口出票
找零口找零
四.系统状态图
五、程序源代码及注释
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity subway is
port(
:in std_logic;
:in std_logic;
:in std_logic;
:in std_logic;
clk
select_start
insert_start
coin :in std_logic_vector(1 downto 0);
note :in std_logic_vector(3 downto 0);
cancel
ticket_stop
:in std_logic_vector(3 downto 0);
ticket_account :in std_logic_vector(1 downto 0);
money_gate
:out std_logic_vector(1 downto 0);
:out std_logic_vector(4 downto 0);
ticket_out
ticket_gate
:out std_logic;
:out std_logic
change_gate
--系统时钟
--“开始选择”按钮
--“开始投币”按钮
--硬币入口
--纸币入口
--“取消”按钮
--出站口编号
--购票张数
--钱币“暂存杆”
--购买的车票
--出票口
--找零口
);
end subway;
architecture behave of subway is
type state_type is (initialize_state,select_state,insert_state,ticket_state,change_state);
signal
state:state_type;
begin
process(clk)
--状态变量申明
--状态信号申明
variable type_temp :std_logic;
variable account_temp :std_logic;
variable temp_type :std_logic_vector(4 downto 0);
--记录是否已选择出站口的变量
--记录是否已选择购票张数的变量
--记录票种的中间变量
:std_logic_vector(4 downto 0); --记录票数的中间变量
variable temp_account
variable price :std_logic_vector(7 downto 0);
:std_logic_vector(1 downto 0);
variable number
variable total_price :std_logic_vector(7 downto 0);
variable total_insert:std_logic_vector(7 downto 0);-- 记录投入钱币总额的变量
variable change
variable sign :std_logic;
variable temp :std_logic;
--记录系统是否已经过初始化的变量
:std_logic_vector(7 downto 0);
--记录应找零金额的变量
--记录投入钱币金额达到总票价的变量
--记录单张票价的变量
--记录票数的变量
--记录总票价的变量
begin
if (clk'event and clk='1') then
--时钟信号上升沿触发
case state is
when initialize_state=>
then
if(sign='0')
--初始状态
--表示系统未经过初始化
--钱币“暂存杆”退出钱币
--购票记录清零
--出票口关闭
--找零口关闭
--票种记录清零
--票数记录清零
--单张票价记录清零
--购票张数记录清零
--票价总额记录清零
--投入钱币总额记录清零
--应找零金额记录清零
--记录已完成系统初始化
money_gate<="00";
ticket_out<="00000";
ticket_gate<='0';
change_gate<='0';
temp_type:="00000";
temp_account:="00000";
type_temp:='0';
account_temp:='0';
price:="00000000";
number:="00";
total_price:="00000000";
total_insert:="00000000";
change:="00000000";
sign:='1';
temp:='0' ;
--投入达到总票价记录清零
else
--表示系统已经过初始化
money_gate<="01";
if (select_start='1') then --按下“开始选择”按钮
--钱币“暂存杆”归为等待状态