基于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万注册用户,加入面包板社区,从菜鸟变大神,打造您的电子人脉社交圈!
评论 (0)
  • 文/Leon编辑/cc孙聪颖‍2023年,厨电行业在相对平稳的市场环境中迎来温和复苏,看似为行业增长积蓄势能。带着对市场向好的预期,2024 年初,老板电器副董事长兼总经理任富佳为企业定下双位数增长目标。然而现实与预期相悖,过去一年,这家老牌厨电企业不仅未能达成业绩目标,曾提出的“三年再造一个老板电器”愿景,也因市场下行压力面临落空风险。作为“企二代”管理者,任富佳在掌舵企业穿越市场周期的过程中,正面临着前所未有的挑战。4月29日,老板电器(002508.SZ)发布了2024年年度报告及2025
    华尔街科技眼 2025-04-30 12:40 274浏览
  • 一、gao效冷却与控温机制‌1、‌冷媒流动设计‌采用低压液氮(或液氦)通过毛细管路导入蒸发器,蒸汽喷射至样品腔实现快速冷却,冷却效率高(室温至80K约20分钟,至4.2K约30分钟)。通过控温仪动态调节蒸发器加热功率,结合温度传感器(如PT100铂电阻或Cernox磁场不敏感传感器),实现±0.01K的高精度温度稳定性。2、‌宽温区覆盖与扩展性‌标准温区为80K-325K,通过降压选件可将下限延伸至65K(液氮模式)或4K(液氦模式)。可选配475K高温模块,满足材料在ji端温度下的性能测试需求
    锦正茂科技 2025-04-30 13:08 380浏览
  • 在CAN总线分析软件领域,当CANoe不再是唯一选择时,虹科PCAN-Explorer 6软件成为了一个有竞争力的解决方案。在现代工业控制和汽车领域,CAN总线分析软件的重要性不言而喻。随着技术的进步和市场需求的多样化,单一的解决方案已无法满足所有用户的需求。正是在这样的背景下,虹科PCAN-Explorer 6软件以其独特的模块化设计和灵活的功能扩展,为CAN总线分析领域带来了新的选择和可能性。本文将深入探讨虹科PCAN-Explorer 6软件如何以其创新的模块化插件策略,提供定制化的功能选
    虹科汽车智能互联 2025-04-28 16:00 230浏览
  • 文/郭楚妤编辑/cc孙聪颖‍越来越多的企业开始蚕食动力电池市场,行业“去宁王化”态势逐渐明显。随着这种趋势的加强,打开新的市场对于宁德时代而言至关重要。“我们不希望被定义为电池的制造者,而是希望把自己称作新能源产业的开拓者。”4月21日,在宁德时代举行的“超级科技日”发布会上,宁德时代掌门人曾毓群如是说。随着宁德时代核心新品骁遥双核电池的发布,其搭载的“电电增程”技术也走进业界视野。除此之外,经过近3年试水,宁德时代在换电业务上重资加码。曾毓群认为换电是一个重资产、高投入、长周期的产业,涉及的利
    华尔街科技眼 2025-04-28 21:55 200浏览
  • 贞光科技代理品牌紫光国芯的车规级LPDDR4内存正成为智能驾驶舱的核心选择。在汽车电子国产化浪潮中,其产品以宽温域稳定工作能力、优异电磁兼容性和超长使用寿命赢得市场认可。紫光国芯不仅确保供应链安全可控,还提供专业本地技术支持。面向未来,紫光国芯正研发LPDDR5车规级产品,将以更高带宽、更低功耗支持汽车智能化发展。随着智能网联汽车的迅猛发展,智能驾驶舱作为人机交互的核心载体,对处理器和存储器的性能与可靠性提出了更高要求。在汽车电子国产化浪潮中,贞光科技代理品牌紫光国芯的车规级LPDDR4内存凭借
    贞光科技 2025-04-28 16:52 322浏览
  • 浪潮之上:智能时代的觉醒    近日参加了一场课题的答辩,这是医疗人工智能揭榜挂帅的国家项目的地区考场,参与者众多,围绕着医疗健康的主题,八仙过海各显神通,百花齐放。   中国大地正在发生着激动人心的场景:深圳前海深港人工智能算力中心高速运转的液冷服务器,武汉马路上自动驾驶出租车穿行的智慧道路,机器人参与北京的马拉松竞赛。从中央到地方,人工智能相关政策和消息如雨后春笋般不断出台,数字中国的建设图景正在智能浪潮中徐徐展开,战略布局如同围棋
    广州铁金刚 2025-04-30 15:24 265浏览
  • 在智能硬件设备趋向微型化的背景下,语音芯片方案厂商针对小体积设备开发了多款超小型语音芯片方案,其中WTV系列和WT2003H系列凭借其QFN封装设计、高性能与高集成度,成为微型设备语音方案的理想选择。以下从封装特性、功能优势及典型应用场景三个方面进行详细介绍。一、超小体积封装:QFN技术的核心优势WTV系列与WT2003H系列均提供QFN封装(如QFN32,尺寸为4×4mm),这种封装形式具有以下特点:体积紧凑:QFN封装通过减少引脚间距和优化内部结构,显著缩小芯片体积,适用于智能门铃、穿戴设备
    广州唯创电子 2025-04-30 09:02 324浏览
  • 随着电子元器件的快速发展,导致各种常见的贴片电阻元器件也越来越小,给我们分辨也就变得越来越难,下面就由smt贴片加工厂_安徽英特丽就来告诉大家如何分辨的SMT贴片元器件。先来看看贴片电感和贴片电容的区分:(1)看颜色(黑色)——一般黑色都是贴片电感。贴片电容只有勇于精密设备中的贴片钽电容才是黑色的,其他普通贴片电容基本都不是黑色的。(2)看型号标码——贴片电感以L开头,贴片电容以C开头。从外形是圆形初步判断应为电感,测量两端电阻为零点几欧,则为电感。(3)检测——贴片电感一般阻值小,更没有“充放
    贴片加工小安 2025-04-29 14:59 305浏览
  • 你是不是也有在公共场合被偷看手机或笔电的经验呢?科技时代下,不少现代人的各式机密数据都在手机、平板或是笔电等可携式的3C产品上处理,若是经常性地需要在公共场合使用,不管是工作上的机密文件,或是重要的个人信息等,民众都有防窃防盗意识,为了避免他人窥探内容,都会选择使用「防窥保护贴片」,以防止数据外泄。现今市面上「防窥保护贴」、「防窥片」、「屏幕防窥膜」等产品就是这种目的下产物 (以下简称防窥片)!防窥片功能与常见问题解析首先,防窥片最主要的功能就是用来防止他人窥视屏幕上的隐私信息,它是利用百叶窗的
    百佳泰测试实验室 2025-04-30 13:28 491浏览
  • 网约车,真的“饱和”了?近日,网约车市场的 “饱和” 话题再度引发热议。多地陆续发布网约车风险预警,提醒从业者谨慎入局,这背后究竟隐藏着怎样的市场现状呢?从数据来看,网约车市场的“过剩”现象已愈发明显。以东莞为例,截至2024年12月底,全市网约车数量超过5.77万辆,考取网约车驾驶员证的人数更是超过13.48万人。随着司机数量的不断攀升,订单量却未能同步增长,导致单车日均接单量和营收双双下降。2024年下半年,东莞网约出租车单车日均订单量约10.5单,而单车日均营收也不容乐
    用户1742991715177 2025-04-29 18:28 275浏览
我要评论
0
1
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