VHDL出租车计价器.docx
《VHDL出租车计价器.docx》由会员分享,可在线阅读,更多相关《VHDL出租车计价器.docx(17页珍藏版)》请在冰豆网上搜索。
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<="1011011";
WHEN"0011"=>SG<="1001111";
WHEN"0100"=>SG<="1100110";
WHEN"0101"=>SG<="1101101";
WHEN"0110"=>SG<="1111101";
WHEN"0111"=>SG<="0000111";
WHEN"1000"=>SG<="1111111";
WHEN"1001"=>SG<="1101111";
WHENOTHERS=>NULL;
ENDCASE;
ENDPROCESSP3;
ENDONE;
〔6〕模块TAXI的实现
该模块为最终的顶层模块。
LIBRARYIEEE;
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYTAXIIS
PORT(T_CLK0:
INSTD_LOGIC;
T_CLK1:
INSTD_LOGIC;
T_CLK2:
INSTD_LOGIC;
T_JS:
INSTD_LOGIC;
T_ENABLE:
INSTD_LOGIC;
T_CLR:
INSTD_LOGIC;
T_STO:
INSTD_LOGIC;
T_BT:
OUTSTD_LOGIC_VECTOR(2DOWNTO0);
T_SG:
OUTSTD_LOGIC_VECTOR(6DOWNTO0));
ENDTAXI;
ARCHITECTURESTRUCOFTAXIIS
COMPONENTMS
PORT(CK0:
INSTD_LOGIC;
CK1:
INSTD_LOGIC;
JS:
INSTD_LOGIC;
CLK_OUT:
OUTSTD_LOGIC);
ENDCOMPONENT;
COMPONENTSOUT
PORT(CLK:
INSTD_LOGIC;
ENABLE:
INSTD_LOGIC;
STO:
INSTD_LOGIC;
CLR:
INSTD_LOGIC;
ST:
OUTSTD_LOGIC_VECTOR(1DOWNTO0));
ENDCOMPONENT;
COMPONENTPULSE
PORT(CLK0:
INSTD_LOGIC;
FOUT:
OUTSTD_LOGIC);
ENDCOMPONENT;
COMPONENTCOUNTER
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));
ENDCOMPONENT;
COMPONENTSCAN_LED
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));
ENDCOMPONENT;
SIGNALL_CLK:
STD_LOGIC;
SIGNALL_FOUT:
STD_LOGIC;
SIGNALL_ST:
STD_LOGIC_VECTOR(1DOWNTO0);
SIGNALL_C1:
STD_LOGIC_VECTOR(3DOWNTO0);
SIGNALL_C2:
STD_LOGIC_VECTOR(3DOWNTO0);
SIGNALL_C3:
STD_LOGIC_VECTOR(3DOWNTO0);
BEGIN
U0:
MSPORTMAP(CK0=>T_CLK0,CK1=>T_CLK1,JS=>T_JS,CLK_OUT=>L_CLK);
U1:
SOUTPORTMAP(CLK=>L_CLK,ENABLE=>T_ENABLE,CLR=>T_CLR,STO=>T_STO,ST=>L_ST);
U2:
PULSEPORTMAP(CLK0=>L_CLK,FOUT=>L_FOUT);
U3:
COUNTERPORTMAP(CLR1=>T_CLR,SI=>L_ST,CLK_DIV=>L_FOUT,C3=>L_C3,C2=>L_C2,C1=>L_C1);
U4:
SCAN_LEDPORTMAP(CLK2=>T_CLK2,DI3=>L_C3,DI2=>L_C2,DI1=>L_C1,BT=>T_BT,SG=>T_SG);
ENDSTRUC;
四、系统仿真
〔1〕模块MS的结果验证
〔2〕模块SOUT的结果验证
〔3〕模块PULSE的结果验证
〔4〕模块COUNTER的结果验证
〔5〕模块SCAN_LED的结果验证
〔6〕模块TAXI的结果验证
五、结论
出租车计费器系统的设计已全部完成,能按预期的效果进行模拟汽车启动、停止、暂停等功能,并设计动态扫描电路显示车费数目,由动态扫描电路来完成。
车暂时停止不计费,车费保持不变。
假设停止则车费清零,等待下一次计费的开始。
出租车计费器系统的设计已全部完成,能按预期的效果进行模拟汽车启动、停止、暂停等功能,并设计动态扫描电路显示车费数目,由动态扫描电路来完成。
车暂时停止不计费,车费保持不变。
假设停止则车费清零,等待下一次计费的开始。
各模块完成后,在将它们组合成完整的出租车系统,在设计过程中还需要改良的是控制系统的纠错功能。
出租车计费系统的设计中表达了VHDL覆盖面广,描述能力强,是一个多层次的硬件描述语言及PLD器件速度快,使用方便,便于修改等特点,本设计在实用方面具有一定的价值。
心得体会:
这次课程设计中,我们主要是运用VHDL语言设计了一个出租车计费器,并且用层次化的设计方法来实现这个电路。
在程序编写结束后,我们还对该程序进行了调试,能按预期的效果进行模拟汽车启动、停止、暂停等功能,基本完成课程设计的要求。
通过此次课程设计,我们更进一步的深入了解了VHDL设计语言,并通过使用对它有了更深的体会。
对于编程过程中可能遇到的问题有了一定的了解,也明白了其中的一些注意事项,对于下次进行编程设计有很大的帮助和提高。
总之,这次实验不仅仅加强了我的动手编程能力,也大大加强了团队合作以及设计能力,使我在理论学习和编程练习方面都获得了较大的收获