1 系统设计
1.1 设计要求
1.1.1 设计任务
设计并制作一台出租车计费器。
1.1.2 性能指标要求
① 用EDA实训仪的I/O设备和FPGA实现出租车计费器的设计。
② 出租车起步开始计程和计费,计程系统按实际公里数计程,计费系统首先显示起步价(如7.0),车行驶2km以内,只收起步价7元。
③ 出租车行驶超过2km后,按每公里1.6元在7.0元的基础上增加。
④ 出租车行驶超过10km后(或超过20元路费),每公里加收50%的车费,即车费变为每公里2.4元。
⑤ 出租车达到目的地后,(用一个按钮)计程和计费数据清零,为下一次计费开始。
1.2 设计思路及设计框图
1.2.1设计思路
计程和计费都是十进制位的输入,通过脉冲实现计数。计程通过分频器的输出作为输入,产生的秒脉冲以实现计数功能。计费在LED数码管上分为个位十位(例如起步价为7元,显示器上显示70,三公里时为86......),计程器和计费器在一个程序内完成,分频器用另一个程序完成,并将程序都生成一个元器件,用图形法级联在一起。上硬件仿真后,打开开关输入脉冲,通过上升沿触发使路程计算加一,并使总路计算模块加一,到达相应的公里数后没每公里收费也随之改变。
1.2.2总体设计框图
2.1 总体电路图
2.2 分频器模块
module fpq_(clk,KS,clk_1s);
input clk,KS;
output reg clk_1s;
reg[26:0] qs;
always @(posedge clk)
if(KS==1)
begin
if(qs==49999999) qs=0;
else qs=qs+1;
if(qs==24999999) clk_1s=0;
else clk_1s=1;
end
endmodule
分频器
2.3计程计费器模块
module CZCJFQ(clk,clrn,clk2,L1,L2,L3,L4,L5,L6);
input clk,clrn,clk2;
output L1,L2,L3,L4,L5,L6;
wire[15:0] Q;
reg[7:0] km;
reg[11:0] ZJ;
reg clk1;
reg [6:0] L1,L2,L3,L4,L5,L6;
initial clk1=1;
always @(posedge clk^clk2 or negedge clrn)
begin
if(~clrn) km[3:0]=0;
else begin
if(km[3:0]==9) km[3:0]=0;
else km[3:0]=km[3:0]+1;
if(km[3:0]==9) clk1=0;
else clk1=1;
end
end
always @(posedge clk1 or negedge clrn)
begin
if(~clrn) km[7:4]=0;
else begin
if( km[7:4]==9) km[7:4]=0;
else km[7:4]= km[7:4]+1;
end
end
initial ZJ[11:0]=70;
always @(posedge clk^clk2 or negedge clrn)
begin
if(~clrn) ZJ[11:0]=70;
else begin
if(ZJ[11:0]>9999) ZJ[11:0]=70;
else if(km[7:0]>'h9) ZJ[11:0]=ZJ[11:0]+24;
else if(km[7:0]>'h1) ZJ[11:0]=ZJ[11:0]+16;
else ZJ[11:0]=ZJ[11:0];
end
end
assign{Q[3:0]}={ZJ[11:0]}%10;
assign{Q[7:4]}={ZJ[11:0]}/10%10;
assign{Q[11:8]}={ZJ[11:0]}/100%10;
assign{Q[15:12]}={ZJ[11:0]}/1000;
路程计费器模块
2.4 组合逻辑模块(部分)
always@ (Q[0],Q[1],Q[2],Q[3])
begin
case ({Q[3],Q[2],Q[1],Q[0]})
4'B0000:L1=7'B1000000;
4'B0001:L1=7'B1111001;
4'B0010:L1=7'B0100100;
4'B0011:L1=7'B0110000;
4'B0100:L1=7'B0011001;
4'B0101:L1=7'B0010010;
4'B0110:L1=7'B0000010;
4'B0111:L1=7'B1111000;
4'B1000:L1=7'B0000000;
4'B1001:L1=7'B0010000;
4'B1010:L1=7'B0001000;
4'B1011:L1=7'B0000011;
4'B1100:L1=7'B1000110;
4'B1101:L1=7'B0100001;
4'B1110:L1=7'B0000110;
4'B1111:L1=7'B0001110;
endcase
end
always@ (Q[4],Q[5],Q[6],Q[7])
begin
case ({Q[7],Q[6],Q[5],Q[4]})
4'B0000:L2=7'B1000000;
4'B0001:L2=7'B1111001;
4'B0010:L2=7'B0100100;
4'B0011:L2=7'B0110000;
4'B0100:L2=7'B0011001;
4'B0101:L2=7'B0010010;
4'B0110:L2=7'B0000010;
4'B0111:L2=7'B1111000;
4'B1000:L2=7'B0000000;
4'B1001:L2=7'B0010000;
4'B1010:L2=7'B0001000;
4'B1011:L2=7'B0000011;
4'B1100:L2=7'B1000110;
4'B1101:L2=7'B0100001;
4'B1110:L2=7'B0000110;
4'B1111:L2=7'B0001110;
endcase
end
.......
3 调试过程
在编程代码和编译过程经常出现问题,尤其是always@(*)语句上经常出错,以及在下载到硬件仿真的时候LED数码管没有反应,在向老师求助答疑后加入了些组合逻辑模块,修改过后的程序能正常编译,之后将程序下载到硬件中,打开开关检查路程计算能正常运行,路程计费计算功能正常,可以达到验收标准。
4 功能测试
4.1 测试仪器与设备
计算机一台
EDA实训仪
4.2 性能指标测试
打开开关后输入脉冲可产生路程计算,随着路程的递增费用也按要求递增,按下按键后数据可清零,也可以通过按下按键自行增加路程。
仿真波形图(部分模块)
需要全部资料可在我的资源里下载,包括程序文档、源程序。
需要完整的资料可在我的资源里下载,也可以加入我的纷传圈子,里面有资源压缩包的百度网盘下载地址及提取码。
纷传 点击用微信打开即可,过程有点繁琐请见谅