《eda基于vhdl语言的出租车计价器大学课程设计-毕业论文.doc》由会员分享,可在线阅读,更多相关《eda基于vhdl语言的出租车计价器大学课程设计-毕业论文.doc(27页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、哈尔滨远东理工学院EDA课程设计 题 目: 基于VHDL语言出租车计费器 哈尔滨远东理工学院-I-摘 要 本文介绍了一种采用单片FPGA芯片进行出租车计费器的设计方法,主要阐述如何使用新兴的EDA器件取代传统的电子设计方法,利用FPGA的可编程性,简洁而又多变的设计方法,缩短了研发周期,同时使出租车计费器体积更小功能更强大。本设计实现了出租车计费器所需的一些基本功能,计费包括起步价、行车里程计费、等待时间计费,同时考虑到出租车行业的一些特殊性,更注重了把一些新的思路加入到设计中。主要包括采用了FPGA芯片,使用VHDL语言进行编程,使其具有了更强的移植性,更加利于产品升级。关键词:VHDL 计
2、费器 FPGA AbstractThis paper describes the use of a single chip FPGA for the design of accounting-fee machine, mainly on how to use the emerging EDA electronic devices designed to replace traditional methods, using the programmable FPGA, concise and changing the design Ways to shorten the development
3、cycle, so that taxi accounting-fee machine in a smaller more powerful. The design and implementation of the taxi accounting-fee machine for some basic functions, including billing starting price, driving metered, the waiting time billing, taking into account the special nature of some of the taxi in
4、dustry, to pay more attention to a number of new Ideas into the design. Mainly including the use of the FPGA chip, the use of VHDL programming, so as to make it a stronger transplanted, and more conducive to product upgrades. Key words: VHDL,accounting-fee machine,FPGA-II-目 录前 言1第一部分 设计要求2一、设计目的2二、系
5、统要求2三、功能描述2四、补充说明2第二部分 系统设计方案3第三部分 主要模块设计5一、 计程计费模块5二、显示模块5三、控制模块6第四部分 仿真结果与分析7一、计程计费模块仿真7二、总体仿真7第五部分 硬件调试8一、引脚锁定8二、硬件验证情况8总结10致谢11参考文献12附录A 电路图13一、电路图13二、PCB图14三、3D仿真图15附录B 程序代码17一、top顶层文件17二、taxi控制模块18二、display显示模块20-III-前 言 随着出租车行业的发展,对出租车计费器的要求也越来越高。二十世纪后半期,随着集成电路和计算机技术的飞速发展,数字系统也得到了飞速发展,其实现方法经历
6、了由分立元件、SSI、MSI到LSI、VLSI以及UVLSI的过程。同时为了提高系统的可靠性与通用性,微处理器和专业集成电路(ASIC)逐渐取代了通用全硬件LSI电路,而ASIC以其体积小、重量轻、功耗低、速度快、成本低、保密性好而脱颖而出。目前,业界大量可编程逻辑器件(PLD),尤其是现场可编程逻辑器件(FPLD)被大量地应用在ASIC的制作当中。在可编程集成电路的开发过程中,以计算机为工作平台,融合了应用电子技术、计算机技术、智能化技术最新成果的电子设计自动化(EDA)技术主要能辅助进行三方面的设计工作:IC设计,电子电路设计以及PCB设计理想的可编程逻辑开发系统能符合大量的设计要求:它能
7、够支持不同结构的器件,在多种平台运行,提供易于使用的界面,并且有广泛的特征。EDA技术(即Electronic Design Automation技术)就是依赖强大的计算机,在EDA工具软件平台上,对以硬件描述语言HDL(Hardware Ddscription Langurage)为系统逻辑描述手段完成的设计文件,自动地完成逻辑编译、化简、分割、综合、布局布线以及逻辑优化和仿真测试,直至实现既定的电子线路系统功能。它在硬件实现方面融合了大规模集成电路制造技术、IC版图设计、ASIC测试和封装、FPGA(Gield Peogrammable Gate Array)/CPLD(Complex P
8、rogrammable Logic Device)编程下载和自动测试等技术。VHDL的英文全名是VHSIC(Very High Speed Integrated Circuit)Hardware Description Language,由IEEE(The Institute of Electrical and Electronics Engineets)进一步发展,并在1987年作为“IEEE标准1076”公布。从此VHDL成为硬件描述语言的业界标准之一。第一部分 设计要求一、设计目的为培养学生树立正确的设计思想和实事求是的工作作风,学习运用所学基础知识理论、专业知识、基本技能去分析和解决工
9、程技术实际问题,提高学生的综合素质,使学生成为工程应用型合格人才,故进行EDA技术及应用的课程设计。帮助学生全面熟悉、掌握VHDL语言基本知识,掌握利用VHDL语言对常用的的组合逻辑电路和时序逻辑电路编程,把编程和实际结合起来,熟悉编制和调试程序的技巧,掌握分析结果的若干有效方法,进一步提高上机动手能力,培养使用设计综合电路的能力,养成提供文档资料的习惯和规范编程的思想。二、系统要求设计一个简单的满足生活所需功能的出租车计费器。三、功能描述该计费器能实现计费功能。车起步开始计费,首先显示起步价,起步费为3.00元,车在行驶3km以内,只收起步价。车行驶超过3km后,每km 加2元,车费一次累加
10、。当遇到红灯或客户需要停车等待时,则按时间计费,计费单价为每20s收费1元。要求用2位数码管显示里程,2位数码管显示费用。四、补充说明(1).实现计费器预置功能,能够预置起步费、每公里收费、车行加费里程、计时收费等。(2).可以模拟汽车行驶、停止、暂停等状态,并根据不同状态进行计费。(3).以十进制显示出租车行驶路程与车费。第二部分 系统设计方案出租车自动计价器的系统方框图如图2.1所示:它有脉冲模块、控制模块、计程模块、计费模块及显示等模块组成控制模块显示模块计程模块计费模块显示位扫描1KHz脉冲时钟信号开始信号暂停信号停止信号图2.1 出租车自动计价器的系统方框图控制模块将其他模块进行连接
11、,是本次设计的核心。它包含计程器、计时器、计价器,同时还有读取外部开关控制信号,提供当前显示信号与显示位选信号,从而周期性交替显示计价/计费信息。计程器在非停车状态完成计程功能并产生里程计价信号,计时器在停车状态完成计时功能并产生等时计价信号。计价器是设计的核心与难点,涉及到多种时钟信号,并有多种计费标准。拟使用有限次高速脉冲发生器向一组级联的十进制计数器提供不同费率的计价脉冲,根据里程计价信号、等时计价信号、停车开关状态、当前计费结果等信号,综合考虑,挑选适合次数的计价脉冲,从而实现不同条件的不同计费。计程器、计价器根据位选信号,输出相应数据的当前选中数字,由顶层模块根据显示数据类型变换信号
12、进行选择,传输给显示模块。显示模块由实验箱上的四个七段数码管、程序编写的一个七段数码管译码器程序组成。程序是本次设计的核心部分,首先要有清晰的思路,然后去实现,程序流程如图2.2所示。启动Start起步价:3元3公里以内超出3公里按2元/公里停车等待时按1元/20秒显示计费金额及行驶里程停止计费计程清零金额里程PauseStop图2.2 出租车自动计价器的程序流程图本次设计首先在ispLEVER环境中对出租车自动计费器的各个部分利用VHDL描述语言予以设计,进行仿真,然后编写顶层模块将各个模块连接,并对相互之间的信号进行必要处理,从而实现整机功能,最后在实验箱上进行物理测试,寻找漏洞、调整参数
13、,最终确定设计。第三部分 主要模块设计一、计程计费模块计程计费模块如图3.2所示:Clk MoneyStartStop DistancePause图3.1 计程计费模块计程计费部分用于计算乘客所行使的公里数及金额。计程器的量程为99公里,满量程自动归零;计费器的量程为99元,满量程自动归零。计程计费数据送入显示模块进行译码,最后分别送至以公里和元为单位对应的数据管上显示。二、显示模块显示模块如图3.3所示: Seg01KHzClk Seg1 Seg2 Seg3Money Seg4 Seg5 Seg6Distance Scan0 Scan1 Scan2 Scan3 图3.2 显示模块显示模块包含
14、一个3进制计数器Cnt,位选Scan0:3,四位Data转换,七段数码管译码器Seg0:6,如图3.2所示。当系统复位时,数码管一起显示0。开始计费时,计费为03,计程为00。具体程序代码详见附录。三、控制模块控制模块如图3.3所示:ClkStartPauseStop Scan0:3 Seg0:6Money1Distance1图3.3 控制模块控制模块部分用于计程计费模块的结合和衔接。如图3.3所示,总输入有Clk,Start,Pause,Stop,总输出有Scan0:3和Seg0:7,中间由信号Money1和Distance1连接。具体程序代码见附录top部分。该模块将计费数据、计程数据动态
15、选择输出。其中计费数据送入显示译码模块进行译码,最后送至十元、元为单位对应的数码管上显示,最大显示为99元;计程数据送入显示译码模块进行译码,最后送至以公里为单位的数码管上显示,最大显示为99公里。第四部分 仿真结果与分析一、计程计费模块仿真图4.1 计程计费模块仿真结果该模块的任务是当Start产生一个高脉冲后,计程计费开始,脉冲输入,进行计程计费,3公里内为3元,3公里后,每公里2元。当暂停信号(Pause)为1时,计程停止,按每20秒1元计费,当停止信号(Stop)时为1时,计程计费清零。如图4.1所示。二、总体仿真图4.2 总体仿真结果总体仿真如图4.2所示,当Start产生一个高脉冲
16、后,计程计费开始,clk为基本输入时钟即基本车速,Clk1kHz为数码管位扫描脉冲,即配合Scan对计程计费各位逐位显示。Seg6:0即为数码管显示编码,根据计程计费模块数据进行显示。具体程序代码见附录程序Display部分。第五部分 硬件调试一、引脚锁定做硬件验证之前需要清楚实验板上各键与各信号的链接情况,参照资料得出本设计中各引脚的对应情况,如图5.1所示:图5.1 引脚锁定表二、硬件验证情况做好引脚锁定后,连接线路后,打开硬件箱的电源,数码管有正确的数字显示,链接硬件箱与计算机开始验证。操作运行实验结果完全符合要求。通过仿真验证表明,本文所设计的出租车计价器能够正常地显示行驶的里程数和乘
17、客应付的费用,符合预定的计费标准和功能要求,如图5.2 所示:图5.2 实验箱实践结果d. 9公里时 计费15元c. 7公里时 计费11元b. 6公里时 计费9元a. 5公里时 计费7元总结短短一个月的EDA课程设计已经接近尾声了,我们从挑选课设题目,查阅资料,到研究出总体设计,详细设计,然后分工合作,再到最后的编程上机调试,修改程序,完善程序,收获颇多。出租车计费器系统的设计已全部完成,能按预期的效果进行模拟汽车启动,停止、暂停等功能,并设计动态扫描电路显示车费数目。车暂停时停止计费。若停止清零,等待下一次计费的开始。出租车计费系统设计中体现了VHDL覆盖面广,描述能力强,是一个多层次的硬件
18、描述语言及FPGA器件速度快,使用方便,便于修改等特点。本设计由于时间有限和经验的欠缺,不足之处还望老师予以指正。在这一段时间里我们再次熟悉和增强了对VHDL语言的基本知识,熟悉利用VHDL语言对常用的的组合逻辑电路和时序逻辑电路编程,把编程和实际结合起来。VHDL硬件描述语言打破了硬件和软件设计人员之间互不干涉的界限,可以使用语言的形式来进行数字系统的硬件结构、行为的描述,直接设计数字电路硬件系统。通过编程、下载后,该芯片已经具备了原来需要使用复杂的数字电路实现的功能;更加了解和加深了对编制和调试程序的技巧,进一步提高了上机动手能力,培养了使用设计综合电路的能力,养成了提供文档资料的习惯和规
19、范编程的思想。本次的课程设计将各个单一的模块实现其功能后,学会通过原理图或顶层文件把各模块连接,从而实现对出租车自动计费。课设注重的不仅是把理论知识巩固,而且应把理论和实际相结合,把知识应用到生活中。在课设过程中,遇到了不少问题,数码管无法正常显示,计费不按要求等。通过的对源代码的修改,发现了一些易忽略的细节。课设考验的是思维逻辑能力,对知识的灵活应用,当然,合作精神是不可或缺的。课设时间不长,要在短时间内完成绝不是个人力量能达到的,要学会集众人之精华,还要善于利用已有的工具为自己服务,开拓思维。在设计程序时,不能妄想一次就将整个程序设计好,反复修改、不断改进是程序设计的必经之路;要养成注释程
20、序的好习惯,一个程序的完美与否不仅仅是实现功能,而应该让人一看就能明白你的思路,这样也为资料的保存和交流提供了方便;在设计课程过程中遇到问题是很正常的,但应该将每次遇到的问题记录下来,并分析清楚,以免下次再碰到同样的问题。课程设计结束了,但是从中学到的知识会让我受益终身。发现、提出、分析、解决问题和实践能力的提高都会受益于我在以后的学习、工作和生活中。致谢EDA课程设计是我们专业课程知识综合应用的实践训练,着是我们迈向社会,从事职业工作前一个必不少的过程我今天认真的进行课程设计,学会脚踏实地迈开这一步,就是为明天能稳健地在社会大潮中奔跑打下坚实的基础通过这次设计,我们在多方面都有所提高。同时各
21、科相关的课程都有了全面的复习,独立思考的能力也有了提高。在这次设计过程中,体现出自己单独设计模具的能力以及综合运用知识的能力,体会了学以致用、突出自己劳动成果的喜悦心情,从中发现自己平时学习的不足和薄弱环节,从而加以弥补。不经意间,这段时间的课程设计已经接近尾声。在这次设计中,我学到了在设计这种思维很严密的报告中一定要按照老师给的要求和步骤一步一步的走下去。自己在动手之前一定要先有一个总体的设计,总的框架图,这样在设计中不至于手忙脚乱的或者丢三落四。在此感谢我们的老师.,老师严谨细致、一丝不苟的作风一直是我工作、学习中的榜样;老师循循善诱的教导和不拘一格的思路给予我无尽的启迪。在此感谢对我帮助
22、过的同学们,谢谢你们对我的帮助和支持,让我感受到同学的友谊。这次设计的每个细节和每个数据,都离不开老师您的细心指导。而您开朗的个性和宽容的态度,帮助我能够很顺利的完成了这次课程设计。参考文献1) EDA技术与VHDL 潘松 黄继业 编著 清华大学出版社2) EDA实用技术 宋嘉玉 孙丽霞 编著 人民邮电出版社3) VHDL电路设计实用技术 齐洪喜 陆颖 编著 清华大学出版社 4) EDA实用技术及应用 刘艳萍 高振斌 李志军 编著 国防工业出版社 5) EDA应用技术 章彬宏 主编 北京理工大学出版社 6) EDA应用技术及应用 姜波 郭宏 编著 哈尔滨工业大学出版社附录A 电路图一、电路图二
23、、PCB图三、3D仿真图附录B 程序代码一、top顶层文件library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity top isport(clk:IN STD_LOGIC; start:IN STD_LOGIC; stop:IN STD_LOGIC; pause:IN STD_LOGIC; clk1khz:in std_logic; scan:out std_logic_vector(3 downto 0); seg7: out std
24、_logic_vector(6 downto 0) );end top;architecture ttt of top iscomponent taxi port(clk:IN STD_LOGIC; start:IN STD_LOGIC; stop:IN STD_LOGIC; pause:IN STD_LOGIC; money:OUT INTEGER RANGE 0 TO 29; distance:OUT INTEGER RANGE 0 TO 29 );end component;component decoder port(clk1khz:in std_logic; money_in:in
25、integer range 0 to 29; distance_in: in integer range 0 to 29; scan:out std_logic_vector(3 downto 0); seg7: out std_logic_vector(6 downto 0);end component;signal money1:integer range 0 to 29;signal distance1: integer range 0 to 29;beginu1:taxi port map(clk,start,stop,pause,money1,distance1);u2:decode
26、r port map(clk1khz,money1,distance1,scan,seg7);end ttt;二、taxi控制模块library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity taxi isPORT(clk:IN STD_LOGIC; start:IN STD_LOGIC; stop:IN STD_LOGIC; pause:IN STD_LOGIC; money:OUT INTEGER RANGE 0 TO 29; distance:OUT INTEGER RANGE 0 TO 2
27、9);end;architecture one of taxi isbeginPROCESS(clk,start,stop,pause)VARIABLE money_reg:INTEGER RANGE 0 TO 29;VARIABLE distance_reg:INTEGER RANGE 0 TO 29;VARIABLE num:INTEGER RANGE 0 TO 9;VARIABLE time1:INTEGER RANGE 0 TO 20;BEGIN IF stop=1THEN money_reg:=0;distance_reg:=0;num:=0;ELSIF start=1THEN mo
28、ney_reg:=3;distance_reg:=0;num:=0;ELSIF clkEVENT AND clk=1THENIF pause=1 THEN IF time1=20 THEN time1:=0;money_reg:=money_reg+1;ELSE time1:=time1+1;END IF;ELSIF start=0AND pause=0AND stop=0THENtime1:=0;IF num =9 THEN num:=0; distance_reg:=distance_reg+1;IF distance_reg3 THEN money_reg:= money_reg+2;E
29、ND IF;ELSE num:=num+1;END IF;END IF;END IF;money=money_reg;distance=distance_reg;END PROCESS;END;三、display显示模块library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity decoder isport(clk1khz:in std_logic;money_in:in integer range 0 to 29;distance_in: in integer range 0 to 29;sc
30、an:out std_logic_vector(3 downto 0);seg7: out std_logic_vector(6 downto 0);end;architecture one of decoder issignal data:std_logic_vector(3 downto 0);signal m_one,m_ten:std_logic_vector(3 downto 0);signal d_one,d_ten:std_logic_vector(3 downto 0);beginprocess(clk1khz,money_in)variable comb1:integer r
31、ange 0 to 29;variable comb1_a,comb1_b:std_logic_vector(3 downto 0);begin if clk1khzevent and clk1khz=1 then if comb1money_in thenif comb1_a=9 and comb1_b=9 thencomb1_a:=0000;comb1_b:=0000; comb1:=0;elsif comb1_a=9 then comb1_a:=0000;comb1_b:=comb1_b+1;comb1:=comb1+1;elsecomb1_a:=comb1_a+1;comb1:=com
32、b1+1;end if;elsif comb1=money_in thenm_one=comb1_a;m_tenmoney_in thencomb1_a:=0000;comb1_b:=0000;comb1:=0;end if;end if;end process;process(clk1khz,distance_in)variable comb2:integer range 0 to 29;variable comb2_a,comb2_b:std_logic_vector(3 downto 0);beginif clk1khzevent and clk1khz=1 then if comb2d
33、istance_in thenif comb2_a=9 and comb2_b=9 thencomb2_a:=0000;comb2_b:=0000;comb2:=0;elsif comb2_a=9 thencomb2_a:=0000;comb2_b:=comb2_b+1;comb2:=comb2+1;elsecomb2_a:=comb2_a+1;comb2:=comb2+1;end if;elsif comb2=distance_in thend_one=comb2_a;d_tendistance_in thencomb2_a:=0000;comb2_b:=0000;comb2:=0;end
34、if;end if;end process;process(clk1khz,m_one,m_ten,d_one,d_ten)variable cnt:std_logic_vector(1 downto 0);beginif clk1khzevent and clk1khz=1thencnt:=cnt+1;end if;case cnt iswhen00=data=m_one;scandata=m_ten;scandata=d_one;scandata=d_ten;scanseg7seg7seg7seg7seg7seg7seg7seg7seg7seg7seg7=1111111;end case;end process;end;-24-