好文档就是一把金锄头!
欢迎来到金锄头文库![会员中心]
电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

基于veriloghdl的出租车计费器.doc

14页
  • 卖家[上传人]:ss****gk
  • 文档编号:208959757
  • 上传时间:2021-11-08
  • 文档格式:DOC
  • 文档大小:635.42KB
  • / 14 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • 《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总体思路 :instl• • •2. 各个模块程序的设计①分频模块:模拟牢辆行进,分ls/km档和0. ls/km档module fpq(clk, cout, kl);input elk,kl;reg [24:0] q;output reg cout;always @(posedge elk)begincase(kl)0: begin q=q+l; if (q==20000000-l) begin cout=l;q=0;end else cout=0;end1: begin q二q+1 ; if (q==2000000-l) begin cout=l;q=0;end else cout=0; endendcaseendendmodule② 计程兼计费模块:jsq99累计路程dejfq按规则汁费,同时附带输出显示• j fuck■■■clr q[7..O]-i_ elk sum[11..O]H— k2• •—.I inst■曇jsq99:路程显示module jsq99(clr, elk, q, cout, k2); input clk,clr,k2; output reg[7:0]q;output reg cout;always @(posedge elk or negedge clr) beginif(〜clr) q = 0; else beginif(k2::0)beginif (q==> h99) q = 0; else q = q* 1; if(q[3:0]== ha)beginq[3:0] = 0; q[7:4] = q[7:4]+l; endif(q==0) cout = 1; else cout = 0;end endendendmoduledejfq:计费module dejfq (elk, clrn, q, k2);input elk,k2;input clrn;output reg[ll:0] q;reg[3:0] c;always @(posedge elk or negedge clrn)beginif Cclrn) begin c=0;q=0;end else beginif(k2==0)beginif(c<14) c=c+l; if(c<=2) q[7:4]=7; else if(c<=10)beginq[3:0]=q[3:0]+6;q[7:4]=q[7:4]+l;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[l1:8]=q[l1:8]+l; endendelse if (c>10)beginq[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]+l;end if(q[7:4]〉9)begin q[7:4]=q[7:4]-10;q[ll:8]=q[ll:8]+l;endendend i f(c>14) c=l1;endendendmodule③ 选择器:选择敁示时间或费用,拨下拨码丌关敁示路程和赀用,拨上显示时钟。

      input k;input [7:0] qm, qf, qs, ql;input [11:0] sum;output reg [23:0] q;alwaysbeginif (k==0) beginq[7:0]=ql;q[ll:8]=0;q[23:12]=sum;end else q[23:0] = {qs, qf, qm};endendmodu1e④ 时间模块:24小时时钟,可以敁示时分秒,可以校准• • y •鬌.♦睿•嚳•眷拳•嚳••眷•嚳••眷• • • • • • • • • • • • • • • • • • • • • • • ■攀 *• • 拳•」jsq24 . • •elkqm[7..O]elmqf[7..O]jmqs[7“0】jfcoutjscout一1s.\ instl该模块乂巾儿个小模块纟H.成module clkgen(clk, cout) ://两千万分频器input elk;reg [24:0] q;output reg cout;always @(posedge elk) beginif (q==20000000-l) q=0; elseif (q==20000000-l) cout二1;else cout=0;endendmodu1cmodule cnt60(clk, clrn, j, q,cout) ;//60 进制计数器 input elk,clrn, j; output reg[7:0] q; output reg cout;always @(posedge elk j or negedge clrn) beginif (〜clrn) q=0;else begini f (q==’ h59) q=0;elseif (q[3:0]==’ha) beginq[3:0]=0; q[7:4]=q[7:4]+l; endif (q==’h59) cout=l;else cout=0;endendendmodu1emodule cnt24(elk, clrn, j, q, cout) ;//24 进制计数器 input elk,clrn, j; output reg[7:0] q; output reg cout;always @(posedge clk^j or negedge clrn) beginif (〜clrn) q=0;else beginif (q==,h23) q=0;else q=q+l;if (q[3:0]==’ha) beginq[3:0]=0; q[7:4]=q[7:4]+l; endif (q==’h23) cout=l;else cout二0;endend cndmodu1cLJ⑤ 流水灯模块:通过亮灭提示行进状态Isdelk q[11..O] k2[•inst3 I nmodule lsd(clk, q, k2);input elk,k2;output reg[ll:0] q;reg [7:0] d;initial q=l;always @(posedge elk) if(k2==0)beginif(d==23) d=0; else d=d+l;if(d〈=ll)beginif(q==12,bllllllllllll) q=12’b0111111111111;else q=q<

      4. 结论通过硬件验证,我的系统已经达到设计要求,同时附加了时钟和流水灯显示W个 小功能,可以通过拨码开关选择显示吋间和费用但由于是初次实践,所以选用 0^0u^2elkclrk2rniirunujnjnujnjnururnifrunujnjrnunjnururni@12□ q[+1 sum;E 5;C5nC5r)C5yY^T5^y^Y5;oc^Y5rici5~)CTryiry"iyyi?YKyT^yT^加法的方法避开了问题,同时也降低了资源占用率,我在这一点上明白了,想要 得到一个优异的程序,我们必须善于发现问题改正问题,同时要有一颗持之以恒 的心里然在实训中遇到了一些我们不能完成的问题,供也能在问题中提高很多 专业知识,当然也离不开老师的悉心教导6.参考文献① 《数字逻辑电路基础》,江W强,电子工业岀版社② 《EDA技术与应用》,江岡强,电子工业出版社附录:①仿真波形图(部分模块)路程兼计费模块:②程序清单module fpq(elk, cout, kl) ;// 分频模块input elk, kl;reg [24:0] q;output reg cout;always @(posedge elk)begincasc(kl)0: begin q=q+l; if (q==20000000-l) begin cout=l;q=0;endelse cout=0; end1: begin q=q+l ; if (q==2000000-l) begin cout=l;q=0;end else cout=0; endendcaseendendmodulemodule jsq99(clr, elk, q, cout, k2) ;//计程 input elk,clr, k2; output reg[7:0]q; output reg cout;always @(posedge elk or negedge clr) beginif(〜clr) q = 0; else beginif(k2==0)beginif(q== h99) q = 0; else q = q+1; if (q[3:0]=’ ha)beginq[3:0] = 0; q[7:4] = q[7:4]+l; endif(q==0) cout = 1; else cout 二 0;end endendendmodulemodule dejfq(clk, clrn, q, k2) ;//计费input elk,k2;input clrn;output reg[11:0] q;reg[3:0] c;always @(posedge elk )beginifCclrn) begin c=0;q=0;endif(k2::0)beginif(c<14) c=c。

      点击阅读更多内容
      关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
      手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
      ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.