写一个简单易懂的Verilog计费计程程序:按行驶路程计费,起步价为10.00元,并在行驶5km后按1.4元/km计费,当计费达到或超过50元时,每公里加收50%的车费,车停止不计费
时间: 2024-03-22 10:38:54 浏览: 106
好的,以下是一个简单易懂的Verilog计费计程程序:
```verilog
module taxi_fare(
input clk, // 时钟信号
input rst, // 复位信号
input start, // 起步信号
input [7:0] distance, // 行驶距离(单位:公里)
output reg [15:0] fare // 出租车费用(单位:元)
);
// 定义状态机的状态
parameter IDLE = 2'b00;
parameter START = 2'b01;
parameter CHARGE = 2'b10;
parameter STOP = 2'b11;
// 定义状态机的状态转移条件
parameter START_COND = 2'b00;
parameter CHARGE_COND = 2'b01;
parameter STOP_COND = 2'b10;
// 定义计费参数
parameter START_PRICE = 10; // 起步价(单位:元)
parameter UNIT_PRICE = 14; // 单价(单位:分)
parameter MAX_FARE = 5000; // 最大费用(单位:分)
parameter EXTRA_CHARGE = 150; // 加收金额(单位:分)
// 定义状态变量和计费变量
reg [1:0] state;
reg [15:0] fare_tmp;
reg [15:0] extra_charge;
reg [7:0] distance_tmp;
// 初始化状态变量和计费变量
initial begin
state = IDLE;
fare_tmp = 0;
extra_charge = 0;
distance_tmp = 0;
end
// 状态机
always @(posedge clk or negedge rst) begin
if (rst == 0) begin
state <= IDLE;
fare_tmp <= 0;
extra_charge <= 0;
distance_tmp <= 0;
end else begin
case (state)
IDLE: begin
if (start) begin
state <= START;
fare_tmp <= START_PRICE;
end
end
START: begin
if (distance_tmp >= 5) begin
state <= CHARGE;
fare_tmp <= fare_tmp + UNIT_PRICE * (distance_tmp - 5);
distance_tmp <= 5;
end else if (distance_tmp > 0) begin
distance_tmp <= distance_tmp - 1;
end
end
CHARGE: begin
if (fare_tmp >= MAX_FARE) begin
state <= STOP;
end else if (distance_tmp < 5) begin
state <= START;
end else begin
state <= CHARGE;
fare_tmp <= fare_tmp + UNIT_PRICE * distance_tmp;
distance_tmp <= 0;
if (fare_tmp >= 5000) begin
extra_charge <= EXTRA_CHARGE * (distance_tmp + 1);
end
end
end
STOP: begin
fare_tmp <= fare_tmp + extra_charge;
end
endcase
end
end
// 输出计费结果
assign fare = fare_tmp + extra_charge;
endmodule
```
该程序实现了按行驶路程计费的功能。首先,当起步信号`start`为1时,出租车进入起步阶段,状态变量`state`变为`START`,`fare_tmp`初始化为起步价`START_PRICE`。然后,当行驶距离`distance`大于等于5公里时,出租车进入计费阶段,状态变量`state`变为`CHARGE`,`fare_tmp`加上超过5公里的行驶距离乘以单价`UNIT_PRICE`。如果行驶距离`distance`小于5公里,出租车仍处于起步阶段,状态变量`state`变回`START`,行驶距离`distance`减1公里。当计费金额`fare_tmp`达到或超过最大费用`MAX_FARE`(50元)时,出租车进入停止阶段,状态变量`state`变为`STOP`,加收金额`extra_charge`为超过最大费用部分的1.5倍。最后,输出计费结果`fare`,即`fare_tmp`加上加收金额`extra_charge`。
阅读全文