出租车计价器.docx
《出租车计价器.docx》由会员分享,可在线阅读,更多相关《出租车计价器.docx(14页珍藏版)》请在冰豆网上搜索。
出租车计价器
《出租车计价器》
设计报告
题目:
出租车计价器
学院:
专业:
班级:
姓名:
学号:
指导教师
摘 要:
本文介绍了一种采用可编程逻辑器件(FPGA/CPLD)进行出租车计费器的设计思想以及实现方法。
本设计实现了出租车计费器所需的一些基本功能,计费金额包括起步价、里程计费、等待计时计费等。
该设计采用模块化设计,在QuartusII9.0软件平台下,采用VerilogHDL硬件描述语言描述和模拟仿真了分频模块、计程模块、计费模块、计时模块,译码以及动态扫描显示模块,完成了出租车计费器仿真设计和硬件电路的实现。
关键词:
FPGA,出租车计费器,Quartus,VerilogHDL
目 录
1.前 言
随着出租车行业的发展,对出租车计费器的要求也越来越高。
最近几年出租车行业发展迅速,在全国有几千万家出租车公司。
因此出租车计费器市场是庞大的。
而出租车计费器成为不可缺少的一部分。
出租车计价器是出租车营运收费的专用智能化仪表,随着电子技术的发展,出租车计价器技术也在不断进步和提高。
国内出租车计价器已经经历了4个阶段的发展。
从传统的全部由机械元器件组成的机械式,到半电子式即用电子线路代替部分机械元器件的出租车计价器;再从集成电路式到目前的单片机系统设计的出租车计价器,以及FPGA计价器.出租车计价器计费是否准确,运数据的管理是否方便都是人们最关注的。
该计价器能实现按时间和里程综合计算车价,能显示时间、里程、单价、总车价等相关信息显示。
信息社会的现代电子产品,性能越来越高,复杂度越来越大,更新步伐也越来越快。
实现这种进步的主要原因就是微电子技术和电子技术的发展。
而电子技术的发展后者的核心就是电子设计自动化技术。
EDA是指以计算机为工作平台,融合了应用电子技术、计算机技术、智能化技术的最新成果而开发出的电子CAD通用软件包,它根据硬件描述语言HDL完成的设计文件,自动完成逻辑编译、化简、分割、综合、优化、布局布线及仿真,直至完成对于特定目标芯片的适配编译、逻辑映射和编程下载等工作。
没有EDA技术的支持,想要完成超大规模集成电路的设计制造是不可想象的;反过来,生产制造技术的不断进步又必将对EDA技术提出新的要求。
本设计采用VerilogHDL语言来设计实现出租车计费系统,具有良好的电路行为描述和系统描述的能力,并在语言易读性和层次化、结构化设计方面,表现了强大的生命力和应用潜力。
源程序经ALTERA的QuartusII9.0软件调试优化,通过下载到特定芯片后,可应用于实际的出租车计费系统中。
本次课程设计巩固和运用了所学课程,通过理论联系实际,提高了分析、解决技术实际问题的独立工作能力,通过对一个出租车计费器的设计,进一步熟悉了数字电路系统设计、制作与调试的方法和步骤。
2.总体方案设计
2.1设计要求
该出租车计价器实现功能:
1、行程≤2公里,且等待累计时间≤5分钟,起步费为5元。
2、行程2公里外,以每公里1.0元,等待累计时间5分钟外,以每分钟以1.0元计费。
3、能显示行驶公里数、等待累计时间和最后的总费用。
4、能通过修改程序来对计费要求实现改变。
用VerilogHDL语言设计符合上述功能要求的出租车计费器,并用层次化设计方法设计该电路,各计数器的计数状态用功能仿真的方法验证,并通过有关波形确认电路设计是否正确。
2.2方案选择
采用EDA技术,根据层次化设计理论,该设计问题自顶向下可分为分频模块,控制模块计量模块、译码和动态扫描显示模块,其系统框图如图1-3所示:
图2-3PFGA控制方案
方案总结:
利用EDA技术实现,采用可编程逻辑器件设计,外围电路简单,模块话设计方便原理清晰,灵活性强,并且完成和扩展附加功能性强。
2.3设计思想及原理
出租车的一般计费过程为:
出租车载客后,启动计费器,整个系统开始运行,里程计数器和时间计数器从0开始计数,费用计数器从8开始计算。
再根据行驶里程或停止等待的时间按以上的标准计费。
若在行驶状态,则计程器开始加计数,当路程超过四公里后,计费器以每公里1元累加。
若出租车停止等待状态,则计时器开始加计数,当时间超过两分钟后,计费器以每分钟1元累加。
出租车到达目的地停止后,停止计费器,显示总费用。
根据课程设计要求计价器可根据车轮转数计算路程,车轮每转一圈送一个脉冲波,假设每转一圈为2米,车轮每转一圈送一个脉冲波(可用传感器检测送出脉冲),本设计为了好模拟仿真假设的是车轮转动100圈才产生一个脉冲,即是一个脉冲是代表200米,则经过5分频器后是每1Km送一个脉冲到里程计算模块,这样方便在软件里面仿真观察,若要下载到实物应用中去,通过实际车轮周长自己设置不同的分频电路来达到产生任意精度的计程距离模块。
其主要原理框图如图1-3所示。
而当车停止的时候通过分频模块产生秒脉冲,通过计时要求来产生计费,本设计重点就在计费控制模式模块和计费模块这两大模块的设计,则根据出租车计费器的工作过程,其主要原理框图如图1-3所示。
本系统采用分层次、分模块的方式设计,其本系统组成框图如下所示。
其中行驶路程计数模块、等待时间计数模块和计费模块,用来统计路程、等待时间和总费用,控制模块是用来控制计费模块,数码管显示模块用来显示行驶的公里数、等待累计时间和总费用等信息。
3.单元模块设计
本系统采用层次化、模块化的设计方法,设计顺序为自下向上。
首先实现系统框图中的各子模块,然后由顶层模块调用各子模块来完成整个系统。
为了便于在数码管里显示,这里的路程、时间和费用计数器均用十六进制表示。
3.1分频模块
将时钟信号进行分频,分出的频率供后面的计程模块和计时模块用,以及后面的数码显示扫描模块都会用到。
3.1.1计数器分频模块
此模块的功能是对总的时钟进行分频,分出的频率是让计数器用的,因为总的时钟是20M的。
设计该模块的时候用了一个32位的计数器,当计数器计到25_000000的时候产生时钟。
在仿真的时候为了快速的方便观察,设计了一个4分频的电路。
在此时假设车轮每转一圈为2米,则转动100圈送一个脉冲,即是200米,则在经4分频后,每1Km送一个脉冲到里程计算模块。
同理,若知道车轮直径,即可算出分频比来设置合理的分频电路,当下载到实物时还是用的是2HZ的时钟
图3-1计数器的分频模块
3.1.2计数器分频模块
modulejishu(clk_20M,clk,reset);//端口定义
inputclk_20M,reset;
outputclk;
regclk;
reg[31:
0]count;///////32位计数器
always@(posedgeclk_20Mornegedgereset)
begin
if(!
reset)
begin
clk<='d0;
count=32'd0;
end
elseif(count==3'd100)
begin
count<=32'd0;
clk<=-clk;
end
elsecount<=count+1'd1;
end
endmodule
3.1.3数码管分频模块
moduleshumafenpin(clk_20M,clk1,reset);//端口定义
inputclk_20M,reset;
outputclk1;
regclk1;
reg[31:
0]count;//32jishuqi
always@(posedgeclk_20Mornegedgereset)
begin
if(!
reset)
begin
clk1<='d0;
count=32'd0;
end
elseif(count==2'd50)//////
begin
count<=32'd0;
clk1<=-clk1;
end
elsecount<=count+1'd1;
end
endmodule
3.2计程模块
3.2.1计程模块电路
modulejicheng(clk,start,reset,distance,distance_enable);
inputclk,start,reset;
output[7:
0]distance;////////////输出的公里
reg[7:
0]distance;/////////////
outputdistance_enable;//控制计费的公里信号
regdistance_enable;
always@(posedgeclkornegedgereset)//异步复位
begin
if(!
reset)//低电平复位
begin
distance<=8'd0;//////////////
end
elseif(start)//start高电平有效
begin
if(distance[3:
0]==9)////////////判断distance的低四位计到了9没有
begin
distance[3:
0]<=4'd0;////////计到9清零
if(distance[7:
4]==9)/////////判断distance的低四位计到了9没有
distance[7:
4]<=4'd0;////////计到9清零
elsedistance[7:
4]<=distance[7:
4]+1'd1;////////////distance的高四位没有计到9的时候加1
end
elsedistance[3:
0]<=distance[3:
0]+1'd1;////////////distance的低四位没有计到9的时候加1
end
end//endalways
always@(posedgeclkornegedgereset)
begin
if(!
reset)
begin
distance_enable<=1'd0;//复位
end
else
if(distance>8'd2)///////////大于公里三的时候
begin
distance_enable<=1'd0;////////输出distance_enable信号
end
end
endmodule
3.3计时模块
modulejishi(clk,reset,start,s,m,time_enable);
inputclk,reset,start;
output[7:
0]s;
output[7:
0]m;
outputtime_enable;//输出的控制计费的信号
reg[7:
0]s;
reg[7:
0]m;
wiretime_enable;
always@(posedgeclkornegedgereset)//异步复位
begin
if(!
reset)//低电平有效
begin//复位
s<=8'd0;
m<=8'd0;
end
elseif(!
start)//start低电平有效
begin
if(s[3:
0]==9)//秒的低四位是9
begin
s[3:
0]<=4'd0;//清零
if(s[7:
4]==5)//秒的高四位是5
begin
s[7:
4]<=4'd0;//清零
if(m[3:
0]==9)//分的低四位是9
begin
m[3:
0]<=4'd0;//清零
if(m[7:
4]==9)//分的高四位是9
m[7:
4]<=4'd0;//清零
elsem[7:
4]<=m[7:
4]+1'd1;//分的高四位不是9加一
end
elsem[3:
0]<=m[3:
0]+1'd1;//分的低四位不是9加一
end
elses[7:
4]<=s[7:
4]+1'd1;//秒的高四位不是5加一
end
elses[3:
0]<=s[3:
0]+1'd1;
end//endalways
end
assigntime_enable=((m[7:
0]>8'd2)&&(s[7:
0]==8'd0))?
1'd1:
1'd0;//产生time_enable信号
endmodule
3.4控制模块
modulekongzhi(start,distance_enable,time_enable,select_clk);
inputstart,distance_enable,time_enable;
outputselect_clk;//输出选择的时钟信号
wireselect_clk;
//当start高电平的时候选择公里计费,输出的时钟信号为distance_enable
//当start低电平的时候选择时间计费,输出的时钟信号为time_enable
assignselect_clk=start?
distance_enable:
time_enable;
endmodule//结束
3.5计费模块
modulejifei(select_clk,reset,fee,clk);
inputselect_clk,reset,clk;
output[7:
0]fee;//输出的费用
reg[7:
0]fee;
always@(posedgeclkornegedgereset)//yibufuwei
begin
if(!
reset)//diyouxiao
begin
fee<=8'd8;///////起步为八元
end
elseif(select_clk==1'd1)
begin
if(fee[3:
0]==4'd9)/////费用的低四位是不是计到了九
begin
fee[3:
0]<=4'd0;/////计到九清零
if(fee[7:
4]==4'd9)/////费用的高四位是不是计到了九
fee[7:
4]<=4'd0;////计到九清零
elsefee[7:
4]<=fee[7:
4]+1'd1;/////费用的高四位没有计到九加一
end
elsefee[3:
0]<=fee[3:
0]+1'd1;/////费用的低四位没有计到九加一
end//begin
end//always
endmodule
3.6数码管显示模块
moduleshumaxianshi(clk1,dig,seg,distance,s,m,fee);
inputclk1;
input[7:
0]distance,fee;/////输入的公里,费用
input[7:
0]s;
input[7:
0]m;
output[7:
0]dig;//译码结果
output[7:
0]seg;//数码管的选择
reg[7:
0]r_dig;//译码结果输出寄存器
reg[7:
0]r_seg;//数码管的选择寄存器
reg[3:
0]disp_dat;
reg[3:
0]a;
assigndig=r_dig;
assignseg=r_seg;
always@(posedgeclk1)
begin
a<=a+1'd1;//数码管的选择
end
always@(posedgeclk1)
begin
case(a)
4'd0:
disp_dat=distance[7:
4];//公里的高四位用第一个数码管显示
4'd1:
disp_dat=distance[3:
0];//公里的低四位用第二个数码管显示
4'd2:
disp_dat=m[7:
4];//时间分的高四位用第三个数码管显示
4'd3:
disp_dat=m[3:
0];
4'd4:
disp_dat=s[7:
4];
4'd5:
disp_dat=s[3:
0];
4'd6:
disp_dat=fee[7:
4];
4'd7:
disp_dat=fee[3:
0];
default:
disp_dat=4'b1010;
endcase
case(a)
4'd0:
r_dig=8'b01111111;//选择第一个数码管
4'd1:
r_dig=8'b10111111;
4'd2:
r_dig=8'b11011111;
4'd3:
r_dig=8'b11101111;
4'd4:
r_dig=8'b11110111;
4'd5:
r_dig=8'b11111011;
4'd6:
r_dig=8'b11111101;
4'd7:
r_dig=8'b11111110;
default:
r_dig=8'b11111111;
endcase
end
//译码结果
always@(disp_dat)
begin
case(disp_dat)
4'h0:
r_seg=8'hc0;//显示0
4'h1:
r_seg=8'hf9;//1
4'h2:
r_seg=8'ha4;//2
4'h3:
r_seg=8'hb0;//3
4'h4:
r_seg=8'h99;//4
4'h5:
r_seg=8'h92;//5
4'h6:
r_seg=8'h82;//6
4'h7:
r_seg=8'hf8;//7
4'h8:
r_seg=8'h80;//8
4'h9:
r_seg=8'h90;//9
default:
r_seg=8'hbf;
endcase
end
endmodule
4.整体顶层模块设计
4.1整体顶层模块电路
各模块设计仿真实现后,可分别创建成元件符号。
顶层就是将各分模块用VerilogHDL语言或者是图形方法连接起来,便可实现系统电路。
其VerilogHDL源代码详见其附录。
其生成的顶层原理图如下所示:
图4-1整体顶层电路原理图
5.系统功能仿真及调试
本设计采用QuartusII软件进行仿真设计,QuartusII是Altera公司的综合性PLD/FPGA开发软件,支持原理图、VHDL、VerilogHDL以及AHDL(AlteraHardwareDescriptionLanguage)等多种设计输入形式,内嵌自有的综合器以及仿真器,可以完成从设计输入到硬件配置的完整PLD设计流程。
6.总结与体会
通过学习了数字数字系统设计和VerilogHDL语言,对EDA技术有了一些了解,但那厚厚的一本书讲的都是理论的东西。
通过这本次课程设计,我才把学到的东西与实践相结合。
从中对所学的知识有了更进一步的理解。
刚开始拿到这题目的时候感觉还是有难度,但着手设计时,慢慢查询资料后感觉不是很难,但在设计时又现了许多细节上的问题。
对QuartusII9.0操作流程还不到位,通过自己网上看Quartus软件基操作视频,首先把Quartus的功能和各操作用途功能详细的了解了一遍,这使我大添信心能把设计做出来,相信只有细心、耐性才能把设计搞好,在这次的出租车计价器设计中,对Verilog模块的基本结构和基本语法更为熟悉。
在设计程序时,不能妄想一次就将整个程序设计好,反复修改、不断改进是程序设计的必经之路,要养成注释程序的好习惯,一个程序的完美与否不仅仅是实现功能,而应该让人一看就能明白你的思路,这样也为交流提供了方便,为以后编程打下基础。
为期两周的EDA课程设计已经结束,从挑选课设题目,查阅资料,到研究出总体设计,详细设计,再到最后的编程上机调试,修改程序,完善程序,收获颇多。
锻炼了自己独立发现问题、分析问题和通过查看相关资料来解决问题的能力。
使自己扩大了知识面,提高了知识水平,借助仿真软件,不仅可以把课堂中所学到的知识,直接加以运用,而且还可以把各个分离的知识组合为一个整体,真正做到理论联系实际的重要性。
使自己在专业知识和动手能力上有了很大的提高。
另外通过本次设计,使我认识到自己对VerilogHDL应用编程能力有很大的欠缺,需要在以后的学习中进一步提高。
学校给我们安排课程设计,大大地加深了我们对理论知识的理解,同时有意识的培养了我们的创新思想。
我想这类似的课程设计是为我们提供了良好的实践平台。