基于FPGA的出租车计费系统设计---第一版--郝旭帅电子设计团队
欢迎各位朋友关注“郝旭帅电子设计团队”,本篇为各位朋友介绍基于FPGA的出租车计费系统设计—第一版
功能说明:
-
收费标准(里程):起步价5元,包括三公里;三公里之后,每公里2元(不到一公里,不收费)。
-
收费标准(低速等待费):当计费开始,车辆速度低于某一速度时,开始收取低速等待费,三分钟收取2元,不足三分钟不收费
-
整体收费=里程计费+低速等待费
-
设置有计费开始/停止按钮。
-
设置有档位控制按钮,0档(停止不动),1档(3分钟一公里),2档(1分钟一公里)。当计费开始,0档和1档位需要累加低速等待计费。
-
利用六个数码管显示信息。
-
显示模式一:第一个数码管显示是否计费(A:计费停止, C:计费开始),第二个数码管显示档位(0、1、2),第三个至六个显示应收钱数。
-
显示模式二:总计运行时间
-
显示模式三:前三个里程,后三个里程收费
-
显示模式四:前三个低速等待时长(分钟),后三个低速等待费。
-
设置有显示模式切换按钮。
-
计费停止后,重新按下计费开始,上述所有统计从0开始。
-
为了下板后,能够比较快速显示出效果,所有的时间加速30倍.
使用平台:本次设计应用Altera的平台设计(芯片:EP4CE10F17C8N)。
仿真平台:Modelsim。
作者QQ:746833924
说明:本篇设计中不涉及到IP和原语,代码在其他平台依然可以适用;当其他板卡电路不同时,会导致不同的现象出现,如有需要修改代码请联系作者;如需作者使用的板卡,请联系作者;
设计思想如下:

