基于FPGA的出租车计费系统设计

原创 面包板社区 2023-05-18 20:05
1、系统硬件方案设计

如下图所示,出租车计费的标准是起步价是12元,2公里之内里程费用不变,当超过2公里时,每行驶1公里,每公里加收2.4元。通过按键模块来控制系统的显示模块,不同的按键可以显示不同的功能,当按键1按下时出租车计费系统开始进行计费,数码管此时显示总费用,计时模块和计里程模块开始运行,同时LED1会亮起,表示出租车正在计费中;当按键2按下时,数码管会显示里程数;当按键3按下时数码管会显示时长;当按键4按下时出租车计费系统会进行复位操作;当按键5按下时会对出租车计费系统暂停计费。出租车设定时速为36KM/H,换算得10秒出租车行驶里程100米,计费模块会增加0.24元。同时对乘坐的时长也会进行收费,每1分钟加收1.2元,换算得每2秒计费模块会增加0.04元。出租车计费系统得总费用等于起步价加上公里数乘以2.4元再加上所乘坐得时间,其计算的公式为:总费用=起步价+(所驾驶里程数-2)*2.4+(乘坐的时间)*1.2。

2、 FPGA芯片选择

本次毕业设计使用的芯片是Altera公司 Cyclone V系列的5CEBA4F23C7N芯片。Cyclone系列是Altera公司简化版的FPGA芯片,该芯片拥有低功耗,低成本,和相对高的集成度等优点,非常适合进行较小的系统设计使用。使用的开发板是E0-CV开发板,如下图所示,该开发板的主要元件有9K可编程逻辑元件;3080kbits嵌入式内存;4分数锁相环;10个发光二极管;10个滑动开关;4个按钮;1个CPU复位按钮;6个7段数码管;串行配置设备-在FPGA上的EPCS64模式配置;车载USB Blaster(普通B型USB连接器);支持JTAG和AS;64MB SDRAM, x16位数据总线;2 x20的GPIO;使用4位电阻网络DAC;使用高密度D-sub连接器;该DE0-CV板带有一个控制面板程序,允许用户访问各种主板上来自主机的部件。主机与主板通信通过USB连接。该程序可以用来验证组件上的功能。

3、计时设计

时钟信号一直都是设计一个同步系统的核心信号,如果没有一个准确的时钟信号,一个系统的运行就不可能会准确,所以时钟信号的好坏以及是否稳定决定了一个同步电路的性能如何。通常使用高性能的信号,一般都会调用FPGA内部属于自己的时钟资源——布线资源和锁相环(PLL)。如下图所示,5CEBA4F23C7N芯片是50 MHz 缓冲至四个 50MHz时钟。

通过分频得50Mhz,在数码管中,时间的显示为00:00,对四个数码管分好位置,0~1数码管对应时钟的秒数,2~3数码管对应时间的分钟数,通过不同的进制可以精确的显示出所用的时间,由于秒到分的进制是6进制,所以数码管1要设置成6进制,其余的都是10进制,调用好时钟后即可开始编写代码,设计时钟的主要流程图如下图所示。

计时代码主要程序如下:

