1、毕业设计论文基于CPLD的出租车计费器系统设计摘要:2Abstract:21.引言11.1课题背景11.2 国内外研究现状及趋势11.3本文的主要工作12.CPLD、VHDL介绍12.1 CPLD现状及发展12.2 CPLD的结构与特点22.2.1 CPLD基本结构22.2.2 CPLD的特点22.3 VHDL设计优点33.出租车计费器的设计33.1出租车计费器的总体设计33.1.1出租车计费标准33.1.2 总体框架设计33.2出租车计费器主要模块设计43.2.1 速度模块43.2.2 计程模块43.2.3 计时模块53.2.4 计费模块54.整体电路设计64.1 整体电路图64.2 电源电
2、路64.3 启动/停止按键电路64.4 自动清零部分75.系统仿真与下载实现75.1 Quartus软件介绍75.2仿真结果85.2.1整体仿真85.2.2速度模块仿真85.2.3计程模块仿真95.2.4计时模块仿真95.2.5 计费模块仿真105.3设计测试106.总结及展望10致谢11参考文献11摘要:结果和结论不明确为了使出租车计费系统设计成本降低、计费准,本文介绍了一种采用CPLD芯片进行出租车计费器的设计方法,描述了该课题的研究意义和应用价值;叙述了CPLD结构原理及其主要运用;介绍了超高速集成电路硬件描述语言的设计和主要功能。本文主要应用可编程逻辑芯片 EPM7128S为核心控制,
3、附加一定外电路组成出租车计费器系统,使用具有移植性强的特点,便于升级及可重复使用的VHDL语言进行设计。关键字:CPLD,VHDL,出租车计费器Abstract:In order to reduce design cost taxi billing system, accounting standard, this paper introduces a CPLD chip taxi meter design method, described the research significance and application value; the CPLD structure principl
4、e and its main application; introduces the ultra high speed integrated circuit hardware description language is designed and the main functions. In this paper, the main application of the programmable logic chip EPM7128S as the core control, some additional external circuit taxi meter system, with t
5、he use of transplantation and strong features, easy to upgrade and repeated use of VHDL language designKey Words: CPLD, VHDL, Taxi fare Registers1.引言1.1课题背景随着城市的发展,出租车行业发展迅速,出租车的附属品也应运而生。传统的出租车计费器大多是由单片机实现的,出租车计价器在最初使用时具备的主要功能是根据行驶里程计价,要求精度高,可靠性好。可以说,早期的计价器就是个里程表。随着科学技术的发展,产生了第二代计价器。它采用了手摇计算机与机械结构相结
6、合的方式,实现了半机械半电子化。此时它在计程的同时还可完成计价的工作。大规模集成电路的发展又产生了第三代计价器,也就是全电子化的计价器。出租车行业以低价高质的服务给人们带来了出行的享受。但是总存在着买卖纠纷困扰着行业的发展。而在出租车行业中解决这一矛盾的最好方法就是改良计价器。用更加精良的计价器来为乘客提供更加方便快捷的服务。计价器作为出租车的一个重要组成部分,关系着出租车司机和乘客双方利益,起着重要的作用,因此,具有良好性能的计价器对广大出租车司机朋友来说是很必要的。1.2 国内外研究现状及趋势目前市场上使用的出租车计费器主要采用的都是利用89C51单片机实现的计费器设计,显示方式上主要采用
7、的是固定显示内容的LED显示1。社会的发展对传统的出租车计费器提出了更高的要求2。近年来,各大城市都在对出租车价格进行调整,由于数量太多,很多城市的调价甚至需要一个月时间才能完成,经常会同一时间出现几个价格,有的城市出租车上还会出现司机人工计价的尴尬情形。这些都暴露了传统计费器灵活性和升级换代能力的不足3。此次选做的毕业课题是“基于CPLD的租出车计费器”,利用现在已经很成熟的可编程逻辑器件来实现这一计费系统,相对用51单片而言,会比较简单,这也同样体现出EDA技术上的优势4。其最突出的地方表现在最具现代电子设计技术特征的功能是日益强大的逻辑设计仿真测试技术。1.3本文的主要工作利用VHDL(
8、Very-High-Speed Integrated Circuit HardwareDescription Language)语言设计出来的出租车计费器系统将实现计程模块、计时模块以及动态扫描模块等设计方法与技巧。计程模块将用计数器来完成,计数器对脉冲数计数,然后提供给程序数据。通过不同的信号,用比较器可以让我们确定出租车是在车行计程还是车停计时。再将数据传输到计费模块,通过多种条件判定,最后确定输出值,然后相加确定最后的费用,并显示出来。2.CPLD、VHDL介绍2.1 CPLD现状及发展20世纪70年代,最早的可编程逻辑器件PLD诞生了。其输出结构是可编程的逻辑宏单元,因为它的硬件结构设
9、计可由软件完成,因而它的设计比纯硬件的数字电路具有很强的灵活性,但其过于简单的结构也使它们只能实现规模较小的电路。为弥补PLD只能设计小规模电路这一缺陷,推出了复杂可编程逻辑器件CPLD。目前应用已深入网络、仪器仪表、汽车电子、数控机床、航天测控设备等方面。72.2 CPLD的结构与特点 CPLD主要是由可编程逻辑宏单元围绕中心的可编程互连矩阵单元组成。其中MC结构较复杂,并具有复杂的I/O单元互连结构,可由用户根据需要生成特定的电路结构,完成一定的功能。由于CPLD内部采用固定长度的金属线进行各逻辑块的互连,所以设计的逻辑电路具有时间可预测性,避免了分段式互连结构时序不完全预测的缺点。2.2
10、.1 CPLD基本结构经过几十年的发展,许多公司都开发出了CPLD可编程逻辑器件。PLD的总体结构(以MAX7000为例,其他型号的结构与此都非常相似见图2-1):图2-1 CPLD基本结构2.2.2 CPLD的特点 CPLD具有编程灵活、集成度高、设计开发周期短、适用范围宽、开发工具先进、设计制造成本低、对设计者的硬件经验要求低、标准产品无需测试、保密性强、价格大众化等特点,可实现较大规模的电路设计,因此被广泛应用于产品的原型设计和产品生产(一般在10,000件以下)之中。几乎所有应用中小规模通用数字集成电路的场合均可应用CPLD器件。CPLD器件已成为电子产品不可缺少的组成部分,它的设计和
11、应用成为电子工程师必备的一种技能。2.3 VHDL设计优点第一,它是可以用来描述逻辑设计的结构,比如逻辑设计中有多少个子逻辑,而这些子逻辑又是如何连接的。除此之外,VHDL并不十分关心一个具体逻辑依靠何种方式实现,而是把开发者的精力集中到逻辑所实现的功能上。第二,VHDL采用类似高级语言的语句格式完成对硬件行为的描述,具备更强的模块化能力,并拥有良好的可读性以及程序的移植性。第三,VHDL给出逻辑的模拟与调试为设计工作提供了最大的空间。VHDL调试的过程是相当灵活的:一方面可以使用传统的调试方法;另一方面,可以使用一些VHDL原码调试器,这类调试器可以大大加快VHDL程序调试的速度 5。3.出
12、租车计费器的设计3.1出租车计费器的总体设计3.1.1出租车计费标准计费标准为起步3元,车行3公里后为1.4元/公里,当计费达到20元后,每公里加收50%的车费,车停止每3分钟增加0.7元。车费显示出来,有一位小数。3.1.2 总体框架设计Speed模块Time模块Kilometers模块Kmmoney模块总费用总里程ResetSpStart图3-1 出租车计费器系统结构图系统接收到reset信号后,总费用变为3元,同时其他计数器、寄存器等全部清零。系统接收到start信号后,首先把部分寄存器赋值,总费用不变,单价price寄存器通过对总费用的判断后赋为3元。其他寄存器和计数器等继续保持为0。
13、速度模块:通过对速度信号sp的判断,决定变量kinside的值。Kinside即是行进100m所需要的时钟周期数,然后每行进100m,则产生一个脉冲clkout。计程模块:由于一个clkout信号代表行进100m,故通过对clkout计数,可以获得共行进的距离kmcount。计时模块:在汽车启动后,当遇到顾客等人或红灯时,出租车采用计时收费的方式。通过对速度信号sp的判断决定是否开始记录时间。当sp=0时,开始记录时间。当时间达到足够长时产生timecount脉冲,并重新计时。一个timecount脉冲相当于等待的时间达到了时间计费的长度。计费模块:由两个进程组成。其中,一个进程根据条件对en
14、able和price赋值,当记录的距离达到3公里后enable变为1,开始进行每公里收费,当总费用大于20元后,则单价price由原来的1.4元每公里变成2.1元每公里;第二个进程在每个时钟周期判断timeout和clkout的值。当其为1时,则在总费用上加上相应的费用。3.2出租车计费器主要模块设计3.2.1 速度模块速度模块首先根据start信号判断是否开始计费,然后根据输入的速度档位sp的判断,确定行驶100m所需要的时钟数,每前进100m,输出一个clkout信号。同时由cnt对clk进行计数,当cnt等于kinside时,把clkout信号置1,cnt清0。VHDL语言程序见附录,模
15、块原件符号如下。图3-2 速度模块框图3.2.2 计程模块此模块主要用于记录行进的距离,其模块框图如图3-3所示。通过对clkout信号的计数,可以计算行驶的距离kmcount。一个clkout脉冲相当于行进100m所以只要记录clkout的脉冲数目即可确定共行进的距离。Kmcount1为十分位,kmcount2为个位,kmcount3为十位,分别为十进制数。图3-3 计程模块框图3.2.3 计时模块速度模块主要用于计时收费,记录计程车速度为0的时间(如等待红灯),其模块框图如图3-4所示。通过对sp信号的判断,当sp=0,开始记录时间。当时间达到足够长时,产生timecount脉冲,并重新计
16、时。 图3-4 计时模块框图3.2.4 计费模块计费模块如图3-6所示,可分为kmmoney1和kmmoney2两个进程。Kmmoney1用于产生enable和price信号。当记录距离达到3km后,enable信号为1,开始进行每公里收费。当总费用大于40元后,单价price由原来的2元变成4元,用作计时收费。通过对sp信号的判断,当sp=0,开始记录时间。当时间达到足够长时,产生timecount脉冲,并重新计时。Kmmoney2用于判断timecount和clkout的值,当其为1时,总费用加1。最终输出为总费用。图3-5 计费模块框图4.整体电路设计4.1 整体电路图整体电路如图4-1
17、。硬件电路由Cyclone电路板组成,clk为时钟周期信号,由试验箱产生,start/stop是启动停止按键电路,reset为自动清零电路。电源又AD-DC开关电源供电。图4-1 整体门电路4.2 电源电路电源采用了AD-DC开关电源,输入115VAC到230VAC,输出+5V(4A)。使用开关电源的好处就是比较节省能源,它的转换效率很高,可达85%以上,稳压范围宽,除此之外,还具有稳压精度高、不使用电源变压器等特点。4.3 启动/停止按键电路如图4-2所示,采用双刀双路开关,一路开关用于清零部分,由于显示部分特殊要求,即计费停止后屏幕上仍然要保持计费的所有信息,只有当下次计费启动时才清零从新
18、开始计费。另外两路开关,其中一路用于启动指示和启动/停止输出信号给CPLD芯片的I/O口。当按下键后,清零部分和启动计费部分同时进行,但清零只是瞬间的,计费指示灯两起。再次按下键后,开关换到另外的两路,空车指示灯亮起。图4-2启动/停止按键电路4.4 自动清零部分由于显示部分的特殊要求,即计费停止后屏幕上仍然要保持计费的所有信息,只有当下次计费启动时才清零从新开始计费。VHDL语言的特殊性,不能在一个结构中用两个不同的动作使其赋值。所以必须要有一个瞬间清零的信号,当CPLD的清零I/O端口为“1”时就自动清零。使用电容的充放电功能来实现,按键断开时清零输出端为接地,按键闭合时电容充电清零端为高
19、电平,充完电后清零端输出又为低电平,当按键断开后,通过一个2k欧姆的电阻放电,为下次充电做好准备。如图4-3所示。图4-3 自动清零电路5.系统仿真与下载实现5.1 Quartus软件介绍Quartus是Altera公司自行设计的一个完全集成化、易学易用的可编程逻辑设计环境,它提供了完全集成且与电路结构无关的开发包环境,具有数字逻辑设计的全部特性,包括:可利用原理图、结构框图、VerilogHDL、AHDL和VHDL完成电路描述,并将其保存为设计实体文件;芯片(电路)平面布局连线编辑;LogicLock增量设计方法,用户可建立并优化系统,然后添加对原始系统的性能影响较小或无影响的后续模块;功能
20、强大的逻辑综合工具;完备的电路功能仿真与时序逻辑仿真工具;定时/时序分析与关键路径延时分析;可使用SignalTap逻辑分析工具进行嵌入式的逻辑分析;支持软件源文件的添加和创建,并将它们连接起来生成编程文件;使用组合编译方法可一次完成整体设计流程;自动定位编译错误;高效的期间编程与验证工具;可读入标准的EDIF网表文件、VHDL网表文件、和Verilog网表文件;能生成第三方EDA软件使用的VHDL网表文件和Verilog网表文件;5.2仿真结果5.2.1整体仿真对电路整体进行仿真,得出如下仿真波形图5-1。图中,当复位信号reset为高电平时,系统所有寄存器、计数器都清零;当开始计费信号st
21、art信号有效时,计费器开始计费,根据出租车行驶的速度sp2.0的取值计算所用花费和行驶里程;当停止计费信号有效时,计费器停止工作。 图5-1 出租车计费器仿真波形图菜单栏截上,好像上次就跟你说了?下同5.2.2速度模块仿真速度模块的仿真波形图如图5-2所示。该模块根据出租车所处的运行状态和不同的形式速度,对相应数目的时钟周期进行计数,车每行驶100m时输出信号clkout输出高电平。图5-2 速度模块仿真波形图5.2.3计程模块仿真计程模块的仿真波形如图5-3所示。图中,当reset信号有效时,系统复位清零;否则,对输入信号clkout进行十进制计数。图5-3计程模块仿真波形图5.2.4计时
22、模块仿真计时模块的仿真波形图如图5-4所示。预设1000个时钟周期为20s,对时钟周期进行计数,每计1000个时钟周期输出高电平,指示计时20秒。图5-4 计时模块仿真波形图5.2.5 计费模块仿真计费模块的仿真波形图如图5-5所示。当reset信号有效时,系统复位清零;否则,当计时计费信号timecount和计程计费信号clkout为高电平时,按照一定计费规则进行计费。图5-5计费模块仿真功能图 综上所述,本设计的出租车计费器完全符合系统设计的要求,实现了出租车计费器所需的各项基本功能。5.3设计测试利用Quartus6.0对所设计出租车计费器的VHDL代码进行了仿真,并在Cyclone型可
23、编程数字实现系统上实现了该控制。该数字实现系统分成两部分,一是FPGA的下载板,它主要包括所使用的芯片、RS-232接头、接脚转换插槽等;另一部分是I/O实验板,它主要包括显示、脉冲输出等。出租车计费器的各部分利用数字实验系统所附的RS-232连接线将计算机中的VHDL代码设计的内容烧录到该实验系统的EPC2C35F672C8芯片中进行测试,测试结果基本实现了总费用=起费用+(里程-3km)里程单价+等待时间等待单价的出租车计费模式。6.总结及展望本文论述了基于CPLD的出租车计费器设计,分别介绍了整个系统和各个模块的设计,使用CPLD芯片、VHDL硬件描述语言作为设计手段,利用自顶向下的模块
24、化设计思路,通过在Quartus软件下进行的模拟仿真,并进行相应的硬件下载调试,证明所设计的系统完成了出租车计费器的功能,各项技术指标符合预定标准,具有一定实用性。由于本人在经验水平上的欠缺,设计中可能存在很多不足,请各位老师予以指证!近年来,CPLD在通信、控制、数据计算等领域得到了广泛的应用,利用CPLD来设计电子产品可减少电子系统的开发风险和开发成本;缩短了上市时间;通过在系统编程、远程在线重构等技术降低维护升级成本。并且,CPLD器件的成本越来越低,这些都说明可编程器件已成为现在及未来很长一段时间的主流,用它来实现的出租车计费器省去很多外围电路,稳定,简单有效,将来必然可以设计出更多更
25、强大的功能,提高产品竞争力。未来基于CPLD平台的出租车计费器将会有更低的成本、更小的体积、更安全、更精确和更多功能。致谢本次设计从选题到最后完成,都得到了指导老师邵利敏老师的悉心指导。邵老师渊博的知识、严谨的治学态度和诲人不倦的精神永远是我学习的榜样。在系统设计过程中,我也遇到了较多的困难,我十分感谢我的朋友和老师给与我的帮助和支持,使我能顺利完成本系统的设计与实现。参考文献至少10篇,其中一篇为英文,你得翻译成中文的那篇1江国强.EDA技术与应用M. 西安:电子科技大学出版社,2000,310-312.2潘松,黄继业.EDA技术与VHDLM.北京:清华大学出版社,2005,220-228.
26、 3甘登岱,田富鹏,朱利娜.EDA培训教程M.南京:机械工业出版社,1998,215-220. 4延明,张霖华.数字电路EDA入门M.北京:邮电大学出版社,2002,195-200.5林愿.基于CPLD/FPGA的出租车计费系统的设计实现M. 西安:电子科学出版社,2003,94-101.6何宾.EDA原理及应用. 北京:清华大学出版社,2009.附录 VHDL程序Speed模块library ieee; -加载库文件use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity speed isport( -定义输入输出端
27、口clk :in std_logic;reset:in std_logic;start:in std_logic;stop :in std_logic;sp :in std_logic_vector(2 downto 0);clkout:out std_logic);end speed;architecture rtl of speed isbeginprocess(clk,reset,start,stop,sp) -敏感信号发生变化时,启动进程type state_type is(s0,s1); -枚举类型;variable s_state:state_type; variable cnt:
28、integer range 0 to 28;variable kinside:integer range 0 to 30;begincase sp is -速度选择when000=kinside:=0; -停止状态或空档when001=kinside:=28; -第一档when010=kinside:=24; -第二档when011=kinside:=20;-第三档when100=kinside:=16;-第四档when101=kinside:=12;-第五档when110=kinside:=8;-第六档when111=kinside:=4;-第七档end case;if reset=1the
29、n-复位清零s_state:=s0;elsif clkevent and clk=1then-时钟上升沿到达时,状态转换case s_state iswhen s0=cnt:=0;clkoutclkout=0;if stop=1thens_state:=s0;-相当于无客上车elsif sp=000thens_state:=s1;-有客上车但车速为0,即刚上车还未起步elsif cnt=kinside thencnt:=0;clkoutwaittime:=0;timecountif sp=000thent_state:=t2;elsewaittime:=0;t_state:=t1;end if
30、;when t2=waittime:=waittime+1;-等待时间加1timecount=0;if waittime=1000 thentimecount=1;-产生一个时间计费脉冲waittime:=0;elsif stop=1thent_state:=t0;elsif sp=000thent_state:=t2;elsetimecount=0;t_state:=t1;end if;end case;end if;end process;end rtl;1)Kilometers模块library ieee; -加载库文件use ieee.std_logic_1164.all;use ie
31、ee.std_logic_unsigned.all;entity kilometers isport(-定义输入输出端口clkout,reset:in std_logic;kmcnt1:out std_logic_vector(3 downto 0);kmcnt2:out std_logic_vector(3 downto 0);kmcnt3:out std_logic_vector(3 downto 0);end kilometers;architecture rtl of kilometers isbeginprocess(clkout,reset)-启动进程variablekm_reg:
32、std_logic_vector(11 downto 0);beginif reset=1then-复位清零km_reg:=000000000000;elsif clkoutevent and clkout=1then-时钟上升沿到达时进行计程if km_reg(3 downto 0)=1001then-对应里程十分位km_reg:=km_reg+0111;-十分位向个分位进位elsekm_reg(3 downto 0):=km_reg(3 downto 0)+0001;end if;end if;kmcnt1=km_reg(3 downto 0);kmcnt2=km_reg(7 downto
33、 4);kmcnt3=000001000000thenprice=0100;elseprice=0011)OR(kmcnt3=0001)thenenable=1;elseenable=0;end if;end process;kmmoney2:process(reset,clkout,clk,enable,price,kmcnt2)variable reg2:std_logic_vector(11 downto 0);variable clkout_cnt:integer range 0 to 10;beginifreset=1thencash1001then-产生进位reg2(7 downt
34、o 0):=reg2(7 downto 0)+00000111;if reg2(7 downto 4)1001thencash=reg2+000001100000;elsecash=reg2;end if;elsecash00001001thenreg2(7 downto 0):=-十位进位reg2(7 downto 0)+00000110+price;if reg2(7 downto 4)1001then-百位进位cash=reg2+000001100000;elsecash=reg2;end if;elsecash=reg2+price;end if;else-对时钟计数clkout_cn
35、t:=clkout_cnt+1;end if;end if;end if;end process;count1=cash(3 downto 0);-总费用的个位count2=cash(7 downto 4);-总费用的十位count3=cash(11 downto 8);-总费用的百位end rtl;1) TOP模块library ieee;use ieee.std_logic_1164.all;entity top isport(-定义整个系统的输入输出端口clk :in std_logic;reset :in std_logic;start :in std_logic;stop :in s
36、td_logic;sp :in std_logic_vector(2 downto 0);kmcnt1:out std_logic_vector(3 downto 0);kmcnt2:out std_logic_vector(3 downto 0);kmcnt3:out std_logic_vector(3 downto 0);count1:out std_logic_vector(3 downto 0);count2:out std_logic_vector(3 downto 0);count3:out std_logic_vector(3 downto 0);end top;architecture rtl of top is-对上述电路模块进行元件定义component speed is-定义速度模块port(clk :in std_logic;reset:in std_logic;start:in std_logic;stop :in std_logic;sp :in std_logic_vector(2 down