内容发布更新时间 : 2024/11/16 15:56:09星期一 下面是文章的全部内容请认真阅读。
⑤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是投入总额的十位数字