用Verilog设计出租车计费器 基本要求:实现计费功能,计费标准为:按行驶里程计费,起步价为10元,并在车行3km后按1元/km计费,车停止不计费。出租车计费器能模拟汽车起动、停止、暂停等状态,能将车费和路程显示出来。
时间: 2024-02-11 13:08:48 浏览: 274
基于FPGA出租车计费器设计报告(verilog).doc
下面是一个简单的出租车计费器的 Verilog 代码,该代码实现了基本的计费功能:
```
module TaxiMeter(
input clk, rst, // 时钟和复位信号
input start, stop, pause, // 起动、停止和暂停信号
input [15:0] distance, // 行驶里程(单位:米)
output reg [31:0] fare, // 车费(单位:分)
output reg [31:0] mileage // 路程(单位:米)
);
reg [3:0] state; // 状态寄存器
reg [31:0] fare_tmp; // 车费暂存器
reg [31:0] mileage_tmp; // 路程暂存器
parameter STATE_IDLE = 2'b00; // 空闲状态
parameter STATE_DRIVING = 2'b01; // 行驶状态
parameter STATE_PAUSED = 2'b10; // 暂停状态
parameter FARE_START = 1000; // 起步价(10元)
parameter FARE_PER_KM = 100; // 每公里价格(1元)
always @(posedge clk) begin
if (rst) begin
state <= STATE_IDLE;
fare_tmp <= 0;
mileage_tmp <= 0;
fare <= 0;
mileage <= 0;
end else begin
case (state)
STATE_IDLE: begin
if (start) begin
state <= STATE_DRIVING;
mileage_tmp <= 0;
fare_tmp <= FARE_START;
end
end
STATE_DRIVING: begin
if (stop) begin
state <= STATE_IDLE;
mileage <= mileage_tmp;
fare <= fare_tmp;
end else if (pause) begin
state <= STATE_PAUSED;
end else begin
mileage_tmp <= mileage_tmp + distance;
if (mileage_tmp > 3000) begin
fare_tmp <= fare_tmp + FARE_PER_KM;
end
end
end
STATE_PAUSED: begin
if (start) begin
state <= STATE_DRIVING;
end else if (stop) begin
state <= STATE_IDLE;
mileage <= mileage_tmp;
fare <= fare_tmp;
end
end
default: begin
state <= STATE_IDLE;
end
endcase
end
end
endmodule
```
该代码中,模块 `TaxiMeter` 包含了时钟、复位信号、起动、停止和暂停信号、行驶里程、车费和路程等信号。状态寄存器 `state` 记录了出租车的状态,车费暂存器 `fare_tmp` 记录了当前的车费,路程暂存器 `mileage_tmp` 记录了当前的路程。参数 `FARE_START` 和 `FARE_PER_KM` 分别表示起步价和每公里价格。
在时钟上升沿的时候,根据当前的状态和输入信号,更新状态寄存器、车费暂存器和路程暂存器,并根据需要将最终的车费和路程输出。具体实现可以参考代码中的注释。
需要注意的是,在本代码中,车费和路程的单位均为分和米,因此需要在实际使用时进行转换。
阅读全文