key_ctrl模块负责将外部输入的按键进行消抖,产生按键按下时的脉冲。
taxi_meter_ctrl模块负责根据外部输入的三个脉冲和出租车计费的规则产生对应的输出数据。
seven_tube_drive模块负责将taxi_meter_ctrl产生的数据显示到数码管上。
key_ctrl模块设计思想为:按键信号是由外部机械式按键产生,每次按下或者抬起时,会产生一定的抖动。如果直接对其进行边沿检测就会导致多次触发。故而需要设计按键消抖,进而对消抖之后的波形进行边沿检测。消抖原理为:外部按键信号发生改变后,如果能够持续20ms,没有新的改变,就认为此次改变不是抖动,而是真正的按下,然后进行采样即可。
// 记录任意边沿之后没有遇到新的边沿的时间长度是否达到20Ms //--------------------------------------------------------------------------------------- always@(posedgeclk)beginif(rst_n ==1'b0)cnt_20ms <=20'd0;elseif(pulse_key_negedge ==1'b1||pulse_key_posedge ==1'b1)cnt_20ms <=20'd1;elseif(cnt_20ms >20'd0&&cnt_20ms <T_20ms)cnt_20ms <=cnt_20ms +1'b1;elsecnt_20ms <=20'd0;end// --------------------------------------------------------------------------------------- // 任意边沿之后没有遇到新的边沿的时间长度达到20Ms,认为按键稳定,此时采样 //-------------------------------------------------------------------------------------- always@(posedgeclk)beginif(rst_n ==1'b0)key_wave <=1'b1;elseif(cnt_20ms ==T_20ms)key_wave <=key_rr;elsekey_wave <=key_wave;end//--------------------------------------------------------------------------------------// 对消抖之后的按键信号进行边沿检测 //---------------------------------------------------------------------------------------------initialkey_wave_r =1'b1;always@(posedgeclk)key_wave_r <=key_wave;assignflag_neg =(key_wave_r ==1'b1&&key_wave ==1'b0)?1'b1:1'b0;assignflag_pos =(key_wave_r ==1'b0&&key_wave ==1'b1)?1'b1:1'b0;//--------------------------------------------------------------------------------------------
taxi_meter_ctrl模块的设计原理如下:
根据flag_start_stop的信号,确定运行状态。
always @ (posedge clk) beginif (rst_n == 1'b0)state_run <= 1'b0;elseif (flag_start_stop == 1'b1)state_run <= ~state_run;elsestate_run <= state_run;end
根据flag_gear的信号,确定出租车的档位。
always @ (posedge clk) beginif (rst_n == 1'b0)gear <= 2'd0;elseif (flag_gear == 1'b1) if (gear < 2'd2)gear <= gear + 1'b1;elsegear <= 2'd0;elsegear <= gear;end
确定公里数,以及根据规则,确定钱数。
停止运行了后,公里数不要清除(也需要翻看),公里数需要在下一次启动时,清除;
flag_mileage_add是公里数递增的脉冲。
always @ (posedge clk) beginif (rst_n == 1'b0)mileage <= 10'd0;elseif (state_run == 1'b0 && flag_start_stop == 1'b1)mileage <= 10'd0;elseif (state_run == 1'b1)if (flag_mileage_add == 1'b1)if (mileage < 10'd999)mileage <= mileage + 1'b1;elsemileage <= mileage;elsemileage <= mileage;elsemileage <= mileage;endalways @ (posedge clk) beginif (rst_n == 1'b0)money_mileage <= 10'd0;elseif (mileage < 10'd4)money_mileage <= 10'd5;elsemoney_mileage <= (mileage - 10'd3) * 2 + 5;end
产生flag_mileage_add的逻辑为:记录三分钟,如果是0档,则计数器不动;如果是1档,则计数器加1(由于加速30倍,所以加30);如果是2档,则计数器加3(由于加速30倍,所以加90);由于每次并不是加1,所以最大值并一定正好能达到,所以超过最大值时,减去最大值。
always @ (posedge clk) beginif (rst_n == 1'b0) begincounter <= 64'd0;flag_mileage_add <= 1'b0;endelseif (state_run == 1'b1)if (gear == 2'd1)if (counter < 34'd9_000_000_000 - 1'b1) begincounter <= counter + 30;flag_mileage_add <= 1'b0;endelse begincounter <= counter - (34'd9_000_000_000 - 1'b1);flag_mileage_add <= 1'b1;endelseif (gear == 2'd2)if (counter < 34'd9_000_000_000 - 1'b1) begincounter <= counter + 90;flag_mileage_add <= 1'b0;endelse begincounter <= counter - (34'd9_000_000_000 - 1'b1);flag_mileage_add <= 1'b1;endelse begincounter <= counter;flag_mileage_add <= 1'b0;endelse begincounter <= 64'd0;flag_mileage_add <= 1'b0;endend
记录整体的运行时间;加速30倍;
always @ (posedge clk) beginif (rst_n == 1'b0)cnt_1s_all_timer <= 26'd0;elseif (state_run == 1'b1)if (cnt_1s_all_timer < T_1s - 1'b1)cnt_1s_all_timer <= cnt_1s_all_timer + 30;elsecnt_1s_all_timer <= cnt_1s_all_timer - (T_1s - 1'b1);elsecnt_1s_all_timer <= 26'd0;endalways @ (posedge clk) beginif (rst_n == 1'b0)sec_counter_all_timer <= 32'd0;elseif (state_run == 1'b0 && flag_start_stop == 1'b1)sec_counter_all_timer <= 32'd0;elseif (cnt_1s_all_timer >= T_1s - 1'b1)sec_counter_all_timer <= sec_counter_all_timer + 1'b1;elsesec_counter_all_timer <= sec_counter_all_timer;end
确定低速等待时间;加速30倍;计数器为1分钟的计数器;
然后根据1分钟的计数器,确定等待了多长时间;
always @ (posedge clk) beginif (rst_n == 1'b0) min_wait_timer <= 32'd0;elseif (state_run == 1'b1) if (gear == 2'd0 || gear == 2'd1)if (min_wait_timer < T_60s - 1'b1)min_wait_timer <= min_wait_timer + 30;elsemin_wait_timer <= min_wait_timer - (T_60s - 1'b1);elsemin_wait_timer <= min_wait_timer;elsemin_wait_timer <= 32'd0;endalways @ (posedge clk) beginif (rst_n == 1'b0)wait_min <= 32'd0;elseif (state_run == 1'b0 && flag_start_stop == 1'b1) wait_min <= 32'd0;elseif (state_run == 1'b1 && (gear == 2'd0 || gear == 2'd1) && min_wait_timer >= T_60s - 1'b1)wait_min <= wait_min + 1'b1;elsewait_min <= wait_min;end
根据低速等待时间,确定低速等待费。
always @ (posedge clk) beginif (rst_n == 1'b0)money_wait <= 32'd0;elsemoney_wait <= (wait_min/3) * 2;end
最终的费用等于里程费用加上低速等待费。
always @ (posedge clk) beginif (rst_n == 1'b0)money_all <= 11'd0;elsemoney_all <= money_mileage + money_wait;end
根据切换显示的脉冲,确定需要显示的模式;
always @ (posedge clk) beginif (rst_n == 1'b0)state_show <= 2'd0;elseif (flag_show == 1'b1)state_show <= state_show + 1'b1;elsestate_show <= state_show;end
一个模式:显示车辆运行状态,档位和收费。
initial data0[23:20] = 4'ha;always @ (posedge clk) beginif (rst_n == 1'b0)data0[23:20] <= 4'ha;elseif (state_run == 1'b1)data0[23:20] <= 4'hc;elsedata0[23:20] <= 4'ha;endalways @ (posedge clk) beginif (rst_n == 1'b0)data0[19:16] <= 4'h0;elsedata0[19:16] <= {2'd0,gear};endalways @ (posedge clk) beginif (rst_n == 1'b0)data0[15:0] <= 16'd0;elsedata0[3:0] <= money_all % 10;data0[7:4] <= money_all/10 % 10;data0[11:8] <= money_all/100 % 10;data0[15:12] <= money_all/1000 % 10;end
第二个模式:显示整体的运行时间(换算成为时分秒)。
always @ (posedge clk) beginif (rst_n == 1'b0)data1 <= 24'd0;elsedata1[23:20] <= sec_counter_all_timer / 3600 / 10 % 10;data1[19:16] <= sec_counter_all_timer / 3600 % 10;data1[15:12] <= sec_counter_all_timer % 3600 / 60 / 10 % 10;data1[11:8] <= sec_counter_all_timer % 3600 / 60 % 10;data1[7:4] <= sec_counter_all_timer % 60 / 10 % 10;data1[3:0] <= sec_counter_all_timer % 60 % 10;end
第三个模式:显示历程,历程计费。
always @ (posedge clk) beginif (rst_n == 1'b0)data2 <= 24'd0;elsedata2[23:20] <= mileage / 100;data2[19:16] <= mileage / 10 % 10;data2[15:12] <= mileage % 10;data2[11:8] <= money_mileage / 100;data2[7:4] <= money_mileage / 10 % 10;data2[3:0] <= money_mileage % 10;end
第四个模式:显示低速等待计费和低速等待时间。
always @ (posedge clk) beginif (rst_n == 1'b0)data3 <= 24'd0;elsedata3[23:20] <= wait_min / 100;data3[19:16] <= wait_min / 10 % 10;data3[15:12] <= wait_min % 10;data3[11:8] <= money_wait / 100;data3[7:4] <= money_wait / 10 % 10;data3[3:0] <= money_wait % 10;end
根据外部的显示脉冲,确定需要显示的模式;
always @ (posedge clk) beginif (rst_n == 1'b0)state_show <= 2'd0;elseif (flag_show == 1'b1)state_show <= state_show + 1'b1;elsestate_show <= state_show;endalways @ (posedge clk) beginif (rst_n == 1'b0)data <= 23'd0;else case (state_show)2'd0 : data <= data0;2'd1 : data <= data1;2'd2 : data <= data2;2'd3 : data <= data3;default : data <= data0;endcaseend
以上为taxi_meter_crtl的设计思想;
七段数码管为普通六位一体的共阳极数码,采用动态驱动的方式,在此不再赘述。
下板后,我们就可以看到出租车计费系统的运行情况。


讲解和演示视频(链接)如下:
https://www.bilibili.com/video/BV184421D7MT/?vd_source=b5405faeab8632f02533bcbfc5e52e55
本设计所有内容(设计代码、设计工程)链接为:
链接:https://pan.baidu.com/s/1vLDLaQckYVFUMS8hQolcaQ
提取码:01v6
本篇内容中有部分资源来源于网络,如有侵权,请联系作者。
如果您觉得本公众号还不错的话,可以推给身边的朋友们,感谢并祝好!
相关文章:
基于FPGA的出租车计费系统设计---第一版--郝旭帅电子设计团队
欢迎各位朋友关注“郝旭帅电子设计团队”,本篇为各位朋友介绍基于FPGA的出租车计费系统设计—第一版 功能说明: 收费标准(里程):起步价5元,包括三公里;三公里之后,每公里2元&#x…...
商汤联合建工社共同打造“住建领域法规标准知识大模型”
近日,商汤科技与中国建筑出版传媒有限公司(下称“建工社”)共同发布“住建领域法规标准知识大模型”,共同探索新型知识服务模式。大模型聚焦建筑行业,以商汤“日日新SenseNova 5.5”大模型体系为基础,结合海…...
基于STM32的智能交通监控系统教程
目录 引言环境准备智能交通监控系统基础代码实现:实现智能交通监控系统 车辆检测模块交通流量分析模块通信与网络系统实现用户界面与数据可视化应用场景:交通管理与优化常见问题与解决方案收尾与总结 引言 随着城市化进程的加快,交通拥堵问…...
Git和TortoiseGit的安装与使用
文章目录 前言一、Git安装步骤查看版本信息 二、TortoiseGit安装中文语言包TortoiseGit 配置不同语言 Git基本原理介绍及常用指令 GitLab添加TortoiseGIT生成SSH Key 前言 Git 提供了一种有效的方式来管理项目的版本,协作开发,以及跟踪和应用文件的变化…...
改进YOLOv5:加入非对称卷积块ACNet,加强CNN 的内核骨架,包含VOC对比实验
🔥🔥🔥 提升多尺度、不规则目标检测,创新提升 🔥🔥🔥 🔥🔥🔥 捕捉图像特征和处理复杂图像特征 🔥🔥🔥 👉👉👉: 本专栏包含大量的新设计的创新想法,包含详细的代码和说明,具备有效的创新组合,可以有效应用到改进创新当中 👉👉👉: �…...
论文解读(12)-Transfer Learning
这个也是看论文的时候看到的,但是对这方面不是理解,需要对这方面知识点进行一个补充。 参考: 迁移学习概述(Transfer Learning)-CSDN博客 1. 什么是Transfer Learning? Transfer Learning就是迁移学习&…...
力扣高频SQL 50题(基础版)第三十八题
文章目录 力扣高频SQL 50题(基础版)第三十八题1484.按日期分组销售产品题目说明实现过程准备数据实现方式结果截图总结 力扣高频SQL 50题(基础版)第三十八题 1484.按日期分组销售产品 题目说明 表 Activities: ---…...
大模型下的视频理解video understanding
数据集 Learning Video Context as Interleaved Multimodal Sequences Motivation: 针对Narrative videos, like movie clips, TV series, etc.:因为比较复杂 most top-performing video perception models 都是研究那种原子动作or人or物 understandin…...
【网络安全】CR/LF注入+Race Condition绕过MFA
未经许可,不得转载。 文章目录 漏洞1:CR/LF注入前言正文漏洞2:Race Condition绕过MFA前言正文漏洞1:CR/LF注入 前言 ExaHub(此处为虚拟名称)是一个专为 Exa 编程语言的爱好者和专业人士量身定制的平台。Exa 语言以其出色的速度和性能而闻名,广泛应用于科学计算、机器学…...
深度学习入门——卷积神经网络
本章的主题是卷积神经网络(Convolutional Neural Network,CNN)。CNN被用于图像识别、语音识别等各种场合,在图像识别的比赛中,基于深度学习的方法几乎都以CNN为基础。本章将详细介绍CNN的结构,并用Python实…...
快团团供货大大团长帮卖团长如何线上结算和支付货款?
一、如何支付结算单? 团长在快团团小程序【我的供货商】—【结算单】—【待支付】中,找到需要支付的结算单,点击【去支付】即可。 当有多笔结算单待支付时,团长可筛选供货商和日期找到需要支付的结算单,点击【去批量…...
vite vue3 Webstorm multiple export width the same name “default“
系统格式不一样,导致代码文件格式冲突导致的,解决方法找到对应的文件,将文件类型切换成LF。...
Transformer预测模型及其Python和MATLAB实现
### 一、背景 在自然语言处理(NLP)领域,传统的序列到序列(Seq2Seq)模型大多依赖于循环神经网络(RNN)和长短期记忆(LSTM)网络。这些模型虽然在许多任务中取得了成功&…...
草的渲染理论
Unity引擎提供了基础的terrain工具,可以制作地形,在上面刷树刷草。对于树,Unity是支持带LOD的Prefab,不同距离显示不同细节的模型,效果还不错。对于草,Unity支持两种方式来刷草,一种是Add Grass…...
Redis:十大数据类型
键(key) 常用命令 1. 字符串(String) 1.1 基本命令 set key value 如下:设置kv键值对,存货时长为30秒 get key mset key value [key value ...]mget key [key ...] 同时设置或者获取多个键值对 getrange…...
bugku-web-source
kali中先用dirsearch工具扫描后台目录,然后用wget -r url/.git命令递归下载后,进入txt文件使用git reflog命令然后只用git show查看作者提交flag日志,用git show 一个一个去尝试,很多假的flag git reflog 是一个 Git 命令&#x…...
一键生成视频并批量上传视频抖音、bilibili、腾讯(已打包)
GenerateAndAutoupload Github地址:https://github.com/cmdch2017/GenerateAndAutoupload 如何下载(找到最新的release) https://github.com/cmdch2017/GenerateAndAutoupload/releases/download/v1.0.1/v1.0.1.zip 启动必知道 conf.py …...
Python WSGI服务器库之gunicorn使用详解
概要 在部署 Python Web 应用程序时,选择合适的 WSGI 服务器是关键的一步。Gunicorn(Green Unicorn)是一个高性能、易于使用的 Python WSGI HTTP 服务器,适用于各种应用部署场景。Gunicorn 设计简洁,支持多种工作模式,能够有效地管理和处理大量并发请求。本文将详细介绍…...
Java编程达人:每日一练,提升自我
目录 题目1.以下哪个单词不是 Java 的关键字?2.boolean 类型的默认值为?3.以下代码输出正确的是?4.以下代码,输出结果为:5.以下代码输出结果为:6.以下代码输出结果为?7.float 变量的默认值为&am…...
(35)远程识别(又称无人机识别)(二)
文章目录 前言 4 ArduRemoteID 5 终端用户数据的设置和使用 6 测试 7 为OEMs添加远程ID到ArduPilot系统的视频教程 前言 在一些国家,远程 ID 正在成为一项法律要求。以下是与 ArduPilot 兼容的设备列表。这里(here)有一个关于远程 ID 的很好解释和常见问题列表…...
在rocky linux 9.5上在线安装 docker
前面是指南,后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...
连锁超市冷库节能解决方案:如何实现超市降本增效
在连锁超市冷库运营中,高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术,实现年省电费15%-60%,且不改动原有装备、安装快捷、…...
全球首个30米分辨率湿地数据集(2000—2022)
数据简介 今天我们分享的数据是全球30米分辨率湿地数据集,包含8种湿地亚类,该数据以0.5X0.5的瓦片存储,我们整理了所有属于中国的瓦片名称与其对应省份,方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...
【Linux】Linux安装并配置RabbitMQ
目录 1. 安装 Erlang 2. 安装 RabbitMQ 2.1.添加 RabbitMQ 仓库 2.2.安装 RabbitMQ 3.配置 3.1.启动和管理服务 4. 访问管理界面 5.安装问题 6.修改密码 7.修改端口 7.1.找到文件 7.2.修改文件 1. 安装 Erlang 由于 RabbitMQ 是用 Erlang 编写的,需要先安…...
云安全与网络安全:核心区别与协同作用解析
在数字化转型的浪潮中,云安全与网络安全作为信息安全的两大支柱,常被混淆但本质不同。本文将从概念、责任分工、技术手段、威胁类型等维度深入解析两者的差异,并探讨它们的协同作用。 一、核心区别 定义与范围 网络安全:聚焦于保…...
Java求职者面试指南:Spring、Spring Boot、Spring MVC与MyBatis技术点解析
Java求职者面试指南:Spring、Spring Boot、Spring MVC与MyBatis技术点解析 第一轮:基础概念问题 请解释Spring框架的核心容器是什么?它的作用是什么? 程序员JY回答:Spring框架的核心容器是IoC容器(控制反转…...
【设计模式】1.简单工厂、工厂、抽象工厂模式
every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?typeblog 0. 前言 以下是 简单工厂模式、工厂方法模式 和 抽象工厂模式 的 Python 实现与对比,结合代码示例和实际应用场景说明: 1. 简单工厂模式&a…...
PySide6 GUI 学习笔记——常用类及控件使用方法(多行文本控件QTextEdit)
文章目录 PySide6.QtWidgets.QTextEdit 应用举例概述核心特性常用方法文本内容操作光标和选择操作格式和样式查找功能视图控制状态设置常用信号 代码示例示例说明1. 基本设置2. 文本格式化功能3. 功能按钮4. 信号处理 PySide6.QtWidgets.QTextEdit 应用举例 概述 QTextEdit 是…...
Oracle 19c RAC集群ADG搭建
1、将主库的pfile和passwdfile发送到备库 #主库一节点操作 scp -P1234 /tmp/pfile2025.ora bak_ip:/home/oracle sco -P1234 /oracle/app/oracle/product/19.0.0/db/dbs/orapw$ORACLE_SID bak_ip:/oracle/app/oracle/product/19.0.0/db/dbs 2、备库修改参数文件成standby相关…...
JavaWeb:前端工程化-Vue
Vue工程化 介绍 什么是Vue? 小白眼里前端开发 前端工程化 环境准备 D:\Program Files\nodejs Vue项目-快速入门 步骤 D:\front\vue 安装依赖 目录结构 code . vscode打开 启动 VScode侧边栏左下角,没有NPM脚本,如何打开?&…...
