可编程式逻辑器件设计试验报告期末报告 出租车计费器.docx

上传人:b****5 文档编号:7031976 上传时间:2023-01-16 格式:DOCX 页数:14 大小:422.16KB
下载 相关 举报
可编程式逻辑器件设计试验报告期末报告 出租车计费器.docx_第1页
第1页 / 共14页
可编程式逻辑器件设计试验报告期末报告 出租车计费器.docx_第2页
第2页 / 共14页
可编程式逻辑器件设计试验报告期末报告 出租车计费器.docx_第3页
第3页 / 共14页
可编程式逻辑器件设计试验报告期末报告 出租车计费器.docx_第4页
第4页 / 共14页
可编程式逻辑器件设计试验报告期末报告 出租车计费器.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

可编程式逻辑器件设计试验报告期末报告 出租车计费器.docx

《可编程式逻辑器件设计试验报告期末报告 出租车计费器.docx》由会员分享,可在线阅读,更多相关《可编程式逻辑器件设计试验报告期末报告 出租车计费器.docx(14页珍藏版)》请在冰豆网上搜索。

可编程式逻辑器件设计试验报告期末报告 出租车计费器.docx

可编程式逻辑器件设计试验报告期末报告出租车计费器

昆明理工大学信息工程与自动化学院学生实验报告

(2012———2013学年第2学期)

课程名称:

可编程逻辑器件开课实验室:

信自楼5042013年5月31日

年级、专业、班

计科102班

学号

2010104052

姓名

成绩

实验项目名称

出租车计费器

指导教师

江虹

教师评语

该同学是否了解实验原理:

A.了解□B.基本了解□C.不了解□

该同学的实验能力:

A.强□B.中等□C.差□

该同学的实验是否达到要求:

A.达到□B.基本达到□C.未达到□

实验报告是否规范:

A.规范□B.基本规范□C.不规范□

实验过程是否详细记录:

A.详细□B.一般□C.没有□

教师签名:

年月日

一、试验设计要求

设计一个出租车计费器,能按路程计费,具体要求如下所述:

1)实现计费功能,计费标准为:

按行驶里程计费,起步价6.00元,并在车行驶3km后按1.2元/km计费,当计费器达到或超过20元时,每km加收50%的车费,车辆停止和暂停时不计费。

2)现场模拟汽车的起动、停止、暂停和换挡等状态。

3)设计数码管动态扫描电路,将车费和路程显示出来,各有两位小数。

二、试验设计原理

(1)设计该出租车有起动键、停止键、暂停键和档位键。

起动键为脉冲触发信号,当其为一个脉冲时,表示汽车已起动,并根据车速的选择和基本车速发出响应频率的脉冲(计费脉冲)以此来实现车费和路程的计数,同时车费显示起步价;当停止键为高电平时,表示汽车熄火,同时停止发出脉冲,此时车费和路程计数清零;当暂停键为高电平时,表示汽车暂停并停止发出脉冲,此时车费和路程计数暂停;档位键用于改变车速,不同的档位对应着不同的车速,同时路程计数的速度也不同。

出租车计费器可分为两大模块,即控制模块和译码显示模块。

系统框图如下所示。

控制模块实现了计费和路程的计数,并且通过不同的档位来控制车速。

译码显示模块实现十进制数到4位二进制数的转换,以及车费和路程的显示。

(A)系统框图

(2)电路符号

出租车计费器的电路符号如下图(B)、输入信号:

计费始终脉冲clk;译码高频时钟ckl20mhz;汽车启动键start;汽车停止键stop;汽车暂停键pause;档位speedup[1..0]。

输出信号:

数码管地址选择信号scan[7..1];7段显示控制信号seg7[6..0],小数点dp

(B)出租车计费器的电路符号

(3)设计方法:

A、自底向上的混合编辑采用混合编辑法,设计不同的模块,最后在原理图编辑器中连接各模块作为顶层设计,其电路如下图(C)所示,其中taxi为控制模块;decoder为译码和显示模块。

(C)出租车计费电路图

三、实验设计过程

控制模块taxi的源代码:

Moduletaxi(money,distance,clk,start,stop,pause,speedup)

Inputclk;//计费时钟

Inputstart;//汽车启动

Inputstop;//汽车停止

Inputpause;//汽车暂停

Input[1:

0]speedup;//档位

Output[12:

0]money;//车费

Output[12:

0]distance;//路程

Reg[12:

0]money;

Reg[12:

0]distance;

Reg[12:

0]money_reg;//车费寄存器

Reg[12:

0]distance_reg//路程寄存器

Reg[3:

0]num;//控制车速的计数器

Reg[12:

0]dis;//千米计数器

Regd;//千米标志位

Always@(posedgeclk)

Begin

If(stop)//汽车停止,计费和路程清零

Beginmoney_reg<=’d0;

distance_reg<=’d0;

dis<=’d0;

num<=’d0;

end

