设计并制作一台出租车计费器。 1.1.2 性能指标要求 ① 用EDA实训仪的I/O设备和PLD芯片实现出租车计费器的设计。 ② 出租车起步开始计程和计费,计程系统按实际公里数计程,计费系统首先显示起步价(如7.0),车行驶2km以内,只收起步价7元。 ③ 出租车行驶超过2km后,按每公里1.6元在7.0元的基础上增加。 ④ 出租车行驶超过10km后(或超过20元路费),每公里加收50%的车费,即车费变为每公里2.4元。 ⑤ 出租车达到目的地后,(用一个按钮)计程和计费数据清零,为下一次计费开始。 1.2 设计思路及设计框图 1.2.1设计思路 本次设计首先在QuartusⅡ环境中对出租车计费器的各个部分利用verilog HDL这一硬件描述语言予以设计、生成模块。而整个设计的核心部分就在分频/计量模块和路程车费计数模块,分频/计量模块的功能主要是用来产生路程脉冲功能,路程车费技术模块主要包括计算路程和车费,通过路程和车费之间的关系,当路程少于一定公里数时车费保持不变,达到一定公里数按照规则每公里增加车费,超过某公里时,再每公里加收车费。待所有模块的功能正确之后,运用原理图搭建顶层电路并进行整体仿真直至达到设计要求,最后再在实验箱上检验设计的正确与否。在实现基本功能的基础上,做了一个创新,设计流水灯,当乘客上车时,流水灯开始运转,乘客下车时,流水灯停止。
2.1一秒钟分频器路程计数器的设计 通过秒脉冲来实现计费器调价,超过9自动进一位、实现计费脉冲。
路程模块用于控制数码管SEG4~SEG7的显示,输入有2个,分别是nclk,clrn。这里还有一个寄存器类型的输出d,是为了给计费器进行一个路程提示。 。
计费模块是用来计出租车的路费的,一共有3个输入,d,clrn,j。 d是计圈模块给的一个输出,主要给计费器提供一个路程的提示,开始计费。2公里内,数码管显示起步价7.0元;2公里到10公里,按每公里1.6元在7.0元的基础上增加;10公里以外,每公里2.4元;期间,低位的逢十进一。另外输入j是用来给计程车一个起步价的设定的。clrn仍未清零端。
流水灯模块是出租车计费器设计的创新点,一共有2个输入,clk,key。给led灯赋初值为1,然后设置一个中间变量temp,将led灯的初值给temp。然后在key=0时执行对led灯的左移,左移完成后给led赋temp的值,即又回到初值,循环执行。
3 调试过程 将程序锁好实训箱上的管脚后,将程序下载到实训箱模拟出租车的路程计费。实训箱前四个数码管表示路程,后四个数码管表示车费。将分频器的按键置于高电平状态,分频器开始输送1秒时钟信号,将控制路程开始的按键置于高电平,模拟乘客上车,车费数码管开始显示起步价7.0元,路程开始计算,2公里内,车费数码管一直显示7.0元,路程大于2公里后小于10公里时,车费数码管开始每公里增加1.6元,路程大于10公里后,车费数码管开始每公里增加2.4元,之后将按键置于低电平,按下清零键,8个数码管重置,恢复起步价。并且当乘客上车时,路程和计费都开始增加,流水灯也会一直转着,当乘客下车时,流水灯就停止,这是实训的创新也是亮点。 4 功能测试 4.1 测试仪器与设备 EDA实训箱,数据连接线,电脑quartus仿真。 4.2 性能指标测试 ① 用EDA实训仪的I/O设备和PLD芯片实现出租车计费器的设计。 ② 出租车起步开始计程和计费,计程系统按实际公里数计程,计费系统首先显示起步价(如7.0),车行驶2km以内,只收起步价7元。 ③ 出租车行驶超过2km后,按每公里1.6元在7.0元的基础上增加。 ④ 出租车行驶超过10km后(或超过20元路费),每公里加收50%的车费,即车费变为每公里2.4元。 ⑤ 出租车达到目的地后,(用一个按钮)计程和计费数据清零,为下一次计费开始。 性能指标要求指标全部完成。
5 心得体会 EDA的学习在某些方面和CAD很像。也涉及到软件Quartus II的应用,还涉及到数电与c语言的学习,可以说结合很多知识。而且程序写出来后,编译有错误又应该一个个改错,然后还要验证能否在实验箱上实现功能,验证和实现
6 参考文献 《EDA技术与应用》第3版 江国强编著 电子工业出版社
附录 附录1:仿真波形图(部分模块)
附录2:程序清单
(1)计费模块:
module jf(d,clrn,q,j);
input j,d,clrn ;
output reg[15:0] q;
reg[3:0] c;
always @(posedge d&&j or negedge clrn)
begin
if(clrn==0) begin c=0;q=0;end
else begin c=c+1;
if(c<=2) q[7:4]=7;
else if(c<=10) begin q[3:0]=q[3:0]+6;q[7:4]=q[7:4]+1;
if(q[3:0]>9)begin q[3:0]=q[3:0]%10;q[7:4]=q[7:4]+1;end
if(q[7:4]>9)begin q[7:4]=q[7:4]%10;q[11:8]=q[11:8]+1; end
end
else if(c>10) begin q[3:0]=q[3:0]+4;q[7:4]=q[7:4]+2;
if(q[3:0]>9)begin q[3:0]=q[3:0]%10;q[7:4]=q[7:4]+1;end
if(q[7:4]>9)begin q[7:4]=q[7:4]%10;q[11:8]=q[11:8]+1;
if(q[11:8]>9)begin q[11:8]=q[11:8]%10;q[15:12]=q[15:12]+1;end
end
end
end
end
endmodule
(2)路程模块:
module lc (nclk,clrn,d,q);
input nclk,clrn;
output reg[15:0] q;
output reg d;
reg[11:0]i;
always @(negedge clrn or posedge nclk)
begin
if(clrn==0) begin q=0;i=0; end
else
begin i=i+5;
if(i>9)
begin q[3:0]=q[3:0]+1;i=0; d=1;
if(q[3:0]>9)
begin
q[3:0]=0;q[7:4]=q[7:4]+1;
//if(q[7:0]<=2) d=1;
if(q[7:4]>9)
begin
q[7:4]=0;q[11:8]=q[11:8]+1;
if(q[11:8]>9)
begin
q[11:8]=0;q[15:12]=q[15:12]+1;
end
end
end
end
else d=0;
end
end
endmodule
(4)分频器模块:
module fpq(clk,kaishi,clk_1s);
input clk,kaishi;
output reg clk_1s;
reg[24:0] qs;
always @(posedge clk)
if(kaishi==1)
begin
if(qs==20000000-1) qs=0;
else qs=qs+1;
if(qs==20000000-1) clk_1s=0;
else clk_1s=1;
end
endmodule
(5)流水灯模块:
module deng(led,key,clk);
input clk,key;
output[11:0] led;
reg[11:0] led;
reg temp;
initial led=12'b000000000001;
always @(posedge clk)
begin
if(key==0)
begin
temp=12'b000000000001;
led=led<<1;
if(led==12'b000000000000)
led=temp;
end
end
endmodule
全部资料51hei下载地址:
出租车计费器.7z
(523.9 KB, 下载次数: 59)
|