基于verilog语言的出租车计费器院别:___计算机与通信工程学院___专业名称:_______电子信息工程________班级学号:________________学生姓名:_______________指导教师:________陈海宴_____________随着出租车行业的发展,对出租车计费器的要求也越来越高。最近几年出租车行业发展迅速,在全国有几千家出租车公司。因此出租车计费器市场是庞大的。而出租车计费器成为不可缺少的一部分。信息社会的现代电子产品,性能越来越高,复杂度越来越大,更新步伐也越来越快。实现这种进步的主要原因就是微电子技术和电子技术的发展。而电子技术的发展后者的核心就是电子设计自动化技术。EDA是指以计算机为工作平台,融合了应用电子技术、计算机技术、智能化技术的最新成果而开发出的电子CAD通用软件包,它根据硬件描述语言HDL完成的设计文件,自动完成逻辑编译、化简、分割、综合、优化、布局布线及仿真,直至完成对于特定目标芯片的适配编译、逻辑映射和编程下载等工作。没有EDA技术的支持,想要完成超大规模集成电路的设计制造是不可想象的;反过来,生产制造技术的不断进步又必将对EDA技术提出新的要求。本文采用verilog语言来设计实现出租车计费系统,经过ModelSim和Quartus仿真将其实例化。如果将该设计再结合到实际应用中,那么,只需改变设计中计费要求,就可以应用到出租车上。另外,如果再任意输入该出租车计价器的计费标准,那么,它的适用范围可能就更广泛了。一、设计要求(1)行程3公里内(包括3公里),且等待累计时间2分钟内(包括2分钟),起步费为6.0元;(2)3公里外(不包括3公里)以每公里1.0元,等待累计时间2分钟外(不包括2分钟)以每分钟以1.0元计费。(3)能显示行驶公里数、等待累计时间和最后的总费用。本计费器的显示范围为0~99元,计价分辨率为1元;计程器显示范围为0~99公里,分辨率为1公里;计时器的显示范围是分钟的显示范围是0—99,辨率为1分钟。秒的显示范围是0—59。分辨率为1秒。二、工作原理出租车的一般计费过程为:出租车载客后,启动计费器,整个系统开始运行,里程计数器和时间计数器从0开始计数,费用计数器从6开始计算。再根据行驶里程或停止等待的时间按以上的标准计费。若在行驶状态,则计程器开始加计数,当路程超过三公里后,计费器以每公里1元累加。若出租车停止等待状态,则计时器开始加计数,当时间超过两分钟后,计费器以每分钟1元累加。出租车到达目的地停止后,停止计费器,显示总费用。根据出租车计费器的工作过程,本系统采用分层次、分模块的方式设计,其本系统组成框图如下所示。其中行驶路程计数模块、等待时间计数模块和计费模块,用来统计路程、等待时间和总费用,控制模块是用来控制计费模块,数码管显示模块用来显示行驶的公里数、等待累计时间和总费用等信息。系统框图如下所示:三、各模块的设计本系统采用层次化、模块化的设计方法,设计顺序为自下向上。首先实现系统框图中的各子模块,然后由顶层模块调用各子模块来完成整个系统。为了便于显示,这里的路程、时间和费用计数器均用十六进制表示。3.1分频模块:3.1.1计数器的分频模块:计数器的分频模块具体框图:此模块的功能是对总的时钟进行分频,分出的频率是让计数器用的,因为总的时钟是50M的。设计该模块的时候用了一个32位的计数器,当计数器计到25_000000的时候产生时钟。在仿真的时候为了方便观察设计了一个8分频的电路。当下载的时候用的是2HZ的时钟。计数器的分频模块VerilogHDL源代码:modulediv(clk_50M,clk,reset);//端口的定义TitleSizeDocumentNumberRevDate:SheetofDocRevCodeTitleA11Monday,July13,2009clkclk_50Mresetclk_50Mresetdistance[7:0]计时器的分频模块clk[7:0]distancedistance_enablestartreset计程模块startclk计时模块startreset[7:0]ss[7:0]time_enable计费模块startreset[7:0]feefee[7:0]数码管显示模块reset[7:0]s[7:0]fee[7:0]distancedig[7:0]seg[7:0]控制模块distance_enabletime_enableselect_clkselect_clkstartclk1clk_50Mclk1reset数码管的分频模块m[7:0][7:0]m[7:0]mclk_50Mclkreset计时器的分频模块clk_50Mresetclkinputclk_50M,reset;//总的时钟是50Moutputclk;//分频后输的时钟regclk;reg[31:0]count;//32位的计数器always@(posedgeclk_50Mornegedgereset)//异步复位beginif(!reset)beginclk='d0;count=32'd0;endelseif(count==32'd25_000000)//判断计时器记到了25_000000吗begincount=32'd0;//计到25_000000计数器清零clk=~clk;//输出的时钟取反end//endbeginelsecount=count+1'd1;//没计到25_000000计数器加一end//endalwaysendmodule//结束分频模块仿真的结果:从波形可以看出当reset为低电平的时候clk为零,当为高电平的时候clk的高电平占了clk_50M的八个周期,低电平也占了clk_50M的八个周期。3.1.2数码管的分频模块:具体框图:clk_50Mresetclk1clk1clk_50Mreset数码管的分频模块此模块的功能是对总的时钟进行分频,分出的频率是让数码管用的,因为总的时钟是50M的。设计该模块的时候用了一个32位的计数器,当计数器计到50_000的时候产生时钟。在仿真的时候为了方便观察设计了一个8分频的电路。数码管的分频模块VerilogHDL源代码:modulediv1(clk_50M,clk1,reset);//端口的定义inputclk_50M,reset;//总的时钟是50Moutputclk1;//分频后输的时钟regclk1;reg[31:0]count;//32位的计数器always@(posedgeclk_50Mornegedgereset)//异步复位beginif(!reset)beginclk1='d0;count=32'd0;endelseif(count==32'd50_000)//判断计时器记到了50_000吗begincount=32'd0;//计到50_000计数器清零clk1=~clk1;//输出的时钟取反end//endbeginelsecount=count+1'd1;//没计到50_000计数器加一end//endalwaysendmodule//结束分频模块3.2计程模块:计程模块的框图:此模块的功能是计算出租车行驶的路程。在出租车启动并行驶的过程中(即复位/启动信号reset为1,行驶/停止信号start为1),当时钟clk是上升沿的时候,系统即对路程计数器distance的里程计数器进行加计数,当路程超过三公里时,系统将输出标志正脉冲distance_enable。计程模块的VerilogHDL源代码:moduledistancemokuai(clk,start,reset,distance,distance_enable);//端口的定义inputclk,start,reset;output[7:0]distance;//输出的公里reg[7:0]distance;outputdistance_enable;//控制计费的公里信号regdistance_enable;always@(posedgeclkornegedgereset)//异步复位beginif(!reset)//低电平复位begindistance=8'd0;endelseif(start)//start高电平有效beginif(distance[3:0]==9)//判断distance的低四位计到了9没有begindistance[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的时候加一endelsedistance[3:0]=distance[3:0]+1'd1;//distance的低四位没有计到9的时候加一end//endstartend//endalways//*产生distance_enable信号*//always@(posedgeclkornegedgereset)beginif(!reset)begindistance_enable=1'd0;//复位endelseif(distance8'd2)//大于公里三的时候begindistance_enable=1'd1;//输出distance_enable信号endend//endalwaysendmodule//结束计程模块计程模块的仿真结果:从波形图可以看出在时钟的控制下,当reset为高电平且start为高电平的时候distance开始计数,当计到大于三的时候输出了distancedistance_enable为高电平。3.3计时模块:计时模块的框图:此模块用于计算停车等待的时间。在出租车行进中,如果车辆停止等待,计数器则在1Hz信号clk的上升沿进行加计数,每60次产生进位脉冲使分钟计数器位进行加计数,当累计等待时间超过2(不包括2分钟)分钟时,输出标志time_enable正脉冲信号。计时模块的VerilogHDL源代码:moduletimemokuai(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)//异步复位beginif(!reset)//低电平有效begin//复位s=8'd0;m=8'd0;endelseif(!start)//start信号低电平有效beginif(s[3:0]==9)//秒的低四位是9begins[3:0]=4'd0;//清零if(s[7:4]==5)//秒的高四位是5begins[7:4]=4'd0;//清零if(m[3:0]==9)//分的低四位是9beginm[3:0]=4'd0;//清零if(m[7:4]==9)//分的高四位是9m[7:4]=4'd0;//清零elsem[7:4]=m[7:4]+1'd1;//分的高四位不是9加一endelsem[3:0]=m[3:0]+1'd1;//分的低四位不是9加一endelses[7:4]=s[7:4]+1'd1;//秒的高四位不是5加一endelses[3:0]=s[3:0]+1'd1;//秒的低四位不是9加一end//endalwaysendassigntime_enable=((m[7:0]8'd2)&&(s[7:0]==8'd0))?1'd1:1'd0;//产生time_enable信号。endmodule//结束计时模块计时模块的仿真结果:两分钟之内(包括两分钟)的