在系统编程技术课程设计 课程名称任课教师设计题目班级 姓名 学号 日期 在系统编程技术 谭敏 出租车自动计费器 05自动化(1)班 王娜 0510203027 2008年1月1日
1
出租车自动计费器EDA设计
1、题目分析
1.1 设计要求
设计一个出租车自动计费器,计费包括起步价、行车里程计费、等待时间计费3部分;用3位数码管显示金额,最大值为999.9元,最小计价单元为0.1元,行程3公里内,且等待时间3分钟以内,起步价为8元,超过3公里,以每公里1.6元计费,等待时间单价为每分钟1元;用两位数码管显示总里程,最大为99公里,用两位数码管显示等待时间,最大值为59MIN。
1.2设计原理
根据层次化设计理论,该设计问题自顶向下可分为分频模块、控制模块、计量模块、译码和动态扫描显示模块,其系统框图如下图所示,各模块功能如下所述。 FPGA
时钟信号 分频器 计费 译码 显示 等待信号 控制器 公里脉冲 计时 计程 计费/复位 出租车自动计费器系统方框图
1.3 模块分析
(1)分频模块:
分频模块对频率为240HZ的输入脉冲进行分频,得到的频率为16HZ,10HZ,1HZ的3种频率。该模块产生频率信号用于计费,每个1HZ脉冲为0.1元计费
控制,10HZ信号为1元的计费控制,16HZ信号用于1.6元计费控制。 (2)计量模块:
计量控制模块是出租车计费器系统的主体部分,该模块主要完成等待时间功能、计价功能、计程功能,同时产生三分钟的等待计时使能控制信号EN1、行程3公里外达的使能控制信号EN0。其中计价功能主要完成的任务是:行程3公里
2
内,且等待时间3分钟以内,起步价为8元,超过3公里,以每公里1.6元计费,等待时间单价为每分钟1元;计时功能完成的任务是:计算乘客的等待时间,计时器的量程为59分钟,满量程自动归零。计程功能主要完成的任务是:计算乘客所行驶的公里数,计时器的量程为99公里,满量程自动归零。 (3)译码显示模块:
该模块经过8选1选择器将计费数据(4位BCD码)、计时数据(2位BCD码)、计程数据(2位BCD码)动态显示输出。其中计费数据JIFEI4—JIEFEI1送入显示译码模块进行译码,最后送至以百元、十元、元、角为单价对应的数码管上显示,最大显示为999.9元;计时数据送入显示译码模块进行译码,最后送至以分为单位对应的数码管上显示,最大显示为59S;计程数据送入显示译码模块进行译码,最后送入以公里为单位的数码管上显示,最大显示为99公里。
2、出租车自动计费器的层次化设计方案
根据选定的方案,以自顶向下的方法实现此方案,编写应用程序并仿真画出波形图以及原件符号图,
(1)该电路的核心部分就是计数分频电路,通过VHDL语言的顺序语句
IF-THEN-ELSE 根据一个或一组条件来选择特定的执行通道,生成计费数据,计时数据和里程数据。
其VHDL源程序(Ⅰ)如下
library ieee;
use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; use ieee.std_logic_arith.all; entity taxi is
port (clk_240:in std_logic; ---频率为240hz的时钟 start: in std_logic; ---计价时能信号 stop: in std_logic; ---等待信号
fin: in std_logic; ---公里脉冲信号 char1,char2,char0,char3: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 f10,f16,f1:std_logic ; -----频率为10HZ,16HZ,1HZ的信号 signal q10:integer range 0 to 23; ----24分频器 signal q16:integer range 0 to 14; -----15分频器 signal q1:integer range 0 to 239; ------240分频器 signal w:integer range 0 to 59; -----秒计数器
signal c3,c2,c1,c0:std_logic_vector(3 downto 0); ----10进制费用计数器 signal k1,k0:std_logic_vector(3 downto 0); ----公里计数器
3
signal m1:std_logic_vector(2 downto 0); -----分的10位计数器
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 q10<=0;q16<=0;f<='0';f10<='0';f16<='0'; else
if q10=23 then q10<=0;f10<='1'; -----此IF 语句得到频率为10HZ的信号 else q10<=q10+1;f10<='0'; end if;
if q16=14 then q16<=0;f16<='1'; ----此IF 语句得到频率为16HZ的信号
else q16<=q16+1;f16<='0'; end if ;
if q1=239 then q1<=0;f1<='1'; ----此IF 语句得到频率为1HZ的信号
else q1<=q1+1;f1<='0'; end if ;
if en1='1' then f<=f10; ----此IF 语句得到计数脉冲f elsif en0='1'then f<=f16; else f<='0'; end if ; end if; end if;
end process;
main: process(f1) begin
if f1'event and f1='1'then if start ='0' then
w<=0;en1<='0';en0<='0';m1<=\elsif stop ='1'then
if w=59 then w<=0; ----此IF 语句完成等待计时 if m0=\ ----此IF 语句分计数 if m1<=\else m1<=m1 +1; end if;
else m0<=m0+1; end if ;
if m1&m0>\ ----此IF 语句得到en1使能信号
4
else en1<='0'; end if ;
else w<=w+1; en1<='0'; end if;
elsif fin='1'then
if k0=\ ----此IF 语句完成公里脉冲计数 if k1<=\
else k1<=k1 +1; end if;
else k0<=k0+1; end if ;
if k1&k0>\ ----此IF 语句得到en0使能信号 else en0<='0'; end if;
else en1<='0';en0<='0'; end if ;
char3<=c3;char2<=c2;char1<=c1;char0<=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<=\elsif f'event and f='1'then
if c0=\ ----此IF 语句完成对费用的计数 if c1=\if c2=\if c3<=\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个进程模块。FENPIN进程对频率为240HZ的输入脉冲进行分
5