基于vhdl语言的出租车计费器.docx
《基于vhdl语言的出租车计费器.docx》由会员分享,可在线阅读,更多相关《基于vhdl语言的出租车计费器.docx(20页珍藏版)》请在冰点文库上搜索。
基于vhdl语言的出租车计费器
目录
课题名称出租车计费器1
第一章设计指标2
1.1任务要求2
1.2设计原理2
1.2.1车速控制模块2
1.2.2里程动态显示模块2
1.2.3计费动态显示模块2
第二章系统框图2
第三章各单元电路设计3
3.1输入选择模块3
3.1.1说明3
3.1.2模块图3
3.1.3程序3
3.2状态模块3
3.2.1说明3
3.2.2模块图4
3.2.3程序4
3.3分频模块5
3.3.1说明5
3.3.2模块图5
3.3.3程序5
3.4计数模块6
3.4.1说明6
3.4.2模块图6
3.4.3程序6
3.5显示译码模块8
3.5.1说明8
3.5.2模块图8
3.5.3程序8
3.6顶层程序9
3.6.1说明9
3.6.2模块图10
3.6.3程序10
第四章总电路图12
第五章工作原理12
5.1选择输入模块12
5.2状态模块12
5.3分频模块12
5.4计数模块12
5.5显示模块13
第六章心得体会13
参考文献13
课题名称出租车计费器
内容摘要:
随着EDA技术的高速发展,电子系统的设计技术和工具发生了深刻的变化,大规模可编程逻辑器件CPLD/FPGA的出现,给设计人员带来了诸多方便。
利用它进行产品开发,不仅成本低、周期短、可靠性高,而且具有完全的知识产权。
该系统利用VHDL语言、PLD设计出租车计费系统,以QuartusII软件作为开发平台,设计了出租车计费器系统程序并进行了程序仿真。
使其实现计费以及预置和模拟汽车启动、停止、暂停等功能,并动态扫描显示车费数目。
关键词:
出租车计费器;计数器;VHDL语言;QuartusII。
第一章设计指标
1.1任务要求
(1)自动计费器具有行车里程计费、等候时间计费和起步费三部分,三项计费统一用4位数码管现实,最大金额为99.99元。
(2)行车里程起步费设为8.00元,并在行车3公里以后再按单价2元/km计费。
等候时间计费设为1元/10分钟,要求行车时,计费值每公里刷新一次;等候时每10分钟刷新一次;行车不到1km或等候不足10分钟则忽略计费。
(3)实现预置功能:
能实现预置功能:
能预置起步费、每公里收费、车行加费里程。
(4)实现模拟功能:
能模拟汽车启动、停止、暂停、车速等状态。
1.2设计原理
1.2.1车速控制模块
当起停键为启动状态时(高电平),模块根据车速选择和基本车速发出响应频率的脉冲驱动计费器和里程显示模块进行计数;当处于停止状态时暂停发出脉冲,此时当输入600个单位脉冲后,即10分钟,计费器数值加1元。
当不足600个脉冲时,不进行计费。
1.2.2里程动态显示模块
其包括计数车速控制模块发出的脉冲以及将计数显示动态显示出来,每来一个脉冲里程值加0.1(控制器每发一个脉冲代表运行了0.1公里)。
1.2.3计费动态显示模块
其初值为8元,当里程超过3公里后才接受计数车速控制模块发出的脉冲的驱动,并且计数显示动态显示出来,每来一个脉冲(代表运行了0.5公里)其数值加1元,当收费超过20时数值加1.5元。
第二章系统框图
第三章各单元电路设计
3.1输入选择模块
3.1.1说明
模块MS,输入端口CK0、CK1为两个不同的时钟信号,来模拟汽车的加速和匀速,JS加速按键。
3.1.2模块图
3.1.3程序
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;
3.2状态模块
3.2.1说明
该模块实现车行状态输出功能,其中clk为时钟信号,enable为启动使能信号,sto暂停信号,clr为清零信号,st为状态信号。
3.2.2模块图
3.2.3程序
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:
="11";CQI:
=CQI;
ELSIFENABLE='1'THEN
CQI:
=CQI+1;
IFCQI<=30THENSTATE:
="00";
ELSIFCQI>30ANDCQI<=80THENSTATE:
="01";
ELSE
STATE:
="10";
ENDIF;
ENDIF;
ENDIF;
ST<=STATE;
ENDPROCESS;
ENDONE;
3.3分频模块
3.3.1说明
该模块实现将时钟信号5分频功能。
3.3.2模块图
3.3.3程序
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;
3.4计数模块
3.4.1说明
实现汽车模拟计费功能。
clr1为清零信号,si为状态信号,c0,c1,c2,c3分别为费用的四位显示。
3.4.2模块图
3.4.3程序
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);
C0:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);
C1:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);
C2:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);
C3:
OUTSTD_LOGIC_VECTOR(3DOWNTO0));
ENDCOUNTER;
ARCHITECTUREONEOFCOUNTERIS
BEGIN
PROCESS(CLK_DIV,CLR1,SI)
VARIABLEQ0:
STD_LOGIC_VECTOR(3DOWNTO0);
VARIABLEQ1:
STD_LOGIC_VECTOR(3DOWNTO0);
VARIABLEQ2:
STD_LOGIC_VECTOR(3DOWNTO0);
VARIABLEQ3:
STD_LOGIC_VECTOR(3DOWNTO0);
VARIABLEaa:
integerrange0to600;
BEGIN
IFCLR1='0'THENQ0:
="0000";Q1:
="0000";Q2:
="0000";Q3:
="0000";
ELSIFCLK_DIV'EVENTANDCLK_DIV='1'THEN
CASESIIS
WHEN"00"=>Q1:
="0000";Q2:
="1000";Q3:
="0000";
WHEN"01"=>IFQ2<"1001"THEN
Q2:
=Q2+1;
ELSE
Q2:
="0000";
IFQ3<"1001"THEN
Q3:
=Q3+1;
ENDIF;
ENDIF;
Q1:
="0000";
WHEN"10"=>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;
WHEN"11"=>aa:
=aa+1;
IF(aa<600)THENQ0:
="0000";Q1:
="0000";Q2:
="0000";Q3:
="0000";
ENDIF;
IF(aa=600andQ2<"1001")THEN
Q2:
=Q2+1;
ELSE
Q2:
="0000";
ENDIF;
IFQ3<"1001"THEN
Q3:
=Q3+1;
ENDIF;
WHENOTHERS=>NULL;
ENDCASE;
ENDIF;
C0<=Q0;
C1<=Q1;
C2<=Q2;
C3<=Q3;
ENDPROCESS;
ENDONE;
3.5显示译码模块
3.5.1说明
该模块实现显示车费功能。
BT为选位信号,SG译码信号。
3.5.2模块图
3.5.3程序
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYSCAN_LEDIS
PORT(DI0:
INSTD_LOGIC_VECTOR(3DOWNTO0);
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<=DI0;
WHEN"01"=>BT<="010";A<=DI1;
WHEN"10"=>BT<="011";A<=DI2;
WHEN"11"=>BT<="100";A<=DI3;
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;
3.6顶层程序
3.6.1说明
该模块为最终的顶层模块。
3.6.2模块图
3.6.3程序
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);
C0:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);
C1:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);
C2:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);
C3:
OUTSTD_LOGIC_VECTOR(3DOWNTO0));
ENDCOMPONENT;
COMPONENTSCAN_LED
PORT(DI0:
INSTD_LOGIC_VECTOR(3DOWNTO0);
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_C0:
STD_LOGIC_VECTOR(3DOWNTO0);
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:
SOUT
PORTMAP(CLK=>L_CLK,ENABLE=>T_ENABLE,CLR=>T_CLR,STO=>T_STO,ST=>L_ST);
U2:
PULSEPORTMAP(CLK0=>L_CLK,FOUT=>L_FOUT);
U3:
COUNTER
PORTMAP(CLR1=>T_CLR,SI=>L_ST,CLK_DIV=>L_FOUT,C3=>L_C3,C2=>L_C2,C1=>L_C1,C0=>L_C0);
U4:
SCAN_LEDPORT
MAP(CLK2=>T_CLK2,DI3=>L_C3,DI2=>L_C2,DI1=>L_C1,DI0=>L_C0,BT=>T_BT,SG=>T_SG);
ENDSTRUC;
第四章总电路图
第五章工作原理
5.1选择输入模块
此模块实现的功能是通过js按键,对clk0和clk1进行选择。
Clk0和clk1分别输入频率不同的脉冲信号,从而实现对车速快慢的模拟。
5.2状态模块
Enable为模块时能端,sto为车辆停车信号输入端,clk引入脉冲信号,clr为清零端。
程序内设置CQI作为公里计数。
当模块工作室,如果sto输入为1,则表示暂停,此时st端口输出“11”。
当st端口为0时,则表示此时车辆处于行驶状态。
当出租车行驶在起步价包含的3公里内时,st端口对外输出00;当超出3公里但在5公里以内时,st输出“00”;当里程超过5公里以后st对外输出“10”。
5.3分频模块
该模块实现将时钟信号5分频功能。
为后面的技术模块提供稳定的脉冲源。
5.4计数模块
此模块实现的功能是对计费模式的选择,同时完成车费的计算。
Clr1为清零端,SI为输入端,SI提供信号,内置4种计费模式,分别对其进行选择。
C3、C2、C1、C0分别代表了计价器的十元、元、角、分。
当SI输入“00”时,则工作在起步价范围内;当SI输入“01”时,系统工作在正常计价范围,即行驶超过三公里,开始按照每公里2元计费;当SI输入“10”时,工作在加价计费范围,即每公里3元。
当SI输入为“11”时,表示车辆停止,此时aa开始计数,当等待脉冲达到600时,即10分钟,计费器增加1元。
从而实现了停车计费,行车计费功能。
5.5显示模块
对输入信号DI进行译码,并作出输出。
显示四位LED灯管,对车费进行计数。
最大值为9999。
第六章心得体会
作为一名工科学生,动手能力对我们来说是非常必要的。
每次实习我都把它当做一次宝贵的经验。
每次精工实习都能给我带来不少收获。
这次做课程设计,过程中也遇到了许多的麻烦,但是在自己的努力下,同学的帮助下,一一攻破,不仅增加了对学科的认识,丰富了自己的知识体系,也更加懂得了合作的重要性。
这次课程设计中,主要是运用VHDL语言设计了一个出租车计费器,并且用层次化的设计方法来实现这个电路。
在程序编写过程中,出现了很多差错,也发现了眼高手低的毛病。
在学习的过程中,对很多内容不去深入了解,在实际动手过程中,遇到了问题,才去找课本,翻资料解决。
虽然有很多不足,但是这次课程设计让我对VHDL语言有了进一步的了解,也对QUARTUS软件有了更加熟悉的掌握,也明白了很多程序设计中应该注意的东西,从而对以后的工作和学习有很大的帮助。
掌握好每一门课程,了解并掌握必要软件,在学习过程中,勤动手,多动脑。
是我这次课程设计最大的收获。
只有一个牢固的知识基础,才能在对深层次的内容进行了解,在学习的道路上走的更远。
最后,感谢在这次实习中指导老师谢贝贝老师,以及所有帮助过我的同学,没有你们,这次实习不可能这么顺利的完成。
参考文献
[1]艾永乐.数字电子技术基础.北京:
中国电力出版社,2008
[2]林明权.VHDL数字控制系统设计范例.北京:
电子工业出版社,2003
[3]王艳芬.数字电子电路及其EDA技术.北京:
化学工业出版社,2007
[4]雷伏容.VHDL电路设计.北京:
清华大学出版社,2006
[5]罗朝霞.数字电路EDA技术入门与实战.北京:
人民邮电出版社,2009
[6]黄任.VHDL入门解惑经典实例经验总结.北京:
北京航空航天大学出版社,2004