名称:出租车计费器Basys2开发板verilog出租车计价器出租车打表器
软件:ISE
语言:Verilog
代码功能:
设计一个出租车计费器,能在 Basys2开发板上实际运行
1、用开发板上的2个按键输入路程和计时信号,其中一个按键,每按一下,代表输入一个0.5公里的脉冲,另外一个按键,每按一次,代表超时后的1分钟。
2、计费规则为起步价8元,2.5公里内免费,每公里1.6元,每分钟等待0.4元。(计费方式可以自行修改)
3、路程、等待时间和费用都要用开发板上的数码管显示,数码管数目肯定不足,可以用开发板上的开关来切换显示,这一部分也需要自己编写代码实现。
本代码的计费方式可以自行修改。修改以下代码即可:
//定义计费方式,可修改 parameter start_price=15'd80;//起步价8.0元 parameter start_kilometres=8'd25;//2.5公里内起步价 parameter kilometres_price=15'd8;//0.8元每0.5公里 parameter time_price=15'd4;//0.4元每分钟
FPGA代码Verilog/VHDL代码资源下载:www.hdlcode.com
本代码已在Basys2开发板验证,开发板如下,其他开发板可以修改管脚适配:
设计文档:
1. 工程文件
2. 程序文件
3. 管脚分配
4. 程序编译
5. RTL图
6. Testbench
7. 仿真图
整体仿真图
按键模块
控制模块
显示模块
部分代码展示:
//控制模块 module taxi_state( input clk,//标准时钟 input reset,//复位信号,高有效 input stop,//本次行程结束,停止计费,低有效 input start,//启动信号,行程开始,低有效 input one_kilometre,//0.5公里产生一次 input minute_en,//1分钟产生一次 output [7:0] minute_out,//分钟 output [7:0] mileage_out,//里程 output reg [15:0] totel_money_out//合计费用 ); parameter s_idle=3'd0; parameter s_starting_price=3'd1;//起步价 parameter s_mileage_price=3'd2;//按里程计费 parameter s_stop=3'd3; parameter s_begin=3'd4; reg [2:0] state=3'd0; reg [15:0] totel_money=16'd0; reg [7:0] mileage=8'd0;//里程 assign mileage_out=mileage; //里程控制 always@(posedge clk) if(reset==1) mileage<=8'd0; else if(state==s_starting_price || state==s_mileage_price ) if(one_kilometre==1) mileage<=mileage+8'd5;//0.5公里里程加0.5 else mileage<=mileage; else if(stop==1) mileage<=8'd0; else mileage<=mileage; //定义计费方式,可修改 parameter start_price=15'd80;//起步价8.0元 parameter start_kilometres=8'd25;//2.5公里内起步价 parameter kilometres_price=15'd8;//0.8元每0.5公里 parameter time_price=15'd4;//0.4元每分钟 always@(posedge clk) if(reset==1)begin state<=s_idle;//reset totel_money<=16'd0; totel_money_out<=16'd0; end else if(stop==1) begin//停止 state<=s_stop; totel_money<=16'd0; totel_money_out<=totel_money;//输出合计费用 end else begin totel_money_out<=totel_money;//输出合计费用 case(state) s_idle:begin//空闲状态 totel_money<=totel_money; if(start==1)//启动 state<=s_begin; else state<=s_idle; end s_begin:begin state<=s_starting_price; totel_money<=start_price;//起步价 end s_starting_price:begin//起步价状态 if(minute_en==1)//1分钟 totel_money<=totel_money+time_price;//0.4元每分钟 else ; if(mileage>=start_kilometres)//大于start_kilometres公里 state<=s_mileage_price; else state<=s_starting_price; end s_mileage_price:begin//车行驶起步公里后按每公里1.6元计费 if(one_kilometre==1) totel_money<=totel_money+kilometres_price;//每公里 1.6元计费 else if(minute_en==1)//1分钟 totel_money<=totel_money+time_price;//0.4元每分钟 else ; end s_stop://停止 state<=s_idle; default:state<=s_idle; endcase end reg [7:0] minute_cnt=8'd0; //总等待时间计数 always@(posedge clk) if(reset==1) minute_cnt<=8'd0; else if(state==s_mileage_price || state==s_starting_price) if(minute_en==1)//1分钟 minute_cnt<=minute_cnt+8'd1;//加分钟 else