三.设计一出租车计价器,要求如下:
1. 起步价8元(3公里),超过3公里但不足10公里内,每过0.5公里计价器累加0.75元;
2. 过10公里后,每过0.5公里计价器累加1元;
3. 公里数7位数字显示,其中整数4位,小数3位。
4. 出租车计价器数字显示位数自己设计,要求显示0-15公里的计价器数字。
程序在modelsim中实现和仿真
源程序如下:
module taxicount(clk,rset,mileage_4,mileage_3,mileage_2,mileage_1,mileage1,mileage2,mileage3,fare_2,fare_1,fare1,fare2);
input clk,rset;
output reg[3:0] mileage_1,mileage_2,mileage_3,mileage_4,mileage1,mileage2,mileage3;
output reg[3:0] fare_1,fare_2,fare1,fare2;
reg[1:0] sel;
wire[31:0] qout1,qout2,qout;
//------里程表显示-----
always @(posedge clk)//第三位小数
begin
if(!rset)
mileage3<=0;
else
if(mileage3==9)
mileage3<=0;
else
mileage3<=mileage3+1;
end
always @(posedge clk)//第二位小数
begin
if(!rset)
mileage2<=0;
else if(mileage3==9)
begin
if(mileage2==9)
mileage2<=0;
else
mileage2<=mileage2+1;
end
end
always @(posedge clk)//第一位小数
begin
if(!rset)
begin
mileage1<=0;
//i<=0;
end
else if(mileage3==9&&mileage2==9)
begin
if(mileage1==9)
mileage1<=0;
else
begin
mileage1<=mileage1+1;
end
end
end
always @(posedge clk)//第一位整数
begin
if(!rset)
mileage_1<=0;
else if(mileage1==9&&mileage2==9&&mileage3==9)
begin
if(mileage_1==9)
mileage_1<=0;
else
mileage_1<=mileage_1+1;
end
end
always @(posedge clk)//第二位整数
begin
if(!rset)
mileage_2<=0;
else if(mileage_1==9&&mileage1==9&&mileage2==9&&mileage3==9)
begin
if(mileage_2==9)
mileage_2<=0;
else
mileage_2<=mileage_2+1;
end
end
always @(posedge clk)//第三位整数
begin
if(!rset)
mileage_3<=0;
else if(mileage_2==9&&mileage_1==9&&mileage1==9&&mileage2==9&&mileage3==9)
begin
if(mileage_3==9)
mileage_3<=0;
else
mileage_3<=mileage_3+1;
end
end
always @(posedge clk)//第四位整数
begin
if(!rset)
mileage_4<=0;
else if(mileage_3==9&&mileage_2==9&&mileage_1==9&&mileage1==9&&mileage2==9&&mileage3==9)
begin
if(mileage_4==9)
mileage_4<=0;
else
mileage_4<=mileage_4+1;
end
end
/* always @(posedge clk)
begin
if(!rset)
begin
qout<=0;
qout1<=0;
qout2<=0;
end
else
begin*/
assign qout=mileage1+mileage_1*10+mileage_2*100;
assign qout1=(mileage1>4)?((mileage_1*2-5)*75+800):((mileage_1*2-6)*75+800);
//assign qout2=(mileage3+mileage2*10+mileage1*100+mileage_1*1000+mileage_2*10000+mileage_3*100000+mileage_4*1000000-10000)*2+18500;
assign qout2=(mileage1>4)?(((mileage_1+mileage_2*10)*2-19)*10+185):(((mileage_1+mileage_2*10)*2-20)*10+185);
//((mileage_1+mileage_2*10+mileage_3*100+mileage_4*1000)*2+1):((mileage_1+mileage_2*10+mileage_3*100+mileage_4*1000)*2))-20)*10+185;
//end
//end
//----计价器显示--------//
always @(posedge clk)
begin
if(!rset)
begin
fare_1<=0;
fare_2<=0;
fare1<=0;
fare2<=0;
end
else if(qout<35) sel<=1;//mileage_1<=3&&mileage_2==0&&mileage_3==0&&mileage_4==0&&mileage1<5
else if(qout>=99) sel<=3;
else sel<=2;
case(sel)
1:begin
fare_2<=0;
fare_1<=8;
fare1<=0;
fare2<=0;
end
2:begin
fare2<=qout1%10;
fare1<=(qout1/10)%10;
fare_1<=(qout1/100)%10;
fare_2<=(qout1/1000)%10;
end
3:begin
fare2<=0;//(qout2/10)%10;
fare1<=qout2%10;
fare_1<=(qout2/10)%10;
fare_2<=(qout2/100)%10;
end
endcase
end
endmodule
测试程序如下:
`timescale 1ns/1ns
module taxicount_tb();
reg clk,rset;
wire[3:0] mileage_4,mileage_3,mileage_2,mileage_1,mileage1,mileage2,mileage3;
wire[3:0] fare_2,fare_1,fare1,fare2;
parameter DELY=100;
taxicount u1(.clk(clk),.rset(rset),.mileage_4(mileage_4),
.mileage_3(mileage_3),.mileage_2(mileage_2),
.mileage_1(mileage_1),.mileage1(mileage1),
.mileage2(mileage2),.mileage3(mileage3),
.fare_2(fare_2),.fare_1(fare_1),
.fare1(fare1),.fare2(fare2));
always #(DELY/2) clk=~clk;
initial begin
clk=0;rset=0;
#(DELY*2) rset=1;
#(DELY*100) rset=0;
#10 rset=1;
#(DELY*1000000) $finish;
end
initial $monitor($time,,,"clk=%d,rset=%d,mileage_4=%d,mileage_3=%d,mileage_2=%d,
mileage_1=%d,mileage1=%d,mileage2=%d,mileage3=%d,
fare_2=%d,fare_1=%d,fare1=%d,fare2=%d",clk,rset,
mileage_4,mileage_3,mileage_2,mileage_1,mileage1,
mileage2,mileage3,fare_2,fare_1,fare1,fare2);
endmodule