elseif(start)//汽车启动后,起步价为6元

begin

money_reg<=’d600;

distance_reg<=’d0;

dis<=’d0;

num<=’d0;

end

else

begin

if(!

start&&!

speedup&&!

pause&&!

stop)//1档

begin

if(num==’d9)

begin

num<=’d0;

distance_reg<=distance_reg+1;

dis<=dis+1;

end

else

begin

num<=num+1;end

end

else

if(!

start&&speedup==’b01&&!

pause&&!

stop)//2档

begin

if(num==’d9)

begin

num<=’d0;

distance_reg<=distance_reg+2;

dis<=dis+2;

end

else

begin

num<=num+1;

end

end

elseif(!

start&&speedup==’b10&&!

pause&&!

stop)//3档

begin

if(num==’d9)

begin

num<=’d0;

distance_reg<=distance_reg+5;

dis<=dis+5;

end

else

begin

num<=num+1;

end

end

elseif(!

start&&speedup==’b11&&!

pause&&!

stop)//4档

begin

distance_reg<=distance_reg+1;

dis<=dis+1;

end

end

if(dis>=’d100)

begin

d<=’d1;dis<=’d0;

end

else

begin

d<=’d0;

end

if(distance_reg>=’d300)//如果超过3km则按1.2元/km计算

begin

if(money_reg<’d2000&&d==”d1)

begin

money_reg<=money_reg+’d120;

end

elseif(distance_reg>’d2000&&d==”d1)

begin

money_reg<=money_reg+’d180;

end

//当计费器达到20元时,每千米加收50%的车费

end

money<=money_reg;

distance<=distance_reg;

end

endmoudle

(2)译码显示模块decoder的源代码:

Moduledeceder(scan,seg7,dp,clk20mhz,money_in,distance_in):

Output[7:

0]scan;//数码管地址选择信号

Output[7:

0]scan;//7段显示控制信号

Output[7:

0]scan;//小数点

Inputclk20mhz;//系统时钟20MHz

Input[12:

0]money_in//车费

Input[12:

0]distance_in//路程

Reg[7:

0]scan:

Reg[6:

0]seg7;

Regdp;

Regclk1khz;//1khz的分频时钟,用于扫描数码管地址

Reg[3:

0]data:

Reg[3:

0]m_one,m_ten,m_hun,m_tho;//钱数的4位十进制数表示

Reg[3:

0]d_one,d_ten,d_hun,d_tho;//路程的4位十进制数表示

Reg[15:

0]count:

Reg[15:

0]comb1:

Reg[3:

0]comb1_a,comb1_b,comb1_c,comb1_d;

Reg[15:

0]comb2;

Reg[3:

0]comb2_a,comb2_b,comb2_c,comb2_d;

Reg[2:

0]cnt;

//--------1khz分频,用于扫描数码管地址

Always@(posedgeclk20mhz)

Begin

If(count==’d10000)

Beginclk1khz<=~clk1khz;count<=’d0;end

Else

Begincount<=count+1;end

//--------将车费的十进制数转化为4位的十进制数

