出租车计价器.doc
【精品文档】如有侵权,请联系网站删除,仅供学习与交流出租车计价器.精品文档.本计价器的主要功能包括:计时功能;计费功能;计程功能;LCD显示;功能:1)启动计费器,里程计数器和时间计数器从零开始,费用计费器从10元开始计算 ;2)根据出租车行驶的里程数和时间(包括停车等待时间)进行计费,当出租车启动在3公里以内,且在等待累计2分钟内时费用计数器复位为起步价10元 ;3)当出租车在行驶状态下超过3公里时,每满1公里时,费用计数器加1元 ;4)当出租车等待时间累计超过2分钟时以每分钟1元计费 。整体设计方案:Clk 输入 C9;Sw1输入 L14;TXD 输出 u8;Flash_ce 输出 k18;Lcd_e 输出 M18;LCD_RW 输出 L17;LCD_RS 输出 L18;LCD_d3:0 输出 R15 R16 P17 M15;模块划分1.分频电路模块:2. 时间计算模块:start: 启动信号, 当start为高电平时出租车开动,选择以公里计费;当start为低电平时出租车等待;选择以时间计费m: 输出的时间分信号s: 输出的时间秒信号Time_enable:控制计费的时间信号,当其为高电平时控制计数器按时间数计数3. 计程功能“distance_enable: 控制计费的公里信号,当其为高电平时控制计数器按路程计数distance: 输出的公里信号4. 判断控制模块 ;select_clk: 输出选择的时钟信号5. 计费模块:fee: 输出的费用信号6. 显示模块:分频程序:module div(clk_50M,clk,reset);input clk_50M;input reset;output clk;wire clk_50M; wire reset;reg clk;reg 7:0 count;always (posedge clk_50M or negedge reset)begin if(!reset) begin count<=0; clk<=0; end else if(count=8'd100) begin count<=8'd0; clk<=clk; end else count<=count+1'd1; end endmodulemodule test; reg clk_50M; reg reset; wire clk; div u1(.clk_50M(clk_50M), .reset(reset), .clk(clk);initial #0 clk_50M=1'b0; always #5 clk_50M=clk_50M;initial begin #0 reset=1'b0; #100 reset=1'b1; endendmodule计时激励:module timemokuai(clk,reset,start,s,m,time_enable);/ 端口的定义input clk,reset,start;output 7:0 s;/输出的秒output 7:0 m;/输出的分output time_enable;/输出的控制计费的信号reg 7:0 s;reg 7:0 m;wire time_enable; always(posedge clk or negedge reset)/异步复位beginif(!reset)/低电平有效begin /复位s<=8'd0;m<=8'd0;endelse if(!start)/start 信号低电平有效beginif(s3:0=9)/ 秒的低四位是9 begin s3:0<=4'd0;/清零 if(s7:4=5) / 秒的高四位是5 begin s7:4<=4'd0; /清零 if(m3:0=9) / 分的低奈皇? begin m3:0<=4'd0; /清零 if(m7:4=9) / 分的高四位是9 m7:4<=4'd0; /清零 else m7:4<=m7:4+1'd1; / 分的高四位不是9加一endelse m3:0<=m3:0+1'd1; /分的低四位不是9加一endelse s7:4<=s7:4+1'd1; / 秒的高四位不是5加一endelse s3:0<=s3:0+1'd1; /秒的低四位不是9加一 end/end alwaysend assign time_enable=(m7:0>8'd2)&&(s7:0=8'd0)?1'd1:1'd0;/产生time_enable信号。endmodule/结束计时激励:module test4;reg clk;reg reset;reg start;wire 7:0 s;wire 7:0 m;wire time_enable;timemokuai u1(.clk(clk), .reset(reset), .start(start), .s(s), .m(m), .time_enable(time_enable);initial clk=1'b0;always #10 clk=clk;initial begin #0 reset=1'b0; #100 reset=1'b1; endinitial begin start=1'b0; #5000 start=1'b1; endendmodule 计程模块激励:module test;reg clk;reg start;reg reset;wire 7:0 distance;wire distance_enable;distancemokuai u1(.clk(clk), .reset(reset), .start(start), .distance(distance), .distance_enable(distance_enable); initial clk=1'b0; always #10 clk=clk; initial begin #0 reset=1'b0; #100 reset=1'b1; end initial begin start=1'b1; #500 start=1'b0;/仿真过程要延迟时间足够长 end endmodule