Verilog 实现超声波测距

Verilog 实现超声波测距

教学视频: https://www.bilibili.com/video/BV1Ve411x75W?p=33&spm_id_from=pageDriver&vd_source=19ae31dff4056e52d2729a4ca212602b

超声波测距原理

参考资料:STM32的超声波测距程序_超声波测距stm32程序_VaderZhang的博客-CSDN博客

推荐一波自己的文章:STM32蓝牙控制循迹避障小车源代码——3.舵机、超声波测距模块_stem32超声波舵机代码_灵风_Brend的博客-CSDN博客

  • 超声波模块工作原理:
    输出TRIG触发测距,需要给最少10us的高电平信呈;
    模块自动发送8个40KHZ的方波,自动检测是否有信号返回;
    有信号返回,通过IO口ECHO输出高电平,高电平持续时间就是超声波从发射到返回的时间;
    测试距离=高电平持续时间*声速/2

需求分析与功能定义:

  • 每隔100ms时间,定时产生10us时间的TRIG高脉冲给到超声波测距模块,用于触发超声波测距模块工作
  • 采集回响信号ECHO的高脉冲保持时间
  • 将ECHO高脉冲保持时间换算成距离信息:s = 0.173*t
  • 人机交互

代码思路:(详细教学可以看最上面的链接)

代码组成:

在这里插入图片描述


vlg_en :输出clk_en信号,对输入时钟clk做分频计数,产生1us的时钟使能信号(计数单位为us)


module vlg_en #(parameter P_CLK_PERIORD = 20	//clk的时钟周期为20ms
)
( input 		clk,input 		rst_n,output reg 	clk_en
);localparam P_DIVCLK_MAX = 1000/P_CLK_PERIORD - 1;	//分频计数器的最大值
reg [7:0] r_divcnt;///
//对输入时钟clk做分频计数,产生1us的时钟使能信号
always @(posedge clk or negedge rst_n) beginif(!rst_n)r_divcnt <= 8'b0;else if(r_divcnt < P_DIVCLK_MAX)r_divcnt <= r_divcnt + 1'b1;elser_divcnt <= 8'b0;
end///
//产生时钟使能信号
always @(posedge clk) beginif(r_divcnt == P_DIVCLK_MAX)clk_en <= 1'b1;elseclk_en <= 1'b0;
endendmodule

vlg_tirg :每隔100ms时间,定时产生10us时间的TRIG高脉冲给到超声波测距模块,用于触发超声波测距模块工作

