基于CPLD的出租车计费器_课程设计论文
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
课程设计
课程名称嵌入式系统
课题名称基于 CPLD 的出租车计费器
专业电子信息工程
班级电子信息
学号
姓名
指导教师
2013 年12 月20 日
课程设计任务书
课程名称:嵌入式系统
题目:基于 CPLD 的出租车计费器
专业班级:电子信息
学生姓名:
指导老师:
审批:
摘要
介绍了出租车计费器系统的组成及工作原理,简述了在 EDA 平台上用 FPGA
器件构成该数字系统的设计思想和实现过程。
论述了计程模块,计费模块,计
时模块,译码动态扫描模块等的设计方法与技巧。
1.引言
随着 EDA 技术的高速发展,电子系统的设计技术发生了深刻的变化,大规模
可编程逻辑器件 CPLD/FPGA 的出现,给设计人员带来了诸多方便。
利用它进行产
品开发,不仅成本低、周期短、可靠性高,而且具有完全的知识产权。
随着社会
的不断进步,人们生活水平的不断提高,出租车逐渐成为人们日常生活不可缺少
的交通工具。
而计价器作为出租车的一个重要组成部分,关系着出租车司机和乘
客双方利益,起着重要的作用,因而出租车计价器的发展非常迅猛。
2.出租车计费系统的实验任务及要求
2.1 技术要求
(1)掌握较复杂逻辑的设计、调试。
(2)进一步掌握用Quartus II7.0。
(3)掌握用 Max+pulsII 软件的原理图输入的设计方法。
2.2 功能要求
基本功能:
(1)按行驶里程计费,起步价为 7.00 元,并在车行 3 公里后按 2.20 元/km 计费,当计数器达到或超过 20 元时,每公里加收 50%的车费,即按 3.30 元/km 计费。
(2)实现模拟功能:能模拟汽车启动、停止。
(3)设计动态扫描电路:将车费、里程、等待时间动态的显示出来。
(4)用VHDL 语言设计符合上述功能要求的出租车计费器,并用层次化设
计方法设计该电路。
(5)各计数器的计数状态用功能仿真的方法验证,并通过有关波形确认电
路设计是否正确。
3.方案设计及原理框图
3.1 硬件方案设计及原理框图
硬件系统组成框图
各模块的作用和组成:
(1)开关模块
该模块的作用是用于电路的输入的信号。
主要有三个开关以及三个限流电阻,电源构成。
(3)动态显示模块:
此模块由六个数码管和三个二极管所构成,17 个200Ω 电阻起到限制电流的作用,使得流到数码管的电流适当,防止数码管中的电流过大,而使得数码管损坏。
数码管将计费、等待时间和里程动态的显示出来。
3.2 软件方案设计及原理框图
3.2.1系统的顶层框图及方案设计:
信号输入:各种控制信号经输入端给控制芯片。
控制芯片:采用的有 CPLD 或者 FPGA 等。
动态显示电路:采用的是数码管来实现功能的输出。
3.2.2 FPGA内部具体框图及方案设计:
出租车的一般计费过程为:出租车载客后,启动计费器,整个系统开始运
行,里程计数器从0开始计数,费用计数器从9开始计算;出租车载客中途等待,等待时间计数器从0开始计数。
最后根据行驶里程或停止等待的时间的计费标准
计费。
出租车到达目的地停止后,停止计费器,显示总费用。
根据出租车计费器的工作过程,本系统采用分层次、分模块的方式设计,
其FPGA内部具体框图如下所示。
图2.1FPGA 内部具体图
各模块的功能:
(1)由FPGA 晶振电路产生 50MHz 时钟信号并输入。
(2)分频器:将时钟信号进行分频。
(3)标志模块:将按钮产生的脉冲转化为一种标志信号。
(4)计程模块:在等待信号未作用时,来一个时钟脉冲信号,里程值加 1。
该模块还包含一个路程计费标志的小模块,输出一个路程计费的信号。
(5)等待状态模块:等待信号作用时,该模块可以记录等待的时间,并产
生等待计费的信号。
(6)按行驶里程计费,起步价为 7.00 元,并在车行 3 公里后按 2.20 元
/km 计费,当计数器达到或超过 20 元时,每公里加收 50%的车费,即按 3.30 元/km 计费。
(7)输出控制模块:分时输出里程、等待时间、费用三个信号,实现动态
显示功能。
(8)译码模块:实现将车费计数模块、等待状态模块和里程计数模块输出
的 BCD 码转换成七段码输出。
4.各单元模块设计,仿真结果及分析
本系统采用层次化、模块化的设计方法,设计顺序为自下向上。
首先实现
系统框图中的各子模块,然后由顶层模块调用各子模块来完成整个系统。
4.1 分频模块:
4.1.1 分频模块的框图
图 3.1.1 分频器的实体图
此模块的功能是对总的时钟进行分频,总的时钟是50M。
计数分频器使用五个这样基本的分频器(35分频)组合而成,控制模块分频器使用三个这样基本的分频器(35分频)组合而成。
4.1.2 分频模块的 VHDL 程序
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY PULSE IS
PORT(CLK0:IN STD_LOGIC;
FOUT:OUT STD_LOGIC);
END PULSE;
ARCHITECTURE ONE OF PULSE IS
BEGIN
PROCESS(CLK0)
VARIABLE CNT:STD_LOGIC_VECTOR(2 DOWNTO 0);
VARIABLE FULL :STD_LOGIC;
BEGIN
IF CLK0'EVENT AND CLK0='1' THEN
IF CNT="100" THEN
CNT:="000" ;
FULL:='1';
ELSE
CNT:=CNT+1;
FULL:='0';
END IF;
END IF;
FOUT<=FULL;
END PROCESS;
JC
clks LC[7..0]
SS
WR
inst2LCJFBZ
SS LCJFBZ
LC[7..0]
inst4
END ONE;
4.1.3 仿真的结果
图 3.1.2 仿真图
从该波形图可以看出输入脉冲的频率是输出脉冲的频率的 35 倍。
4.2 计程模块:
4.2.1 计程模块的框图:
图3.1.3集程模块图
此模块的功能是计算出租车行驶的路程。
在出租车启动并行驶的过程中(开始/结束信号SS为1,行驶/等待信号WR为1),当时钟clks是上升沿的时候,系统即对路程计数器JC的里程计数器进行加计数,当路程超过三公里时,系统将输出标志正脉冲LCJFBZ。
4.2.2 计程模块的 VHDL 程序
(1) 计程程序
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity JC is
port(clks,SS,WR:in std_logic;
LC:BUFFER std_logic_vector(7 downto 0));
end entity JC;
architecture one of JC is
SIGNAL Q1,Q0:std_logic_vector(3 downto 0);
begin
process(clks,SS,WR,LC)
VARIABLE SW:STD_LOGIC_VECTOR(1 DOWNTO 0);
begin
SW:=SS&WR;
IF SW="00" OR SW="01" THEN Q1<="0000";Q0<="0000";
ELSIF SW="11" THEN Q1<=Q1;Q0<=Q0;
ELSIF CLKS'EVENT AND CLKS='1' THEN
IF Q1=9 AND Q0=9 THEN
Q1<="0000";Q0<="0000";
ELSIF Q0=9 THEN Q1<=Q1+1;Q0<="0000";
ELSE Q1<=Q1;Q0<=Q0+1;
END IF;
END IF;
END PROCESS;
(2) 计程标志程序
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity LCJFBZ is
port(SS:in std_logic; --SS 开始/复位信号,
LC:IN STD_LOGIC_VECTOR(7 DOWNTO 0);
LCJFBZ:OUT std_logic);
end entity LCJFBZ;
architecture TWO of LCJFBZ is
BEGIN
PROCESS(SS,LC)
BEGIN
IF SS='0' OR (LC(7 DOWNTO 4)="0000" AND LC(3 DOWNTO 0)<4) THEN LCJFBZ<='0';
ELSE LCJFBZ<='1';
END IF;
END PROCESS;
END TWO;
4.2.3 计程模块仿真结果:
图 3.1.4 计程模块仿真图
从波形图可以看出在时钟的控制下当SS 为低电平的时候LC 为零,当SS 为高电平且WR 为高电平的时候LC 开始计数,当计到大于三的时候输出了LCJFBZ 为高电平。
4.3 计时模块:
4.3.1 计时模块的框图:
DDZT
CLK DDJFBZ
SS DDSJ[7..0]
DDBZ
inst1
图3.1.5计时模块图
此模块用于计算停车等待的时间。
在出租车行进中,如果车辆停止等待,计数器则在信号clk的上升沿进行加计数,当累计等待时间超过2(不包括2分钟)分钟时,输出标志DDJFBZ正脉冲信号。
4.3.2计时模块的VHDL程序:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY DDZT IS
PORT(CLK,SS:IN STD_LOGIC;
DDBZ:IN STD_LOGIC;
DDJFBZ:OUT STD_LOGIC;
DDSJ:OUT STD_LOGIC_VECTOR(7 DOWNTO 0));
END ENTITY DDZT;
ARCHITECTURE ONE OF DDZT IS
BEGIN
PROCESS(CLK,SS,DDBZ)
VARIABLE Q1,Q0: STD_LOGIC_VECTOR(3 DOWNTO 0);
BEGIN
IF SS='0' THEN Q1:="0000";Q0:="0000";DDJFBZ<='0';
ELSIF DDBZ='1' THEN
IF CLK='1' AND CLK'EVENT THEN
IF Q1=9 AND Q0=9 THEN
Q1:="0000";Q0:="0000";
ELSIF Q0=9 THEN Q1:=Q1+1;Q0:="0000";
ELSE Q1:=Q1;Q0:=Q0+1;
END IF;
IF(Q1>0 OR Q0>3) THEN
DDJFBZ<='1';
END IF;
END IF;
END IF;
DDSJ(7 DOWNTO 4)<=Q1;DDSJ(3 DOWNTO 0)<=Q0;
END PROCESS;
END ONE;
4.3.3计时模块的仿真结果:
图3.1.6计时模块仿真图
从波形图可以看出在clk的控制下当SS为高电平DDBZ为高电平的时候时间计数但是费用没有计数,DDJFBZ为低电平。
4.4计费模块:
4.4.1计费模块的框图:
图3.1.7计费模块图
费用计数器模块用于出租车启动后,根据行驶路程和等待时间计算费用。
当出租车启动时,SS为高电平,用于将费用计数器复位为起步价10元;当车处
于行驶状态且满3公里时,select_clk信号选择distans_enable,此后路程每满1公里,费用计数器加1元;当出租车处于停止等待状态且时钟满2分钟时,
select_clk信号选择time_enable信号,时间每满1分钟,费用计数器加1元。
4.4.2计费模块的VHDL的程序:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
-- 定义函数名
PACKAGE PACKEXP1 IS
FUNCTION bcd_add8(AIN,BIN : in std_logic_vector)
RETURN std_logic_vector;
END;
--描述函数体
PACKAGE BODY PACKEXP1 IS
FUNCTION bcd_add8(AIN,BIN : std_logic_vector)
RETURN std_logic_vector IS
type type_bcdx4 is array(3 downto 0) of std_logic_vector(4 downto 0);
VARIABLE SA,SB : type_bcdx4;
VARIABLE CI : std_logic_vector(4 downto 0);
VARIABLE SOUT : std_logic_vector(11 downto 0);
BEGIN
CI:=(others=>'0');
SOUT:=(others=>'0');
for i in 0 to 1 loop --0-1的循环
SA(i) := ('0' & AIN(i*4+3 downto i*4))+('0' & BIN(i*4+3
downto i*4))+("0000" & CI(i));
if ((SA(i)(4)='1') or (SA(i)(3 downto 0)>9)) then
SB(i) := SA(i) + "00110";
else
SB(i) := SA(i);
end if;
CI(i+1) := SB(i)(4);
SOUT(i*4+4 downto i*4):=SB(i);
end loop;
RETURN SOUT;
END FUNCTION bcd_add8;
END;
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
USE WORK.PACKEXP1.ALL;
ENTITY JF is
PORT( SS:IN STD_LOGIC; --开始/停止信号,低电平停止,高电平开始DN:IN STD_LOGIC; --白天黑夜控制,高电平夜间,低电平白天
LC:IN std_logic_vector(7 downto 0); -- 路程
DDSJ:IN STD_LOGIC_VECTOR(7 DOWNTO 0); --等待时间
LCJFBZ:IN STD_LOGIC; --路程计费标志
DDJFBZ:IN STD_LOGIC; --等待计费标志,高电平时等待开始计费,低电平不计费
FY:OUT STD_LOGIC_VECTOR(7 DOWNTO 0)); --总费用
END ENTITY JF;
architecture ONE of JF is
BEGIN
-- 讨论白天/黑夜?路程计费?等待计费?
PROCESS(SS,DN,LC,DDSJ,DDJFBZ,LCJFBZ)
VARIABLE FY1 :STD_LOGIC_VECTOR(11 DOWNTO 0);
BEGIN
IF SS='0' THEN
FY1:="000000000000";
ELSIF DN='0' THEN --白天时
IF LCJFBZ='0' THEN --起始价
FY1(11 DOWNTO 4):=(OTHERS=>'0'); --9
FY1(3 DOWNTO 0):="1001";
ELSE --加收路程费
FY1:=bcd_add8(LC,LC);
FY1:=bcd_add8(FY1,LC); --多一个脉冲加收3,则变成LC*3 END IF;
ELSIF LCJFBZ='0' THEN --起始价。