湖南人文科技学院课程设计报告课程名称: VHDL语言与EDA课程设计~设计题目:出租车自动计价器设计系别:专业:班级:学生姓名:学号:起止日期: 2011年6月13日~2011年6月26日$指导教师:教研室主任:摘要随着我国社会经济的全面发展,各大中小城市的出租车营运事业发展迅速,出租车已经成为人们日常出行选择较为普遍的交通工具。
出租车计价器是出租车营运收费的专用智能化仪表,是出租车市场规范化、标准化以及减少司机与乘客之间发生纠纷的重要设备。
一种功能完备、简单易用、计量准确的出租车计价器是加强出租车行业管理、提高服务质量的必备品。
根据预定的设计要求和设计思路,我们使用VHDL硬件描述语言设计了一个实际的基于Altera FPGA芯片的出租车自动计价器系统,介绍了该系统的电路结构和程序设计。
通过在软件中编译和下载测试,得到了仿真波形和关键的设计结果。
经过在实验箱上进行硬件测试,证明该出租车计价系统具有实用出租车计价器的基本功能,如能进一步完善,将可以实用化和市场化。
关键词:出租车自动计价器;VHDL; FPGA ;目录设计要求 ................................................. 错误!未定义书签。
1、方案论证与对比 ........................................ 错误!未定义书签。
方案一................................................ 错误!未定义书签。
方案二................................................ 错误!未定义书签。
两种方案的对比........................................ 错误!未定义书签。
2、实验步骤和设计过程 .................................... 错误!未定义书签。
计程模块.............................................. 错误!未定义书签。
等待计时模块.......................................... 错误!未定义书签。
计费模块.............................................. 错误!未定义书签。
3、调试与操作说明 ........................................ 错误!未定义书签。
中的VHDL程序......................................... 错误!未定义书签。
程序的编译与及仿真波形................................ 错误!未定义书签。
程序的下载与功能的测试................................ 错误!未定义书签。
4、课程设计心得体会 ...................................... 错误!未定义书签。
5、元器件及仪器设备明细 .................................. 错误!未定义书签。
6、参考文献 .............................................. 错误!未定义书签。
7、致谢 .................................................. 错误!未定义书签。
出租车自动计价器设计设计要求设计一个出租车自动计费器,具有行车里程计费、等候时间计费、及起价三部分,用四位数码管显示总金额,最大值为元,行车里程单价1元/公里,等候时间单价元/10分钟,起价3元(3公里起价)。
设计的主要技术指标如下:1) 计价范围: 0~元计价分辨率:元2) 计程范围:0~99公里计程分辨率: 1公里3) 计时范围:0~59分计时分辨率: 1分1、方案论证与对比根据本课程设计要求,需要对出租车当行驶公里数和等待时间两种情况对应进行计数计费,同时要求显示出对应行驶公里数、等待时间和出租车费用,我们想到了以下两种方案。
方案一用分频器将外部时钟分为三路频率的信号,用来计时和计程,同时也供整个系统工作,通过设置使能信号,使系统自动对等待时间计时和对行驶公里数的计数,最后将所得结果分别在数码管上显示出来。
图 1 方案一设计结构图方案二各部分主要功能包括:信号输入模块对车轮传感器传送的脉冲信号进行计数,并以高低脉冲模拟出租汽车启动、停止按钮,具有输入信号作用;数据转换模块将计费模块输出的车费和路程转换成十进制数据;译码/动态扫描模块将路程与费用的数值译码后用动态扫描的方式驱动数码管[5];数码管显示模块将公里数和计费金额显示出来。
图2 方案二设计结构图两种方案的对比经分析,两种方案都要通过模块组合来实现出租车计价器的功能。
方案一模块数量比方案二多一些,但思路简单,各模块程序也相对简单,因此较容易实现,适合我们初学EDA的编程设计。
方案二模块较少,但单个模块功能要求较高,程序复杂。
所以,我们选择方案一。
2、实验步骤和设计过程计程模块计程模块:根据提供的里程脉冲信号fin,计算乘客上车后出租车所行驶的里程数。
fin每来一个上升沿,计程模块实现一次计数,里程数就加1。
当行驶里程大于3Km时,本模块中en0信号变为1;进行行驶公里都计费。
等待计时模块等待计时模块:根据分频得到的时钟信号f_1,计算乘客的等待累计时间。
计时器的量程为59min,满量程归零。
等待时间大于3min时,本模块中en1信号变为1;f_1每来一个上升沿,计量模块实现一次计数,等待时间加1。
计费模块计费模块:实现计价、计时和计程的数据计费。
计量模块实现对于出租车在行驶和等待过程中的里程数和计时功能:计费时钟每来一个上升沿,计量模块实现一次计数,里程数或者等待时间加1。
当行驶里程大于3Km时,本模块中en0信号变为1;进行的是行驶公里数大于3公里以每公里元计费的操作;当等待时间大于2min时,本模块中en1信号变为1,进行的是等待时间大于2分钟以每分钟元计费的操作;最后用cha3,cha2,cha1,cha0来组成的4位数显示总费用,最大显示为元。
3、调试与操作说明中的VHDL程序根据设计要求我们写出了VHDL程序:library ieee;useuseuseentity taxi is --定义实体[3]port ( clk_256 :instd_logic; --频率为256Hz的时钟start :instd_logic; --计价使能信号stop:instd_logic;--等待信号fin:instd_logic;--公里脉冲信号cha3,cha2,cha1,cha0:out std_logic_vector(3 downto 0); --费用数据km1,km0:out std_logic_vector(3 downto0); --公里数据min1,min0: out std_logic_vector(3 downto0)); --等待时间end taxi;architecture behav of taxi issignalf_16,f16,f_1:std_logic;signal q_16:integer range 0 to15; --分频器signal q16:integer range 0 to15; --分频器signal q_1:integer range 0 to255; --分频器signal w:integer range 0 to59; --秒计数器signal c3,c2,c1,c0:std_logic_vector(3 downto 0); --制费用计数器signal k1,k0:std_logic_vector(3 downto 0); --公里计数器signal m1:std_logic_vector(2 downto 0); --分的十位计数器signal m0:std_logic_vector(3 downto 0); --分的个位计数器en1,en0,f:std_logic;--使能信号beginfenpin:process(clk_256,start) --分频器模块beginif clk_256'event and clk_256='1' thenif start='0' then q_16<=0;q16<=0;f_16<='0';f16<='0';f_1<='0';f<='0';elseif q_16=15 then q_16<=0;f_16<='1'; --此if语句得到频率为16Hz的信号else q_16<=q_16+1;f_16<='0';end if;if q16=15 then q16<=0;f16<='1'; --此if语句得到另一个频率为16Hz的信号else q16<=q16+1;f16<='0';end if;if q_1=255 then q_1<=0;f_1<='1'; --此if语句得到频率为1Hz的信号else q_1<=q_1+1;f_1<='0';end if;if en1='1' thenf<=f_16; --此if语句得到计费脉冲f elsif en0='1' then f<=f16;else f<='0';end if;end if;end if;end process;process(f_1) --等待计时模块if f_1'event and f_1='1' thenif start='0' thenw<=0;en1<='0';en0<='0';m1<="000";m0<="0000";k1<="0000";k0<="0000";elsif stop='1' then --等待计时模块if w=59 thenw<=0; --此if语句完成等待计时if m0="1001" thenm0<="0000"; --此if语句完成分计数if m1<="101" then m1<="000";else m1<=m1+1;end if;else m0<=m0+1;end if;if m1&m0>"0000001"thenen1<='1'; --此if语句得到en1使能信号else en1<='0';end if;else w<=w+1;en1<='0';end if;elsif fin='1' then --计程模块if k0="1001" thenk0<="0000"; --此if语句完成公里脉冲计数if k1="1001" then k1<="0000";else k1<=k1+1;end if;else k0<=k0+1;end if;if k1&k0>"00000010" thenen0<='1'; --此if语句得到en0使能信号else en0<='0';end if;else en1<='0';en0<='0';end if;cha3<=c3;cha2<=c2;cha1<=c1;cha0<=c0; --费用数据输出km1<=k1;km0<=k0;min1<='0'&m1;min0<=m0; --公里数据、分钟数据输出end if;end process;process(f,start) --计费模块[2]beginif start='0' then c3<="0000";c2<="0001";c1<="0000";c0<="0000";elsif f'event and f='1' thenif c0="1001" thenc0<="0000"; --此if语句完成对费用的计数if c1="1001" then c1<="0000";if c2="1001" then c2<="0000";if c3<="1001" then c3<="0000";else c3<=c3+1;end if;else c2<=c2+1;end if;else c1<=c1+1;end if;else c0<=c0+1;end if;end if;end process;end behav;程序的编译与及仿真波形在QuartusII新建项目,将设计的程序输入并以实体名为文件名保存[4],然后以保存后的文件为顶层文件建立工程,编译通过后新建波形文件,设置好输入参数后进行仿真,我们得到的仿真波形如图3:图3 出租车计价器程序的仿真波形从仿真波形中我们看出,当出租车行驶公里数(Km1,Km0组成的两位数)为16即出租车行驶了16公里,等待时间(min1,min0组成的两位数)为03,即等待3分钟时,对应的出租车计费显示是1650即元。