ELSIF (clk'EVENT AND clk = '1')THEN --判断时钟信号为上升沿;IF (en_1hz = '1') THEN --使能为1开始计时;IF (data0(3 DOWNTO 0) ="1001") THEN --数码管09时下次数值加10;其他情况都加1IF (data1 = "0101") THEN--数码管15时下次数值加1变成0;其他情况都加1IF (data2 = "1001") THEN--数码管29时下次数值加1变成0;其他情况都加1IF (data3 = "0101") THEN--数码管35时下次数值加1变成0;其他情况都加1data3 <= "0000";ELSEdata3 <= data3 + "0001";END IF;data2 <= "0000";ELSEdata2 <= data2 + "0001";END IF;data1 <= "0000"; ELSEdata1 <= data1 + "0001";END IF;data0 <= "0000"; ELSEdata0 <= data0 + "0001"time_total <= (data3 & data2& data1 & data0);--总时间就是data0~3连接到一起的量

4、 计程设计

出租车的速度设置为36km/h,换算得10m/s,既每秒行驶0.1km,设置数码管中显示000.0km。每过10s就向前一位进1,后一位清零,即可计算得出出租车走过的总路程为多少。设计里程计算的主要流程图如下图所示。

计算里程的主要代码如下:

ELSIF (clk'EVENT AND clk = '1')THEN --判断时钟信号为上升沿;IF (en_1hz = '1') THEN --使能为1开始计程;IF (data0 = "1001") THENdata0 <= "0000"; -- 0号位为9时下次数值加1为0,其他情况都加1;IF (data1 = "1001") THENdata1 <= "0000"; -- 1号位为9时下次数值加1为0,其他情况都加1;IF (data2 = "1001") THEN-- 2号位为9时下次数值加1为0,其他情况都加1;IF (data3 = "1001") THEN-- 3号位为9时下次数值加1为0,其他情况都加1;data3 <= "0000";ELSE data3<= data3 + "0001";END IF;data2 <= "0000"; ELSE data2<= data2 + "0001";END IF;ELSE data1 <= data1 +"0001";END IF;ELSE data0 <= data0 +"0001";Mile_dec <= (data4 & data3& data2 & data1); --总里程就是data0~3连接到一起的量

5、计费设计

出租车的费用为起步价12元,每分钟加收1.2元,前两公里不收而外里程费,两公里后每公里加收2.4元,由于设置了出租车的行驶速度为36km/h,既每秒10m,每10s走100m收费0.24元。设计程序里就是前200s只进行对乘坐时间的计算收费,不对出租车行走的里程数进行收费,200s后出租车行走了2km以上,总费用就开始加上里程费用。如下图所示:

费用计算代码如下:

cnt_2s <= (conv_integer(time_total(3 DOWNTO 0)) + conv_integer(time_total(7DOWNTO 4)) * 10) / 2;-- 将时间的秒数设置成cnt_2s,时间的费用是两秒一跳;IF ((NOT(rst)) = '1') THEN --判断复位取反后是否等于1,与其他时钟错开Q1 <= 1200;--总费用就为12元;ELSIF (clk'EVENT AND clk = '1')THENIF (Mile_in <="0000000000100000") THEN --当里程小于2KM时;Q1 <= 1200+4 * cnt_2s+( (conv_integer(time_total(11 DOWNTO 8)) + conv_integer(time_total(15 DOWNTO 12)) * 10) * 100);--总费用等于12加上0.04乘以总时间的秒数再加上所用多少分钟;ELSEQ1 <= 1200+ 4 * cnt_2s+((conv_integer(time_total(11 DOWNTO 8)) + conv_integer (time_total(15 DOWNTO 12))* 10) * 100) + 24 *(conv_integer( Mile_in(15 DOWNTO 12)) *1000+conv_integer(Mile_in(11 DOWNTO 8)) *100 +conv_integer(Mile_in(7 DOWNTO 4))*10 +conv_integer(Mile_in(3 DOWNTO 0)) - 20);--总费用等于12加上0.04乘以总时间的秒数再加上所用多少分钟再加上计程所显示的距离END IF;--rem A/B的运算结果是向0的方向取整--将费用的每个位置分出T10 <= (Q1 rem 10);T20 <= (Q1 /10) rem 10;T30 <= (Q1 / 100) rem 10;T40 <= (Q1 /1000) rem 10;--将每个位置的费用数值都拉长4位,方便后面转换T1<=conv_std_logic_vector(T10,4);T2<=conv_std_logic_vector(T20,4);T3<=conv_std_logic_vector(T30,4);T4<=conv_std_logic_vector(T40,4);T_fare <= (T4 & T3 & T2& T1);-- 总费用的数值就用二进制替换出来

6、 按键设计

对按键进行设计都要进行消抖操作,因为在对按键进行扫描的过程中,按键会经常出现扫描不正常,按下按键没反应或者反应不灵敏的情况,原因就是按键按下或者抬起时会产生抖动,会在回路中产生不稳定的信号,这段不稳定的信号中如果采集到的按键值就会产生误判,进而影响系统的运作。按键抖动的示意图如下所示。所以在对按键进行操作的时候就要对按键进行消抖操作。

按键消抖的流程图如下图所示:

按键消抖的主要代码如下:
IF ((NOT(rst_n)) = '1') THEN --复位键为0则按键采样都为0count2 <="00000000000000";key_reg1 <= '0';key_reg2 <= '0';button_posedge <= '0';ELSIF (clk'EVENT AND clk = '1')THEN --检测到时钟上升沿时count2 <= count2 +"00000000000001";IF (count2 ="00000011111010") THEN – 延迟时间key_reg1 <= button_in; --键位输入count2 <="00000000000000";END IF;key_reg2 <= key_reg1;button_posedge <= (key_reg2) AND(NOT(key_reg1)); --按键状态

7、按键的编写与功能分配

DE0-CV开发板的按键都是每个按钮开关在未按下时高电平,按下时是处于低电平模式,一般这种按键模式称之为共阳极连接。在VHDL中按键值得获取可以采用二进制进行描述。开发板的按键示意图如下所示。

出租车计费系统的开始是由按键1进行操作的,当按键1按下时,出租车计费系统开始计费,计时和计程模块开始运行;当按键2按下时,数码管上显示的是出租车所行驶的里程数;当按键3按下时,数码管显示的是出租车所用的时间;当按键4按下时,数码管显示出租车所要收取的费用;当按键5按下时,出租车计费系统暂停计费,重新按下按键1会继续计费;当按键6按下时,出租车计费系统进行复位操作。如下图所示。

按键的设计代码如下:

--先调用好在消抖的例化程序中写好的按键端口,在顶层文件中分配给每个需要用到的按键端口;

ax_debounce_m7 : ax_debounce --启动按键;PORT MAP (clk => clk,rst_n=> rst_n,button_in => btn1,button_posedge=> start_posedge);ax_debounce_m1 : ax_debounce --里程按键;PORT MAP (clk=>clk,rst_n=>rst_n,button_in=>btn2,button_posedge=>distance_posedge);ax_debounce_m2 : ax_debounce --计时按键;PORT MAP (clk=> clk,rst_n=>rst_n,button_in => btn3,button_posedge => time_posedge);ax_debounce_m3 : ax_debounce --暂停按键;PORT MAP (clk=>clk,rst_n=>rst_n,button_in=>btn5,button_posedge=>stop_posedge);ax_debounce_m4 : ax_debounce --费用按键;PORT MAP (clk=> clk,rst_n=>rst_n,button_in => btn6,button_posedge=> fare_posedge);--相应的端口的主要功能如下面代码所示:IF ((NOT(rst_n)) = '1')THEN --复位键功能stop_en <= '0';ELSIF (clk'EVENT AND clk= '1') THENIF (stop_posedge = '1')THEN --暂停stop_en <= '1';PROCESS (clk, rst_n)BEGINIF ((NOT(rst_n)) = '1')THEN --复位键按下数码管显示的时间dist_en <='0';time_en <= '1';fare_en <= '0';ELSIF (clk'EVENT AND clk= '1') THENIF (distance_posedge ='1') THEN --里程按键按下数码管显示里程dist_en <='1';time_en <= '0';fare_en <= '0';ELSIF (time_posedge ='1') THEN --时间按键按下数码管显示时间dist_en <='0';time_en <= '1';fare_en <= '0';ELSIF (fare_posedge ='1') THEN --费用按键按下数码管显示费用dist_en <= '0';time_en<= '0';fare_en <= '1';

8、数码管的设计

Led数码管是由七个发光二极管0、1、2、3、4、5、6构成,根据数码管之间相互连接的情况,一共有两种数码管,一种是共阴极数码管:把所有负极端全部接一块接负极,即公共端为负极。另外一种是共阳极数码管:把所有正极端全部接一块接正极,即公共端为正极。只要控制好数码管每段的显示,就能使数码管显示出不同的数字以及简单的英文字母。DE0-CV 开发板有 6 个 7 段数码管。这6个数码管都是共阳极数码管,可以通过低电平或者高电平来控制开发板数码管每段的显示。

在编写代码中,代码中的电路信号通常是以BCD码的形式进行表示或者进行编写,例如:在代码中写出判断出该数值为0000,此时在代码中的电信号为二进制,假设该数码管为共阳极数码管,那么相应的字形码应该是1000000,对应的数码管段码,如图3.8所示,6号段高电平不亮,其他段位正常亮起,此时数码管显示为0,符合要求。这两者之间的转换就需要使用到BCD码到数码管显示的字形码之间的转换模块。

BCD译码的相应代码显示:

CASE bin_data ISWHEN "0000"=>seg_data <= "1000000"; --0WHEN "0001"=>seg_data <= "1111001"; --1WHEN "0010"=>seg_data <= "0100100"; --2WHEN "0011"=>seg_data <= "0110000"; --3WHEN "0100"=>seg_data <= "0011001"; --4WHEN "0101"=>seg_data <= "0010010"; --5WHEN "0110"=>seg_data <= "0000010"; --6WHEN "0111"=>seg_data <= "1111000"; --7WHEN "1000"=>seg_data <= "0000000"; --8WHEN "1001"=>seg_data <= "0010000"; --9WHEN OTHERS=>seg_data <= "1111111"; --其他情况数码管不亮

作者:czd886, 来源:面包板社区

链接:https://mbb.eet-china.com/forum/topic/129004_1_1.html

版权声明:本文为博主原创,未经本人允许,禁止转载!


END



免费申请开发板



点击阅读原文,参加活动!

面包板社区 面包板社区——中国第一电子人社交平台 面包板社区是Aspencore旗下媒体,整合了电子工程专辑、电子技术设计、国际电子商情丰富资源。社区包括论坛、博客、问答,拥有超过250万注册用户,加入面包板社区,从菜鸟变大神,打造您的电子人脉社交圈!
评论
  • 每日可见的315MHz和433MHz遥控模块,你能分清楚吗?众所周知,一套遥控设备主要由发射部分和接收部分组成,发射器可以将控制者的控制按键经过编码,调制到射频信号上面,然后经天线发射出无线信号。而接收器是将天线接收到的无线信号进行解码,从而得到与控制按键相对应的信号,然后再去控制相应的设备工作。当前,常见的遥控设备主要分为红外遥控与无线电遥控两大类,其主要区别为所采用的载波频率及其应用场景不一致。红外遥控设备所采用的射频信号频率一般为38kHz,通常应用在电视、投影仪等设备中;而无线电遥控设备
    华普微HOPERF 2025-01-06 15:29 172浏览
  • By Toradex 秦海1). 简介嵌入式平台设备基于Yocto Linux 在开发后期量产前期,为了安全以及提高启动速度等考虑,希望将 ARM 处理器平台的 Debug Console 输出关闭,本文就基于 NXP i.MX8MP ARM 处理器平台来演示相关流程。 本文所示例的平台来自于 Toradex Verdin i.MX8MP 嵌入式平台。  2. 准备a). Verdin i.MX8MP ARM核心版配合Dahlia载板并
    hai.qin_651820742 2025-01-07 14:52 113浏览
  • 村田是目前全球量产硅电容的领先企业,其在2016年收购了法国IPDiA头部硅电容器公司,并于2023年6月宣布投资约100亿日元将硅电容产能提升两倍。以下内容主要来自村田官网信息整理,村田高密度硅电容器采用半导体MOS工艺开发,并使用3D结构来大幅增加电极表面,因此在给定的占位面积内增加了静电容量。村田的硅技术以嵌入非结晶基板的单片结构为基础(单层MIM和多层MIM—MIM是指金属 / 绝缘体/ 金属) 村田硅电容采用先进3D拓扑结构在100um内,使开发的有效静电容量面积相当于80个
    知白 2025-01-07 15:02 145浏览
  • 在智能家居领域中,Wi-Fi、蓝牙、Zigbee、Thread与Z-Wave等无线通信协议是构建短距物联局域网的关键手段,它们常在实际应用中交叉运用,以满足智能家居生态系统多样化的功能需求。然而,这些协议之间并未遵循统一的互通标准,缺乏直接的互操作性,在进行组网时需要引入额外的网关作为“翻译桥梁”,极大地增加了系统的复杂性。 同时,Apple HomeKit、SamSung SmartThings、Amazon Alexa、Google Home等主流智能家居平台为了提升市占率与消费者
    华普微HOPERF 2025-01-06 17:23 211浏览
  • 故障现象一辆2017款东风风神AX7车,搭载DFMA14T发动机,累计行驶里程约为13.7万km。该车冷起动后怠速运转正常,热机后怠速运转不稳,组合仪表上的发动机转速表指针上下轻微抖动。 故障诊断 用故障检测仪检测,发动机控制单元中无故障代码存储;读取发动机数据流,发现进气歧管绝对压力波动明显,有时能达到69 kPa,明显偏高,推断可能的原因有:进气系统漏气;进气歧管绝对压力传感器信号失真;发动机机械故障。首先从节气门处打烟雾,没有发现进气管周围有漏气的地方;接着拔下进气管上的两个真空
    虹科Pico汽车示波器 2025-01-08 16:51 86浏览
  • 根据环洋市场咨询(Global Info Research)项目团队最新调研,预计2030年全球无人机锂电池产值达到2457百万美元,2024-2030年期间年复合增长率CAGR为9.6%。 无人机锂电池是无人机动力系统中存储并释放能量的部分。无人机使用的动力电池,大多数是锂聚合物电池,相较其他电池,锂聚合物电池具有较高的能量密度,较长寿命,同时也具有良好的放电特性和安全性。 全球无人机锂电池核心厂商有宁德新能源科技、欣旺达、鹏辉能源、深圳格瑞普和EaglePicher等,前五大厂商占有全球
    GIRtina 2025-01-07 11:02 127浏览
  • 这篇内容主要讨论三个基本问题,硅电容是什么,为什么要使用硅电容,如何正确使用硅电容?1.  硅电容是什么首先我们需要了解电容是什么?物理学上电容的概念指的是给定电位差下自由电荷的储藏量,记为C,单位是F,指的是容纳电荷的能力,C=εS/d=ε0εrS/4πkd(真空)=Q/U。百度百科上电容器的概念指的是两个相互靠近的导体,中间夹一层不导电的绝缘介质。通过观察电容本身的定义公式中可以看到,在各个变量中比较能够改变的就是εr,S和d,也就是介质的介电常数,金属板有效相对面积以及距离。当前
    知白 2025-01-06 12:04 234浏览
  • 根据Global Info Research项目团队最新调研,预计2030年全球封闭式电机产值达到1425百万美元,2024-2030年期间年复合增长率CAGR为3.4%。 封闭式电机是一种电动机,其外壳设计为密闭结构,通常用于要求较高的防护等级的应用场合。封闭式电机可以有效防止外部灰尘、水分和其他污染物进入内部,从而保护电机的内部组件,延长其使用寿命。 环洋市场咨询机构出版的调研分析报告【全球封闭式电机行业总体规模、主要厂商及IPO上市调研报告,2025-2031】研究全球封闭式电机总体规
    GIRtina 2025-01-06 11:10 126浏览
  • 彼得·德鲁克被誉为“现代管理学之父”,他的管理思想影响了无数企业和管理者。然而,关于他的书籍分类,一种流行的说法令人感到困惑:德鲁克一生写了39本书,其中15本是关于管理的,而其中“专门写工商企业或为企业管理者写的”只有两本——《为成果而管理》和《创新与企业家精神》。这样的表述广为流传,但深入探讨后却发现并不完全准确。让我们一起重新审视这一说法,解析其中的矛盾与根源,进而重新认识德鲁克的管理思想及其著作的真正价值。从《创新与企业家精神》看德鲁克的视角《创新与企业家精神》通常被认为是一本专为企业管
    优思学院 2025-01-06 12:03 161浏览
  •  在全球能源结构加速向清洁、可再生方向转型的今天,风力发电作为一种绿色能源,已成为各国新能源发展的重要组成部分。然而,风力发电系统在复杂的环境中长时间运行,对系统的安全性、稳定性和抗干扰能力提出了极高要求。光耦(光电耦合器)作为一种电气隔离与信号传输器件,凭借其优秀的隔离保护性能和信号传输能力,已成为风力发电系统中不可或缺的关键组件。 风力发电系统对隔离与控制的需求风力发电系统中,包括发电机、变流器、变压器和控制系统等多个部分,通常工作在高压、大功率的环境中。光耦在这里扮演了
    晶台光耦 2025-01-08 16:03 75浏览
  • 本文介绍编译Android13 ROOT权限固件的方法,触觉智能RK3562开发板演示,搭载4核A53处理器,主频高达2.0GHz;内置独立1Tops算力NPU,可应用于物联网网关、平板电脑、智能家居、教育电子、工业显示与控制等行业。关闭selinux修改此文件("+"号为修改内容)device/rockchip/common/BoardConfig.mkBOARD_BOOT_HEADER_VERSION ?= 2BOARD_MKBOOTIMG_ARGS :=BOARD_PREBUILT_DTB
    Industio_触觉智能 2025-01-08 00:06 100浏览
  • 大模型的赋能是指利用大型机器学习模型(如深度学习模型)来增强或改进各种应用和服务。这种技术在许多领域都显示出了巨大的潜力,包括但不限于以下几个方面: 1. 企业服务:大模型可以用于构建智能客服系统、知识库问答系统等,提升企业的服务质量和运营效率。 2. 教育服务:在教育领域,大模型被应用于个性化学习、智能辅导、作业批改等,帮助教师减轻工作负担,提高教学质量。 3. 工业智能化:大模型有助于解决工业领域的复杂性和不确定性问题,尽管在认知能力方面尚未完全具备专家级的复杂决策能力。 4. 消费
    丙丁先生 2025-01-07 09:25 122浏览
  • 本文介绍Linux系统更换开机logo方法教程,通用RK3566、RK3568、RK3588、RK3576等开发板,触觉智能RK3562开发板演示,搭载4核A53处理器,主频高达2.0GHz;内置独立1Tops算力NPU,可应用于物联网网关、平板电脑、智能家居、教育电子、工业显示与控制等行业。制作图片开机logo图片制作注意事项(1)图片必须为bmp格式;(2)图片大小不能大于4MB;(3)BMP位深最大是32,建议设置为8;(4)图片名称为logo.bmp和logo_kernel.bmp;开机
    Industio_触觉智能 2025-01-06 10:43 96浏览
  • 「他明明跟我同梯进来,为什么就是升得比我快?」许多人都有这样的疑问:明明就战绩也不比隔壁同事差,升迁之路却比别人苦。其实,之间的差异就在于「领导力」。並非必须当管理者才需要「领导力」,而是散发领导力特质的人,才更容易被晓明。许多领导力和特质,都可以通过努力和学习获得,因此就算不是天生的领导者,也能成为一个具备领导魅力的人,进而被老板看见,向你伸出升迁的橘子枝。领导力是什么?领导力是一种能力或特质,甚至可以说是一种「影响力」。好的领导者通常具备影响和鼓励他人的能力,并导引他们朝着共同的目标和愿景前
    优思学院 2025-01-08 14:54 82浏览
我要评论
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