EDA实训-出租车计费.pdf
-EDAEDA 技术及应用技术及应用 实训报告实训报告姓姓名名满眼皆是繁华满眼皆是繁华指导教师:指导教师:2021 2021 年年 7 7 月月 8 8 日日实训题目:出租车计费器的设计1系统设计1.1 设计要求1.1.1 设计任务设计并制作一台出租车计费器。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 设计思路出租车计费器的整体构造包括:分频模块,计数模块,计费模块。另外我还加了扩展功能:选择模块,计时模块。不计价时,可以切换到显示时分秒。这个功能需要选择模块和计时模块共同来实现。通过分频模块产生一个脉冲信号模拟汽车的启动与停顿,然后通过计数模块,计算出一.z-共所行驶的路程,最后通过记价模块,将所行驶的路程计算出相对应的价钱。计费显示起步价 7 元,2km 之为起步价,以后每 1km 在起步价 7 元的根底上增加 1.6 元;超过 10km 以后,每 1km 增加 2.4 元。通过数学公式计算出费用,这就是费用计算模块。结合生活中的出租车计费器,分别有3km 以,10km 以以及超过 10Km 以后的计费标准。我设计用拨码开关来实现清零与车速的转换,并通过数码管来显示路程与车费。车轮每转一圈就是一个脉冲,因此,脉冲频率的快慢就是车速的快慢,这就是车速的计算;把车轮每转一圈 4 米的话,每来一个脉冲路程就加 4 米,这就是路程的计算;当路程的百位向千位进位时就产生一个脉冲也就是路程又走了 1 公里。于是便实现了车行驶3km 以,只收起步价7 元。行驶超过 3km 后,按每公里 1.6 元在 7.0 元的根底上增加。行驶超过10km 后或超过 20 元路费,每公里加收50的车费,即车费变为每公里2.4 元。1.2.2 总体设计框图2各个模块程序的设计2.1 分频模块这个模块是设计不同车速的,通过d1 与 d2 的值来设置四个不同的车速,其中00 是最慢,01 是中速,10 是最快,11 是停顿。这样更贴切生活。2.2 计费器模块分为输出路程和时间的模块,由分频,路程,车费,模块组成。车速的计算:车轮每转一圈就是一个脉冲,因此,脉冲频率的快慢就是车速的快慢。路程的计算:如果车轮每转一圈,每来一个脉冲路程就加4 米。计费器模块如下列图所示:2.2.1 车费模块这个模块就是实现题目要求的,在2km 收起步价 7 块,大于 2km 小于 10km 的时候每公里收 1.6 块,大于 10 公里以后每公里收 2.4 块,通过 if 循环嵌套来实现。2.2.2 路程模块这个模块是用来计算具体路程,并通过数码管表达出租车所行走的路程。2.3 计时模块不计价时,可以切换到显示时间,显示时分秒,也可人为校准。方便在车上看时间。用控制端上下电平控制选择。计时模块路下列图所示:2.4 选择模块计费器和显示时分秒的切换选择,由输入端c 控制。3调试过程写程序的过程中遇到了很多问题,编译的时候出现了很多错误,通过询问教师跟同学,再参考一些同学的程序后,解决了逐个问题,逐渐完善了自己的程序。.z-管脚锁定:4功能测试4.1 测试仪器与设备EDA 实训箱,Quartus II 软件,数据连接线。4.2 性能指标测试S14 为 1 时开场计费,S0 和 S1 可以调节路程跳动的速度,可切换3 种不同的速度;K7按键校准车费;当 S0 S1 都为 1 时,停顿计费,也表示车停顿走动。S15 用来切换计费器和显示时间的功能,拨为 0 时,是计费器功能;拨为 1 时,是显示时间功能。按键 K7 K6 K5可以调节路程的设置,S14 为 0 时是清零功能。K2 K1 K0 为时分秒的校准。5实训心得体会这次 EDA 实训将 EDA 知识运用到实际中,我从中受益匪浅。我选择的实训题目是出租车计费器,刚开场看题目,有点摸不着头脑,查找资料,于是根据每一个要求,再根据教师上课讲的容,有了个总体的思路。通过这样实训,提高了动手能力,如何运用数码管显示十进制数,在将 EDA 课堂知识运用到实训中时,对课堂知识也有了更好的理解,在过程中遇到不懂的地方,通过请教教师和同学也明白了自己的缺乏之处,并将在以后的学习中进一步完善自己。波形仿真时,一直有问题。后来发现是因为自己操作不对,在proessing 那儿要设置,我记得上课教师又给我们讲过,可能是我记得不牢。通过这次实训,我运行软件 Quartus II熟练多了较以前来说。下次做实训的时候要考虑周到,不清楚的时候要及时翻书,并回忆教师上课讲的容和重点。更在这一点上明白了,我们必须善于发现问题改正问题,同时要有一颗持之以恒的心。用理论知识运用到实际中,大大提高了我们的学习兴趣,同时要感教师们的悉心教诲。6参考文献1自美电子线路设计实验测试第二版 :华中科技大学,20002江国强,EDA 技术与应用第 2 版,电子工业,2021附录附录 1:仿真波形图局部模块路程仿真计费器仿真时间仿真附录 2:程序清单分频器module fpq(clk,d1,d2,nclk);input clk,d1,d2;.z-output nclk;reg nclk;reg24:0 num;always(posedge clk)begin case(d1,d2)0:begin num=num+1;if(num=19999999)begin nclk=1;num=0;end else nclk=0;end 1:begin num=num+1;if(num=1999999)begin nclk=1;num=0;end else nclk=0;end 2:begin num=num+1;if(num=199999)begin nclk=1;num=0;end else nclk=0;end 3:begin num=num+1;if(num=0)begin nclk=1;num=0;end else nclk=0;end endcase end endmodule路程计算module lc(nclk,clrn,q,d);input nclk,clrn;output reg15:0 q;output reg d;.z-reg11:0 i;reg3:0 k;always(negedge nclk or negedge clrn)beginif(clrn=0)begin q=0;i=0;endelsebegin i=i+1;k=i*4;if(k9)begin q3:0=q3:0+1;k=0;if(q3:09)beginq3:0=0;q7:4=q7:4+1;if(q7:49)beginq7:4=0;q11:8=q11:8+1;d=1;if(q11:89)beginq11:8=0;q15:12=q15:12+1;endendendendelse d=0;endendendmodule车费计算module cf(d,clrn,q,j);input d,j;input clrn;output reg15:0 q;reg c;always(posedge dj).z-beginif(clrn)begin c=0;q=0;endelse c=c+1;if(c=2)q7:4=7;else if(c9)begin q3:0=q3:0-10;q7:4=q7:4+1;endif(q7:49)begin q7:4=q7:4-10;q11:8=q11:8+1;endendelse if(c10)begin q3:0=q3:0+4;q7:4=q7:4+2;if(q3:09)begin q3:0=q3:0-10;q7:4=q7:4+1;endif(q7:49)begin q7:4=q7:4-10;q11:8=q11:8+1;if(q11:89)begin q11:8=q11:8-10;q15:12=q15:12+1;endendendif(c14)c=11;endendmodule60 进制计数器modulet60(clrn,clk,j,q,cout);input clrn,clk,j;output reg 7:0 q;output reg cout;always(posedge clkj or negedge clrn)beginif(clrn)q=0;else beginif(q=h59)q=0;else q=q+1;if(q3:0=ha)begin q3:0=0;q7:4=q7:4+1;endif(q=h59)cout=1;else cout=0;.z-endendendmodule24 进制计数器modulet24(clrn,clk,j,q,cout);input clrn,clk,j;output reg 7:0 q,cout;always(posedge clkj or negedge clrn)beginif(clrn)q=0;else beginif(q=h23)q=0;else q=q+1;if(q3:0=ha)begin q3:0=0;q7:4=q7:4+1;endif(q=h23)cout=1;else cout=0;endendendmodule分频 1 秒module fenpin1s(clk,cout);input clk;reg 24:0 q;output reg cout;always(posedge clk)beginif(q=20000000-1)q=0;else q=q+1;if(q=20000000-1)cout=1;else cout=0;endendmodule.z-总时间 module zsj(qm,qf,qs,day,q);input7:0 qm,qf,qs,day;output reg 31:0 q;alwaysbeginq31:0=day,qs,qf,qm;endendmodule选择切换功能module*uanze(q1,q2,q3,q,c,clk);input c,clk;input15:0 q1,q2;input31:0 q3;output reg31:0 q;always(posedge clk)begincase(c)0:begin q31:16=q115:0;q15:0=q215:0;end1:begin q23:0=q323:0;q31:24=0;endendcaseendendmodule.z