基于verilogHDL的出租车计费器.docx
- 文档编号:10157415
- 上传时间:2023-02-08
- 格式:DOCX
- 页数:17
- 大小:185.37KB
基于verilogHDL的出租车计费器.docx
《基于verilogHDL的出租车计费器.docx》由会员分享,可在线阅读,更多相关《基于verilogHDL的出租车计费器.docx(17页珍藏版)》请在冰豆网上搜索。
基于verilogHDL的出租车计费器
《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)
begin
case(k1)
0:
beginq=q+1;
if(q==20000000-1)
begincout=1;q=0;end
elsecout=0;
end
1:
beginq=q+1;
if(q==2000000-1)
begincout=1;q=0;end
elsecout=0;
end
endcase
end
endmodule
②计程兼计费模块:
jsq99累计路程dejfq按规则计费,同时附带输出显示
该模块又由两个小模块组成:
jsq99:
路程显示
modulejsq99(clr,clk,q,cout,k2);
inputclk,clr,k2;
outputreg[7:
0]q;
outputregcout;
always@(posedgeclkornegedgeclr)
begin
if(~clr)q=0;
elsebegin
if(k2==0)
begin
if(q=='h99)q=0;
elseq=q+1;
if(q[3:
0]=='ha)
begin
q[3:
0]=0;
q[7:
4]=q[7:
4]+1;
end
if(q==0)cout=1;
elsecout=0;end
end
end
endmodule
dejfq:
计费
moduledejfq(clk,clrn,q,k2);
inputclk,k2;
inputclrn;
outputreg[11:
0]q;
reg[3:
0]c;
always@(posedgeclkornegedgeclrn)
begin
if(~clrn)beginc=0;q=0;end
elsebegin
if(k2==0)
begin
if(c<14)c=c+1;
if(c<=2)q[7:
4]=7;
elseif(c<=10)
begin
q[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;end
if(q[7:
4]>9)beginq[7:
4]=q[7:
4]-10;q[11:
8]=q[11:
8]+1;end
end
elseif(c>10)
begin
q[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;end
if(q[7:
4]>9)beginq[7:
4]=q[7:
4]-10;q[11:
8]=q[11:
8]+1;end
end
endif(c>14)c=11;end
end
endmodule
③选择器:
选择显示时间或费用,拨下拨码开关显示路程和费用,拨上显示时钟。
modulexzq(k,qm,qf,qs,q,q1,sum);
inputk;
input[7:
0]qm,qf,qs,q1;
input[11:
0]sum;
outputreg[23:
0]q;
always
begin
if(k==0)begin
q[7:
0]=q1;q[11:
8]=0;q[23:
12]=sum;end
elseq[23:
0]={qs,qf,qm};
end
endmodule
④时间模块:
24小时时钟,可以显示时分秒,可以校准。
该模块又由几个小模块组成
moduleclkgen(clk,cout);//两千万分频器
inputclk;
reg[24:
0]q;
outputregcout;
always@(posedgeclk)
begin
if(q==20000000-1)q=0;
elseq=q+1;
if(q==20000000-1)cout=1;
elsecout=0;
end
endmodule
modulecnt60(clk,clrn,j,q,cout);//60进制计数器
inputclk,clrn,j;
outputreg[7:
0]q;
outputregcout;
always@(posedgeclk^jornegedgeclrn)
begin
if(~clrn)q=0;
elsebegin
if(q=='h59)q=0;
elseq=q+1;
if(q[3:
0]=='ha)begin
q[3:
0]=0;q[7:
4]=q[7:
4]+1;end
if(q=='h59)cout=1;
elsecout=0;end
end
endmodule
modulecnt24(clk,clrn,j,q,cout);//24进制计数器
inputclk,clrn,j;
outputreg[7:
0]q;
outputregcout;
always@(posedgeclk^jornegedgeclrn)
begin
if(~clrn)q=0;
elsebegin
if(q=='h23)q=0;
elseq=q+1;
if(q[3:
0]=='ha)begin
q[3:
0]=0;q[7:
4]=q[7:
4]+1;end
if(q=='h23)cout=1;
elsecout=0;end
end
endmodule
⑤流水灯模块:
通过亮灭提示行进状态
modulelsd(clk,q,k2);
inputclk,k2;
outputreg[11:
0]q;
reg[7:
0]d;
initialq=1;
always@(posedgeclk)
if(k2==0)
begin
if(d==23)d=0;
elsed=d+1;
if(d<=11)
begin
if(q==12'b111111111111)q=12'b0111111111111;
elseq=q<<1;q=q+1;
end
if(d>11)
begin
if(q==12'b000000000000)q=1;
elseq=q<<1;
end
end
endmodule
3.制作与调试过程
①新建工程,输入程序,生成模块
②各模块波形模拟
③进行各模块间连线
④引脚锁定
⑤下载硬件验证
调试:
最初计费时选择乘法,但占用资源过多,而且在数码管显示时出现16进制,所以转换成加法,成功解决问题。
4.结论
通过硬件验证,我的系统已经达到设计要求,同时附加了时钟和流水灯显示两个小功能,可以通过拨码开关选择显示时间和费用。
但由于是初次实践,所以选用了以前上课的模块,导致程序过于臃肿,总体来说还是可以的。
5.实训心得体会
为期两周的实训结束了,这是我首次将EDA课程学习到的知识运用到实际当中。
在实训过程中我遇到许多的困难,特别是将16进制转换成0-9的16进制输出到数码管这个地方,困扰了我数天的时间,通过查找资料我采用将乘法转换成加法的方法避开了问题,同时也降低了资源占用率,我在这一点上明白了,想要得到一个优异的程序,我们必须善于发现问题改正问题,同时要有一颗持之以恒的心。
虽然在实训中遇到了一些我们不能完成的问题,但也能在问题中提高很多专业知识,当然也离不开老师的悉心教导。
6.参考文献
①《数字逻辑电路基础》,江国强,电子工业出版社
②《EDA技术与应用》,江国强,电子工业出版社
附录:
①仿真波形图(部分模块)
路程兼计费模块:
②程序清单
modulefpq(clk,cout,k1);//分频模块
inputclk,k1;
reg[24:
0]q;
outputregcout;
always@(posedgeclk)
begin
case(k1)
0:
beginq=q+1;
if(q==20000000-1)
begincout=1;q=0;end
elsecout=0;
end
1:
beginq=q+1;
if(q==2000000-1)
begincout=1;q=0;end
elsecout=0;
end
endcase
end
endmodule
modulejsq99(clr,clk,q,cout,k2);//计程
inputclk,clr,k2;
outputreg[7:
0]q;
outputregcout;
always@(posedgeclkornegedgeclr)
begin
if(~clr)q=0;
elsebegin
if(k2==0)
begin
if(q=='h99)q=0;
elseq=q+1;
if(q[3:
0]=='ha)
begin
q[3:
0]=0;
q[7:
4]=q[7:
4]+1;
end
if(q==0)cout=1;
elsecout=0;end
end
end
endmodule
moduledejfq(clk,clrn,q,k2);//计费
inputclk,k2;
inputclrn;
outputreg[11:
0]q;
reg[3:
0]c;
always@(posedgeclk)
begin
if(~clrn)beginc=0;q=0;end
if(k2==0)
begin
if(c<14)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;end
if(q[7:
4]>9)beginq[7:
4]=q[7:
4]-10;q[11:
8]=q[11:
8]+1;end
end
elseif(c>10)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;end
if(q[7:
4]>9)beginq[7:
4]=q[7:
4]-10;q[11:
8]=q[11:
8]+1;end
end
if(c>14)c=1;end
end
endmodule
moduleclkgen(clk,cout);//两千万分频器
inputclk;
reg[24:
0]q;
outputregcout;
always@(posedgeclk)
begin
if(q==20000000-1)q=0;
elseq=q+1;
if(q==20000000-1)cout=1;
elsecout=0;
end
endmodule
modulecnt60(clk,clrn,j,q,cout);//60进制计数器
inputclk,clrn,j;
outputreg[7:
0]q;
outputregcout;
always@(posedgeclk^jornegedgeclrn)
begin
if(~clrn)q=0;
elsebegin
if(q=='h59)q=0;
elseq=q+1;
if(q[3:
0]=='ha)begin
q[3:
0]=0;q[7:
4]=q[7:
4]+1;end
if(q=='h59)cout=1;
elsecout=0;end
end
endmodule
modulecnt24(clk,clrn,j,q,cout);//24进制计数器
inputclk,clrn,j;
outputreg[7:
0]q;
outputregcout;
always@(posedgeclk^jornegedgeclrn)
begin
if(~clrn)q=0;
elsebegin
if(q=='h23)q=0;
elseq=q+1;
if(q[3:
0]=='ha)begin
q[3:
0]=0;q[7:
4]=q[7:
4]+1;end
if(q=='h23)cout=1;
elsecout=0;end
end
endmodule
modulexzq(k,qm,qf,qs,q,q1,sum);//选择器
inputk;
input[7:
0]qm,qf,qs,q1;
input[11:
0]sum;
outputreg[23:
0]q;
always
begin
if(k==0)begin
q[7:
0]=q1;q[11:
8]=0;q[23:
12]=sum;end
elseq[23:
0]={qs,qf,qm};
end
endmodule
modulelsd(clk,q,k2);//流水灯
inputclk,k2;
outputreg[11:
0]q;
reg[7:
0]d;
initialq=1;
always@(posedgeclk)
if(k2==0)
begin
if(d==23)d=0;
elsed=d+1;
if(d<=11)
begin
if(q==12'b111111111111)q=12'b0111111111111;
elseq=q<<1;q=q+1;
end
if(d>11)
begin
if(q==12'b000000000000)q=1;
elseq=q<<1;
end
end
endmodule
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 verilogHDL 出租车 计费