数电课程设计出租车计价器.docx
- 文档编号:14131256
- 上传时间:2023-06-20
- 格式:DOCX
- 页数:21
- 大小:83.17KB
数电课程设计出租车计价器.docx
《数电课程设计出租车计价器.docx》由会员分享,可在线阅读,更多相关《数电课程设计出租车计价器.docx(21页珍藏版)》请在冰点文库上搜索。
数电课程设计出租车计价器
湖南大学电气与信息工程学院
本科生课程设计
课 程:
数电课程设计
题 目:
出租车计价器
专 业:
电气工程及其自动化
班 级:
学 号:
姓 名:
时间:
2015年6月
指导教师:
一、基本功能及要求
1、基本功能:
实现计程车的计价器功能。
一方面实现基本功能,包括在行程中满足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小时)
2、要求
实现模拟功能:
能模拟汽车启动、停止等状态。
当汽车行驶时模拟车轮转动以计算行车里程数,当汽车停止时可以计时以计算停车时间过长产生的费用,从而计算出最终的乘车费用。
二、系统模块划分
1、计费模块
CP1端输入的脉冲信号经系统内部分频后作为模拟行车里程信号。
CP2端输入脉冲信号进系统内部分频后作为行车时间信号。
RR为复位信号。
RR=‘1’时计价器清零。
RSTN为计价器开关。
CASH[15…0]、MILES[15…0]、TIMES[15…0]端分别输出乘车费用,行车里程,行车总时间,它们都是用16位2进制BCD码表示。
2、LCD显示模块
BUSY:
控制器忙信号,数据未显示稳定时BUSY=1,反之为0。
CASHH[7…0]CASHL[7…0]:
乘车费用16位2进制BCD码的高8位数据和低八位数据。
MILEH[7…0]MILEL[7…0]:
行车里程16位2进制BCD码的高8位数据和低八位数据。
CPIN:
输入工作时钟信号。
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时数据在第二行显示。
RST:
复位信号,高电平有效。
STORBE:
数据输入有效使能,高电平有效。
3、LCD控制模块
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;反之为0
STROBE:
数据输入有效使能,高电平有效
LCD显示器接口:
LCD_E:
LCD显示器使能
LCD_RW:
LCD读写方向控制
LCD_RS:
LCD命令,数据选择
LCD_DATA_TRI:
LCD数据高阻态控制
LCD_DATAO:
LCD数据输出总线
LCD_DATAI:
LCD数据输入总线
三、源程序
1、计费模块程序
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
entityJFQZMKis
port(CP1,CP2,RR,RSTN:
INSTD_LOGIC;
MILES,CASH,TIMES:
OUTSTD_LOGIC_VECTOR(15DOWNTO0)
);
endJFQZMK;
architectureJFQLLofJFQZMKis
SIGNALCASHOUT:
STD_LOGIC_VECTOR(15DOWNTO0);
--由CASHTIME&CASHMILE组成
--十个十米记为0.1KM的SIGNAL(模拟轮子转一圈走十米)
SIGNALCT:
STD_LOGIC_VECTOR(15DOWNTO0);
SIGNALCP3:
STD_LOGIC;
--十个0.1KM脉冲记为1KM的SIGNAL
SIGNALT:
STD_LOGIC_VECTOR(15DOWNTO0);
SIGNALCP:
STD_LOGIC;
--时间计数及分频的SIGANAL
SIGNALCOUNTER_REG:
STD_LOGIC_VECTOR(31DOWNTO0);
SIGNALCOUNTER:
STD_LOGIC_VECTOR(31DOWNTO0);
SIGNALTIMESOUT:
STD_LOGIC_VECTOR(15DOWNTO0);
SIGNALCLK:
STD_LOGIC;
--里程计算部分的SIGNAL
SIGNALMILESOUT:
STD_LOGIC_VECTOR(15DOWNTO0);
--行车计费部分的SIGNAL
SIGNALCASHL:
STD_LOGIC_VECTOR(15DOWNTO0);
SIGNALCASHH:
STD_LOGIC_VECTOR(15DOWNTO0);
SIGNALCASHMILE:
STD_LOGIC_VECTOR(15DOWNTO0);
--停车计费部分的SIGNAL
SIGNALCOST:
STD_LOGIC_VECTOR(15DOWNTO0);
SIGNALCV:
STD_LOGIC_VECTOR(7DOWNTO0);
SIGNALCASHTIME:
STD_LOGIC_VECTOR(15DOWNTO0);
--将16位二进制价格转换到BCD码
FUNCTIONCONVERT(AA:
STD_LOGIC_VECTOR)RETURNSTD_LOGIC_VECTORIS
VARIABLEAN:
STD_LOGIC_VECTOR(15DOWNTO0);
VARIABLES:
STD_LOGIC_VECTOR(15DOWNTO0);
BEGIN
AN:
=X"0000";S:
=X"0000";
FORNIN0TO15LOOP
IFAA(N)='1'THEN
CASENIS
WHEN0=>AN:
=X"0001";
WHEN1=>AN:
=X"0002";
WHEN2=>AN:
=X"0004";
WHEN3=>AN:
=X"0008";
WHEN4=>AN:
=X"0016";
WHEN5=>AN:
=X"0032";
WHEN6=>AN:
=X"0064";
WHEN7=>AN:
=X"0128";
WHEN8=>AN:
=X"0256";
WHEN9=>AN:
=X"0512";
WHEN10=>AN:
=X"1024";
WHEN11=>AN:
=X"2048";
WHEN12=>AN:
=X"4096";
WHEN13=>AN:
=X"8192";
WHENOTHERS=>AN:
=X"0000";
ENDCASE;
IF(("0"&S(3downto0))+("0"&AN(3DOWNTO0)))>"01001"THEN
S(3DOWNTO0):
=S(3DOWNTO0)+AN(3DOWNTO0)+"0110";--如果相加大于9加6来调整,
S(15DOWNTO4):
=S(15DOWNTO4)+X"001";
ELSE
S(3DOWNTO0):
=S(3DOWNTO0)+AN(3DOWNTO0);
ENDIF;
IF(("0"&S(7DOWNTO4))+("0"&AN(7DOWNTO4)))>"01001"THEN
S(7DOWNTO4):
=S(7DOWNTO4)+AN(7DOWNTO4)+"0110";
S(15DOWNTO8):
=S(15DOWNTO8)+X"01";
ELSE
S(7DOWNTO4):
=S(7DOWNTO4)+AN(7DOWNTO4);
ENDIF;
IF(("0"&S(11DOWNTO8))+("0"&AN(11DOWNTO8)))>"01001"THEN
S(11DOWNTO8):
=S(11DOWNTO8)+AN(11DOWNTO8)+"0110";
S(15DOWNTO12):
=S(15DOWNTO12)+X"1";
ELSE
S(11DOWNTO8):
=S(11DOWNTO8)+AN(11DOWNTO8);
ENDIF;
S(15DOWNTO12):
=S(15DOWNTO12)+AN(15DOWNTO12);
ENDIF;
ENDLOOP;
RETURNS;
ENDFUNCTION;
BEGIN
--10个脉冲记为0.1KM的实现
PROCESS(CP1,RR)--CP1,RRINPUTSIGNAL
BEGIN
IFRR='1'THEN
CT<=X"0000";
ELSIFCP1='1'ANDCP1'EVENTTHEN
IFCT="0000000000001001"THEN
CT<=X"0000";
CP3<='1';
ELSE
CP3<='0';
CT<=CT+"0000000000000001";
ENDIF;
ENDIF;
--分频,每个CP1脉冲就是轮子转一圈,记十个脉冲为0.1km为新信号CP3
ENDPROCESS;
--10个0.1KM脉冲记为1KM的实现
PROCESS(CP3,RR)
BEGIN
IFRR='1'THEN
T<=X"0000";
ELSIFCP3='1'ANDCP3'EVENTTHEN
IFT="0000000000001001"THEN
T<=X"0000";
CP<='1';
ELSE
CP<='0';
T<=T+"0000000000000001";
ENDIF;
ENDIF;
ENDPROCESS;
--将时间脉冲分频
PROCESS(CP2,RR)
BEGIN
IFRR='1'THEN
COUNTER_REG<="00000001101111111111111111111111";
--X"989680";--仿真时设为2
COUNTER<=X"00000000";
CLK<='0';
ELSE
IFCP2='1'ANDCP2'EVENTTHEN
IFCOUNTER>=COUNTER_REGTHEN
COUNTER<=X"00000000";
CLK<=NOTCLK;
ELSE
COUNTER<=COUNTER+1;
ENDIF;
ENDIF;
ENDIF;
ENDPROCESS;
--时间计数的实现
PROCESS(CLK,RR)
VARIABLETIMESOUT_I:
STD_LOGIC_VECTOR(15DOWNTO0);
BEGIN
IFRR='1'THEN
TIMESOUT<=X"0000";
TIMESOUT_I:
=X"0000";
ELSIFCLK='1'ANDCLK'EVENTTHEN
IFTIMESOUT_I(15DOWNTO0)="1001100110011001"THEN--16位二进制数转BCD码
TIMESOUT_I:
=X"0000";
ELSE
IFTIMESOUT_I(11DOWNTO0)="100101011001"THEN--超过9小时59分钟
TIMESOUT_I(11DOWNTO0):
="000000000000";
TIMESOUT_I:
=TIMESOUT_I+"0001000000000000";
ELSE
IFTIMESOUT_I(7DOWNTO0)="01011001"THEN--超过59分钟
TIMESOUT_I(7DOWNTO0):
="00000000";
TIMESOUT_I:
=TIMESOUT_I+"0000000100000000";
ELSE
IFTIMESOUT_I(3DOWNTO0)="1001"THEN
TIMESOUT_I(3DOWNTO0):
="0000";
TIMESOUT_I:
=TIMESOUT_I+"0000000000010000";
ELSE
TIMESOUT_I:
=TIMESOUT_I+"0000000000000001";
ENDIF;
ENDIF;
ENDIF;
ENDIF;
TIMESOUT<=TIMESOUT_I;
ENDIF;--16位二进制数转BCD码
ENDPROCESS;
--里程计算部分
PROCESS(CP3,RR)
VARIABLEMILESOUT_I:
STD_LOGIC_VECTOR(15DOWNTO0);
BEGIN
IFRR='1'THEN
MILESOUT<=X"0000";
MILESOUT_I:
=X"0000";
ELSIFCP3='1'ANDCP3'EVENTTHEN
IFMILESOUT_I(15DOWNTO0)="1001100110011001"THEN
--16位二进制数转BCD码
MILESOUT_I:
=X"0000";
ELSE
IFMILESOUT_I(11DOWNTO0)="100110011001"THEN
MILESOUT_I(11DOWNTO0):
="000000000000";
MILESOUT_I:
=MILESOUT+"0001000000000000";
ELSE
IFMILESOUT_I(7DOWNTO0)="10011001"THEN
MILESOUT_I(7DOWNTO0):
="00000000";
MILESOUT_I:
=MILESOUT_I+"0000000100000000";
ELSE
IFMILESOUT_I(3DOWNTO0)="1001"THEN
MILESOUT_I(3DOWNTO0):
="0000";
MILESOUT_I:
=MILESOUT_I+"0000000000010000";
ELSE
MILESOUT_I:
=MILESOUT_I+"0000000000000001";
ENDIF;
ENDIF;
ENDIF;
ENDIF;--16位二进制数转BCD码
MILESOUT<=MILESOUT_I;
ENDIF;
ENDPROCESS;
--行车计费部分
PROCESS(MILESOUT,RR)
BEGIN
IFRR='1'THEN
CASHL<=X"0000";
ELSIFMILESOUT<"0000000000100000"THEN--里程小于2.0公里
CASHL<="0000000000111100";--金额赋值6.0元,非BCD码
ELSE
CASHL<="0000000000111100";
ENDIF;
ENDPROCESS;
PROCESS(MILESOUT,CP,RR)
BEGIN
IFRR='1'THEN
CASHH<=X"0000";
ELSIFCP='1'ANDCP'EVENTTHEN
IFMILESOUT<"0000000011000000"THEN
CASHH<=X"0000";--行程<=6.0公里,不额外收费
ELSIFMILESOUT<"0000000100000000"THEN
CASHH<=CASHH+"0000000000010010";--行程<=10公里,1.8元/公里
ELSE
CASHH<=CASHH+"0000000000010110";--行程>10公里,2.2元/公里
ENDIF;
ENDIF;
ENDPROCESS;
PROCESS(CASHH,CASHL,RR)
BEGIN
IFRR='1'THEN
CASHMILE<=X"0000";
ELSE
CASHMILE<=CASHH+CASHL;
ENDIF;
ENDPROCESS;
--停车计费部分
PROCESS(MILESOUT,CLK,RR)
BEGIN
IFRR='1'THEN
COST<=X"0000";CV<=X"00";CASHTIME<=X"0000";
--cost存里程数,若实时里程数与cost相等,说明停车
ELSIFCLK='1'ANDCLK'EVENTTHEN
IFCOST/=MILESOUTTHEN
CV<="00000000";
ELSIFCV="00000101"THEN
CASHTIME<=CASHTIME+"0000000000100000";
--停车超过5分钟,每等一分钟2元
ELSE
CV<=CV+"00000001";
ENDIF;
COST<=MILESOUT;
ENDIF;
ENDPROCESS;
--计价部分
PROCESS(CASHTIME,CASHMILE,RR)
VARIABLECASHOUT_I:
STD_LOGIC_VECTOR(15DOWNTO0);
BEGIN
IFRR='1'THEN
CASHOUT_I:
=X"0000";
ELSE
CASHOUT_I:
=CONVERT(CASHTIME+CASHMILE);
ENDIF;
CASHOUT<=CASHOUT_I;
ENDPROCESS;
--输出部分
PROCESS(MILESOUT,CASHOUT,TIMESOUT)
BEGIN
MILES<=MILESOUT;
CASH<=CASHOUT;
TIMES<=TIMESOUT;
ENDPROCESS;
ENDJFQLL;
2、LCD显示模块程序
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
entityJFQLCDis
port(CPIN,R,BUSY:
INSTD_LOGIC;
TMH,TML,MILEH,MILEL,CASHH,CASHL:
INSTD_LOGIC_VECTOR(7DOWNTO0);
CLK,RST,STROBE,OUTLINE:
OUTSTD_LOGIC;
DATA:
OUTSTD_LOGIC_VECTOR(7DOWNTO0);
ADDR:
OUTSTD_LOGIC_VECTOR(3DOWNTO0)
);
endJFQLCD;
architectureJFQofJFQLCDis
TYPESTATESIS(S0,S1,S2,S3,S4);
SIGNALS:
STATES;
SIGNALLCDPT:
INTEGERRANGE0TO23;
SIGNALCPCT:
INTEGERRANGE0TO65535;
SIGNALCP:
STD_LOGIC;
begin
PROCESS(CPIN,R)
BEGIN
CLK<=CPIN;
IFR='1'THEN
CPCT<=65535;
ELSIFCPIN='1'ANDCPIN'EVENTTHEN
IFCPCT=0THEN
CPCT<=65535;CP<=NOTCP;
ELSE
CPCT<=CPCT-1;
ENDIF;
ENDIF;
ENDPROCESS;
--分频延时
PROCESS(CP,R)
BEGIN
IFR='1'THEN
S<=S0;LCDPT<=0;RST<='1';
ELSIFCP='1'ANDCP'EVENTTHEN
CASESIS
WHENS0=>S<=S1;LCDPT<=0;RST<='1';
WHENS1=>RST<='0';STROBE<='0';
IFBUSY='0'THEN
LCDPT<=LCDPT+1;
IFLCDPT=10THEN
S<=S3;
ELSE
S<=S2;
ENDIF;
ENDIF;
WHENS2=>S<=S1;STROBE<='1';
WHENS3=>STROBE<='0';
IFBUSY='0'THEN
IFLCDPT=23THEN
LCDPT<=10;
ELSE
LCDPT<=LCDPT+1;
ENDIF;
S<=S4;
ENDIF;
WHENS4=>STROBE<='1';S<=S3;
WHENOTHERS=>NULL;
ENDCASE;
ENDIF;
ENDPROCESS;
PROCESS(LCDPT,TMH,TML,CASHH,CASHL,MILEH,MILEL)
BEGIN
CASELCDPTIS
WHEN0=>NULL;
WHEN1=>DATA<="00111010";ADDR<="0011";OUTLINE<='0';--:
WHEN2=>DATA<="00101110";ADDR<="1011";OUTLINE<='0';--.
WHEN3=>DATA<="01001011";ADDR<="1101";OUTLINE<='0';--K
WHEN4=>DATA<="01101101";ADDR<="1110";OUTLINE<='0';--m
WHEN5=>DATA<="01000011";ADDR<="0010";OUTLINE<='1';--C
WHEN6=>DATA<="01000001";ADDR<="0011";OUTLINE<='1';--A
WHEN7=>DATA<="01010011";ADDR<="0100";OUTLINE<='1';--S
WHEN8=>DATA<="01001000";ADDR<="0101";
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 课程设计 出租车 计价器
![提示](https://static.bingdoc.com/images/bang_tan.gif)