基于verilogHDL的出租车计费器.docx

上传人:b****6 文档编号:5078104 上传时间:2022-12-13 格式:DOCX 页数:14 大小:59.78KB
下载 相关 举报
基于verilogHDL的出租车计费器.docx_第1页
第1页 / 共14页
基于verilogHDL的出租车计费器.docx_第2页
第2页 / 共14页
基于verilogHDL的出租车计费器.docx_第3页
第3页 / 共14页
基于verilogHDL的出租车计费器.docx_第4页
第4页 / 共14页
基于verilogHDL的出租车计费器.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

基于verilogHDL的出租车计费器.docx

《基于verilogHDL的出租车计费器.docx》由会员分享,可在线阅读,更多相关《基于verilogHDL的出租车计费器.docx(14页珍藏版)》请在冰豆网上搜索。

基于verilogHDL的出租车计费器.docx

基于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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工作范文 > 演讲主持

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1