出租车自动计费器
一.设计
1、 设计一个出租车自动计费器,具有行车里程计费、等候时间计费、及起价三部分,用四位数码管显示总金额,最大值为99。99元;
2、 行车里程单价1元/公里,等候时间单价0。5元/10分钟,起价3元(3公里起价)均能通过人工输入。
3、 行车里程的计费电路将汽车行驶的里程数转换成与之成正比的脉冲数,然后由计数译码电路转换成收费金额,实验中以一个脉冲模拟汽车前进十米,则每100个脉冲表示1公里,然后用BCD码比例乘法器将里程脉冲乘以每公里单价的比例系数,比例系数可由开关预置。例如单价是1。0元/公里,则脉冲当量为0。01元/脉冲。
4、 用LED显示行驶公里数,两个数码管显示收费金额。
二.原理描述
利用层次化设计理论,将设计问
自顶向下可分为分频模块,控制模块,计量模块和显示模块。系统框图如下图1:
图1
2.1分频模块
分频模块对频率为240Hz的输入脉冲进行分频,得到15Hz,16Hz,1Hz的3种频率,该模块产生频率信号用于计费。
2.2计量控制模块
计量控制模块是出租车自动计费器系统的主体部分,该模块主要完成等待计时功能,计价功能和计程功能。
计时功能的主要任务是计算乘客的等待累计时间,计时器的量程为59分,满量程自动清零。计程功能的主要任务是计算乘客所行使的公里数,计程器的量程为99公里,满量程自动归零。
三.实验程序
3.1出租车计价器VHDL程序
通过VHDL语言的顺序语句根据一个或者一组条件选择某一特定的执行通道,生成计费数据,计时数据和里程数据。
1. 出租车计价器VHDL程序
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity taxi is
port ( clk_240 :in std_logic; --频率为240Hz的时钟
start :in std_logic; --计价使能信号
stop:in std_logic; --等待信号
fin:in std_logic; --公里脉冲信号
cha3,cha2,cha1,cha0:out std_logic_vector(3 downto 0); --费用数据
km1,km0:out std_logic_vector(3 downto 0); --公里数据
min1,min0: out std_logic_vector(3 downto 0)); --等待时间
end taxi;
architecture behav of taxi is
signal f_15,f_16,f_1:std_logic; --频率为15Hz,16Hz,1Hz的信号
signal q_15:integer range 0 to 15; --分频器
signal q_16:integer range 0 to 14; --分频器
signal q_1:integer range 0 to 239; --分频器
signal w:integer range 0 to 59; --秒计数器
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); --分的个位计数器
signal en1,en0,f:std_logic; --使能信号
begin
feipin:process(clk_240,start)
begin
if clk_240'event and clk_240='1' then
if start='0' then q_15<=0;q_16<=0;f_15<='0';f_16<='0';f_1<='0';f<='0';
else
if q_15=15 then q_15<=0;f_15<='1'; --此语句得到频率为15Hz的信号
else q_15<=q_15+1;f_15<='0';
end if;
if q_16=14 then q_16<=0;f_16<='1'; --此语句得到频率为16Hz的信号
else q_16<=q_16+1;f_16<='0';
end if;
if q_1=239 then q_1<=0;f_1<='1'; --此语句得到频率为1Hz的信号
else q_1<=q_1+1;f_1<='0';
end if;
if en1='1' then f<=f_15; --此语句得到计费脉冲f
elsif en0='1' then f<=f_16;
else f<='0';
end if;
end if;
end if;
end process;
main:process(f_1)
begin
if f_1'event and f_1='1' then
if start='0' then
w<=0;en1<='0';en0<='0';m1<="000";m0<="0000";k1<="0000";k0<="0000";
elsif stop='1' then
if w=59 then w<=0; --此语句完成等待计时
if m0="1001" then m0<="0000"; --此语句完成分计数
if m1<="101" then m1<="000";
else m1<=m1+1;
end if;
else m0<=m0+1;
end if;
if m1&m0>"0000001"then en1<='1'; --此语句得到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'; --此语句得到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 main;
jifei:process(f,start)
begin
if start='0' then c3<="0000";c2<="0011";c1<="0000";c0<="0000";
elsif f'event and f='1' then
if c0="1001" then c0<="0000"; --此语句完成对费用的计数
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 jifei;
end behav;
该程序包含3个进程模块。fepin进程对频率为240Hz的输入脉冲进行分频,得到3种计费频率信号,供main进程和计费进程进行计费,计时,计程只用;main进程完成等待计时功能,计程功能,该模块将等待时间和行使公里数变成秒冲个数计算,jifei进程将起步价3元预先固定在电路中,通过对计费脉冲个数的统计,计算出整个费用数据。
源程序中输入信号fin是汽车传感器提供的距离脉冲信号;start为汽车计价启动信号,当start=1时,表示开始计费,此时将计价器计费数据初值送入,计费信号变量,里程数清零,计时计数器清零;stop为汽车停止信号,当stop=1时,表示停车等待状态,并开始等待计时计费。
3.2.译码显示
通过将计费数据(4位BCD码),计程数据(2位BCD码)送入显示译码模块进行译码,其中计费数据最后送至以百元,十元,元,角为单位对应数码管上显示,最大为999.9元,计程数据送入显示译码模块进行译码,最后送至以公里为单位的数码管上显示。
七段数码管显示译码器的VHDL源程序
LIBRARY IEEE;
USE IEEE.std_logic_1164.all;
USE IEEE.std_logic_unsigned.all;
ENTITY di_LED IS;
Port(d:in std_logic_vector(3 downto 0);
q:out std_logic_vector(6 downto 0);
end di_LED;
architecture rtl of di_LED is
begin
process(d)
begin
case d is
when “0000”=>q<=”0111111”;--gfedcba
when “0001”=>q<=”0000110”;
when “0010”=>q<=”1011011”;
when “0011”=>q<=”1001111”;
when “0100”=>q<=”1100110”;
when “0101”=>q<=”1101101”;
when “0110”=>q<=”1111101”;
when “0111”=>q<=”0100111”;
when “1000”=>q<=”1111111”;
when others=>q<=”1101111”;
end case;
end process;
end rtl;
源程序中输入信号d[3..0]为BCD码输入,q[6..0]为七段译码输出。
四.仿真图形
根据图1给出的出租车自动系统框图,出租车自动计费器可分为出租车自动计费器系统的主体taxi模块,计数器模块和七段数码显示译码器模块。按已确立的模块和程序,在第三方仿真软件modelsim中,得到的出租车自动计费器的仿真图形如图2。
图2
五.实验总结与心得体会
经过这次的实验设计,我有了很深的体会。对于muxplus2和quartus2软件的使用也更加的得心应手。在这个过程中我们遇到了很多的问题。为了解决这些问题我努力通过各种渠道寻找解决问题的方法。上网查资料、问同学、图书馆查资料、问,其实最有效的方法还是自己去想。那样学到的西才会更加的深刻记得时间也是最长的,他人的帮助当然是很好的,但只是暂时的要想真正的学到东西还是要靠自己去想办法。不能一有问题就希望要他人帮忙,一定自己先好好想想实在解决不了的再去问老师找同学。最后同学的帮组下利用modelsim第三方仿真软件得到了上述的仿真图形。当然在这个设计中还存在很多的不足,但我相信随着以后学习的升入自己肯定能够熟练的设计出一个更好的出租车计费器。