Augus

你好,FPGA之出租车计费器的设计

0
阅读(3187)

出租车计费器

设计要求:

1. 能实现计费功能,计费标准为:按行驶里程收费,起步费为10.00元,

并在车行3公里后再按2元/公里,当计费器计费达到或超过一定收费(如20元)时,

每公里加收50%的车费,车停止不计费。

2. 实现预置功能:能预置起步费、每公里收费、车行加费里程。

3. 实现模拟功能:能模拟汽车启动、停止、暂停、车速等状态。

4. 设计动态扫描电路:将车费显示出来,有两位小数。

5. 用Verilog语言设计符合上述功能要求的出租车计费器,并用层次化设计方法设计该电路。

6. 各计数器的计数状态用功能仿真的方法验证,并通过有关波形确认电路设计是否正确。

7. 完成电路全部设计后,通过系统实验箱下载验证设计的正确性。 计费器按里程收费,每100米开始一次计费。


设计代码:

module Taxi_prj( clk, rst_n, en, //delay, Mail_out, Cost_out ); input clk,rst_n; input en; reg flag; reg[9:0] delay; output [9:0]Mail_out; output [9:0]Cost_out; reg [9:0] mail_cnt; reg [9:0] cost_cnt; always @(posedge clk or negedge rst_n) begin if(!rst_n) mail_cnt <= 9'd30; else if(cost_cnt !=9'd10 && en ==1 && flag ==0) mail_cnt <= mail_cnt + 1'b1;//100m else if(flag == 1) mail_cnt <= 9'd30; end always @(posedge clk or negedge rst_n) begin if(!rst_n) cost_cnt <= 9'd10; else if(flag==0 && en)begin if(cost_cnt <= 9'd19)//8km cost_cnt <= cost_cnt + 9'd2;//2yuan else if(cost_cnt >= 9'd20) begin cost_cnt <= cost_cnt + 9'd3;//2yuan end end else if(flag == 1) cost_cnt <= 9'd10; //mail_cnt <= 9'd30; end always @(posedge clk or negedge rst_n) begin if(!rst_n) begin delay <= 9'd0; flag <= 0; end else if(en == 0) begin //停车开始计数 delay <= delay + 9'd1; if(delay == 9'd49)begin flag <= 1; end else flag <= 0; end end assign Mail_out = mail_cnt; assign Cost_out = cost_cnt; endmodule `timescale 1ns/1ns `define clock_period 20 module Taxi_prj_tb; reg clk; reg rst_n; reg en; //wire [9:0]delay; wire [9:0]Mail_out; wire [9:0]Cost_out; Taxi_prj Taxi_prj( .clk(clk), .rst_n(rst_n), .en(en), // .delay(delay), .Mail_out(Mail_out), .Cost_out(Cost_out) ); initial clk = 1; always #(`clock_period/2) clk = ~clk; initial begin rst_n = 1'b0; en= 1; #(`clock_period *5); rst_n = 1'b1; #(`clock_period *20); en= 0; #(`clock_period *60); en = 1; #(`clock_period *20); en= 0; #(`clock_period *20); en = 1; #(`clock_period *50); $stop; end endmodule


备注:以实现基本要求,数码管显示使用顶层模块化设计

TAXI_prj.rar


Baidu
map