EDA设计课程设计出租车计费系统的VHDL设计
武汉工业学院计算机系出租车计费系统的VHDL设计课程:EDA设计班级:网络工程081姓名:学号:080510122日期:2011-11-28一、设计任务与要求(1)、能够实现计费功能费用的计算是按行驶里程收费,设出租车的起步价是5.00元,当里程小于3km里时,按起步价收费;当里程大于3km时每公里按1.3元计费。等待累计时间超过2min,按每分钟1.5元计费。所以总费用按下式计算:总费用=起步价+(里程-3km)*里程单价+等候时间*等候单价(2)、能够实现显示功能l 显示汽车行驶里程:用四位数字显示,显示方式为“XXXX”,单价为km。计程范围为099km,计程分辨率为1km。l 显示等候时间:用两位数字显示分钟,显示方式为“XX”。计时范围为059min,计时分辨率为1min。l 显示总费用:用四位数字显示,显示方式为“XXX.X”,单位为元。计价范围为999.9元,计价分辨率为0.1元。二、设计原理根据设计要求,系统的输入信号CLK,计价开始信号START,等待信号STOP,里程脉冲信号FIN。系统得输出信号有:总费用数CHA0 CHA3,行驶距离KM0 KM1,等待时间MIN0 MIN1 等。系统的元件框图如下:系统有两个脉冲输入信号clk_195、fin,两个控制输入开关start、stop;控制过程为:start作为计费开始开关,当start为高电平时,系统开始根据输入的情况计费。当有乘客上车并开始行驶时,fin脉冲到来,进行行驶计费,此时的stop需要置为0;如需停车等待,就把stop变为高电平,并去除fin输入脉冲,进行等待计费;当乘客下车且不等待时,直接将start置为0,系统停止工作;系统由分频模块、控制模块、计量模块和计费模块四部分组成。计量模块是整个系统实现里程计数和时间计数的重要部分;控制模块是实现不同计费方式的选择部分;设计通过分频模块产生不同频率的脉冲信号来实现系统的计费。计量模块采用1HZ的驱动信号,计费模块采用13HZ、15HZ的驱动信号;计量模块每计数一次,计费模块就实现13次或者15次计数,即为实现计时时的1.5 元/min、计程时的1.3元/km的收费;系统总体顶层框图为:三、设计步骤 (一)、分频模块 分频模块是对系统时钟频率进行分频,分别得到15HZ、13HZ、1HZ三种频率;本设计中通过三种不同频率的脉冲信号实现在计程车在行驶、等待两种情况下的不同计费。原理框图如下: 源程序如下:library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;entity fenpin2 isport ( clk_195 :in std_logic; -频率为195HZ的时钟 clk_13: out std_logic; -频率为13HZ的时钟 clk_15: out std_logic; -频率为15HZ的时钟 clk_1: out std_logic); -频率为1HZ的时钟end fenpin2;architecture rt1 of fenpin2 is signal q_13:integer range 0 to 12; -分频器 signal q_15:integer range 0 to 14; -分频器 signal q_1:integer range 0 to 194; -分频器 begin process(clk_195) beginif (clk_195'event and clk_195='1' )then if q_13=12 then q_13<=0;clk_13<='1' -此处产生13HZ频率的信号 else q_13<=q_13+1;clk_13<='0' end if;if q_15=14 then q_15<=0;clk_15<='1' -此处产生15HZ频率的信号 else q_15<=q_15+1;clk_15<='0' end if;if q_1=194 then q_1<=0;clk_1<='1' -此处产生1HZ频率的信号 else q_1<=q_1+1;clk_1<='0'end if; end if; end process;end rt1;分频模块的仿真波形图为:注:有图中的周期时间可以看出,三种输出的信号脉冲对应的频率比实现了1:13:15;(二)、计量模块 本模块实现对于出租车在行驶和等待过程中的继承和计时功能;当行驶里程大于3KM时,本模块中en0信号变为1;当等待时间大于2min时,本模块中en1信号变为1;clk1每来一个上升沿,计量模块实现一次计数,里程数或者等待时间加1;元件框图为:源程序如下:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity jiliang isport( s: in std_logic; -计量开始信号 fin: in std_logic; -里程脉冲信号 stop: in std_logic; -等待信号 clk1: in std_logic; -计量驱动信号 en1,en0:buffer std_logic; -计量输出的控制信号 k1,k0: buffer std_logic_vector(3 downto 0); -里程计数 m1,m0: buffer std_logic_vector(3 downto 0); -时间计数end jiliang;architecture rt2 of jiliang issignal w:integer range 0 to 59; -秒计数器beginprocess(clk1)begin if clk1'event and clk1='1' then -本语句实现clk1对计量模块的驱动 if s='0' then w<=0;en1<='0'en0<='0'm1<="0000"m0<="0000"k1<="0000"k0<="0000" elsif stop='1' then -等待计时开始标志 if w=59 then w<=0; if m0="1001" then m0<="0000" if m1="0101" then m1<="0000" else m1<=m1+1; end if; else m0<=m0+1; end if; -完成等待计时 if m1&m0>"00000001"then en1<='1'-等待时间大于2min输出使能信号en1 else en1<='0' end if; else w<=w+1;en1<='0' end if; elsif fin='1' then -行驶计程开始 if k0="1001" then k0<="0000" if k1="1001" then k1<="0000" else k1<=k1+1; end if; else k0<=k0+1; end if; -完成里程计数 if k1&k0>"00000010" then en0<='1' -行驶里程大于3KM输出使能信号en0 else en0<='0' end if; else en1<='0'en0<='0' -clk1不驱动,使能信号为0 end if; end if;end process;end rt2;计量模块的仿真波形图为:注:由图可以看出,在fin脉冲到来时,k1、k0进行计数,en0在每进行一次加法计数时就输出一次高电平;当stop为高电平时,即为进入等待计时,m1、m0进行计数,en1在每进行一次计时计数的时候输出一个高电平;(三)、计费模块 本模块根据输入的clk2信号变化,调节费用的计数,c0、c1、c2、c3分别表示费用的显示。原理框图为:源程序如下:library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;entity jifei isport(clk2:in std_logic; -计费驱动信号 start: in std_logic; -计费开始信号 c0,c1,c2,c3: buffer std_logic_vector(3 downto 0);end jifei;architecture rt3 of jifei isbeginprocess(clk2,start)begin if start='0' then c3<="0000"c2<="0000"c1<="0101"c0<="0000" -对于起步价进行了限定 elsif clk2'event and clk2='1' then if c0="1001" then c0<="0000" if c1="1001" then c1<="0000" if c2="1001" then c2<="0000