您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 电子设计/PCB > 基于verilog-HDL的出租车计费器
《EDA技术与应用》实训报告学号姓名指导教师:江国强杨艺敏2011年4月28日实训题目:出租车计费器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.3方案论证1.3.1总体思路整个系统主要由计程兼计费模块组成,另外添加计时器和流水灯模块作为附加功能,最后由选择模块选择输出费用或时间,分频模块作为路程模拟输入。1.3.2设计方案分频器将实训仪的时钟转换成1s或0.1s的脉冲模拟行进一公里,将脉冲输入计程兼计费模块进行路程累加和计费,同时输出路程数和费用。流水灯则按行进路程进行亮灭,附加的时钟功能可以查看时间。最后由选择模块进行费用和时间间的切换。2.各个模块程序的设计①分频模块:模拟车辆行进,分1s/km档和0.1s/km档modulefpq(clk,cout,k1);inputclk,k1;reg[24:0]q;outputregcout;always@(posedgeclk)begincase(k1)0:beginq=q+1;if(q==20000000-1)begincout=1;q=0;endelsecout=0;end1:beginq=q+1;if(q==2000000-1)begincout=1;q=0;endelsecout=0;endendcaseendendmodule②计程兼计费模块:jsq99累计路程dejfq按规则计费,同时附带输出显示该模块又由两个小模块组成:jsq99:路程显示modulejsq99(clr,clk,q,cout,k2);inputclk,clr,k2;outputreg[7:0]q;outputregcout;always@(posedgeclkornegedgeclr)beginif(~clr)q=0;elsebeginif(k2==0)beginif(q=='h99)q=0;elseq=q+1;if(q[3:0]=='ha)beginq[3:0]=0;q[7:4]=q[7:4]+1;endif(q==0)cout=1;elsecout=0;endendendendmoduledejfq:计费moduledejfq(clk,clrn,q,k2);inputclk,k2;inputclrn;outputreg[11:0]q;reg[3:0]c;always@(posedgeclkornegedgeclrn)beginif(~clrn)beginc=0;q=0;endelsebeginif(k2==0)beginif(c14)c=c+1;if(c=2)q[7:4]=7;elseif(c=10)beginq[3:0]=q[3:0]+6;q[7:4]=q[7:4]+1;if(q[3:0]9)beginq[3:0]=q[3:0]-10;q[7:4]=q[7:4]+1;endif(q[7:4]9)beginq[7:4]=q[7:4]-10;q[11:8]=q[11:8]+1;endendelseif(c10)beginq[3:0]=q[3:0]+4;q[7:4]=q[7:4]+2;if(q[3:0]9)beginq[3:0]=q[3:0]-10;q[7:4]=q[7:4]+1;endif(q[7:4]9)beginq[7:4]=q[7:4]-10;q[11:8]=q[11:8]+1;endendendif(c14)c=11;endendendmodule③选择器:选择显示时间或费用,拨下拨码开关显示路程和费用,拨上显示时钟。modulexzq(k,qm,qf,qs,q,q1,sum);inputk;input[7:0]qm,qf,qs,q1;input[11:0]sum;outputreg[23:0]q;alwaysbeginif(k==0)beginq[7:0]=q1;q[11:8]=0;q[23:12]=sum;endelseq[23:0]={qs,qf,qm};endendmodule④时间模块:24小时时钟,可以显示时分秒,可以校准。该模块又由几个小模块组成moduleclkgen(clk,cout);//两千万分频器inputclk;reg[24:0]q;outputregcout;always@(posedgeclk)beginif(q==20000000-1)q=0;elseq=q+1;if(q==20000000-1)cout=1;elsecout=0;endendmodulemodulecnt60(clk,clrn,j,q,cout);//60进制计数器inputclk,clrn,j;outputreg[7:0]q;outputregcout;always@(posedgeclk^jornegedgeclrn)beginif(~clrn)q=0;elsebeginif(q=='h59)q=0;elseq=q+1;if(q[3:0]=='ha)beginq[3:0]=0;q[7:4]=q[7:4]+1;endif(q=='h59)cout=1;elsecout=0;endendendmodulemodulecnt24(clk,clrn,j,q,cout);//24进制计数器inputclk,clrn,j;outputreg[7:0]q;outputregcout;always@(posedgeclk^jornegedgeclrn)beginif(~clrn)q=0;elsebeginif(q=='h23)q=0;elseq=q+1;if(q[3:0]=='ha)beginq[3:0]=0;q[7:4]=q[7:4]+1;endif(q=='h23)cout=1;elsecout=0;endendendmodule⑤流水灯模块:通过亮灭提示行进状态modulelsd(clk,q,k2);inputclk,k2;outputreg[11:0]q;reg[7:0]d;initialq=1;always@(posedgeclk)if(k2==0)beginif(d==23)d=0;elsed=d+1;if(d=11)beginif(q==12'b111111111111)q=12'b0111111111111;elseq=q1;q=q+1;endif(d11)beginif(q==12'b000000000000)q=1;elseq=q1;endendendmodule3.制作与调试过程①新建工程,输入程序,生成模块②各模块波形模拟③进行各模块间连线④引脚锁定⑤下载硬件验证调试:最初计费时选择乘法,但占用资源过多,而且在数码管显示时出现16进制,所以转换成加法,成功解决问题。4.结论通过硬件验证,我的系统已经达到设计要求,同时附加了时钟和流水灯显示两个小功能,可以通过拨码开关选择显示时间和费用。但由于是初次实践,所以选用了以前上课的模块,导致程序过于臃肿,总体来说还是可以的。5.实训心得体会为期两周的实训结束了,这是我首次将EDA课程学习到的知识运用到实际当中。在实训过程中我遇到许多的困难,特别是将16进制转换成0-9的16进制输出到数码管这个地方,困扰了我数天的时间,通过查找资料我采用将乘法转换成加法的方法避开了问题,同时也降低了资源占用率,我在这一点上明白了,想要得到一个优异的程序,我们必须善于发现问题改正问题,同时要有一颗持之以恒的心。虽然在实训中遇到了一些我们不能完成的问题,但也能在问题中提高很多专业知识,当然也离不开老师的悉心教导。6.参考文献①《数字逻辑电路基础》,江国强,电子工业出版社②《EDA技术与应用》,江国强,电子工业出版社附录:①仿真波形图(部分模块)路程兼计费模块:②程序清单modulefpq(clk,cout,k1);//分频模块inputclk,k1;reg[24:0]q;outputregcout;always@(posedgeclk)begincase(k1)0:beginq=q+1;if(q==20000000-1)begincout=1;q=0;endelsecout=0;end1:beginq=q+1;if(q==2000000-1)begincout=1;q=0;endelsecout=0;endendcaseendendmodulemodulejsq99(clr,clk,q,cout,k2);//计程inputclk,clr,k2;outputreg[7:0]q;outputregcout;always@(posedgeclkornegedgeclr)beginif(~clr)q=0;elsebeginif(k2==0)beginif(q=='h99)q=0;elseq=q+1;if(q[3:0]=='ha)beginq[3:0]=0;q[7:4]=q[7:4]+1;endif(q==0)cout=1;elsecout=0;endendendendmodulemoduledejfq(clk,clrn,q,k2);//计费inputclk,k2;inputclrn;outputreg[11:0]q;reg[3:0]c;always@(posedgeclk)beginif(~clrn)beginc=0;q=0;endif(k2==0)beginif(c14)c=c+1;if(c=2)q[7:4]=7;elseif(c=10)beginq[3:0]=q[3:0]+6;q[7:4]=q[7:4]+1;if(q[3:0]9)beginq[3:0]=q[3:0]-10;q[7:4]=q[7:4]+1;endif(q[7:4]9)beginq[7:4]=q[7:4]-10;q[11:8]=q[11:8]+1;endendelseif(c10)beginq[3:0]=q[3:0]+4;q[7:4]=q[7:4]+2;if(q[3:0]9)beginq[3:0]=q[3:0]-10;q[7:4]=q[7:4]+1;endif(q[7:4]9)beginq[7:4]=q[7:4]-10;q[11:8]=q[11:8]+1;endendif(c14)c=1;endendendmodulemoduleclkgen(clk,cout);//两千万分频器inputclk;reg[24:0]q;outputregcout;always@(posedgeclk)beginif(q==20000000-1)q=0;elseq=q+1;if(q==20000000-1)cout=1;elsecout=0;endendmodulemodulecnt60(clk,clrn,j,q,cout);//60进制计数器inputclk,clrn,j;outputreg[7:0]q;outputregcout;always@(posedgeclk^jornegedgeclrn)beginif(~clrn)q=0;elsebeginif(q=='h59)q=0;elseq=q+1;if(q[3:0]=='ha)beginq[3:0]=0;q[7:4]=q[7:4]+1;endif(q=='h59)cout=1;elsecout=0;endendendmodulemodulecnt24(clk,clrn,j,q,cout);//24进制计数器inputclk,clrn,j;outputreg[7:
本文标题:基于verilog-HDL的出租车计费器
链接地址:https://www.777doc.com/doc-6201918 .html