EDA技术课程设计任务书1 概述 (1)2 总体设计 (2)2.1 设计要求 (2)2.2 设计思路 (2)2.3 设计流程图 (2)2.4 总体设计封装图 (4)2.5 各信号说明 (4)3 模块设计 (5)3.1秒分频模块 (5)3.2控制模块 (5)3.3计量模块 (5)3.3.1计价部分 (5)3.3.2计时部分 (5)3.3.3计程部分 (5)3.4译码显示模块 (5)4程序调试运行 (6)5硬件验证 (8)5.1引脚锁定 (8)5.2硬件验证情况 (8)6 总结及体会 (9)参考文献 (10)附录(程序源代码) (11)随着我国国民经济生产总值的增加以及人民生活水平的提高,各大中小城市的出租车营运事业发展迅速,出租车已经成为人们日常出行选择较为普通的交通工具。
出租车计价器是出租车营运收费的专用智能化仪表,是使出租车市场规化、标准化的重要设备。
一种功能完备,简单易用,计量准确的出租车计价器是加强出租车行业管理,提高服务质量的必需品。
本设计采用VHDL硬件描述语言作为设计手段,采用自顶向下的设计思路,得到一种出租车计价系统的软件结构,通过QuartusⅡ软件下进行仿真,证明所设计的电路系统完成了出租车计价的功能,各项指标符合设计要求。
该设计虽然功能简单,智能化水平比较低,但仍具有一定的实用性。
该设计是在VHDL的基础上对出租车计价器进行设计来实现其基本功能的,与以往的基于单片机的数模混合电路相比,FPGA具有稳定性好、抗干扰能力强、电路实现简单、程序简单等优点,且非常适合做为出租车计价器的控制核心,所以选择用VHDL来对计价器进行设计来实现其功能。
出租车计价器的实现将大大改善人们出行时因为讨价还价而带来的烦恼,从而使人们的心情比较愉悦。
本设计是对出租车计价器的四个模块进行分析的,综述如下:分频模块:分频模块是其它模块的基础,输入时钟选为32Hz,分频后的时钟频率为1Hz,为后续模块提供基本时钟。
等待时间模块:该模块针对乘客确认下车前的等待而言,比如堵车、中途下车的情况,通过1Hz脉冲计数,每一分钟计时加一,最大计时时间显示为99分钟。
路程模块:该模块是对车辆行驶路程进行计数,以1Hz时钟为基础,检测行程脉冲,路程模块中有部变量来判断路程,当大于3公里、20公里时,分别有相应的使能信号对此作出记录,最大路程显示为99公里。
计费模块:该模块是基于等待时间模块和路程模块对费用进行控制的。
通过部使能信号分别计算3公里以、3-20公里以及20公里以后的费用。
本设计是基于VHDL进行编程,然后在Qu artusⅡ进行波形仿真,实现出租车计价器的基本功能。
2 总体设计2.1 设计要求(1)起步价为8.00元,起步公里为3公里;(2)超过3公里,每公里按1元收费;(3)单程行驶里程超过20公里,每公里租价加收50%;(4)等候时间超过1分钟,每分钟按这公里的租价计算。
要求显示里程、计费及等候时间。
乘客上车后,按下启动键,开始计费,除非同一乘客往返用那个车,否则按下单程键,这样行驶里程超过20公里时,每公里加收50%,既每公里租费1.5元;计费显示为3位整数、1位小数。
2.2 设计思路输入2个时钟信号,分别模拟时间和路程。
对等待时间、路程计数,进而统计费用。
系统结构框图如图2-1。
图2-1自动计价器的系统方框图 上图中,计数器1对分频后的1Hz 脉冲计数,计数60次,计数器加1,对应等待时间,计数器2对车速脉冲计数,其上升沿到来计数加1,对应里程。
2.3 设计流程图设计流程图如图2-2所示。
控制器图2-2系统设计流程图乘客上车后,按下启动按钮,计价器开始工作,首先进入初始化状态,即计程从0开始,计费从8开始。
再根据单程信号判断是否为单程,进而确定计费方式。
单程:里程计数器开始计数,当路程超过3公里时,计费开始累加,按1元每公里计算,路程超过20公里时每公里1.5元。
当路程超过3公里有等待时,按下等待信号,每等待1分钟费用与当前计费方式相同。
往返:每公里1元,等待计费为每分钟1元。
乘客下车后,按下复位键,则所有计数器进入初始状态。
2.4 总体设计封装图总体设计封装图如图2-3所示。
图2-3 系统封装图2.5 各信号说明输入信号: clk:系统时钟信号;mile:车速时钟;start::启动信号,当start=1时,出租车启动,计数器开始计数;否则计数器停止计数;single:单程信号,单程时由司机输入;stop:等待信号,处于等待状态时由司机输入;输出信号:km1,km2:里程,单位为公里;min1,min2:等待时间,单位为分钟;price1,price2,price3,price4:费用,单位为元,其中price1表示小数位。
3 模块设计3.1秒分频模块秒分频模块对频率为240Hz的输入脉冲进行分频,得到的频率为16Hz,15Hz 和1Hz的三种频率。
该模块产生频率信号用于计费,每个1HZ脉冲为0.1元计费控制,15HZ信号为1.5元的计费控制,16Hz信号为1.6元计费控制。
3.2控制模块控制模块是系统的核心部分,对计价器的状态进行控制。
3.3计量模块计量模块完成计价、计时、计程功能。
3.3.1计价部分行程3公里,起步费为8元;3公里外以每公里1元计费,等待累计时间1分钟外以每分钟1元计费。
20公里外以每公里1.5元计费,等待累计时间1分钟外以每分钟1.5元计费。
计费数据送入显示译码模块进行译码,最后送至以百元、十元、元、角为单位对应的数码管上显示。
3.3.2计时部分计时部分用于计算乘客的等待累计时间。
计时器的量程为59分,满量程自动归零。
即时数据送入显示译码模块进行译码,最后送至以分为单位对应的数据管上显示。
3.3.3计程部分计程部分用于计算乘客所行使的公里数。
计程器的量程为99公里,满量程自动归零。
计程数据送入显示译码模块进行译码,最后送至以公里为单位对应的数据管上显示。
3.4译码显示模块译码显示模块完成计价、计时、计程数据显示。
该模块经过8选1选择器将计费数据(4位BCD码)、计时数据(2位BCD码)、计程数据(2位BCD码)动态选择输出。
其中计费数据送入显示译码模块进行译码,最后送至百元、十元、元、角为单位对应的数码管上显示,最大显示为999.9元;计时数据送入显示译码模块进行译码,最后送至分为单位对应的数码管上显示,最大显示为99分钟;计程数据送入显示译码模块进行译码,最后送至以公里为单位的数码管上显示,最大显示为99公里。
4程序调试运行图4-1 单程行驶示意图启动键、单程键有效,由图4-1可知,3公里之计费显示为8元;3-20公里之间每公里1元累计;超过20公里每公里1.5元累计。
图4-2 单程行驶中途等待示意图启动键、单程键有效,行驶一段时间等待信号有效,等待后继续行驶。
由图4-2可知,3公里之计费显示8元,3-20公里之间每公里1元累加,中间等待信号有效,每等待一分钟按此时每公里的费用计算,里程计数器停止计数,等待时间到,里程计数器继续计数。
图4-3 单程行驶到达目的地示意图启动键、单程键有效,乘客到达目的地下车。
如图4-3所示。
图4-4 双程行驶示意图启动键有效,乘客乘车完成双程行驶。
由图4-4可知,3公里之计费显示为8元;3-20公里之间每公里1元累计;超过20公里每公里1元累计。
5硬件验证5.1引脚锁定做硬件验证之前需要清楚实验板上各键与各信号的情况,参照资料得出本设计中各引脚的对应情况如下,本设计下载时选择模式5。
引脚锁定如图5-1。
图5-1 引脚锁定图5.2硬件验证情况做好引脚锁定后,打开硬件箱的电源,数码管有正确的数字显示,硬件箱与计算机开始验证。
操作运行实验结果完全符合要求。
通过仿真验证表明,本文所设计的出租车计价器能够正常地显示行驶的里程数和乘客应付的费用,符合预定的计费标准和功能要求。
6 总结及体会通过为期一周的课程设计,出租车计价器系统的设计已基本完成,能按预期的效果模拟汽车启动、等待、停止、复位等功能,并显示车费数目等待时间及行驶路程。
出租车计费系统的设计中体现了VHDL覆盖面广,描述能力强,是一个多层次的硬件描述语言及CPLD器件速度快,使用方便,便于修改等特点,本设计在实用方面具有一定的价值。
在本次设计中还存在很多不足,可以改进的地方目前有以下几点:一、该设计虽然实现了基本的计费和计程,但是很多问题并没有解决,如本设计只实现了一种车速的计费。
若要实现出租车的不同档位下的计程计费,还需要进一步讨论。
二、该设计智能化水平较低,启动、等待、复位等信号需要人为输入,若在实际中出现操作偏差,会导致计费不准确。
通过此次课程设计,我们更进一步的深入了解了VHDL设计语言,并在使用过程中对它有了更深的体会。
对编程过程中可能遇到的问题有了一定的了解和解决方法,在理论学习和编程练习以及硬件测试方面都获得了较大的收获,对于今后进行程序设计有很大的帮助。
期间要感我的老师的悉心指导以及同学们的大力帮助。
在此次设计过程中确实遇到了很多困难,但是再大的困难只要有勇气去征服它,那就不是什么困难了。
此外,通过本次课程设计,我还有了一定的对学习上的体会,知识的真实魅力其实是在于它因为应用于实践中而产生的实际的生产价值,或者说是给人们带来的巨大的方便,因为它有用了所以我们学起来会更有动力,更能往深里去研究。
参考文献[1] Volei A. Pedroni. 《VHDL数字电路设计教程》.电子工业,2010.[2] 松,黄继业.《EDA技术实用教程》.科学,2010.6.[3] 江海.《EDA技术课程设计》.华中科技大学,2009.5.[3] 鲍可进,念强,不贿等.《数字逻辑电路设计》.清华大学,2004.[4] 王道宪,贺名臣,伟.《VHDL电路设计技术》.国防工业,2004.[5] 黄仁欣.《EDA技术实用教程》.清华大学,2006.[6] 徐向民.《数字系统设计及VHDL实践》.机械工业,2007.附录(程序源代码)出租车计价器源程序library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity hu 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 hu issignal start_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; km2<=k2;price1<=p1; price2<=p2;price3<=p3; price4<=p4;U1:process(clk)beginif(clk'event and clk='1')thenif q=255 thenq<=0;clk1hz<='1';elseq<=q+1;clk1hz<='0';end if;end if;end process;U2:process(clk1hz)beginif start='0' thenf_wait<='0';m1<="0000";m2<="0000";elsif(clk1hz'event and clk1hz='1')then if stop='1' thenif second=6 thensecond<=0;f_wait<='1';if m1="1001" thenm1<="0000";if m2="0101" thenm2<="0000";elsem2<=m2+'1';end if;elsem1<=m1+'1';end if;elsef_wait<='0';second<=second+1;end if;elsef_wait<='0';end if;end if;end process;U3:process(clk1hz)beginif(clk1hz'event and clk1hz='1')thenstart_r<=start;end if;end process;f<=f_wait when stop='1' elsemile when en0='1' else'0';U4:process(start,mile)beginif start='0' thenk1<="0000"; k2<="0000";en0<='0'; en1<='0';elsif(mile'event and mile='1')thenif stop='0' thenif k1="1001" thenk1<="0000";if k2="1001" thenk2<="0000";elsek2<=k2+'1';end if;elsek1<=k1+'1';end if;if k1="0011" thenen0<='1';end if;if k2="0001" and k1="1001" and single='1' then en1<='1';end if;elsek1<=k1;k2<=k2;end if;end if;end process;U5:process(start,f)beginif start='0' thenp1<="0000";p2<="0000";p3<="0000";p4<="0000";elsif start='1' and start_r='0' then p1<="0000";p2<="1000";p3<="0000";p4<="0000";elsif(f'event and f='1')thenif en1='0' thenif p2="1001" thenp2<="0000";if p3="1001" thenp3<="0000";if p4="1001" thenp4<="0000";elsep4<=p4+'1';end if;elsep3<=p3+'1';end if;elsep2<=p2+'1';end if;elseif(p1="0101" and p2="1000") or p2="1001" then if(p2="1001" and p1="0101")thenp1<="0000";p2<="0001";elsif(p2="1001" and p1="0000") thenp1<="0101";p2<="0000";elsif(p2="1000" and p1="0101")thenp1<="0000";p2<="0000";end if;if p3="1001" thenp3<="0000";if p4="1001" thenp4<="0000";elsep4<=p4+'1';end if;elsep3<=p3+'1';end if;elsif p1="0000" thenp1<="0101";p2<=p2+'1';elsep1<="0000";p2<=p2+"0010";end if;end if;end if;end process;end bhv;。