基于verilogHDL的出租车计费器.docx
- 文档编号:5078104
- 上传时间:2022-12-13
- 格式:DOCX
- 页数:14
- 大小:59.78KB
基于verilogHDL的出租车计费器.docx
《基于verilogHDL的出租车计费器.docx》由会员分享,可在线阅读,更多相关《基于verilogHDL的出租车计费器.docx(14页珍藏版)》请在冰豆网上搜索。
基于verilogHDL的出租车计费器
《EDA技术与应用》实训报告
姓名
指导教师:
江国强杨艺敏
2011年_4-月_28_日
实训题目:
出租车计费器
1.系统设计
1.1设计要求
1.1.1设计任务设计并制作一台出租车计费器。
1.1.2技术要求
1用EDA实训仪的I/O设备和PLD芯片实现出租车计费器的设计。
2出租车起步开始计程和计费,计程系统按实际公里数计程,计费
系统首先显示起步价(如7.0),车行驶2km以内,只收起步价7元。
3出租车行驶超过2km后,按每公里1.6元在7.0元的基础上增加。
4出租车行驶超过10km后(或超过20元路费),每公里加收50%的车费,即车费变为每公里2.4元。
5出租车达到目的地后,(用一个按钮)计程和计费数据清零,为下一次计费开始。
1.2方案比较最初计费模块选择乘法,但占用资源过多,所以选择分段加法来解决
1.3方案论证
1.3.1总体思路
整个系统主要由计程兼计费模块组成,另外添加计时器和流水灯模块作为附加功能,最后由选择模块选择输出费用或时间,分频模块作为路程模拟输入。
1.3.2设计方案
分频器将实训仪的时钟转换成1s或0.1s的脉冲模拟行进一公里,将脉冲输入计程兼计费模块进行路程累加和计费,同时输出路程数和费用。
流水灯则按行进路程进行亮灭,附加的时钟功能可以查看时间。
最后由选择模块进行费用和时间间的切换。
出qTH.Q]
JU!
■■■■■..J.I|J.^»U1H.UHIIIUJ1I
_OLniftjT厂
de
p
enp^iqi
clr
#4
clk
sum[i1..0]
K2
qm[7.0)
a
z
cru
jm
JT
cout
3
js
court^ls
inrgtl
q[23q
qm[7..0JqTF.0]qs^-.O]qlF-O]sumlllOl
2.各个模块程序的设计
1分频模块:
模拟车辆行进,分1s/km档和0.1s/km档
i
L
clkcout
=1
c
J
KI
fenpinqi
r
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;endelsecout=0;
end
1:
beginq=q+1;
if(q==2000000-1)
begincout=1;q=0;endelsecout=0;
end
endcaseend
endmodule
2计程兼计费模块:
jsq99累计路程dejfq按规则计费,同时附带输出显示
■\fuck
clr
q|70]
clk
sum[110]
k2
ck4[7..0|
z.・com
.:
对口
ch埴11”切
cbm
k2
_u「
I・■■:
BI:
instS
该模块又由两个小模块组成:
.=intt
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;end
if(q==0)cout=1;elsecout=0;endend
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;endif(q[7:
4]>9)beginq[7:
4]=q[7:
4]-10;q[11:
8]=q[11:
8]+1;endend
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;endif(q[7:
4]>9)beginq[7:
4]=q[7:
4]-10;q[11:
8]=q[11:
8]+1;endend
if(c>14)c=11;end
end
endendmodule
3选择器:
选择显示时间或费用,拨下拨码开关显示路程和费用,拨上显示时钟。
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
4
clk
即4
Qlrn
j
叩..QJ
■-
c*fi
cnm
?
3
ins12
….(:
iiin..““
i
de
q[7..g]
D"n
j
wi7-
_J「矽i
|、旷一二
■TI■»■'■■
〉DGUt_is
■■w呻.”|*r
时间模块:
24小时时钟,可以显示时分秒,可以校准。
[jsq24
?
・・
・・i
clk
qm[70]
qs[7.0]
■■i
.1,
R
clrn
I…
i
br|
Jf
f""
a8-f
cout
cout_1s
1JJ
F
js
一一;instl
J"'
该模块又由几个小模块组成
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@(posedgeclkAjornegedgeclrn)
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@(posedgeclkAjornegedgeclrn)
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
⑤流水灯模块:
通过亮灭提示行进状态
moduleIsd(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.制作与调试过程
1新建工程,输入程序,生成模块
2各模块波形模拟
3进行各模块间连线
4引脚锁定
5下载硬件验证
调试:
最初计费时选择乘法,但占用资源过多,而且在数码管显示时出现进制,所以转换成加法,成功解决问题。
4.结论
通过硬件验证,我的系统已经达到设计要求,同时附加了时钟和流水灯显示
两个小功能,可以通过拨码开关选择显示时间和费用。
但由于是初次实践,所以选用了以前上课的模块,导致程序过于臃肿,总体来说还是可以的。
5.实训心得体会
为期两周的实训结束了,这是我首次将EDA课程学习到的知识运用到实际当中。
在实训过程中我遇到许多的困难,特别是将16进制转换成0-9的16进制输出到数码管这个地方,困扰了我数天的时间,通过查找资料我采用将乘法转换成加法的方法避开了问题,同时也降低了资源占用率,我在这一点上明白了,想要得到一个优异的程序,我们必须善于发现问题改正问题,同时要有一颗持之以恒的心。
虽然在实训中遇到了一些我们不能完成的问题,但也能在问题中提高很多
专业知识,当然也离不开老师的悉心教导。
6.参考文献
1《数字逻辑电路基础》,江国强,电子工业出版社
2纟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;endelsecout=0;
end
1:
beginq=q+1;
if(q==2000000-1)begincout=1;q=0;endelsecout=0;
endendcaseendendmodule
modulejsq99(clr,clk,q,cout,k2);//计程inputclk,clr,k2;
outputreg[7:
0]q;outputregcout;always@(posedgeclkornegedgeclr)begin
if(~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)
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;endend
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@(posedgeclkAjornegedgeclrn)
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;endendendmodule
modulecnt24(clk,clrn,j,q,cout);//24inputclk,clrn,j;
outputreg[7:
0]q;
outputregcout;
always@(posedgeclkAjornegedgeclrn)begin
if(~clrn)q=0;
elsebegin
if(q=='h23)q=0;
elseq=q+1;
if(q[3:
0]=='ha)beginq[3:
0]=0;q[7:
4]=q[7:
4]+1;end
if(q=='h23)cout=1;
elsecout=0;end
end
endmodulemodulexzq(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;endelseq[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
endendmodule
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 verilogHDL 出租车 计费
![提示](https://static.bdocx.com/images/bang_tan.gif)