Augus

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

0
阅读(3301)

    出租车计费器 

设计要求:

  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