基于FPGA的出租车计费器课程设计程序

  • 格式:doc
  • 大小:405.00 KB
  • 文档页数:12

设计题目:出租车计费器

一、设计实验条件

QuartusII7.2

二、设计目标

1. 实现计费功能。按行驶里程计费,起步价为6.00元,并在车行驶3km后按1.2元/km计费,当计费器达到或超过20元时,每千米加收50%的车费,车停止和暂停时不计费;

2. 现场模拟汽车的起动、停止、暂停和换挡等状态;

3. 设计数码管动态扫描电路,将车费和路程显示出来,各有两位小数。

三、设计报告的内容

1. 前言

伴随中国经济的腾飞,城市化的进程也随之加快。虽然人们出行的选择趋于多样化,但是出租车作为一种重要的交通工具,也为很多人作为出行的选择。大城市里出租车已经相当普及,但是在中小城市出租车依然处于快速发展的阶段。

出租车的计费方式也在发生变化,由只能显示里程的方式变为现在的自主计费和打印发票及语音提示的智能化方式;根据出租车行业的发展需求,国内许多生产厂商也制造出不同类型的计价器,传统的出租车计费器经过十几年的使用,在稳定性,成本等方面都具有一定的优势。

利用FPGA设计出满足出租车不同计费需求的计费器,去满足当地出租车的计费需求。这个课题在实现计费功能的同时,也解决了传统出租车计费器系统的不足。出租车的需求不断的增大,因此,出租车计费器的需求也将不断增大,计程车的服务也显得越来越重要,因此出租车计费器也就应运而生了。

2. 设计主体

(1)设计原理:假设出租车有启动键、停止键、暂停键和档位键。启动键为脉冲触发信号,当它为一个脉冲是,表示汽车已启动,并根据车速的选择和基本车速发出相应频率的脉冲(计费脉冲)实现车费和路程的计数,同时车费显示起步价;当停止键为高电平时,表示汽车熄火,同时停止发出脉冲,此时车费和路程计数清零;当暂停键为高电平时,表示汽车暂停并停止发出脉冲,此时车费和路程计数暂停;档位键用来改变车速,不同档位对应着不同的车速,同时路程计数的速度也不同。

出租车计费器可分为两大模块,即控制模块和译码显示模块,系统框图如图1所示,控制模块实现了计费和路程的技术,并且通过不同的档位控制车速。译码显示模块实现了十进制到4位十进制的转换,以及车费和路程的显示。

计费时钟

档位

起动

暂停

停止

图1 出租车计费器系统框图

(2)步骤:

① 首先设计taxi计费模块,实现计费功能。起步价为6.00元,并在车行驶3km后按1.2元/km计费,当计费器达到或超过20元时,每千米加收50%的车费,车停止和暂停时不计费。taxi模块程序如下:

library ieee;

use ieee.std_logic_1164.all;

use ieee.std_logic_unsigned.all;

entity taxi is

port(clk:in std_logic;----计费时钟

控制模块

显示模块 start:in std_logic;----汽车起动

stop:in std_logic;----汽车停止

pause:in std_logic;----汽车暂停

speedup:in std_logic_vector(1 downto 0);----档位(4个档位)

money:out integer range 0 to 8000;----车费

distance:out integer range 0 to 8000);----路程

end;

architecture one of taxi is

begin

process(clk,start,stop,pause,speedup)

variable money_reg,distance_reg:integer range 0 to 8000;----车费和路程的寄存器

variable num:integer range 0 to 9;----控制车速的计数器

variable dis:integer range 0 to 100;----千米计数器

variable d:std_logic;----千米标志位

begin

if stop='1'then-----汽车停止,计费和路程清零

money_reg:=0;

distance_reg:=0;

dis:=0;

num:=0;

elsif start='1'then-----汽车起动后,起步价为6元

money_reg:=600;

distance_reg:=0;

dis:=0;

num:=0;

elsif clk'event and clk='1'then

if start='0'and speedup="00"and pause='0' and stop='0'then---1档

if num=9 then

num:=0; distance_reg:=distance_reg+1;

dis:=dis+1;

else num:=num+1;

end if;

elsif start='0'and speedup="01"and pause='0' and stop='0'then---2档

if num=9 then

num:=0;

distance_reg:=distance_reg+2;

dis:=dis+2;

else num:=num+1;

end if;

elsif start='0'and speedup="10"and pause='0' and stop='0'then---3档

if num=9 then

num:=0;

distance_reg:=distance_reg+5;

dis:=dis+5;

else num:=num+1;

end if;

elsif start='0'and speedup="11"and pause='0' and stop='0'then---4档

distance_reg:=distance_reg+1;

dis:=dis+1;

end if;

if dis>=100 then

d:='1';

dis:=0;

else d:='0';

end if;

if distance_reg>=300 then-------如果超过3km按1.2元/千米计算

if money_reg<2000 and d='1'then

money_reg:=money_reg+120; elsif money_reg>=2000 and d='1'then

money_reg:=money_reg+180;

-------当计费器达到20元,每千米加收50%的车费

end if;

end if;

end if;

money<=money_reg;

distance<=distance_reg;

end process;

end;

① 将输出的费用和路程作为输入,给decoder模块,完成数码管显示功能,并且对小数点等做出明确定义。decoder程序如下:

library ieee;

use ieee.std_logic_1164.all;

use ieee.std_logic_unsigned.all;

entity decoder is

port(clk20mhz:in std_logic;-----系统时钟20MHZ

money_in:in integer range 0 to 8000;-----车费

distance_in:in integer range 0 to 8000;-----路程

scan:out std_logic_vector(7 downto 0);-----数码管地址选择信号

seg7:out std_logic_vector(6 downto 0);-----7段显示控制信号(abcdefg)

dp:out std_logic);---------小数点

end;

architecture one of decoder is

signal clk1khz:std_logic;----1KHZ的分频时钟,用于扫描数码管地址

signal data:std_logic_vector(3 downto 0);

signal m_one,m_ten,m_hun,m_tho:std_logic_vector(3 downto 0);-----钱数的4位十进制表示

signal d_one,d_ten,d_hun,d_tho:std_logic_vector(3 downto 0);-----路程的4位十进制表示 begin

-------------1KHZ分频,用于扫描数码管地址---

process(clk20mhz)

variable count:integer range 0 to 9999;

begin

if clk20mhz'event and clk20mhz='1'then

if count=9999 then clk1khz<=not clk1khz;count:=0;

else count:=count+1;

end if;

end if;

end process;

------将车费的十进制数转化为4位十进制数---

process(clk20mhz,money_in)

variable comb1:integer range 0 to 8000;

variable comb1_a,comb1_b,comb1_c,comb1_d:std_logic_vector(3 downto 0);

begin