1、EDA课程设计出租车计价器131引言为培养学生树立正确的设计思想和实事求是的工作作风,学习运用所学基础知识理论、专业知识、基本技能去分析和解决工程技术实际问题,提高学生的综合素质,使学生成为工程应用型合格人才,故进行EDA技术及应用的课程设计。帮助学生全面熟悉、掌握VHDL语言基本知识,掌握利用VHDL语言对常用的的组合逻辑电路和时序逻辑电路编程,把编程和实际结合起来,熟悉编制和调试程序的技巧,掌握分析结果的若干有效方法,进一步提高上机动手能力,培养使用设计综合电路的能力,养成提供文档资料的习惯和规范编程的思想。本文借助EDA实验室的仿真软件以及试验箱设计一个出租车计价器,要求显示里程和金额。
2、行程小于基本里程时,显示起步价,基本里程、起步价要求可通过按键自己设定;行程大于基本里程时,每多行一公里,在起步价上加X元,X可由按键设定;当出租车等待时,由司机按下等候键,每等待一分钟加Y元,Y可由按键设定系统中所需脉冲均由实验箱的晶振分频提供。2系统组成及设计原理2.1系统组成方框图出租车自动计价器的系统方框图如图1所示:它有分频模块、控制模块、计时模块、计费模块及显示等模块组成。 图1.出租车自动计价器的系统方框图2.2出租车自动计价器原理图出租车自动计价器原理图如图2所示:它有输入信号clk,start,single,stop,mile;输出信号min1,min2,km1,km2,pr
3、ice1, price2, price3, price4。图2.出租车自动计价器原理图2.3出租车自动计价器原理(1) 车速控制模块当起停键为启动状态时(高电平),模块根据车速选择和基本车速发出响应频率的脉冲驱动计费器和里程显示模块进行计数;当处于停止状态时暂停发出脉冲,此时计费器和里程显示模块相应的停止计数。(2) 里程动态显示模块其包括计数车速控制模块发出的脉冲以及将计数显示动态显示出来,每来一个脉冲里程值加0.1(控制器每发一个脉冲代表运行了0.1公里)。(3) 计费动态显示模块其初值为10元,当里程超过3公里后才接受计数车速控制模块发出的脉冲的驱动,并且计数显示动态显示出来,每来一个脉
4、冲(代表运行了0.5公里)其数值加1元,当收费超过20时数值加1.5元。3计价器系统模块设计3.1控制模块控制模块是系统的核心部分,对计价器的状态进行控制。3.2计量模块计量模块完成计价、计时、计程功能。行程3公里内,起步费为8元;3公里外以每公里1元计费,等待累计时间1分钟外以每分钟1元计费。20公里外以每公里1.5元计费,等待累计时间1分钟外以每分钟1.5元计费。计费数据送入显示译码模块进行译码,最后送至以百元、十元、元、角为单位对应的数码管上显示。计时部分用于计算乘客的等待累计时间。计时器的量程为59分,满量程自动归零。即时数据送入显示译码模块进行译码,最后送至以分为单位对应的数据管上显
5、示。计程部分用于计算乘客所行使的公里数。计程器的量程为99公里,满量程自动归零。计程数据送入显示译码模块进行译码,最后送至以公里为单位对应的数据管上显示。3.3译码显示模块译码显示模块完成计价、计时、计程数据显示。该模块经过8选1选择器将计费数据(4位BCD码)、计时数据(2位BCD码)、计程数据(2位BCD码)动态选择输出。其中计费数据送入显示译码模块进行译码,最后送至百元、十元、元、角为单位对应的数码管上显示,最大显示为999.9元;计时数据送入显示译码模块进行译码,最后送至分为单位对应的数码管上显示,最大显示为99分钟;计程数据送入显示译码模块进行译码,最后送至以公里为单位的数码管上显示
6、,最大显示为99公里。4系统仿真及调试4.1仿真结果图4-1-1 系统仿真图图4-1-2系统仿真图图中clk栏为黑阴影是因为时钟频率太大,周期太小。5系统硬件设计5.1引脚锁定 做硬件验证之前需要清楚实验板上各键与各信号的链接情况,参照资料得出本设计中各引脚的对应情况如下,本设计下载时选择模式5。引脚锁定如图3所示:图3.引脚锁定图5.2硬件验证情况做好引脚锁定后,打开硬件箱的电源,数码管有正确的数字显示,链接硬件箱与计算机开始验证。操作运行实验结果完全符合要求。通过仿真验证表明,本文所设计的出租车计价器能够正常地显示行驶的里程数和乘客应付的费用,符合预定的计费标准和功能要求。6课程设计结束语
7、通过一个多星期的课程设计,从选题到查资料,从完善原理图到写报告文档,让我明白了课程设计是名副其实的综合性训练,不仅要运用学过的EDA技术及应用,数字电路、模拟电路以及电子技术实验等知识,还要学会查阅各种图书资料和工具书,并将新知识和所学的结合起来为自己所用。在做整个课程设计的过程中,我进一步熟悉使用了QuartusIII仿真软件,能较好的应用这个软件,不管是文本程序的编写还是在顶层原理图的设计都有所提高,还增强了动手能力。应用软件的时候,要注意积累每次的体会和错误,下次碰到该注意的地方就要小心点,碰到出过错误的地方就要格外注意不要再犯同样的错误,这种方法应该适用做任何一件事吧。在设计中遇到一些
8、困难和问题,在向老师请教和与同学的讨论中,解决了问题,觉得很有收获。在整个课程设计的过程中让我意识到耐心、毅力和细心是做好一件事的必须品质。在应用QuartusIII软件的时候,有很多小细节是需要注意的,不然一不小心就会出现很多错误。文本程序编辑的时候,保存要注意后缀名,保存文件名和实体名要一致,保存位置要是某个盘里的某个文件夹,这三个注意点特别重要,因为其中任何一点都会引发一系列的错误。检查这三点无误后,然后再可以按照运行报告来对程序进行完善。图形编辑中同样有很多需要注意的地方,以及怎样将文本和图形结合起来。通过这次设计,我更好地掌握了这些基本技巧,学会了多学多练,也懂得了实践出真知。本次课
9、程已经结束,在一周的课程设计中,我学到很多的道理,在以后的学习中,我会更加注重对实际操作及编程的掌握,我相信在本次课设以后,我对EDA的理解将更加深刻。参考文献1.朱正伟主编,EDA技术及应用,清华大学出版社,20052.黄智伟等主编,FPGA系统设计与实践,电子工业出版社,20043.沈明山主编,EDA技术及可编程器件应用实训,科学出版社,20044. EDA技术实用教程(第三版) 潘松、黄继业 编著 科学出版社,2003附录出租车计价器源程序library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;en
10、tity taxi isport(clk:in std_logic; start,single:in std_logic; stop,mile:in std_logic; min1,min2:out std_logic_vector(3 downto 0); km1,km2:out std_logic_vector(3 downto 0); price1,price2,price3,price4:out std_logic_vector(3 downto 0);end;architecture bhv of taxi issignal f_mile1,f_mile2,f_mile_r,star
11、t_r:std_logic;signal clk1hz:std_logic;signal q:integer range 0 to 299;signal second:integer range 0 to 59;signal p1,p2,p3,p4:std_logic_vector(3 downto 0);signal k1,k2:std_logic_vector(3 downto 0);signal m1,m2:std_logic_vector(3 downto 0);signal en0,en1,f_wait,f:std_logic;beginmin1=m1;min2=m2;km1=k1;
12、km2=k2;price1=p1;price2=p2;price3=p3;price4=p4;U1:process(clk) begin if(clkevent and clk=1)then if q=255 then q=0; clk1hz=1; else q=q+1; clk1hz=0; end if; end if; end process;U2:process(clk1hz) begin if start=0 then f_wait=0; elsif(clk1hzevent and clk1hz=1)then if stop=1 then if second=29 then secon
13、d=0; f_wait=1; if m1=1001 then m1=0000; if m2=0101 then m2=0000; else m2=m2+1; end if; else m1=m1+1; end if; else f_wait=0; second=second+1; end if; else f_wait=0; end if; end if; end process;U3:process(clk1hz)begin if(clk1hzevent and clk1hz=1)then start_r=start; end if;end process;f=f_wait when sto
14、p=1 else mile when en0=1 else 0;U4:process(start,mile) begin if start=0 then k1=0000; k2=0000; en0=0; en1=0; elsif(mileevent and mile=1)then if stop=0 then if k1=1001 then k1=0000; if k2=1001 then k2=0000; else k2=k2+1; end if; else k1=k1+1; end if; if k1=0011 then en0=1; end if; if k2=0001 and k1=1
15、001 and single=1 then en1=1; end if; else k1=k1; k2=k2; end if; end if; end process;U5:process(start,f) begin if start=1 and start_r=0 then p1=0000; p2=1000; p3=0000; p4=0000; elsif(fevent and f=1)then if en1=0 then if p2=1001 then p2=0000; if p3=1001 then p3=0000; if p4=1001 then p4=0000; else p4=p
16、4+1; end if; else p3=p3+1; end if; else p2=p2+1; end if; else if(p1=0101 and p2=1000) or p2=1001 then if(p2=1001 and p1=0101)then p1=0000; p2=0001; elsif(p2=1001 and p1=0000) then p1=0101; p2=0000; elsif(p2=1000 and p1=0101)then p1=0000; p2=0000; end if; if p3=1001 then p3=0000; if p4=1001 then p4=0000; else p4=p4+1; end if; else p3=p3+1; end if; elsif p1=0000 then p1=0101; p2=p2+1; else p1=0000; p2=p2+0010; end if; end if; end if; end process;end bhv;