If(comb1

Begin

If(comb1_a=’d9&&comb1_==’d9&&comb1_c==’d9)

Begin

Comb1_a=’d0000;

Comb1_c=’d0000;

Comb1_d=’d0000;

Comb1_d<=Comb1_d+1;

Comb<=comb+1;

End

Elseif(comb1_a==’d9&&comb1_b==’d9)

Begin

Comb1_a<=’d0000;

Comb1_b<=’d0000;

Comb1_c<=comb_c+1;

Comb1<=comb1+1;

End

Elseif(comb1_a==’d9)

Begin

Comb1_a<=’d0000;

Comb1_b<=comb1_b+1;

Comb1<=comb1+1;

End

Else

Begin

Comb1_a<=comb1_a+1;

Comb1<=comb1+1;

End

End

Elseif(comb1==money_in)

begin

M_one<=comb1_a;

M_ten<=comb1_b;

M_hun<=comb1_c;

M_tho<=comb1_d;

End

Elseif(comb1>money_in)

Begin

Comb1_a<=’b0000;

Comb1_b<=’b0000;

Comb1_c<=’b0000;

Comb1_d<=’b0000;

Comb1<=’d0;

End

//-------------将路程的十进制数转化为4位十进制数

if(comb2

begin

if(comb2_a==’d9&&comb2_b=’d9&&comb2_c==’d9)

begin

Comb2_a<=’b0000;

Comb2_b<=’b0000;

Comb2_c<=’b0000;

Comb2_d<=comb2_d+1;

Comb2<=comb2+1;

End

Elseif(comb2_a==’d9&&comb2_b=’d9)

Begin

Comb2_a<=’b0000;

Comb2_b<=’b0000;

Comb2_c<=comb2_c+1;

Comb2<=comb2+1;

End

Elseif(comb2_a==’d9)

Begin

Comb2_a<=’b0000;

Comb2_b<=comb2_b+2;

Comb2<=comb2+1;

end

else

begin

comb2_a<=comb2_a+1;

comb2<=comb2+1;

end

end

elseif(comb2==distance_in)

begin

d_one<=comb2_a;

d_ten<=comb2_b;

d_hun<=comb2_c;

d_tho<=comb2_d;

end

elseif(comb2>distance_in)

begin

comb2_a<=’b0000;

comb2_b<=’b0000;

comb2_c<=’b0000;

comb2_d<=’b0000;

comb2_a<=’d0;

end

end

//--------------数码管动态扫描------

always@(posedgeclk1khz)

begin

cnt<=cnt+1;

end

always@(cnt)

begin

case(cnt)

‘b000:

begindata<=m_one;dp<=’d0;scan<=’b00000001;end

‘b001:

begindata<=m_ten;dp<=’d0;scan<=’b00000010;end

‘b010:

begindata<=m_hun;dp<=’d1;scan<=’b00000100;end

‘b011:

begindata<=m_tho;dp<=’d0;scan<=’b00001000;end

‘b100:

begindata<=d_one;dp<=’d0;scan<=’b00010000;end

‘b101:

begindata<=d_ten;dp<=’d0;scan<=’b00100000;end

‘b110:

begindata<=d_hun;dp<=’d1;scan<=’b01000000;end

‘b111:

begindata<=d_tho;dp<=’d0;scan<=’b10000000;end

default:

begindata<=’bx;dp<=’bx;scan<=’bx;end

endcase

end

//----------7段译码--------------------

always@(data)

begin

case(data[3:

0])

4’b0000:

seg7[6:

0]=7’b1111110;

4’b0001:

seg7[6:

0]=7’b0110000;

4’b0010:

seg7[6:

0]=7’b1101101;

4’b0011:

seg7[6:

0]=7’b1111001;

4’b0100:

seg7[6:

0]=7’b0110011;

4’b0101:

seg7[6:

0]=7’b1011011;

4’b0110:

seg7[6:

0]=7’b1011111;

4’b0111:

seg7[6:

0]=7’b1110000;

4’b1000:

seg7[6:

0]=7’b1111111;

4’b1001:

seg7[6:

0]=7’b1111011;

default:

seg7[6:

0]=7’b0000000;

endcase

end

endmodule

四、实验运行截图:

对控制器模块Taxi进行仿真后得到的运行结构分别如下:

(1)对控制模块taxi进行仿真后的到的结果图如下图(D)所示,时序仿真结果如图(E)所示。

(D)控制模块功能仿真结果

(E)控制模块时序仿真结果

(2)将扫描书码馆的分频系数改小后,对译码显示模块decoder的功能仿真结果如[F]图所示,时序仿真结果如图(G)所示。

(G)控制模块时序仿真结果

[G]显示模块仿真

五、实验总结和分析:

经过了一个学期的学习和实验认识,这次是要需要完成的设计相对难一些,我们的任务主要是运用VHDL语言设计了一个出租车计费器,设计该出租车有起动键、停止键、暂停键和档位键。

起动键为脉冲触发信号,当其为一个脉冲时,表示汽车已起动,并根据车速的选择和基本车速发出响应频率的脉冲(计费脉冲)以此来实现车费和路程的计数,同时车费显示起步价;当停止键为高电平时,表示汽车熄火,同时停止发出脉冲,此时车费和路程计数清零;当暂停键为高电平时,表示汽车暂停并停止发出脉冲,此时车费和路程计数暂停;档位键用于改变车速,不同的档位对应着不同的车速,同时路程计数的速度也不同。

对我来说这个设计存在很多的问题,不过我通过对老师给的参考程序,对其进行了调试和修改,使其能按预期的效果进行模拟汽车启动、停止、暂停等功能,并设计了动态显示车费和里程的硬件电路。

出租车暂停时不计费,车费保持不变,且里程也保持不变,若复位则车费和里程清零,等待下一次计费的开始。

最后终于达到了实验的要求,成功的完成了设计。

这次实验的最大收获是我对对软件QuartusII的应用也更加熟练。

通过在设计中发现问题,并对遇到某个问题知道该从哪几方面去对其进行解析和理解。

通过对软件的仿真,发现编写的问题,和解决所要解决的问题,在设计中遇到对的问题我不断的查阅资料并同老师请教,收获很多。

在这次试验中,使我学到很多的东西,出租车计费器可分为两大模块,即控制模块和译码显示模块。

控制模块实现了计费和路程的计数,并且通过不同的档位来控制车速。

译码显示模块实现十进制数到4位二进制数的转换,以及车费和路程的显示。

通过对实验原理的了解我不仅巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。

通过这次试验使我懂得了理论与实际相结合的重要性,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。

这些对我以后的学习都有很大的帮助,对以后的思考、动手能力将有很大的改变。

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

当前位置:首页 > 初中教育 > 理化生

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

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