地铁自动售票机(基于FPGA)设计 下载本文

⑤qua_1,qua_2:将其中一个置高电平,作为选择购买车票的数量(一张票,两张票)。

2)输出

②pri[3:0]:表示所选票价,输出到余额计算模块和显示功能模块,作为判断出何种票的条件,并在数码管显示出车票单价。

③qua[3:0]:表示所买票数,输出到显示功能模块,在数码管显示出票数。

④cost[3:0]:表示应付总额,根据票价和票数来计算出应付的总额,输出到余额计算模块,用来计算找赎金额。

该车票选择模块的源程序如下:

module xuanpiao(pri_3,pri_4,pri_5,pri_6,qua_1,qua_2,clk,rd,

pri,qua,cost);

input pri_3,pri_4,pri_5,pri_6,qua_1,qua_2,rd,clk; output[3:0] pri; output[3:0] qua; output[3:0] cost; reg[3:0] pri; reg[3:0] qua; reg[3:0] cost; initial begin

pri=0; qua=0; cost=0; end

always@(rd) //清零 begin

if(!rd) begin

pri=0; qua=0; cost=0;

end end

always@(posedge clk or negedge rd) begin

if(!rd) begin

pri=0; qua=0; cost=0; end

else if(pri_3&&qua_1) // 选1张3元票,总额3元 begin pri=3; qua=1; cost=3; end

else if(pri_4&&qua_1) // 选1张4元票,总额4元 begin pri=4; qua=1; cost=4; end

else if(pri_5&&qua_1) // 选1张5元票,总额5元 begin pri=5; qua=1; cost=5; end

else if(pri_6&&qua_1) // 选1张6元票,总额6元 begin pri=6; qua=1; cost=6; end

else if(pri_3&&qua_2) // 选2张3元票,总额6元 begin pri=3; qua=2; cost=6; end

else if(pri_4&&qua_2) // 选2张4元票,总额8元 begin pri=4; qua=2;

cost=8; end

else if(pri_5&&qua_2) // 选2张5元票,总额10元 begin pri=5; qua=2; cost=10; end

else if(pri_6&&qua_2) // 选2张6元票,总额12元 begin pri=6; qua=2; cost=12; end end endmodule

经过编译后建立波形文件,波形仿真图如图所示:

在此波形仿真图中,将pri_3,qua_1;pri_5,qua_2;pri_4,qua_2;依次置高电平作为输入,输出显示为选择的3元票,1张票,应付总额3元;选择的5元票,2张票,应付总额10;选择的4元票,2张票,应付的总额8元,说明达到此车票选择模块的预期功能。

2.2 钱币处理模块

钱币处理模块是对投入的钱币进行处理的过程,输出参

数coin为投币数值计数器,以1元为单位进行计算。该模块入口参数coin1(投入1元)coin5(投入5元钱),coin10(投入10元钱),coin20(投入20元)。功能类似于计钱器,在清零的前提下,可准确计算,记录并保存所投入的总钱数。

钱币处理模块如图所示:

图 钱币处理模块

1)输入

①rd:模块复位信号,将所有输出信号清零。 ②clk:模块的时钟信号。

③coin_1,coin_5,coin_10,coin_20:表示投入1元,5元,10元,20元。一次时钟上升沿,若信号为‘1’时,表示投入一次1元,5元10元,20元。

2)输出

①coinh[3:0],coinl[3:0]:信号输出到显示功能模块,在数码管上显示出投入钱币总额的十位和个位。

②coin[4:0]:表示投入钱币的总额,输出到余额计算模块,与应付总额相比较,来计算出找赎金额。

该钱币处理模块的源程序如下:

module toubi(coin_1,coin_5,coin_10,coin_20,clk,rd, coinh,coinl,coin);

input coin_1,coin_5,coin_10,coin_20,rd,clk; output[3:0] coinh,coinl; output[4:0] coin; reg[3:0] coinh,coinl; reg[4:0] coin; /*initial begin

coinh=0; coinl=0; coin=0; end*/

/*always@(rd) // 清零 begin if(!rd) begin coinh=0; coinl=0; coin=0; end end*/

always@(posedge clk or negedge rd) begin

if(!rd) begin coinh=0; coinl=0; coin=0; end

else if(coin_1) //投入1元 begin

case(coinl) // coinl是投入总额的个位数字 0: begin coinl=1;

coinh=coinh; // coinh是投入总额的十位数字