EDA-FPGA出租车计价器

更新时间:2023-10-20 11:12:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

湖北工业大学

电子设计CAD-EDA课程报告

项目名称:

基于FPGA的出租车计价器设计

一、实验目的

设计一个出租车计价器,具有行车里程计费、等候时间计费、及起步价三部分,用四位数码管显示总金额,最大值为999.9元,最小计价单元为0.1元,行程3公里内,且等待累计时间3分钟内,起步费为8元。若超过3公里,以行车里程单价1.6元/公里计费,等候时间超过3分钟后单价1元/分钟。最大值为59min。

设计的主要技术指标如下:

1) 计价范围: 0~999.9元 计价分辨率: 0.1元 2) 计程范围:0~99公里 计程分辨率: 1公里 3) 计时范围:0~59分 计时分辨率: 1分

二、实验设备

FPGA器件、USB JTAG调试工具、Quartus 9.0软件、VHDL硬件设计语言 原理阐述:用分频器将外部时钟分为三路频率的信号,用来计时和计程,同

三、硬件设计

时也供整个系统工作,通过设置使能信号,使系统自动对等待时间计时和对行驶公里数的计数,最后将所得结果分别在数码管上显示出来。框图表示如下:

等待时间脉冲 FPGA 公里脉冲 控制器 计时 计费 数码管显示 计费/复位

计程 四、软件设计

1、软件原理阐述:

我们的产品主要分为三个模块进行软件设计:①计程模块:根据提供的里程脉冲信号fin,计算乘客上车后出租车所行驶的里程数。fin每来一个上升沿,计程模块实现一次计数,里程数就加1。当行驶里程大于3Km时,本模块中en0信号变为1;进行行驶公里都计费。②等待计时模块:根据分频得到的时钟信号f_1,计算乘客的等待累计时间。计时器的量程为59min,满量程归零。等待时间大于3min时,本模块中en1信号变为1;f_1每来一个上升沿,计量模块实现一次计数,等待时间加1。③计费模块:实现计价、计时和计程的数据计费。计量模块实现对于出租车在行驶和等待过程中的里程数和计时功能:计费时钟每来

一个上升沿,计量模块实现一次计数,里程数或者等待时间加1。当行驶里程大于3Km时,本模块中en0信号变为1;进行的是行驶公里数大于3公里以每公里1.6元计费的操作;当等待时间大于3min时,本模块中en1信号变为1,进行的,最大显示为999.9元。 2、软件框图设计如下:

3、软件流程图设计如下:

初始状态 按start

计程车进入起步价(3公里) 超过3公里按fin(公里脉冲)

开始计程并按公里计费 再次按下start

按下stop(停止计程计费)

结束

4、软件详细设计(包含主要逻辑单元、模块、源代码、仿真波形图等内容) 分频模块对频率为240HZ的输入脉冲进行分频,得到16HZ、10HZ、和1HZ的三种频率。该模块产生频率信号用于计费,每1HZ脉冲为0.1元计费控制,10HZ信号为1元的计费控制,16HZ信号为1.6元计费控制。

计量控制模块是出租车计费的主体部分,该模块主要完成等待计时功能、计价功能、计程功能,同时产生3分钟的等待计时始能控制信号en1、行程3公里外的是能控制信号en0。其中计价功能主要完成的任务是:行程3公里内,且等待累计时间在3分钟内,起步费为8元;3公里以外以每公里1.6元计费。等待时间3分钟以外以每分钟1元计费。计时功能主要完成的任务是:计算乘客的等待累计时间,计时的量程为59分,满量程自动归零。计程功能主要完成的任务是:计算乘客所行驶的公里数,计程器的量程为99公里,满量程自动归零。

根据前面的描述,该电路的核心部分就是分频/计量控制电路,通过VHDL语言的顺序语句IF-THEN-ELSE根据一个或一组条件来选择某一特定的执行通道,生成计费数据、计时数据和里程数据。 4.1 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; --公里脉冲信号 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_10,f_16,f_1:std_logic; --频率为10Hz,16Hz,1Hz的信号 signal q_10:integer range 0 to 23; --24分频器 signal q_16:integer range 0 to 14; --15分频器 signal q_1:integer range 0 to 239; --240分频器 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_10<=0;q_16<=0;f_10<='0';f_16<='0';f_1<='0';f<='0'; else

if q_10=23 then q_10<=0;f_10<='1'; --此IF语句得到频率为10Hz的信号 else q_10<=q_10+1;f_10<='0'; end if;

if q_16=14 then q_16<=0;f_16<='1'; --此IF语句得到频率为16Hz的信号 else q_16<=q_16+1;f_16<='0'; end if;

if q_1=239 then q_1<=0;f_1<='1'; --此IF语句得到频率为1Hz的信号 else q_1<=q_1+1;f_1<='0'; end if;

if en1='1' then f<=f_10; --此IF语句得到计费脉冲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 start='0' then

w<=0;en1<='0';en0<='0';m1<=\ elsif f_1'event and f_1='1' then if stop='1' then

if w=59 then w<=0; --此IF语句完成等待计时 if m0=\ --此IF语句完成分计数 if m1=\ else m1<=m1+1;

本文来源:https://www.bwwdw.com/article/8caf.html

Top