基于VerilogHDL设计的出租车计价器Word格式.docx
《基于VerilogHDL设计的出租车计价器Word格式.docx》由会员分享,可在线阅读,更多相关《基于VerilogHDL设计的出租车计价器Word格式.docx(29页珍藏版)》请在冰豆网上搜索。
因此出租车计费器市场是庞大的。
而出租车计费器成为不可缺少的一部分。
出租车计价器是出租车营运收费的专用智能化仪表,随着电子技术的发展,出租车计价器技术也在不断进步和提高。
国出租车计价器已经经历了4个阶段的发展。
从传统的全部由机械元器件组成的机械式,到半电子式即用电子线路代替部分机械元器件的出租车计价器;
再从集成电路式到目前的单片机系统设计的出租车计价器,以及FPGA计价器.出租车计价器计费是否准确,运数据的管理是否方便都是人们最关注的。
该计价器能实现按时间和里程综合计算车价,能显示时间、里程、单价、总车价等相关信息显示。
信息社会的现代电子产品,性能越来越高,复杂度越来越大,更新步伐也越来越快。
实现这种进步的主要原因就是微电子技术和电子技术的发展。
而电子技术的发展后者的核心就是电子设计自动化技术。
EDA是指以计算机为工作平台,融合了应用电子技术、计算机技术、智能化技术的最新成果而开发出的电子CAD通用软件包,它根据硬件描述语言HDL完成的设计文件,自动完成逻辑编译、化简、分割、综合、优化、布局布线及仿真,直至完成对于特定目标芯片的适配编译、逻辑映射和编程下载等工作。
没有EDA技术的支持,想要完成超大规模集成电路的设计制造是不可想象的;
反过来,生产制造技术的不断进步又必将对EDA技术提出新的要求。
本设计采用VerilogHDL语言来设计实现出租车计费系统,具有良好的电路行为描述和系统描述的能力,并在语言易读性和层次化、结构化设计方面,表现了强大的生命力和应用潜力。
源程序经ALTERA的QuartusII9.0软件调试优化,通过下载到特定芯片后,可应用于实际的出租车计费系统中。
本次课程设计巩固和运用了所学课程,通过理论联系实际,提高了分析、解决技术实际问题的独立工作能力,通过对一个出租车计费器的设计,进一步熟悉了数字电路系统设计、制作与调试的方法和步骤。
2.总体方案设计
2.1设计要求
该出租车计价器实现功能:
1、行程≤4公里,且等待累计时间≤2分钟,起步费为8.0元。
2、行程4公里外,以每公里1.0元,等待累计时间2分钟外,以每分钟以1.0元计费。
3、能显示行驶公里数、等待累计时间和最后的总费用。
4、能通过修改程序来对计费要现改变。
用VerilogHDL语言设计符合上述功能要求的出租车计费器,并用层次化设计方法设计该电路,各计数器的计数状态用功能仿真的方法验证,并通过有关波形确认电路设计是否正确。
2.2方案论证与选择
方案一:
采用数字电路控制,其原理图如图1-1所示。
采用传感器件,输出脉冲信号,经过放大整形最为移位寄存器的脉冲,实现计价,但是考虑到这中电路性能不够稳定,故障率高,如要做到很精确多功能则其规模较大,难调试。
而且电路不实用。
图2-1数字电路方案
方案二:
采用单片机控制,通过单片机作为主控器,利用1602字符液晶作为显示电路,采用外部晶振作为时钟脉冲,通过按键可以方便调节,以下是方案三的系统流程图,本方案主要通过软硬结合可以很容易实现要求,其灵活性也还不错,成本也不高。
方案原理图如下图所示:
图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计数器分频模块
此模块的功能是对总的时钟进行分频,分出的频率是让计数器用的,因为总的时钟是50M的。
设计该模块的时候用了一个32位的计数器,当计数器计到25_000000的时候产生时钟。
在仿真的时候为了快速的方便观察,设计了一个5分频的电路。
在此时假设车轮每转一圈为2米,则转动100圈送一个脉冲,即是200米,则在经5分频后,每1Km送一个脉冲到里程计算模块。
同理,若知道车轮直径,即可算出分频比来设置合理的分频电路,当下载到实物时还是用的是2HZ的时钟
图3-1计数器的分频模块
3.1.2计数器分频模块仿真结果
图3-2计数器的分频模块功能仿真
从波形可以看出当reset为低电平的时候clk为零,当reset为高电平的时候clk的高电平占了clk_50M的5个周期,低电平也占了clk_50M的5个周期。
3.1.3数码管分频模块
此模块的功能是对总的时钟进行分频,分出的频率是让数码管用的,当计数器计到50_000的时候产生时钟。
此模块在整体仿真时,没有用到数码管显示,在此不在赘述以及仿真波形,在实物下载时必不可少,其模块如下图:
图3-3数码块分频模块
3.2计程模块
3.2.1计程模块电路
此模块的功能是计算出租车行驶的路程。
在出租车启动并行驶的过程中(即复位/启动信号reset为1,行驶/停止信号start为1),当时钟clk是上升沿的时候,系统即对路程计数器distance的里程计数器进行加计数,当路程超过三公里时,系统将输出标志正脉冲distance_enable。
其模块如下:
图3-4计程模块
3.2.2计程模块仿真结果
图3-5计程模块功能仿真
从波形图可以看出在时钟的控制下,当reset为高电平且start为高电平的时候distance开始计数,当计到大于三的时候输出了distance_enable为高电平。
准备对第4公里以后的脉冲进行加计费。
3.3计时模块
3.3.1计时模块电路
此模块用于计算停车等待的时间。
图中s代表秒计时,m代表分钟数计时。
在出租车行进中,如果车辆停止等待,计数器则在1Hz信号clk的上升沿进行加计数,每60次产生进位脉冲使分钟计数器位进行加计数,当累计等待时间超过2(不包括2分钟)分钟时,输出标志time_enable正脉冲信号。
其模块如下图所示:
图3-6计时模块
3.3.2计时模块的仿真结果
1.两分钟之(包括两分钟)的仿真结果如下所示:
从波形图可以看出在clk的控制下当start为低电平reset为高电平的时候时间计数,time_enable为低电平。
图3-7计时模块功能仿真(2分钟)
2.两分钟之外(不包括两分钟)的仿真结果如下所示:
图3-8计时模块功能仿真(2分钟外)
从波形图可以看出在clk的控制下当start为低电平reset为高电平的时候时间计数,当时间大于二分钟的时候,time_enable为输出高电平,为超过2分钟后以每增加一分钟对计费进行加计数。
3.4控制模块
3.4.1控制模块电路
控制模块用于为计费模块提供时钟,当start高电平的时候选择公里计费,输出的时钟信号为distance_enable,当start低电平的时候选择时间计费,输出的时钟信号为time_enable。
这样控制模块便控制着其计费模式。
模块如下图所示:
图3-9控制模块
3.4.2计时模块的仿真结果
1.公里计费的仿真结果如下所示:
图3-10控制模仿真图(公里计费)
从波形图可以看出当start为高电平的时候输出的信号是distance_enable。
此时控制模块选出的是distance_enable,即选出距离使能脉冲计费,则实现了按公里计费。
2.时间计费的仿真结果如下所示:
图3-11控制模仿真图(按时计费)
从波形图可以看出当start为低电平的时候输出的信号是time_enable。
即选择了按等待时间脉冲计费。
仿真上的公里脉冲和时间脉冲是为了仿真而简单的设置的波形,并非是前面信号组合检测而成,在后面整体组合电路中为进行模块的组合。
这里为了便于功能仿真区别,没有设置过多的脉冲,以影响分辨控制模块所选择的计费模式。
3.5计费模块
3.5.1控制模块电路
费用计数器模块用于出租车启动后,根据行驶路程和等待时间计算费用。
当出租车停车时,时钟reset用于将费用计数器复位为起步价6.0元;
当车处于行驶状态时,select_clk信号选择distans_enable,若满4公里后路程每满1公里,费用计数器加1元;
当出租车处于停止等待状态且时钟满2分钟时,select_clk信号选择time_enable信号,时间每满1分钟,费用计数器加1元。
图3-12计费模块
3.5.2计费模块的仿真结果
图3-13计费模块仿真
从波形图可以看出reset用于将费用计数器复位为起步价8.0元;
由于本仿真select_clk信号并非是系统选择出来的公里脉冲和计时脉冲,通过认为设定,不影响其观察功能效果。
3.6数码管显示模块
图3-14数码管显示模块
数码管有两种显示方式动态显示与静态显示,由于在本文中用到了八个数码管所以选择了动态显示,在时钟的控制下,当reset为高电平的时候把费用,公里,时间译码输出。
这里没有数码管显示仿真效果不明显,即不给予仿真。
以上单元模块设计完毕,通过每个单元模块代码的设计以及仿真验证每个模块的真确性,为确保后面整体模块电路的正确性奠定了基础。
4.整体顶层模块设计
4.1整体顶层模块电路
各模块设计仿真实现后,可分别创建成元件符号。
顶层就是将各分模块用VerilogHDL语言或者是图形方法连接起来,便可实现系统电路。
其VerilogHDL源代码详见其附录。
其生成的顶层原理图如下所示:
图4-1整体顶层电路原理图
5.系统功能仿真及调试
本设计采用QuartusII软件进行仿真设计,QuartusII是Altera公司的综合性PLD/FPGA开发软件,支持原理图、VHDL、VerilogHDL以及AHDL(AlteraHardwareDescriptionLanguage)等多种设计输入形式,嵌自有的综合器以及仿真器,可以完成从设计输入到硬件配置的完整PLD设计流程。
5.1系统仿真及调试
各个单元模块完成后,即可将分模块和顶层模块进行仿真测试,同时可根据设计要求加入测试输入条件。
仿真后得到的相应输出结果与预先的结果想比较,若不相符,则应修改设计,直到相符为止。
为了仿真得到明显的效果,最好能能下载到带数码管的试验想上进行直接的数字观察。
由于条件有限,为了能使仿真效果明显,采用了不带译码显示的波形仿真,其电路原理图如下:
图5-1系统仿真调试电路
首先,对以下输入输出端作以下解释和说明,如表4-1:
表5-1测试端口说明
输入输出端口说明
端口
类型
功能定义
Clk_50M
Input
全局时钟。
在时钟上升沿,计算费用。
reset
整体复位,在reset=0时,等待计时为0
start
选择计费模式
Start=1,计程计费
Start=0,计时计费
m[7:
0]
Output
等待时间的输入(分)
s[7:
等待计时的输入(秒)
distance[7:
所行路程的输入
fee7:
总费用输出
功能仿真结果验证如下如下所示:
a.为行驶中未停时的系统电路仿真结果:
图5-2系统仿真调试电路(a)
b.为行驶中停止时(在两分钟之)的系统电路仿真结果:
图5-3系统仿真调试电路(b)
c.为行驶中停止时(在两分钟之外)的系统电路仿真结果:
图5-4系统仿真调试电路(c)
从(a)可以看出当reset为1时,费用计数器为8元,系统启动,start=1表示出租车行驶,distance_enable每产生一个脉冲,路程计数器加1;
路程4公里,费用保持8不变,超过4公里,费用计数器进行加计数,每增加1公里费用加1元,此时等待时间计数器不变。
而根据(b),(c)的仿真波形可知,当reset为1时,系统启动,start=0表示出租车处于停止等待状态,此时等待时间计数器计数,在2分钟等待时间,费用计数器不变;
等待时间超过2分钟后,每增加1分钟,费用计数器增加1元,此时路程计数器保持不变。
从以上仿真可看出该出租车计价器整体功能实现都能完成,出租车计费器系统的设计已经全部完成,能按预期的效果进行模拟汽车起步价格,暂停,停止等功能各种计费,并能够通过LCD显示车费数目。
本款出租车计价器包括总价输出、显示路程,显示其等待时间等功能。
另外,如果再任意输入该出租车计价器的计费标准,那么,它的适用围可能就更广泛了。
(个人认为可调的话,会引起驾驶员改价作弊的问题,本设计没有外围可调电路,只能根据程序修改,因而防作弊。
)
6.总结与体会
通过学习了数字数字系统设计和VerilogHDL语言,对EDA技术有了一些了解,但那厚厚的一本书讲的都是理论的东西。
通过这本次课程设计,我才把学到的东西与实践相结合。
从中对所学的知识有了更进一步的理解。
刚开始拿到这题目的时候感觉还是有难度,但着手设计时,慢慢查询资料后感觉不是很难,但在设计时又现了许多细节上的问题。
对QuartusII9.0操作流程还不到位,通过自己网上看Quartus软件基操作视频,首先把Quartus的功能和各操作用途功能详细的了解了一遍,这使我大添信心能把设计做出来,相信只有细心、耐性才能把设计搞好,在这次的出租车计价器设计中,对Verilog模块的基本结构和基本语法更为熟悉。
在设计程序时,不能妄想一次就将整个程序设计好,反复修改、不断改进是程序设计的必经之路,要养成注释程序的好习惯,一个程序的完美与否不仅仅是实现功能,而应该让人一看就能明白你的思路,这样也为交流提供了方便,为以后编程打下基础。
为期两周的EDA课程设计已经结束,从挑选课设题目,查阅资料,到研究出总体设计,详细设计,再到最后的编程上机调试,修改程序,完善程序,收获颇多。
锻炼了自己独立发现问题、分析问题和通过查看相关资料来解决问题的能力。
使自己扩大了知识面,提高了知识水平,借助仿真软件,不仅可以把课堂中所学到的知识,直接加以运用,而且还可以把各个分离的知识组合为一个整体,真正做到理论联系实际的重要性。
使自己在专业知识和动手能力上有了很大的提高。
另外通过本次设计,使我认识到自己对VerilogHDL应用编程能力有很大的欠缺,需要在以后的学习中进一步提高。
学校给我们安排课程设计,大加深了我们对理论知识的理解,同时有意识的培养了我们的创新思想。
我想这类似的课程设计是为我们提供了良好的实践平台。
致
由于本次设计是第一次做关于EDA课程设计,不像单片机那样顺手,感老师的指导,感老师对本次论文的认真检查审阅。
由于时间有限和经验还尚欠缺,不足之处还望老师予以批评指正。
另外,我还要感学校能安排这次课程设计,为我们学习相关专业提供了良好的实践平台。
参考文献
[1]王金明.数字系统设计与VerilogHDL[M]..电子工业,2011
[2]夏宇闻.Verilog数字系统设计教程[M].:
航天航空大学,2008
[3]华成英.电子技术[M]..中央广播电视大学,2006
[4]鹏,景.数字电子技术基础与设计.:
理工大学,2004.4.
[5]王长宏.VHDL设计实例及其仿真与综合.:
航天航空大学,2001
附录A:
单元模块VerilogHDL源代码
A.1计数器的分频模块VerilogHDL源代码
modulediv(clk_50M,clk,reset);
//端口的定义
inputclk_50M,reset;
//总的时钟是50M
outputclk;
//分频后输出的时钟
regclk;
reg[31:
0]count;
//32位的计数器
always(posedgeclk_50Mornegedgereset)//异步复位
begin
if(!
reset)
begin
clk<
='
d0;
count=32'
end
elseif(count==3'
d100)//判断计时器记到了100吗?
count<
=32'
//计到100计数器清零
=~clk;
//输出的时钟取反
end//endbegin
elsecount<
=count+1'
d1;
//没计到100计数器加一
end//endalways
endmodule//结束分频模块
A.2数码管的分频模块VerilogHDL源代码
modulediv1(clk_50M,clk1,reset);
outputclk1;
//分频后输出的时钟1KHZ
regclk1;
clk1<
elseif(count==2'
d50)//判断计时器记到了50吗
//计到50计数器清零
=~clk1;
//没计到50计数器加一
A.3计程模块VerilogHDL源代码
moduledistancemokuai(clk,start,reset,distance,distance_enable);
//端口的定义
inputclk,start,reset;
output[7:
0]distance;
//输出的公里
reg[7:
outputdistance_enable;
//控制计费的公里信号
regdistance_enable;
always(posedgeclkornegedgereset)//异步复位
reset)//低电平复位
distance<
=8'
end
elseif(start)//start高电平有效
if(distance[3:
0]==9)//判断distance的低四位计到了9没有
distance[3:
0]<
=4'
//计到9清零
if(distance[7:
4]==9)//判断distance的高四位计到了9没有
distance[7:
4]<
elsedistance[