基于FPGA的出租车里程时间计费器

news2025/2/28 15:47:08

基于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)
	begin
		if(!sys_reset_n)
			begin
				data_km_ge<=4'h0;
				flag_km_shi_up<=1'b0;
			end
		else if(!EN)begin
			data_km_ge<=data_km_ge;
			flag_km_shi_up<=flag_km_shi_up;
			end
		else if(key_dri && en_dowm_car)
			begin
				if(data_km_ge<4'h9)
					begin
						data_km_ge<=data_km_ge+1'b1;
						flag_km_shi_up<=1'b0;
					end
				else
					begin
						data_km_ge<=4'h0;
						flag_km_shi_up<=1'b1;
					end
			end
	end

always @(posedge key_dri or negedge sys_reset_n)
	begin
		if(!sys_reset_n)
			begin
				data_km_shi<=4'h0;
				flag_km_bai_up<=1'b0;
			end
		else if(!EN)begin
			data_km_shi<=data_km_shi;
			flag_km_bai_up<=flag_km_bai_up;
			end
		else if(key_dri && en_dowm_car && flag_km_shi_up)
			begin
				if(data_km_shi<4'h9)
					begin
						data_km_shi<=data_km_shi+1'b1;
						flag_km_bai_up<=1'b0;
					end
				else
					begin
						data_km_shi<=4'h0;
						flag_km_bai_up<=1'b1;
					end
			end
		else if(key_dri && en_dowm_car && flag_km_shi_up==1'b0)
			begin
			flag_km_bai_up<=1'b0;
			end
	end

always @(posedge key_dri or negedge sys_reset_n)
	begin
		if(!sys_reset_n)
			begin
				data_km_bai<=4'h0;
			end
		else if(!EN)begin
			data_km_bai<=data_km_bai;
			end
		else if(key_dri && en_dowm_car && flag_km_bai_up)
			begin
				if(data_km_bai<4'h9)
					begin
						data_km_bai<=data_km_bai+1'b1;
					end
				else
					begin
						data_km_bai<=4'h0;
					end
			end
	end

endmodule

时间增加模块

//计时模块
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)
	begin
		if(!sys_reset_n)
			begin
				cnt<=1'b0;
				clk_1s<=1'b0;
		end
		else if(!EN)
			begin
				cnt<=cnt;   //保持
				clk_1s<=clk_1s;
			end
		else if(cnt<MAX_NUM)
			begin
				cnt<=cnt+1'b1;
			end
		else
			begin
				cnt<=0;
				clk_1s<=~clk_1s;  //翻转
			end
	end

always @(negedge clk_1s or negedge sys_reset_n)	
	begin
	   if(!sys_reset_n)
			begin
				time_price_ge<=4'h0;
			end
	   else if(en_dowm_car)begin
	         if(flag_s_up && time_price_ge<4'h9)begin
	            time_price_ge<=time_price_ge+1;
	         end
	         else if(flag_s_up && time_price_ge==4'h9)begin
	            time_price_ge<=0;
	         end
	   end
	end
always @(negedge clk_1s or negedge sys_reset_n)	
	begin
	   if(!sys_reset_n)
			begin
				time_price_shi<=4'h0;
			end
	   else if(en_dowm_car)begin
	         if(time_price_ge==4'h9 && time_price_shi<4'h9 && flag_s_up )begin
	            time_price_shi<=time_price_shi+1;
	         end
	         else if(time_price_ge==4'h9 && time_price_shi==4'h9&& flag_s_up)begin
	            time_price_shi<=0;
	         end
	   end
	end

always @(negedge clk_1s or negedge sys_reset_n)	
	begin
	   if(!sys_reset_n)
			begin
				time_price_bai<=4'h0;
			end
	   else if(en_dowm_car)begin
	         if(time_price_shi==4'h9 && time_price_bai<4'h9&& flag_s_up &&time_price_ge==4'h9)begin
	            time_price_bai<=time_price_bai+1;
	         end
	         else if(time_price_shi==4'h9 && time_price_bai==4'h9&& flag_s_up&&time_price_ge==4'h9)begin
	            time_price_bai<=0;
	         end
	   end
	end
	
//	秒个位加1
always @(negedge clk_1s or negedge sys_reset_n)	
	begin
		if(!sys_reset_n)
			begin
				data_s_ge<=4'h0;
				flag_s_up<=0;
			end
		else if(!EN)
			begin
				data_s_ge<=data_s_ge;   //保持
				flag_s_up<=flag_s_up;
			end
		else if(en_dowm_car)begin
		    if(data_s_ge < 4'h9 )
			begin
				data_s_ge<=data_s_ge+1'b1;		
				flag_s_up<=1'b0;					
			end
	    else if(data_s_ge == 4'h9)
			begin
				data_s_ge<=4'h0;		
				flag_s_up<=1'b1;					
			end
	    end
	    else begin
	            data_s_ge<=data_s_ge;   //保持
				flag_s_up<=flag_s_up;
	    end
	end
//	秒十位加1
always @(negedge clk_1s or negedge sys_reset_n)	
	begin
		if(!sys_reset_n)
			begin
				data_s_shi<=4'h0;
				flag_m_up<=0;
			end
		else if(!EN)
			begin
				data_s_shi<=data_s_shi;   //保持
				flag_m_up<=flag_m_up;
			end
		else if(data_s_shi < 4'h5 && data_s_ge==4'h9)
			begin
				data_s_shi<=data_s_shi+1'b1;		
				flag_m_up<=1'b0;					
			end
	    else if(data_s_shi == 4'h5 && data_s_ge==4'h9)
			begin
				data_s_shi<=4'h0;		
				flag_m_up<=1'b1;					
			end
		else begin
		        data_s_shi<=data_s_shi;		
				flag_m_up<=1'b0;	
		end
	end

//分钟个位加一
always @(posedge clk_1s or negedge sys_reset_n)	
	begin
		if(!sys_reset_n)
			begin
				data_m_ge<=4'h0;
				flag_m_shi_up<=1'b0;
			end
		else if(!EN)
			begin
				data_m_ge<=data_m_ge;   //保持
				flag_m_shi_up<=flag_m_shi_up;
			end
		else if(en_dowm_car) 
			begin
				if(data_m_ge<4'h9 && data_s_shi==4'h5 && data_s_ge==4'h9)
					begin
						data_m_ge<=data_m_ge+1'b1;
						flag_m_shi_up<=1'b0;
					end
				else if(data_m_ge==4'h9 && data_s_shi==4'h5 && data_s_ge==4'h9)
					begin
						data_m_ge<=4'h0;
						flag_m_shi_up<=1'b1;
					end
				else begin
		               data_m_ge<=data_m_ge;   //保持
				       flag_m_shi_up<=1'b0;
		          end
			end
		else begin
		        data_m_ge<=data_m_ge;   //保持
				flag_m_shi_up<=1'b0;
		end
	end

//分钟十位加一
always @(posedge flag_m_shi_up or negedge sys_reset_n)	
	begin
		if(!sys_reset_n)
			begin
				data_m_shi<=4'h0;
			end
		else if(!EN)
			begin
				data_m_shi<=data_m_shi;   //保持
			end
		else if(en_dowm_car) 
			begin
				if(data_m_shi<4'h5 )
					begin
						data_m_shi<=data_m_shi+1'b1;
					end
				else if(data_m_shi==4'h5)
					begin
						data_m_shi<=4'h0;
					end
			end
		else begin
		        data_m_ge<=data_m_ge;   //保持
		end
	end

endmodule

计算价格模块

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;
initial
	begin
		price_km<=16'd30;
		price_time<=16'd0;
	end

	
	
//里程计价
always @(posedge add_km or negedge sys_reset_n)
	begin
		if(!sys_reset_n)
			begin
				price_ge<=4'h0;
				 price_shi_up<=1'b0;
			end
		else if(en_dowm_car )begin
		    if(data_km_bai==4'h0)begin
		          if(price_ge<4'h9 && data_km_shi>=4'h3 )begin//大于3.0公里开始增加
		          price_ge<=price_ge+1;
		          price_shi_up<=1'b0;
		          end
		           else if(price_ge>=4'h9 && data_km_shi>=4'h3 )begin//大于3.0公里开始增加 到9累加
		          price_ge<=4'h0;
		          price_shi_up<=1'b1;
		          end
		           else if(price_ge<4'h9 && data_km_shi<4'h3)begin
		          price_ge<=price_ge;
		          price_shi_up<=1'b0;
		          end
		          end
		    else if(data_km_bai!=4'h0)begin
		           if(price_ge<4'h9 )begin//大于3.0公里开始增加
		          price_ge<=price_ge+1;
		          price_shi_up<=1'b0;
		            end
		          else if(price_ge>=4'h9)begin//大于3.0公里开始增加 到9累加
		          price_ge<=4'h0;
		          price_shi_up<=1'b1;
		          end
		        end
		      end
	    
	end

always @(posedge add_km or negedge sys_reset_n)
	begin
		if(!sys_reset_n)
			begin
				price_shi<=4'h8;
				 price_bai_up<=1'b0;
			end
		
		    else if(price_shi<4'h9 && price_shi_up)begin
		          price_shi<=price_shi+1;
		          price_bai_up<=1'b0;
		    end
		    else if(price_shi>=4'h9 && price_shi_up)begin
		          price_shi<=4'h0;
		          price_bai_up<=1'b1;
		    end
		    else if(price_shi_up==1'b0)begin
		          price_bai_up<=1'b0;
		    end
		
	     
	end

always @(posedge add_km or negedge sys_reset_n)
	begin
		if(!sys_reset_n)
			begin
				price_bai<=4'h0;
			end
		    else if(price_bai<4'h9 && price_bai_up)begin
		          price_bai<=price_bai+1;
		    end
		    else if(price_bai>=4'h9 && price_bai_up)begin
		          price_bai<=4'h0;
		    end
	end

endmodule

在这里插入图片描述

模块分析:
通过分频得到5S周期的脉冲信号,当EN信号为高电平时,也就是有乘客上车后,司机按下按键,出租车变为载客状态,这时里程开始根据脉冲信号的上升沿进行增加。
在这里插入图片描述
通过按键切换到等待时间计费模式后,EN变为高电平,模块开始工作。将时钟分频模块得到的1S脉冲信号作为触发源进行判断,分和秒各8位,可以看到在脉冲上升沿时间不断累加,符合预期功能。

上板视频演示

基于FPGA的出租车里程时间计费器

总结

模块太多,只展示了比较重要的,其他一些模块就是产生分频信号的,无关紧要。需要的一键三连

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2273674.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于FPGA的洗衣机控制器电子定时器

文章目录 功能描述 一、框架 二、verilog代码 控制模块实现 三、视频上板效果展示 功能描述 &#xff08;1&#xff09;定时启动正转20秒暂停10秒反转20秒暂 停10秒&#xff0c;定时未到回到“正转20秒暂停10秒……”&#xff0c;定时到则停止; 若定时到&#xff0c;则停…

【Linux系列】Vim 编辑器中的高效文本编辑技巧:删除操作

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

大纲笔记幕布的替换

文章目录 前言类似的大纲软件探索 DynalistLogseq通过国内代码仓库建立 Git 仓库Logseq 的使用PC 端安卓端Git 操作Termux git 步骤Termux 的桌面组件&#xff1a;Termux widget 报错参考 前言 之前我一直用幕布&#xff0c;买了三年&#xff0c;奈何要过期了&#xff0c;又三…

STM32-笔记35-DMA(直接存储器访问)

一、什么叫DMA&#xff1f; DMA&#xff08;Direct Memory Access&#xff0c;直接存储器访问&#xff09;提供在外设与内存、存储器和存储器之间的高速数据传输使用。它允许不同速度的硬件装置来沟通&#xff0c;而不需要依赖于CPU&#xff0c;在这个时间中&#xff0c;CPU对于…

【踩坑】SparkSQL union/unionAll 函数的去重问题

【踩坑】SparkSQL union/unionAll 函数的去重问题 测试数据 case class Employee(first_name:String)val employeeDF1 spark.createDataset(Seq( Employee("Mary"), Employee("Mandy"),Employee("Kurt") )) val employeeDF2 spark.createDat…

allure报告修改默认语言为中文

1、项目根目录创建.py文件&#xff0c;把代码复制进去 import os from pathlib import Pathdef create_settings_js_file(directory"../pytest_mytt/reports/allures/", filenamesettings.js):# 创建或确认目录存在Path(directory).mkdir(parentsTrue, exist_okTrue…

使用frp实现本地内网穿透

环境&#xff1a;linux &#xff08;具有公网ip的线上服务器&#xff09;、windows&#xff08;本地&#xff09;、frp Releases fatedier/frphttps://github.com/fatedier/frp/releases 首先下载下来下面两个文件 概览 | frp一些概述&#xff0c;便于您快速的了解 frp。http…

Cursor无限续杯——解决Too many free trials.

前情提要 我们都知道Cursor对新用户是有14天且500条免费限制的。 一般情况下&#xff0c;当14天过期&#xff0c;是可以注销账户再重新注册&#xff0c;这样就可以继续拥有14天的体验时长。 但是&#xff01;&#xff01;如果使用超过500次&#xff0c;Cusor就会把你的电脑I…

cursor试用出现:Too many free trial accounts used on this machine 的解决方法

文章精选推荐 1 JetBrains Ai assistant 编程工具让你的工作效率翻倍 2 Extra Icons&#xff1a;JetBrains IDE的图标增强神器 3 IDEA插件推荐-SequenceDiagram&#xff0c;自动生成时序图 4 BashSupport Pro 这个ides插件主要是用来干嘛的 &#xff1f; 5 IDEA必装的插件&…

攻防世界 Web_php_wrong_nginx_config

​ 打开题目地址&#xff0c;显示为登录页面。尝试用御剑扫描一下&#xff0c;发现了admin页面&#xff0c;点进去显示如下 点开控制台&#xff0c;发现如下 isLogin参数为0。尝试抓包并该islogin参数为1&#xff0c;返回依旧不变。 再扫描&#xff0c;发现robots.txt&#xff…

WordPress静态缓存插件WP Super Cache与 WP Fastest Cache

引言 WordPress是一款开源的内容管理系统&#xff08;CMS&#xff09;&#xff0c;最初作为博客平台开发&#xff0c;现已发展成为一个功能强大的建站工具&#xff0c;支持创建各种类型的网站&#xff0c;包括企业网站、在线商店、个人博客等。它具有用户友好的界面、丰富的插…

多模态大模型初探索:通过ollama部署多模态大模型

文章目录 前言模型下载 前言 今天和同事聊天&#xff0c;聊到多模态大模型&#xff0c;感觉可以作为2025年的一个新的探索方向。希望和大家一起学习&#xff0c;一起进步。 今天也是尝试了我能想到的最基本最快速地本地部署多模态大模型的方式&#xff0c;那便是使用ollama。…

【深度学习】布匹寻边【附完整链接】

布匹寻边 项目简介 布匹寻边是指布料裁剪过程中&#xff0c;通过AI寻边技术自动识别布匹的边缘&#xff0c;将检测到的边缘信息输出&#xff0c;确保裁剪的准确性&#xff0c;减少浪费&#xff0c;并提高生产效率。 项目需求 将打满针眼的布匹边缘裁剪掉&#xff0c;且误差小…

scanf:数据之舟的摆渡人,静卧输入港湾的诗意守候

大家好啊&#xff0c;我是小象٩(๑ω๑)۶ 我的博客&#xff1a;Xiao Xiangζั͡ޓއއ 很高兴见到大家&#xff0c;希望能够和大家一起交流学习&#xff0c;共同进步。* 这一节我们主要来学习scanf的基本用法&#xff0c;了解scanf返回值&#xff0c;懂得scanf占位符和赋值…

vue数据请求通用方案:axios的options都有哪些值

Axios 是一个基于 promise 的 HTTP 库&#xff0c;可以用在浏览器和 Node.js 中。 在使用 Axios 发送请求时&#xff0c;可以通过传递一个配置对象来指定请求的各种选项。 以下是一些常用的 Axios 配置选项及其说明&#xff1a; 1.url: &#xff08;必需&#xff09;请求的 …

阿里mod_asr3.0集成webrtc静音算法

alibabacloud-nls-cpp-sdk-master 先到阿里官网下载nls库的源代码&#xff0c;编译生成对应的库文件和头文件。 我编译的放到了以下目录。 /home/jp/2025/alibabacloud-nls-cpp-sdk-master/build/install/NlsSdk3.X_LINUX/include/ /home/jp/2025/alibabacloud-nls-cpp-sdk-…

【大模型】百度千帆大模型对接LangChain使用详解

目录 一、前言 二、LangChain架构与核心组件 2.1 LangChain 核心架构 2.2 LangChain 核心组件 三、环境准备 3.1 前置准备 3.1.1 创建应用并获取apikey 3.1.2 开通付费功能 3.2 获取LangChain文档 3.3 安装LangChain依赖包 四、百度千帆大模型对接 LangChain 4.1 LL…

【51单片机零基础-chapter6:LCD1602调试工具】

实验0-用显示屏LCD验证自己的猜想 如同c的cout,前端的console.log() #include <REGX52.H> #include <INTRINS.H> #include "LCD1602.h" int var0; void main() {LCD_Init();LCD_ShowNum(1,1,var211,5);while(1){;} }实验1-编写LCD1602液晶显示屏驱动函…

Mysql--基础篇--事务(ACID特征及实现原理,事务管理模式,隔离级别,并发问题,锁机制,行级锁,表级锁,意向锁,共享锁,排他锁,死锁,MVCC)

在MySQL中&#xff0c;事务&#xff08;Transaction&#xff09;是一组SQL语句的集合&#xff0c;这些语句一起被视为一个单一的工作单元。事务具有ACID特性&#xff0c;确保数据的一致性和完整性。通过事务&#xff0c;可以保证多个操作要么全部成功执行&#xff0c;要么全部不…

使用VUE3创建个人静态主页

使用VUE3创建个人静态主页 &#x1f31f; 前言&#x1f60e;体验&#x1f528; 具体实现✨ 核心功能&#x1f3d7;️ 项目结构&#x1f680; 用这个项目部署 Git Page &#x1f4d6; 参考 &#x1f31f; 前言 作为开发者或者内容创作者&#xff0c;我们经常需要创建静态网页&a…