module vlg_tirg
( input 		clk,input 		rst_n,input 		clk_en,output reg 	trig
);localparam P_TRIG_PERIORD_MAX = 100_000 - 1;	//100ms计数最大值
localparam P_TRIG_HIGH_MAX = 10;			//10us高脉冲保持时间reg [16:0] tricnt;///
//100ms周期计数
always @(posedge clk or negedge rst_n) beginif(!rst_n)tricnt <= 'b0;else if(clk_en)beginif(tricnt < P_TRIG_PERIORD_MAX)tricnt <= tricnt + 1'b1;elsetricnt <= 'b0;end		
end///
//产生保持10us的trig信号
always @(posedge clk) beginif((tricnt > 'b0)&&(tricnt <= P_TRIG_HIGH_MAX))trig <= 1'b1;elsetrig <= 1'b0;
endendmodule

上面两个信号的波形展示:

在这里插入图片描述

vlg_echo : 采集回响信号ECHO的高脉冲保持时间。(echo信号的高电平保持时间即为超声波往返的时间)

module vlg_echo
( input 		clk,input 		rst_n,input 		clk_en,input 		echo,output reg [15:0] t_us
);reg [1:0] r_echo;
wire pos_echo,neg_echo;
reg cnt_en;
reg [15:0] echo_cnt;///
//对echo信号锁存两拍,获取边沿检测信号,产生计数使能信号cnt_en
always @(posedge clk or negedge rst_n) beginif(!rst_n)r_echo <= 'b0;elser_echo <= {r_echo[0],echo};	//高位锁存,低位移位	
endassign pos_echo = ~r_echo[1] & r_echo[0];
assign neg_echo = r_echo[1] & ~r_echo[0];always @(posedge clk or negedge rst_n) beginif(!rst_n)cnt_en <= 'b0;else if(pos_echo)cnt_en <= 1'b1;else if(neg_echo)cnt_en <= 1'b0;else ;
end///
//对echo信号的高电平保持时间进行1us为单位的计数
always @(posedge clk or negedge rst_n) beginif(!rst_n)echo_cnt <= 'b0;else if(!cnt_en)echo_cnt <= 'b0;else if(clk_en)echo_cnt <= echo_cnt + 1'b1;else ;
end	///
//对echo_cnt计数最大值做锁存
always @(posedge clk or negedge rst_n) beginif(!rst_n)t_us <= 'b0;else if(neg_echo)t_us <= echo_cnt;
endendmodule

cal :将时间计算为距离。测试距离=高电平持续时间 * 声速/2。 (s = 0.173*t)

module cal
( input 		clk,input 		rst_n,input [15:0] t_us,output [14:0] s_mm
);/*	s=0.173*ts*4096=0.173*t*4096=709*t	 避免小数部分s=709*t/4096=709*t>>12709实现方法:  1)乘法器2)709=512+128+64+4+1本代码使用乘法器来实现。直接调用乘法器IP核
*/
wire [25:0] mult_result;mult_gen_0 u_mult_gen_0 (.CLK(clk),  // input wire CLK.A(10'd709),      // input wire [9 : 0] A.B(t_us),      // input wire [15 : 0] B.P(mult_result)      // output wire [25 : 0] P
);assign s_mm = mult_result[25:12];endmodule

顶层文件 vlg_top

module vlg_top(input 	clk,input 	rst_n,output 	trig
);localparam P_CLK_PERIORD = 20;//接口声明
reg clk;
reg rst_n;
reg echo;wire clk_en;
wire trig;
wire [15:0] t_us;
wire [14:0] s_mm;//使能时钟产生模块
vlg_en #(.P_CLK_PERIORD (P_CLK_PERIORD)	//clk的时钟周期为20ns
)
u_vlg_en( .clk 		(clk),.rst_n 		(rst_n),.clk_en 	(clk_en)
);//产生触发信号trig
vlg_tirg u_vlg_tirg(.clk	(clk),.rst_n	(rst_n),.clk_en	(clk_en),.trig   (trig)
);//测距模块的回响信号echo的高电平采集时间
vlg_echo u_vlg_echo(.clk	(clk),.rst_n	(rst_n),.clk_en	(clk_en),.echo	(echo),.t_us   (t_us)
);//乘法器,计算距离
cal u_cal(.clk	(clk),.rst_n	(rst_n),.t_us	(t_us),.s_mm   (s_mm)
);endmodule

调用乘法器IP核

点击IP核,输入MUL,进行下面的操作:

在这里插入图片描述


在这里插入图片描述

TB文件

`timescale 1ns/1psmodule tb_top();reg clk;
reg rst_n;
reg echo;wire [14:0] s_mm;vlg_top u_vlg_top(.clk	(clk),.rst_n	(rst_n),.trig   (trig)
);//产生时钟
initial clk = 1;
always #10 clk = ~clk;//测试激励产生
initial beginrst_n = 0;echo = 0;#200;rst_n = 1;end//函数实现 s=0.173*t
function real function_t2s;input real t;beginfunction_t2s = 0.173*t;end
endfunctioninteger tricnt = 0;
integer dly_time;always @(posedge trig)begintricnt = tricnt + 1;#5000;echo = 1;dly_time = 11+{$random}%26011;		//11<t<26011#500;$display("test %0d:\n dly_time=%0d us\n s=%0d mm\n",tricnt,dly_time,s_mm,function_t2s(dly_time));#(dly_time*1000);echo = 0;
endendmodule

仿真结果

  • 仿真波形

在这里插入图片描述

  • 结果

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于Java+SpringBoot+Vue前后端分离在线考试与学习交流网页平台设计和实现

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

常见前端面试之VUE面试题汇总七

20. 对 vue 设计原则的理解 1.渐进式 JavaScript 框架&#xff1a;与其它大型框架不同的是&#xff0c;Vue 被设计 为可以自底向上逐层应用。Vue 的核心库只关注视图层&#xff0c;不仅易于上 手&#xff0c;还便于与第三方库或既有项目整合。另一方面&#xff0c;当与现代化的…

扫雷小游戏

目录 一.扫雷小游戏 二.游戏主体一览 ​编辑 三.模块化设计扫雷游戏 3.1打印欢迎菜单 3.2创建两个二维数组 3.3棋盘稍加修改 3.4布置雷 3.5排查雷 四.游戏总体代码 4.1game.h头文件 4.2game.c函数实现源文件 4.3游戏main函数主体 五.游戏效果图 一.扫雷小游戏 这是…

Verilog 实现状态机自动售卖机

Verilog 实现状态机自动售卖机 教学视频&#xff1a;https://www.bilibili.com/video/BV1Ve411x75W?p33&spm_id_frompageDriver&vd_source19ae31dff4056e52d2729a4ca212602b 功能需求 使用1元、2元、5元面值的纸币进行支付&#xff0c;获取6元的物品&#xff0c;不设…

基于Jenkins自动打包并部署Tomcat环境

基于上一章创建部署 Linux下Jenkins安装 &#xff08;最新&#xff09;_学习新鲜事物的博客-CSDN博客 传统网站部署的流程 在运维过程中&#xff0c;网站部署是运维的工作之一。传统的网站部署的流程大致分为:需求分 析-->原型设计-->开发代码-->提交代码--&g…

python+django+mysql旅游景点推荐系统-前后端分离(源码+文档)

系统主要采用Python开发技术和MySQL数据库开发技术以及基于OpenCV的图像识别。系统主要包括系统首页、个人中心、用户管理、景点信息管理、景点类型管理、景点门票管理、在线反馈、系统管理等功能&#xff0c;从而实现智能化的旅游景点推荐方式&#xff0c;提高旅游景点推荐的效…

GEE/PIE遥感大数据处理与典型案例

随着航空、航天、近地空间等多个遥感平台的不断发展&#xff0c;近年来遥感技术突飞猛进。由此&#xff0c;遥感数据的空间、时间、光谱分辨率不断提高&#xff0c;数据量也大幅增长&#xff0c;使其越来越具有大数据特征。对于相关研究而言&#xff0c;遥感大数据的出现为其提…

Redis笔记——(狂神说)待续

Nosql概述 为什么要用NoSql&#xff1f; 1、单机mysql的年代&#xff1a;90年代&#xff0c;网站访问量小&#xff0c;很多使用静态网页html写的&#xff0c;服务器没压力。 当时瓶颈是&#xff1a;1)数据量太大一个机器放不下。2)数据的索引(BTree)&#xff0c;一个机器内存也…

html动态爱心代码【四】(附源码)

目录 前言 特效 完整代码 总结 前言 情人节马上就要到了&#xff0c;为了帮助大家高效表白&#xff0c;下面再给大家带来了实用的HTML浪漫表白代码(附源码)背景音乐&#xff0c;可用于520&#xff0c;情人节&#xff0c;生日&#xff0c;表白等场景&#xff0c;可直接使用。…

nrm管理源仓库及发布私人npm包

使用nrm管理源及切换源仓库 1.安装nrm源管理器 npm install nrm -g2.查看目前现有的源仓库 通过 nrm ls 查看现有的源 nrm ls 输出&#xff1a;这是目前现有的源 3.切换不同的源 可以通过 nrm use xxx&#xff08;源仓库名&#xff09;来切换不同的源地址 nrm use taobao…

探索pytest:Python自动化测试的新境界

在当今的软件开发领域&#xff0c;测试已经不仅仅是一个简单的步骤&#xff0c;而是确保软件质量的核心环节。Python&#xff0c;作为全球最受欢迎的编程语言之一&#xff0c;拥有丰富的测试框架和工具。而在这其中&#xff0c;pytest无疑是最受欢迎和最具影响力的一个。本文将…

VR法治警示教育:情景式课堂增强教育效果

VR法治警示教育平台是一款基于虚拟现实技术的在线教育平台&#xff0c;旨在通过模拟真实场景和互动体验&#xff0c;向公众普及法律知识&#xff0c;提高公民的法律意识和素养。该平台采用先进的虚拟现实技术&#xff0c;将用户带入一个逼真的仿真环境&#xff0c;让用户身临其…