基于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 的很好解释和常见问题列表…...
web vue 项目 Docker化部署
Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage):…...

(十)学生端搭建
本次旨在将之前的已完成的部分功能进行拼装到学生端,同时完善学生端的构建。本次工作主要包括: 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...
React Native 开发环境搭建(全平台详解)
React Native 开发环境搭建(全平台详解) 在开始使用 React Native 开发移动应用之前,正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南,涵盖 macOS 和 Windows 平台的配置步骤,如何在 Android 和 iOS…...

(二)TensorRT-LLM | 模型导出(v0.20.0rc3)
0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述,后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作,其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...
解锁数据库简洁之道:FastAPI与SQLModel实战指南
在构建现代Web应用程序时,与数据库的交互无疑是核心环节。虽然传统的数据库操作方式(如直接编写SQL语句与psycopg2交互)赋予了我们精细的控制权,但在面对日益复杂的业务逻辑和快速迭代的需求时,这种方式的开发效率和可…...

深入理解JavaScript设计模式之单例模式
目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式(Singleton Pattern&#…...

对WWDC 2025 Keynote 内容的预测
借助我们以往对苹果公司发展路径的深入研究经验,以及大语言模型的分析能力,我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际,我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测,聊作存档。等到明…...

《通信之道——从微积分到 5G》读书总结
第1章 绪 论 1.1 这是一本什么样的书 通信技术,说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号(调制) 把信息从信号中抽取出来&am…...

ETLCloud可能遇到的问题有哪些?常见坑位解析
数据集成平台ETLCloud,主要用于支持数据的抽取(Extract)、转换(Transform)和加载(Load)过程。提供了一个简洁直观的界面,以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...

Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级
在互联网的快速发展中,高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司,近期做出了一个重大技术决策:弃用长期使用的 Nginx,转而采用其内部开发…...