1数电课程设计报告设计课题:出租车计价器姓名:班级:学号:指导老师20引言随着我国市场经济的发展,交通也越来越便利,特别是计程车,以快捷、方便的特点早已盛行各个城市,成为城市交通的重要工具。计程车市场从90年代初的起步阶段到现在已经进入了高峰期。随着城市化水平的提高和人民生活水平的改善,计程车的服务也就显得越来越重要。因此计程车计价器也就应运而生了。本设计就是针对目前计程车计价器的问题设计的一种基于可编程逻辑器件FPGA的ASIC,并用超高速硬件描述语言VHDL编程实现的可同时显示金额、乘车时间、乘车总路程的“多功能”计价器。有较好的实用价值和较高的可行性。一、整体方案设计实现计程车的计价器功能。一方面实现基本功能时,包括在行程中满足2公里以内计起步价6元,以后在车行2公里后且10公里以内再按1.8元/公里,10公里以后按2.2元/公里计费;处于等待的状态下满足5分钟以内不计价,以后以2元/分计费。另一方面多功能的实现,计价器可以显示总费用,总行程数和总乘车时间等等。实现模拟功能:能模拟汽车启动、停止等状态。设计的主要技术指标如下:1、计价范围:0~999.0元计价分辨率:0.1元。2、计程范围:0~99公里计价分辨率:1公里。3、计时范围:59分59秒计时分辨率:1秒(1小时)设计方案比较方案一:用单片机实现:通过软件编程,仿真,调试,符合要求后将程序用编程器写入到单片机芯片上。利用单片机的中断响应乘客开车或者等待的请求,进行相应的处理。利用寄存器存放计价器系统运行状态,从而可以根据整个行程的状态进行计价。方案二:用FPGA(可编程门阵列)实现:利用硬件描述语言编程,仿真调试后下载到可编程逻辑器件(CPLD)上实现。可以对计程车整个过程进行判断、处理。整个过程完全实现了自动化和智能化。比较而言,方案一的开发及制作成本较低,能较大程度地利用资源,但外围电路较多,调试复杂,抗干扰能力差,特别对这种计程车的计价器需要长时间不间断运作的系统,由于主要是软件运作,容易出错,造成系统不稳定。方案二将所有器件集成在一块芯片上,体积大大减小的同时还提高了稳定性,并且可应用EDA软件仿真,调试,易于进行功能扩展,外围电路较少,采用硬件逻辑电路实现,其最大的优点是稳定性好,抗干扰能力强,非常适合作为计程车的计价器系统的控制核心。基于对以上各个因素的考虑,我们觉得FPGA实现计程车的计价器的设计更设计的要求,提升设计的可行性。因此,决定选用以FPGA为核心,用VHDL编程来实现计价器的设计。3二、系统模块划分将系统分为三个大模块:1系统各项计费功能的实现;CASH[15..0]CP1CP2MILES[15..0]RRRSTNTIMES[15..0]VHDLENTITY:jfqzmkU_jfqzmkVHDL1.VhdCP1端输入的脉冲信号经系统内部分频后做为模拟行车里程信号。CP2端输入脉冲信号进系统内部分频后做为行车时间信号。RR为复位信号,RR=’1’时计价器清零,RSTN为计价器开关。CASH[15…0]MILES[15…0]TIMES[15…0]端分别输出乘车费用,行车里程,行车总时间,它们都是用16位2进制BCD码表示。2各模块的LCD显示模块。ADDR[3..0]BUSYCASHH[7..0]CASHL[7..0]CLKCPINDATA[7..0]MILEH[7..0]MILEL[7..0]OUTLINERRSTSTROBETMH[7..0]TML[7..0]VHDLENTITY:jfqlcdU_jfqlcdVHDL2.VhdBUSY:控制器忙信号,数据未显示稳定时BUSY=1;反之为0;CASHH[7…0]CASHL[7…0]:乘车费用16位2进制BCD码的高8位数据和低八位数据;CPIN:输入工作时钟信号;MILEH[7…0]MILEL[7…0]:行车里程16位2进制BCD码的高8位数据和低八位数据;R:LCD显示开关;TMH[7…0]TML[7…0]:行车时间16位2进制BCD码的高8位数据和低八位数据;ADDR[3…0]:字符在LCD屏幕上的地址(共两行,每行16个字符)ADDR=“0000”~“1111”对应每行的第0~15个字符;CLK:控制器工作时钟,上升沿有效;DATA[7…0]:ASCII码数据总线;OUTLINE:LCD1602屏幕上的行选择信号,LINE=0时数据在第一行显示,LINE=1时数据4在第二行显示;RST:复位信号,高电平有效;STORB:E数据输入有效使能,高电平有效;3LCD控制显示模块CLK:控制器工作时钟,上升沿有效RST:复位信号,高电平有效DATA[7..0]:ASCII码数据总线ADDR[3..0]:字符在LCD屏幕上的地址(共两行,每行16个字符)ADDR=“0000”~“1111”对应每行的第0~15个字符LINE:LCD1602屏幕上的行选择信号,LINE=0时数据在第一行显示,LINE=1时数据在第二行显示BUSY:控制器忙信号,数据未显示稳定时BUSY=1;反之为0STROBE:数据输入有效使能,高电平有效LCD显示器接口:LCD_E:LCD显示器使能LCD_RW:LCD读写方向控制LCD_RS:LCD命令,数据选择LCD_DATA_TRI:LCD数据高阻态控制LCD_DATAO:LCD数据输出总线LCD_DATAI:LCD数据输入总线5三、主要VHDL源程序1、计费功能的实现LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;entityJFQZMKisport(CP1,CP2,RR,RSTN:INSTD_LOGIC;MILES,CASH,TIMES:OUTSTD_LOGIC_VECTOR(15DOWNTO0));endJFQZMK;architectureJFQLLofJFQZMKisSIGNALCASHOUT:STD_LOGIC_VECTOR(15DOWNTO0);--由CASHTIME&CASHMILE组成--十个十米记为0.1KM的SIGNAL(模拟轮子转一圈走十米)SIGNALCT:STD_LOGIC_VECTOR(15DOWNTO0);SIGNALCP3:STD_LOGIC;--十个十米记为0.1KM的SIGNAL--十个0。1KM脉冲记为1KM的SIGNALSIGNALT:STD_LOGIC_VECTOR(15DOWNTO0);SIGNALCP:STD_LOGIC;--十个0。1KM脉冲记为1KM的SIGNAL--时间计数及分频的SIGANALSIGNALCOUNTER_REG:STD_LOGIC_VECTOR(31DOWNTO0);SIGNALCOUNTER:STD_LOGIC_VECTOR(31DOWNTO0);SIGNALTIMESOUT:STD_LOGIC_VECTOR(15DOWNTO0);SIGNALCLK:STD_LOGIC;--时间计数及分频的SIGANAL--里程计算部分的SIGNALSIGNALMILESOUT:STD_LOGIC_VECTOR(15DOWNTO0);--里程计算部分的SIGNAL--行车计费部分的SIGNALSIGNALCASHL:STD_LOGIC_VECTOR(15DOWNTO0);SIGNALCASHH:STD_LOGIC_VECTOR(15DOWNTO0);SIGNALCASHMILE:STD_LOGIC_VECTOR(15DOWNTO0);--行车计费部分的SIGNAL6--停车计费部分的SIGNALSIGNALCOST:STD_LOGIC_VECTOR(15DOWNTO0);SIGNALCV:STD_LOGIC_VECTOR(7DOWNTO0);SIGNALCASHTIME:STD_LOGIC_VECTOR(15DOWNTO0);--停车计费部分的SIGNAL--将16位二进制价格转换到BCD码FUNCTIONCONVERT(AA:STD_LOGIC_VECTOR)RETURNSTD_LOGIC_VECTORISVARIABLEAN:STD_LOGIC_VECTOR(15DOWNTO0);VARIABLES:STD_LOGIC_VECTOR(15DOWNTO0);BEGINAN:=X0000;S:=X0000;FORNIN0TO15LOOPIFAA(N)='1'THENCASENISWHEN0=AN:=X0001;WHEN1=AN:=X0002;WHEN2=AN:=X0004;WHEN3=AN:=X0008;WHEN4=AN:=X0016;WHEN5=AN:=X0032;WHEN6=AN:=X0064;WHEN7=AN:=X0128;WHEN8=AN:=X0256;WHEN9=AN:=X0512;WHEN10=AN:=X1024;WHEN11=AN:=X2048;WHEN12=AN:=X4096;WHEN13=AN:=X8192;WHENOTHERS=AN:=X0000;ENDCASE;IF((0&S(3downto0))+(0&AN(3DOWNTO0)))01001THENS(3DOWNTO0):=S(3DOWNTO0)+AN(3DOWNTO0)+0110;S(15DOWNTO4):=S(15DOWNTO4)+X001;ELSES(3DOWNTO0):=S(3DOWNTO0)+AN(3DOWNTO0);ENDIF;IF((0&S(7DOWNTO4))+(0&AN(7DOWNTO4)))01001THENS(7DOWNTO4):=S(7DOWNTO4)+AN(7DOWNTO4)+0110;S(15DOWNTO8):=S(15DOWNTO8)+X01;ELSES(7DOWNTO4):=S(7DOWNTO4)+AN(7DOWNTO4);ENDIF;IF((0&S(11DOWNTO8))+(0&AN(11DOWNTO8)))010017THENS(11DOWNTO8):=S(11DOWNTO8)+AN(11DOWNTO8)+0110;S(15DOWNTO12):=S(15DOWNTO12)+X1;ELSES(11DOWNTO8):=S(11DOWNTO8)+AN(11DOWNTO8);ENDIF;S(15DOWNTO12):=S(15DOWNTO12)+AN(15DOWNTO12);ENDIF;ENDLOOP;RETURNS;ENDFUNCTION;--将16位二进制价格转换到BCD码BEGIN--10个脉冲记为0.1KM的实现PROCESS(CP1,RR)--CP1,RRINPUTSIGNALBEGINIFRR='1'THENCT=X0000;ELSIFCP1='1'ANDCP1'EVENTTHENIFCT=0000000000001001THENCT=X0000;CP3='1';ELSECP3='0';CT=CT+0000000000000001;ENDIF;ENDIF;ENDPROCESS;--10个脉冲记为0.1KM的实现--10个0。1KM脉冲记为1KM的实现PROCESS(CP3,RR)BEGINIFRR='1'THENT=X0000;ELSIFCP3='1'ANDCP3'EVENTTHENIFT=0000000000001001THENT=X0000;CP='1';ELSECP='0';8T=T+0000000000000001;ENDIF;ENDIF;ENDPROCESS;--10个0。1KM脉冲记为1KM的实现完--将时间脉冲分频PROCESS(CP2,RR)BEGINIFRR='1'THENCOUNTER_REG=00000001101111111111111111111111;--X989680;--仿真时设为2COUNTER=X00000000;CLK='0';ELSEIFCP2='1'ANDCP2'EVENTTHENIFCOUN