最新VHDL出租车计价器.docx
《最新VHDL出租车计价器.docx》由会员分享,可在线阅读,更多相关《最新VHDL出租车计价器.docx(15页珍藏版)》请在冰豆网上搜索。
最新VHDL出租车计价器
VHDL——出租车计价器
该系统利用VHDL语言、PLD设计出租车计费系统,以MAX+PLUSⅡ软件作为开发平台,设计了出租车计费器系统程序并进行了程序仿真。
使其实现计费以及预置和模拟汽车启动、停止、暂停等功能,并动态扫描显示车费数目。
关键词:
出租车计费器;计数器;VHDL语言;MAX+PLUSⅡ;
一、实验任务及要求
1.能实现计费功能,计费标准为:
按行驶里程收费,起步费为10.00元,并在车行3公里后再按2元/公里,当计费器计费达到或超过一定收费(如20元)时,每公里加收50%的车费,车停止不计费。
2.实现预置功能:
能预置起步费、每公里收费、车行加费里程。
3.实现模拟功能:
能模拟汽车启动、停止、暂停、车速等状态。
4.设计动态扫描电路:
将车费显示出来,有两位小数。
5.用VHDL语言设计符合上述功能要求的出租车计费器,并用层次化设计方法设计该电路。
6.各计数器的计数状态用功能仿真的方法验证,并通过有关波形确认电路设计是否正确。
7.完成电路全部设计后,通过系统实验箱下载验证设计的正确性。
二、实验原理
系统顶层框图:
车速选择
起/停开关
基本速率
Reset
扫描时钟
显示输出显示输出
计费器按里程收费,每100米开始一次计费。
各模块功能如下:
(1)车速控制模块
当起停键为启动状态时(高电平),模块根据车速选择和基本车速发出响应频率的脉冲驱动计费器和里程显示模块进行计数;当处于停止状态时暂停发出脉冲,此时计费器和里程显示模块相应的停止计数。
(2)里程动态显示模块
其包括计数车速控制模块发出的脉冲以及将计数显示动态显示出来,每来一个脉冲里程值加0.1(控制器每发一个脉冲代表运行了0.1公里)。
(3)计费动态显示模块
其初值为10元,当里程超过3公里后才接受计数车速控制模块发出的脉冲的驱动,并且计数显示动态显示出来,每来一个脉冲(代表运行了0.5公里)其数值加1元,当收费超过20时数值加1.5元。
三、出租车计费系统的实现
3.1系统的总体模块图:
3.2系统各功能模块的实现:
(1)模块MS的实现
模块MS,输入端口CK0、CK1为两个不同的时钟信号,来模拟汽车的加速和匀速,JS加速按键。
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYMSIS
PORT(CK0:
INSTD_LOGIC;
CK1:
INSTD_LOGIC;
JS:
INSTD_LOGIC;
CLK_OUT:
OUTSTD_LOGIC);
ENDMS;
ARCHITECTUREONEOFMSIS
BEGIN
PROCESS(JS,CK0,CK1)
BEGIN
IFJS='0'THENCLK_OUT<=CK0;
ELSECLK_OUT<=CK1;
ENDIF;
ENDPROCESS;
ENDONE;
(2)模块SOUT的实现
该模块实现车行状态输出功能,其中clk为时钟信号,enable为启动使能信号,sto暂停信号,clr为清零信号,st为状态信号。
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYSOUTIS
PORT(CLK:
INSTD_LOGIC;
ENABLE:
INSTD_LOGIC;
STO:
INSTD_LOGIC;
CLR:
INSTD_LOGIC;
ST:
OUTSTD_LOGIC_VECTOR(1DOWNTO0));
ENDSOUT;
ARCHITECTUREONEOFSOUTIS
BEGIN
PROCESS(CLK,ENABLE,STO,CLR)
VARIABLECQI:
STD_LOGIC_VECTOR(7DOWNTO0);
VARIABLESTATE:
STD_LOGIC_VECTOR(1DOWNTO0);
BEGIN
IFCLR='0'THENCQI:
=(OTHERS=>'0');
ELSIFCLK'EVENTANDCLK='1'THEN
IFSTO='1'THENSTATE:
="00";CQI:
=CQI;
ELSIFENABLE='1'THEN
CQI:
=CQI+1;
IFCQI<=30THENSTATE:
="01";
ELSIFCQI>30ANDCQI<=80THENSTATE:
="10";
ELSE
STATE:
="11";
ENDIF;
ENDIF;
ENDIF;
ST<=STATE;
ENDPROCESS;
ENDONE;
(3)模块PULSE的实现
该模块实现将时钟信号5分频功能。
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYPULSEIS
PORT(CLK0:
INSTD_LOGIC;
FOUT:
OUTSTD_LOGIC);
ENDPULSE;
ARCHITECTUREONEOFPULSEIS
BEGIN
PROCESS(CLK0)
VARIABLECNT:
STD_LOGIC_VECTOR(2DOWNTO0);
VARIABLEFULL:
STD_LOGIC;
BEGIN
IFCLK0'EVENTANDCLK0='1'THEN
IFCNT="100"THEN
CNT:
="000";
FULL:
='1';
ELSE
CNT:
=CNT+1;
FULL:
='0';
ENDIF;
ENDIF;
FOUT<=FULL;
ENDPROCESS;
ENDONE;
(4)模块COUNTER的实现
实现汽车模拟计费功能。
clr1为清零信号,si为状态信号,c1,c2,c3分别为费用的三为显示。
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYCOUNTERIS
PORT(CLK_DIV:
INSTD_LOGIC;
CLR1:
INSTD_LOGIC;
SI:
INSTD_LOGIC_VECTOR(1DOWNTO0);
C1:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);
C2:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);
C3:
OUTSTD_LOGIC_VECTOR(3DOWNTO0));
ENDCOUNTER;
ARCHITECTUREONEOFCOUNTERIS
BEGIN
PROCESS(CLK_DIV,CLR1,SI)
VARIABLEQ1:
STD_LOGIC_VECTOR(3DOWNTO0);
VARIABLEQ2:
STD_LOGIC_VECTOR(3DOWNTO0);
VARIABLEQ3:
STD_LOGIC_VECTOR(3DOWNTO0);
BEGIN
IFCLR1='0'THENQ1:
="0000";Q2:
="0000";Q3:
="0000";
ELSIFCLK_DIV'EVENTANDCLK_DIV='1'THEN
CASESIIS
WHEN"00"=>Q1:
=Q1;Q2:
=Q2;Q3:
=Q3;
WHEN"01"=>Q1:
="0000";Q2:
="0000";Q3:
="0001";
WHEN"10"=>IFQ2<"1001"THEN
Q2:
=Q2+1;
ELSE
Q2:
="0000";
IFQ3<"1001"THEN
Q3:
=Q3+1;
ENDIF;
ENDIF;
Q1:
="0000";
WHEN"11"=>IFQ1<"0101"THEN
Q1:
=Q1+5;
ELSE
Q1:
="0000";
ENDIF;
IFQ1="0101"THEN
IFQ2<"1001"THEN
Q2:
=Q2+1;
ELSE
Q2:
="0000";
IFQ3<"1001"THEN
Q3:
=Q3+1;
ENDIF;
ENDIF;
ELSE
IFQ2<"1001"THEN
Q2:
=Q2+2;
ELSE
Q2:
="0001";
IFQ3<"1001"THEN
Q3:
=Q3+1;
ENDIF;
ENDIF;
ENDIF;
WHENOTHERS=>NULL;
ENDCASE;
ENDIF;
C1<=Q1;
C2<=Q2;
C3<=Q3;
ENDPROCESS;
ENDONE;
(5)模块SCAN_LED的实现
该模块实现显示车费功能。
BT为选位信号,SG译码信号。
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYSCAN_LEDIS
PORT(DI1:
INSTD_LOGIC_VECTOR(3DOWNTO0);
DI2:
INSTD_LOGIC_VECTOR(3DOWNTO0);
DI3:
INSTD_LOGIC_VECTOR(3DOWNTO0);
CLK2:
INSTD_LOGIC;
SG:
OUTSTD_LOGIC_VECTOR(6DOWNTO0);
BT:
OUTSTD_LOGIC_VECTOR(2DOWNTO0));
ENDSCAN_LED;
ARCHITECTUREONEOFSCAN_LEDIS
SIGNALCNT4:
STD_LOGIC_VECTOR(1DOWNTO0);
SIGNALA:
STD_LOGIC_VECTOR(3DOWNTO0);
BEGIN
P1:
PROCESS(CLK2)
VARIABLESQ:
STD_LOGIC_VECTOR(1DOWNTO0);
BEGIN
IFCLK2'EVENTANDCLK2='1'THEN
IFSQ="10"THENSQ:
="00";
ELSE
SQ:
=SQ+1;
ENDIF;
ENDIF;
CNT4<=SQ;
ENDPROCESSP1;
P2:
PROCESS(CNT4)
BEGIN
CASECNT4IS
WHEN"00"=>BT<="001";A<=DI1;
WHEN"01"=>BT<="010";A<=DI2;
WHEN"10"=>BT<="100";A<=DI3;
WHEN"11"=>BT<="100";A<="1111";
WHENOTHERS=>NULL;
ENDCASE;
ENDPROCESSP2;
P3:
PROCESS(A)
BEGIN
CASEAIS
WHEN"0000"=>SG<="0111111";
WHEN"0001"=>SG<="0000110";
WHEN"0010"=>SG<="1