基于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 的很好解释和常见问题列表…...
ES6从入门到精通:前言
ES6简介 ES6(ECMAScript 2015)是JavaScript语言的重大更新,引入了许多新特性,包括语法糖、新数据类型、模块化支持等,显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var…...
云计算——弹性云计算器(ECS)
弹性云服务器:ECS 概述 云计算重构了ICT系统,云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台,包含如下主要概念。 ECS(Elastic Cloud Server):即弹性云服务器,是云计算…...

【第二十一章 SDIO接口(SDIO)】
第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...

React19源码系列之 事件插件系统
事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...
如何为服务器生成TLS证书
TLS(Transport Layer Security)证书是确保网络通信安全的重要手段,它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书,可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...
【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)
升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点,但无自动故障转移能力,Master宕机后需人工切换,期间消息可能无法读取。Slave仅存储数据,无法主动升级为Master响应请求ÿ…...

自然语言处理——Transformer
自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效,它能挖掘数据中的时序信息以及语义信息,但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN,但是…...

用docker来安装部署freeswitch记录
今天刚才测试一个callcenter的项目,所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...
稳定币的深度剖析与展望
一、引言 在当今数字化浪潮席卷全球的时代,加密货币作为一种新兴的金融现象,正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而,加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下,稳定…...

使用 SymPy 进行向量和矩阵的高级操作
在科学计算和工程领域,向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能,能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作,并通过具体…...