基于FPGA的出租车里程时间计费器
基于FPGA的出租车里程时间计费器
- 功能描述
- 一、系统框图
- 二、verilog代码
- 里程增加模块
- 时间增加模块
- 计算价格模块
- 上板视频演示
- 总结
功能描述
(1);里程计费功能:3公里以内起步价8元,超过3公里后每公里2元,其中不满一公里按照一公里计算。
(2);等待计费功能:当乘客中途下车需要司机等待时,按照等待时间进行收费,每3分钟0.7元,其中不满3分钟不收费。
(3);数码管显示功能;3种显示状态,默认显示公里数,显示格式10.2,每次步进0.1km,步进时间长度为5S。第二种显示等待时间,显示格式50:33,步进时间长度1S。第三种显示当前费用,包括等待费用以及里程计价费用。
(4);信号灯指示功能:当里程计费模式下,LED2亮起,其他LED熄灭。当等待时间计费模式下,LED4亮起,其他LED熄灭。载人状态下LED1亮起,否则不亮。
(5);按键切换功能:3个按键起作用,第一个按键负责切换计费模式,默认是里程计费模式,切换后为等待时间计费模式。第二个按键负责表示出租车载人状态,默认空载,按下表示载人模式。第三个按键负责切换数码管显示的数据,每按一次切换一次,3种数据循环显示。
一、系统框图
二、verilog代码
里程增加模块
module count_km(input key_dri,input sys_reset_n,input en_dowm_car,input EN,output reg [3:0] data_km_ge,output reg [3:0] data_km_shi,output reg [3:0] data_km_bai,// output reg [15:0] data_km,output [3:0] point
);parameter max_km=16'd9999; reg flag_km_shi_up;
reg flag_km_bai_up;assign point=4'b0010;always @(posedge key_dri or negedge sys_reset_n)beginif(!sys_reset_n)begindata_km_ge<=4'h0;flag_km_shi_up<=1'b0;endelse if(!EN)begindata_km_ge<=data_km_ge;flag_km_shi_up<=flag_km_shi_up;endelse if(key_dri && en_dowm_car)beginif(data_km_ge<4'h9)begindata_km_ge<=data_km_ge+1'b1;flag_km_shi_up<=1'b0;endelsebegindata_km_ge<=4'h0;flag_km_shi_up<=1'b1;endendendalways @(posedge key_dri or negedge sys_reset_n)beginif(!sys_reset_n)begindata_km_shi<=4'h0;flag_km_bai_up<=1'b0;endelse if(!EN)begindata_km_shi<=data_km_shi;flag_km_bai_up<=flag_km_bai_up;endelse if(key_dri && en_dowm_car && flag_km_shi_up)beginif(data_km_shi<4'h9)begindata_km_shi<=data_km_shi+1'b1;flag_km_bai_up<=1'b0;endelsebegindata_km_shi<=4'h0;flag_km_bai_up<=1'b1;endendelse if(key_dri && en_dowm_car && flag_km_shi_up==1'b0)beginflag_km_bai_up<=1'b0;endendalways @(posedge key_dri or negedge sys_reset_n)beginif(!sys_reset_n)begindata_km_bai<=4'h0;endelse if(!EN)begindata_km_bai<=data_km_bai;endelse if(key_dri && en_dowm_car && flag_km_bai_up)beginif(data_km_bai<4'h9)begindata_km_bai<=data_km_bai+1'b1;endelsebegindata_km_bai<=4'h0;endendendendmodule
时间增加模块
//计时模块
module count_1s
(input clk, //系统时钟input sys_reset_n, //复位信号input EN, //使能 保持input en_dowm_car,// output reg [7:0] data_s, //秒计时器
// output reg [7:0] data_m, //分钟计时器output reg [3:0] data_s_shi,output reg [3:0] data_s_ge,output reg [3:0] data_m_shi,output reg [3:0] data_m_ge,output reg [3:0] time_price_ge,output reg [3:0] time_price_shi,output reg [3:0] time_price_bai,output reg clk_1s, //1s脉冲output [3:0] point //点
);parameter time_60=8'd60;
parameter MAX_NUM=28'd249;reg [27:0] cnt; //1s计数器reg flag_1m; //1m计时reg flag_m_shi_up;
reg flag_s_up;
reg flag_m_up;
reg time_shi_up;
reg time_bai_up;assign point=4'b0100;
//1s计时
always @(posedge clk or negedge sys_reset_n)beginif(!sys_reset_n)begincnt<=1'b0;clk_1s<=1'b0;endelse if(!EN)begincnt<=cnt; //保持clk_1s<=clk_1s;endelse if(cnt<MAX_NUM)begincnt<=cnt+1'b1;endelsebegincnt<=0;clk_1s<=~clk_1s; //翻转endendalways @(negedge clk_1s or negedge sys_reset_n) beginif(!sys_reset_n)begintime_price_ge<=4'h0;endelse if(en_dowm_car)beginif(flag_s_up && time_price_ge<4'h9)begintime_price_ge<=time_price_ge+1;endelse if(flag_s_up && time_price_ge==4'h9)begintime_price_ge<=0;endendend
always @(negedge clk_1s or negedge sys_reset_n) beginif(!sys_reset_n)begintime_price_shi<=4'h0;endelse if(en_dowm_car)beginif(time_price_ge==4'h9 && time_price_shi<4'h9 && flag_s_up )begintime_price_shi<=time_price_shi+1;endelse if(time_price_ge==4'h9 && time_price_shi==4'h9&& flag_s_up)begintime_price_shi<=0;endendendalways @(negedge clk_1s or negedge sys_reset_n) beginif(!sys_reset_n)begintime_price_bai<=4'h0;endelse if(en_dowm_car)beginif(time_price_shi==4'h9 && time_price_bai<4'h9&& flag_s_up &&time_price_ge==4'h9)begintime_price_bai<=time_price_bai+1;endelse if(time_price_shi==4'h9 && time_price_bai==4'h9&& flag_s_up&&time_price_ge==4'h9)begintime_price_bai<=0;endendend// 秒个位加1
always @(negedge clk_1s or negedge sys_reset_n) beginif(!sys_reset_n)begindata_s_ge<=4'h0;flag_s_up<=0;endelse if(!EN)begindata_s_ge<=data_s_ge; //保持flag_s_up<=flag_s_up;endelse if(en_dowm_car)beginif(data_s_ge < 4'h9 )begindata_s_ge<=data_s_ge+1'b1; flag_s_up<=1'b0; endelse if(data_s_ge == 4'h9)begindata_s_ge<=4'h0; flag_s_up<=1'b1; endendelse begindata_s_ge<=data_s_ge; //保持flag_s_up<=flag_s_up;endend
// 秒十位加1
always @(negedge clk_1s or negedge sys_reset_n) beginif(!sys_reset_n)begindata_s_shi<=4'h0;flag_m_up<=0;endelse if(!EN)begindata_s_shi<=data_s_shi; //保持flag_m_up<=flag_m_up;endelse if(data_s_shi < 4'h5 && data_s_ge==4'h9)begindata_s_shi<=data_s_shi+1'b1; flag_m_up<=1'b0; endelse if(data_s_shi == 4'h5 && data_s_ge==4'h9)begindata_s_shi<=4'h0; flag_m_up<=1'b1; endelse begindata_s_shi<=data_s_shi; flag_m_up<=1'b0; endend//分钟个位加一
always @(posedge clk_1s or negedge sys_reset_n) beginif(!sys_reset_n)begindata_m_ge<=4'h0;flag_m_shi_up<=1'b0;endelse if(!EN)begindata_m_ge<=data_m_ge; //保持flag_m_shi_up<=flag_m_shi_up;endelse if(en_dowm_car) beginif(data_m_ge<4'h9 && data_s_shi==4'h5 && data_s_ge==4'h9)begindata_m_ge<=data_m_ge+1'b1;flag_m_shi_up<=1'b0;endelse if(data_m_ge==4'h9 && data_s_shi==4'h5 && data_s_ge==4'h9)begindata_m_ge<=4'h0;flag_m_shi_up<=1'b1;endelse begindata_m_ge<=data_m_ge; //保持flag_m_shi_up<=1'b0;endendelse begindata_m_ge<=data_m_ge; //保持flag_m_shi_up<=1'b0;endend//分钟十位加一
always @(posedge flag_m_shi_up or negedge sys_reset_n) beginif(!sys_reset_n)begindata_m_shi<=4'h0;endelse if(!EN)begindata_m_shi<=data_m_shi; //保持endelse if(en_dowm_car) beginif(data_m_shi<4'h5 )begindata_m_shi<=data_m_shi+1'b1;endelse if(data_m_shi==4'h5)begindata_m_shi<=4'h0;endendelse begindata_m_ge<=data_m_ge; //保持endendendmodule
计算价格模块
module count_money(input [7:0] data_m,input [15:0] data_km,input sys_reset_n,input clk,input add_km,input en_dowm_car,input clk_1s,input [3:0] data_km_ge,input [3:0] data_km_shi,input [3:0] data_km_bai,input [3:0] time_price_ge,input [3:0] time_price_shi,input [3:0] time_price_bai,output reg [3:0] price_ge,output reg [3:0] price_shi,output reg [3:0] price_bai,
// output reg [15:0] data_price,output [3:0] point
);assign point=4'b0010;reg [15:0] price_km;
reg [15:0] price_time;reg price_shi_up;
reg price_bai_up;
initialbeginprice_km<=16'd30;price_time<=16'd0;end//里程计价
always @(posedge add_km or negedge sys_reset_n)beginif(!sys_reset_n)beginprice_ge<=4'h0;price_shi_up<=1'b0;endelse if(en_dowm_car )beginif(data_km_bai==4'h0)beginif(price_ge<4'h9 && data_km_shi>=4'h3 )begin//大于3.0公里开始增加price_ge<=price_ge+1;price_shi_up<=1'b0;endelse if(price_ge>=4'h9 && data_km_shi>=4'h3 )begin//大于3.0公里开始增加 到9累加price_ge<=4'h0;price_shi_up<=1'b1;endelse if(price_ge<4'h9 && data_km_shi<4'h3)beginprice_ge<=price_ge;price_shi_up<=1'b0;endendelse if(data_km_bai!=4'h0)beginif(price_ge<4'h9 )begin//大于3.0公里开始增加price_ge<=price_ge+1;price_shi_up<=1'b0;endelse if(price_ge>=4'h9)begin//大于3.0公里开始增加 到9累加price_ge<=4'h0;price_shi_up<=1'b1;endendendendalways @(posedge add_km or negedge sys_reset_n)beginif(!sys_reset_n)beginprice_shi<=4'h8;price_bai_up<=1'b0;endelse if(price_shi<4'h9 && price_shi_up)beginprice_shi<=price_shi+1;price_bai_up<=1'b0;endelse if(price_shi>=4'h9 && price_shi_up)beginprice_shi<=4'h0;price_bai_up<=1'b1;endelse if(price_shi_up==1'b0)beginprice_bai_up<=1'b0;endendalways @(posedge add_km or negedge sys_reset_n)beginif(!sys_reset_n)beginprice_bai<=4'h0;endelse if(price_bai<4'h9 && price_bai_up)beginprice_bai<=price_bai+1;endelse if(price_bai>=4'h9 && price_bai_up)beginprice_bai<=4'h0;endendendmodule
模块分析:
通过分频得到5S周期的脉冲信号,当EN信号为高电平时,也就是有乘客上车后,司机按下按键,出租车变为载客状态,这时里程开始根据脉冲信号的上升沿进行增加。
通过按键切换到等待时间计费模式后,EN变为高电平,模块开始工作。将时钟分频模块得到的1S脉冲信号作为触发源进行判断,分和秒各8位,可以看到在脉冲上升沿时间不断累加,符合预期功能。
上板视频演示
基于FPGA的出租车里程时间计费器
总结
模块太多,只展示了比较重要的,其他一些模块就是产生分频信号的,无关紧要。需要的一键三连
相关文章:

基于FPGA的出租车里程时间计费器
基于FPGA的出租车里程时间计费器 功能描述一、系统框图二、verilog代码里程增加模块时间增加模块计算价格模块上板视频演示 总结 功能描述 (1);里程计费功能:3公里以内起步价8元,超过3公里后每公里2元,其中…...

三甲医院等级评审八维数据分析应用(五)--数据集成与共享篇
一、引言 1.1 研究背景与意义 随着医疗卫生体制改革的不断深化以及信息技术的飞速发展,三甲医院评审作为衡量医院综合实力与服务水平的重要标准,对数据集成与共享提出了更为严苛的要求。在传统医疗模式下,医院内部各业务系统往往各自为政,形成诸多“信息孤岛”,使得数据…...

VUE条件树查询 自定义条件节点
之前实现过的简单的条件树功能如下图: 经过最新客户需求确认,上述条件树还需要再次改造,以满足正常需要! 最新暴改后的功能如下红框所示: 页面功能 主页面逻辑代码: <template><div class"…...
什么是打流,怎么用iperf3打流
什么是打流 在网络安全和黑灰产领域,“打流”具有不同的含义,常用于形容通过技术手段制造流量假象或发起流量攻击。 流量攻击(DDoS)中的“打流”: “打流”指向目标服务器或网络发起 大规模的数据请求,造…...
使用MySQL APT源在Linux上安装MySQL
全新安装MySQL的步骤 以下说明假定您的系统上尚未安装任何版本的MySQL(无论是由Oracle还是其他方分发) 添加MySQL的Apt源。 将MySQL的APT存储库添加到系统的软件存储库列表中。 1、转到MySQL APT存储库的下载页面MySQL :: Download MySQL APT Reposi…...

redux react-redux @reduxjs/toolkit
redux团队先后推出了redux、react-redux、reduxjs/toolkit,这三个库的api各有不同。本篇文章就来梳理一下当我们需要在项目中集成redux,从直接使用redux,到使用react-redux,再到react-redux和reduxjs/toolkit配合使用,…...

【偏好对齐】通过ORM直接推导出PRM
论文地址:https://arxiv.org/pdf/2412.01981 相关博客 【自然语言处理】【大模型】 ΨPO:一个理解人类偏好学习的统一理论框架 【强化学习】PPO:近端策略优化算法 【偏好对齐】PRM应该奖励单个步骤的正确性吗? 【偏好对齐】通过OR…...
Python与其他编程语言的区别是什么?
Python是一种广泛使用的高级编程语言,以其简洁的语法、强大的库支持和广泛的应用领域而著称。与其他编程语言相比,Python具有许多独特的特点和优势。以下将从多个方面详细探讨Python与其他编程语言的区别,并通过示例进行说明。 一、语法简洁…...

cuda11.6和对应的cudnn(windows)
因为每次不同的torch版本要下对应的cuda,这次刚好在Windows上下好了一个cuda11.6和对应的cudnn,直接放到网盘中,大家有需要对应版本的可以直接下载: 链接:https://pan.quark.cn/s/f153a53830d4 大家自取,c…...

24年无人机行业资讯 | 12.23-12.29
24年无人机行业资讯 | 12.23-12.29 1、 国家发改委新设低空经济司,助力低空经济规范发展2、商务部支持无人机民用国际贸易,强调出口管制与安全并重3、滨州高新区首架无人机成功下线4、 2025第九届世界无人机大会筹备推进会顺利召开5、2024年世界无人机竞…...

uniapp:微信小程序文本长按无法出现复制菜单
一、问题描述 在集成腾讯TUI后,为了能让聊天文本可以复制,对消息组件的样式进行修改,主要是移除下面的user-select属性限制: user-select: none;-webkit-user-select: none;-khtml-user-select: none;-moz-user-select: none;-ms…...

qml Item详解
1、概述 Item是QML(Qt Modeling Language)的基础元素,所有其他可视化元素都继承自它。它代表了一个可视化的对象,虽然Item对象本身没有可视外观,但它定义了所有可视项之间通用的属性,比如位置、大小、旋转…...
【Java回顾】Day4 反射机制
反射机制 之前学过一部分,笔记在20250103Java包_网络编程.md里,这里在之前的笔记的基础上做一些补充。 反射:得到class对象后反向获取对象的各种信息。 包 Field 类或接口中的字段(成员变量),动态访问和修改类的字段 模板 获取Class 对象 …...

【沉默的羔羊心理学】汉尼拔的“移情”游戏:操纵与理解的艺术,精神分析学视角下的角色互动
终极解读《沉默的羔羊》:弗洛伊德精神分析学视角下的深层剖析 关键词 沉默的羔羊弗洛伊德精神分析学角色心理意识与潜意识性别与身份 弗洛伊德精神分析学简介 弗洛伊德的精神分析学是心理学的一个重要分支,主要关注人类行为背后的无意识动机和冲突。…...

[深度学习] 大模型学习1-大语言模型基础知识
大语言模型(Large Language Model,LLM)是一类基于Transformer架构的深度学习模型,主要用于处理与自然语言相关的各种任务。简单来说,当用户输入文本时,模型会生成相应的回复或结果。它能够完成许多任务&…...
如何解决数据库和缓存不一致的问题
目录 一、Cache-Aside模式(旁路缓存模式) 二、Write-Through模式(写透缓存模式) 三、Write-Behind模式(写回缓存模式) 四、先删除缓存再更新数据库(不推荐,存在风险)…...

剑指Offer|LCR 021. 删除链表的倒数第 N 个结点
LCR 021. 删除链表的倒数第 N 个结点 给定一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。 示例 1: 输入:head [1,2,3,4,5], n 2 输出:[1,2,3,5]示例 2: 输入:head [1], n 1…...

【NX入门篇】
NX入门篇 一、UG NX 由来二、软件如何启动(UG NX 12.0)三、使用步骤四、常用命令 一、UG NX 由来 UG NX由来: 1969 年:UG 的开发始于美国麦道航空公司,基于 C 语言开发实现;1976 年:UG问世&am…...

ubuntu如何禁用 Snap 更新
.禁用 Snap 更新(通过修改 snapd 配置) 打开并编辑 /etc/apt/apt.conf.d/50unattended-upgrades文件。 这个文件控制自动更新的行为。 sudo vim /etc/apt/apt.conf.d/50unattended-upgrades 里面有一行将里面的auto改为false即可禁用更新:…...

Spring AI Alibaba-对话模型(Chat Model)
对话模型(Chat Model)接收一系列消息(Message)作为输入,与模型 LLM 服务进行交互,并接收返回的聊天消息(Chat Message)作为输出。相比于普通的程序输入,模型的输入与输出…...
【Linux】C语言执行shell指令
在C语言中执行Shell指令 在C语言中,有几种方法可以执行Shell指令: 1. 使用system()函数 这是最简单的方法,包含在stdlib.h头文件中: #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...
【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】
1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件(System Property Definition File),用于声明和管理 Bluetooth 模块相…...
Java 加密常用的各种算法及其选择
在数字化时代,数据安全至关重要,Java 作为广泛应用的编程语言,提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景,有助于开发者在不同的业务需求中做出正确的选择。 一、对称加密算法…...
在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?
uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件,用于在原生应用中加载 HTML 页面: 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...
MySQL账号权限管理指南:安全创建账户与精细授权技巧
在MySQL数据库管理中,合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号? 最小权限原则…...

中医有效性探讨
文章目录 西医是如何发展到以生物化学为药理基础的现代医学?传统医学奠基期(远古 - 17 世纪)近代医学转型期(17 世纪 - 19 世纪末)现代医学成熟期(20世纪至今) 中医的源远流长和一脉相承远古至…...
Webpack性能优化:构建速度与体积优化策略
一、构建速度优化 1、升级Webpack和Node.js 优化效果:Webpack 4比Webpack 3构建时间降低60%-98%。原因: V8引擎优化(for of替代forEach、Map/Set替代Object)。默认使用更快的md4哈希算法。AST直接从Loa…...

Kubernetes 节点自动伸缩(Cluster Autoscaler)原理与实践
在 Kubernetes 集群中,如何在保障应用高可用的同时有效地管理资源,一直是运维人员和开发者关注的重点。随着微服务架构的普及,集群内各个服务的负载波动日趋明显,传统的手动扩缩容方式已无法满足实时性和弹性需求。 Cluster Auto…...

恶补电源:1.电桥
一、元器件的选择 搜索并选择电桥,再multisim中选择FWB,就有各种型号的电桥: 电桥是用来干嘛的呢? 它是一个由四个二极管搭成的“桥梁”形状的电路,用来把交流电(AC)变成直流电(DC)。…...

【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 编写的,需要先安…...