以CPLD/FPGA为主体,设计并制作一台出租车计费系统。
基本要求:1、里程显示,显示方式为XXX.X,单位为km精确到0.1km
2、里程单价显示,显示方式为X.XX,单位为元/km,根据每天不同的时间段有两种情况:当时间段为06:00~23:00时单价为1.40元/km,其他时间段单价为1.80元/km;
3、费用的计算及显示,出租车的起价为5.00元,当里程小于2km时,按起价计算费用;当里程大于2km时,按下式计算费用:
费用=里程×里程单价+等候时间×等候单价
费用显示方式为XXX:XX,单位为元;
4、当出租车在正常运行状态下,应能显示当前的时间;在熄火的情况下,时钟必须正常运行,但是可以不显示时钟;
源程序如下:
- module control(clk, //50MHz
- reset, //复位
- set, //状态切换
- start, //计费启动开关
- run, //出租车运行状态开关
- price_day_short, //白天近程单价
- price_day_long, //白天远程单价
- price_night_short, //晚上近程单价
- price_night_long, //晚上远程单价
- price_wait_time, //等待时间每分钟价格
- one_price_day, //白天起步价
- one_price_night, //晚上起步价
- short_distance, //起步价可行最大里程数
- long_distance, //最大近程里程数
- day_time, //白天开始时间
- night_time, //晚上开始时间
- start_out,
- run_out,
- state,
- password //更改信息的密码
- );
- input clk,reset,set,start,run;
- input [5:0] password;
- output [7:0] price_day_short,price_day_long,price_night_short,price_night_long,price_wait_time;
- output [11:0] one_price_day,one_price_night;
- output [7:0] short_distance,long_distance;
- output [7:0] day_time,night_time;
- output [3:0] state,start_out;
- output run_out;
- reg [7:0] price_day_short,price_day_long,price_night_short,price_night_long,price_wait_time;
- reg [11:0] one_price_day,one_price_night;
- reg [7:0] short_distance,long_distance;
- reg [7:0] day_time,night_time;
- reg [3:0] state,start_out;
- reg run_out,add,sub;
-
- initial //为了处理小数点,把实际价格扩大十倍
- begin
- day_time=5; //白天开始时间
- night_time=23; //晚上开始时间
- short_distance=3; //起步价可行最大里程数
- long_distance=10; //最大近程里程数
- price_day_short=24; //实际价格2.4元
- price_day_long=36; //实际价格3.6元
- price_night_short=31; //实际价格3.1元
- price_night_long=47; //实际价格4.7元
- one_price_day=140; //实际价格14元
- one_price_night=180; //实际价格18元
- price_wait_time=10; //实际价格1元
- end
-
- initial
- begin
- state<=4'd0;
- end
-
- always@(posedge clk)
- begin
- if(reset==1) //复位键
- state<=4'd0;
- if(set==1) //总状态设置
- if(state>=4'd14)
- state<=4'd1;
- else
- state<=state+4'd1;
-
- // start/run第一功能区
-
- if(start==1&&state==0) //state=0,该功能可用 //计费启动键,每按一次取反一次。
- if(start_out>=4'd2) start_out<=4'd0; //总状态设置
- else start_out<=start_out+4'd1;
-
- if(start_out==0) run_out=1;
-
- if(start_out==1&&run==1&&state==0) //出租车行驶状态键,没按一次取反一次。
- begin
- run_out=~run_out;
- end
-
- // start/run第二功能区
-
- add=start; //加,第二功能
- sub=run; //减,第二功能
- if(password==6'b010101) //密码正确才能更改价格和参数
- case(state)
- 4'd0:;
- 4'd1:;
- 4'd2:;
- 4'd3:
- begin
- if(add==1) //白天近程单价设置
- if(price_day_short>=8'd99) price_day_short<=8'd0;
- else price_day_short<=price_day_short+8'd1;
- if(sub==1)
- if(price_day_short<=8'd0) price_day_short<=8'd99;
- else price_day_short<=price_day_short-8'd1;
- end
- 4'd4: //白天远程单价设置
- begin
- if(add==1)
- if(price_day_long>=8'd99) price_day_long<=8'd0;
- else price_day_long<=price_day_long+8'd1;
- if(sub==1)
- if(price_day_long<=8'd0) price_day_long<=8'd99;
- else price_day_long<=price_day_long-8'd1;
- end
- endcase
- end
- endmodule
复制代码
代码下载:
czc.7z
(7.27 MB, 下载次数: 8)
|