基于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万注册用户,加入面包板社区,从菜鸟变大神,打造您的电子人脉社交圈!
评论
  •         温度传感器的精度受哪些因素影响,要先看所用的温度传感器输出哪种信号,不同信号输出的温度传感器影响精度的因素也不同。        现在常用的温度传感器输出信号有以下几种:电阻信号、电流信号、电压信号、数字信号等。以输出电阻信号的温度传感器为例,还细分为正温度系数温度传感器和负温度系数温度传感器,常用的铂电阻PT100/1000温度传感器就是正温度系数,就是说随着温度的升高,输出的电阻值会增大。对于输出
    锦正茂科技 2024-12-03 11:50 141浏览
  • 作为优秀工程师的你,已身经百战、阅板无数!请先醒醒,新的项目来了,这是一个既要、又要、还要的产品需求,ARM核心板中一个处理器怎么能实现这么丰富的外围接口?踌躇之际,你偶阅此文。于是,“潘多拉”的魔盒打开了!没错,USB资源就是你打开新世界得钥匙,它能做哪些扩展呢?1.1  USB扩网口通用ARM处理器大多带两路网口,如果项目中有多路网路接口的需求,一般会选择在主板外部加交换机/路由器。当然,出于成本考虑,也可以将Switch芯片集成到ARM核心板或底板上,如KSZ9897、
    万象奥科 2024-12-03 10:24 96浏览
  • RDDI-DAP错误通常与调试接口相关,特别是在使用CMSIS-DAP协议进行嵌入式系统开发时。以下是一些可能的原因和解决方法: 1. 硬件连接问题:     检查调试器(如ST-Link)与目标板之间的连接是否牢固。     确保所有必要的引脚都已正确连接,没有松动或短路。 2. 电源问题:     确保目标板和调试器都有足够的电源供应。     检查电源电压是否符合目标板的规格要求。 3. 固件问题: &n
    丙丁先生 2024-12-01 17:37 114浏览
  • 光伏逆变器是一种高效的能量转换设备,它能够将光伏太阳能板(PV)产生的不稳定的直流电压转换成与市电频率同步的交流电。这种转换后的电能不仅可以回馈至商用输电网络,还能供独立电网系统使用。光伏逆变器在商业光伏储能电站和家庭独立储能系统等应用领域中得到了广泛的应用。光耦合器,以其高速信号传输、出色的共模抑制比以及单向信号传输和光电隔离的特性,在光伏逆变器中扮演着至关重要的角色。它确保了系统的安全隔离、干扰的有效隔离以及通信信号的精准传输。光耦合器的使用不仅提高了系统的稳定性和安全性,而且由于其低功耗的
    晶台光耦 2024-12-02 10:40 143浏览
  • 11-29学习笔记11-29学习笔记习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习笔记&记录学习习笔记&记学习学习笔记&记录学习学习笔记&记录学习习笔记&记录学习学习笔记&记录学习学习笔记记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&学习学习笔记&记录学习学习笔记&记录学习学习笔记&记
    youyeye 2024-12-02 23:58 92浏览
  • 戴上XR眼镜去“追龙”是种什么体验?2024年11月30日,由上海自然博物馆(上海科技馆分馆)与三湘印象联合出品、三湘印象旗下观印象艺术发展有限公司(下简称“观印象”)承制的《又见恐龙》XR嘉年华在上海自然博物馆重磅开幕。该体验项目将于12月1日正式对公众开放,持续至2025年3月30日。双向奔赴,恐龙IP撞上元宇宙不久前,上海市经济和信息化委员会等部门联合印发了《上海市超高清视听产业发展行动方案》,特别提到“支持博物馆、主题乐园等场所推动超高清视听技术应用,丰富线下文旅消费体验”。作为上海自然
    电子与消费 2024-11-30 22:03 107浏览
  • 概述 说明(三)探讨的是比较器一般带有滞回(Hysteresis)功能,为了解决输入信号转换速率不够的问题。前文还提到,即便使能滞回(Hysteresis)功能,还是无法解决SiPM读出测试系统需要解决的问题。本文在说明(三)的基础上,继续探讨为SiPM读出测试系统寻求合适的模拟脉冲检出方案。前四代SiPM使用的高速比较器指标缺陷 由于前端模拟信号属于典型的指数脉冲,所以下降沿转换速率(Slew Rate)过慢,导致比较器检出出现不必要的问题。尽管比较器可以使能滞回(Hysteresis)模块功
    coyoo 2024-12-03 12:20 170浏览
  • 当前,智能汽车产业迎来重大变局,随着人工智能、5G、大数据等新一代信息技术的迅猛发展,智能网联汽车正呈现强劲发展势头。11月26日,在2024紫光展锐全球合作伙伴大会汽车电子生态论坛上,紫光展锐与上汽海外出行联合发布搭载紫光展锐A7870的上汽海外MG量产车型,并发布A7710系列UWB数字钥匙解决方案平台,可应用于数字钥匙、活体检测、脚踢雷达、自动泊车等多种智能汽车场景。 联合发布量产车型,推动汽车智能化出海紫光展锐与上汽海外出行达成战略合作,联合发布搭载紫光展锐A7870的量产车型
    紫光展锐 2024-12-03 11:38 126浏览
  • 遇到部分串口工具不支持1500000波特率,这时候就需要进行修改,本文以触觉智能RK3562开发板修改系统波特率为115200为例,介绍瑞芯微方案主板Linux修改系统串口波特率教程。温馨提示:瑞芯微方案主板/开发板串口波特率只支持115200或1500000。修改Loader打印波特率查看对应芯片的MINIALL.ini确定要修改的bin文件#查看对应芯片的MINIALL.ini cat rkbin/RKBOOT/RK3562MINIALL.ini修改uart baudrate参数修改以下目
    Industio_触觉智能 2024-12-03 11:28 110浏览
  • TOF多区传感器: ND06   ND06是一款微型多区高集成度ToF测距传感器,其支持24个区域(6 x 4)同步测距,测距范围远达5m,具有测距范围广、精度高、测距稳定等特点。适用于投影仪的无感自动对焦和梯形校正、AIoT、手势识别、智能面板和智能灯具等多种场景。                 如果用ND06进行手势识别,只需要经过三个步骤: 第一步&
    esad0 2024-12-04 11:20 103浏览
  • 最近几年,新能源汽车愈发受到消费者的青睐,其销量也是一路走高。据中汽协公布的数据显示,2024年10月,新能源汽车产销分别完成146.3万辆和143万辆,同比分别增长48%和49.6%。而结合各家新能源车企所公布的销量数据来看,比亚迪再度夺得了销冠宝座,其10月新能源汽车销量达到了502657辆,同比增长66.53%。众所周知,比亚迪是新能源汽车领域的重要参与者,其一举一动向来为外界所关注。日前,比亚迪汽车旗下品牌方程豹汽车推出了新车方程豹豹8,该款车型一上市就迅速吸引了消费者的目光,成为SUV
    刘旷 2024-12-02 09:32 138浏览
我要评论
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