当前位置: 首页 > article >正文

Verilog 超声波测距:从时序控制到距离计算的模块化设计

1. 超声波测距原理与Verilog实现思路超声波测距听起来很高科技其实原理特别简单。想象一下你在山谷里大喊一声然后听回声——超声波测距就是这个原理的电子版。模块发射超声波遇到障碍物反射回来我们只要计算声波往返时间就能算出距离。我在做智能小车项目时这个功能帮了大忙。具体到Verilog实现核心就四步触发发射、捕获回波、计算时间、换算距离。这里有个坑要注意声速会受温度影响但一般室内应用可以忽略。我实测过在20℃环境下声速约343m/s换算成us级时间就是每毫米往返需要5.8us。不过实际代码里我们用0.173这个魔术数字这是把声速和单位换算都考虑进去的简化公式。2. 模块化设计架构2.1 时钟分频模块先说说vlg_en这个模块。FPGA的时钟动不动就50MHz但超声波测距需要的是us级精度。我常用的是把50MHz20ns周期分频成1MHz1us周期。代码里这个参数P_CLK_PERIORD就是输入时钟周期单位是ns。这里有个小技巧用parameter定义常量后期修改特别方便。module vlg_en #( parameter P_CLK_PERIORD 20 //50MHz时钟 )( input clk, input rst_n, output reg clk_en ); //分频计数器最大值计算 localparam P_DIVCLK_MAX 1000/P_CLK_PERIORD - 1; reg [7:0] r_divcnt; always (posedge clk or negedge rst_n) begin if(!rst_n) r_divcnt 0; else if(r_divcnt P_DIVCLK_MAX) r_divcnt r_divcnt 1; else r_divcnt 0; end always (posedge clk) begin clk_en (r_divcnt P_DIVCLK_MAX); end endmodule2.2 触发信号生成模块vlg_tirg模块负责产生10us的TRIG脉冲这个脉冲就像扣动扳机让超声波模块开始工作。我建议把周期设为100ms这样测距频率就是10Hz既不会太频繁也不会太慢。调试时发现个有趣现象如果TRIG脉冲太短比如小于10us模块可能不响应太长又会降低刷新率。module vlg_tirg ( input clk, input rst_n, input clk_en, //1MHz时钟使能 output reg trig ); //100ms100_000us localparam P_TRIG_PERIORD_MAX 100_000 - 1; localparam P_TRIG_HIGH_MAX 10; //10us高电平 reg [16:0] tricnt; always (posedge clk or negedge rst_n) begin if(!rst_n) tricnt 0; else if(clk_en) begin tricnt (tricnt P_TRIG_PERIORD_MAX) ? tricnt 1 : 0; end end always (posedge clk) begin trig (tricnt 0) (tricnt P_TRIG_HIGH_MAX); end endmodule3. 回波时间捕获技术3.1 边沿检测技巧vlg_echo模块最核心的技术就是边沿检测。我一般用两级寄存器做同步既防亚稳态又能准确捕捉跳变。这里有个细节echo信号来自外部模块一定要先同步到FPGA时钟域曾经有个项目因为没做同步测距结果时不时抽风。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 ~r_echo[1] r_echo[0]; //上升沿 wire neg_echo r_echo[1] ~r_echo[0]; //下降沿 reg cnt_en; reg [15:0] echo_cnt; always (posedge clk or negedge rst_n) begin if(!rst_n) r_echo 0; else r_echo {r_echo[0], echo}; end3.2 高电平计时实现计时逻辑要注意三点1)只在echo高电平时计数 2)用clk_en控制计数精度 3)下降沿时锁存计数值。实测发现用1MHz时钟时最大测距约5.6米65535us对小车够用了。如果要测更远可以把计数器改成32位。always (posedge clk or negedge rst_n) begin if(!rst_n) cnt_en 0; else if(pos_echo) cnt_en 1; else if(neg_echo) cnt_en 0; end always (posedge clk or negedge rst_n) begin if(!rst_n) echo_cnt 0; else if(!cnt_en) echo_cnt 0; else if(clk_en) echo_cnt echo_cnt 1; end always (posedge clk or negedge rst_n) begin if(!rst_n) t_us 0; else if(neg_echo) t_us echo_cnt; end endmodule4. 距离计算优化方案4.1 定点数运算技巧cal模块的s0.173*t涉及浮点运算但在FPGA里浮点计算太耗资源。我的解决方案是定点数运算把0.173放大4096倍得到709最后结果右移12位。这样既保证精度又节省资源。调试时发现用移位相加代替乘法器可以进一步节省LUT。module cal ( input clk, input rst_n, input [15:0] t_us, output [14:0] s_mm ); //7095121286441 wire [25:0] sum1 t_us 9; //512*t wire [25:0] sum2 t_us 7; //128*t wire [25:0] sum3 t_us 6; //64*t wire [25:0] sum4 t_us 2; //4*t wire [25:0] sum5 t_us; //1*t wire [25:0] sum_total sum1 sum2 sum3 sum4 sum5; assign s_mm sum_total[25:12]; //右移12位 endmodule4.2 乘法器IP核使用当需要更高性能时可以用Xilinx的乘法器IP核。在Vivado里创建IP时选择Multiplier类型配置为16bit x 10bit无符号乘法。记得把Pipeline Stages设为2这样时序更稳定。我在Artix-7上实测用IP核比纯LUT实现节省30%资源。5. 系统集成与调试5.1 顶层模块设计vlg_top就像乐高底座把所有模块插在一起。接口设计有个原则控制信号用寄存器输出状态信号用wire输入。我习惯把参数集中定义在顶层这样修改起来一目了然。特别注意跨时钟域信号要加同步器特别是echo信号。module vlg_top( input clk, input rst_n, input echo, output trig, output [14:0] distance_mm ); parameter P_CLK_PERIORD 20; //50MHz wire clk_en; wire [15:0] t_us; vlg_en #(.P_CLK_PERIORD(P_CLK_PERIORD)) u_en( .clk(clk), .rst_n(rst_n), .clk_en(clk_en)); vlg_tirg u_trig( .clk(clk), .rst_n(rst_n), .clk_en(clk_en), .trig(trig)); vlg_echo u_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(distance_mm)); endmodule5.2 测试平台搭建好的TB文件能事半功倍。我用$random生成随机延时模拟不同距离。注意给echo信号加500ns延迟模拟硬件响应时间。波形查看重点trig脉冲宽度、echo响应延迟、计数器清零时机。module tb_top(); reg clk; reg rst_n; reg echo; wire trig; wire [14:0] s_mm; vlg_top uut(.*); initial begin clk 1; forever #10 clk ~clk; end initial begin rst_n 0; echo 0; #200 rst_n 1; repeat(5) begin (posedge trig); #5000 echo 1; #($urandom_range(26000, 11)*1000); echo 0; end $finish; end endmodule6. 常见问题与解决方案6.1 信号抖动处理实际项目中echo信号常有毛刺。我的应对方案1)硬件上加RC滤波 2)Verilog里用计数器去抖。比如连续3个周期高电平才认为有效。在低速应用如10Hz刷新时这个方案特别有效。6.2 温度补偿方案虽然我们忽略了温度影响但对精度要求高的场合可以加DS18B20温度传感器。实测温度每升高1℃声速增加0.6m/s。可以在cal模块里动态调整乘法系数公式变为s (331.4 0.6*T)*t/2其中T是摄氏温度。6.3 多模块协同工作当系统中有多个超声波模块时要分时复用触发信号。我的方案是用状态机轮询每个模块间隔100ms触发。关键是要确保前一个模块的echo信号结束再触发下一个否则会互相干扰。

相关文章:

Verilog 超声波测距:从时序控制到距离计算的模块化设计

1. 超声波测距原理与Verilog实现思路 超声波测距听起来很高科技,其实原理特别简单。想象一下你在山谷里大喊一声,然后听回声——超声波测距就是这个原理的电子版。模块发射超声波,遇到障碍物反射回来,我们只要计算声波往返时间&am…...

用AI起飞,组织为何躺平?CSDN收藏必备:解锁AI转型的正确姿势!

本文揭示了当前许多公司在应用AI技术时,虽然个人效率显著提升,但整体组织效能并未得到同步改善的现象。文章通过历史类比,指出AI转型需重构组织形态,而非简单叠加技术。AI如同铁路时代的变革,要求企业建立统一协作框架…...

收藏!程序员必看:AI冲击下,如何不被大厂裁员和低薪offer淘汰?

文章指出当前IT市场因大厂降本增效、AI编程工具发展、供过于求及业务增长放缓等因素,导致程序员求职难度加大、薪资增长空间缩小。文章强调AI并未完全取代程序员,而是提高了对程序员的能力要求,如业务理解、架构能力等。建议程序员积极拥抱AI…...

从SolidWorks到Matlab:机械臂STL模型导入与plot3D可视化全流程解析

1. 从SolidWorks导出机械臂STL文件的正确姿势 搞机械臂仿真的朋友应该都遇到过这样的场景:在SolidWorks里精心设计的模型,导出STL后导入Matlab就各种错位、缺失。我当年做五自由度机械臂项目时,光是模型导入就折腾了整整三天。下面这些血泪经…...

从DTU数据集到MVSNet:点云重建精度与完整度的量化评估实战

1. 从零开始理解DTU数据集与MVSNet 第一次接触三维重建时,我被各种专业术语搞得晕头转向。直到亲手用DTU数据集跑通了MVSNet,才真正理解点云重建的奥妙。DTU数据集就像三维世界的"标尺",而MVSNet则是帮你画图的"智能画笔"…...

Zotero 6.0用户必看:如何绕过插件兼容性检查安装最新工具

Zotero 6.0插件兼容性破解指南:解锁新版工具的全套方案 当你发现心仪的Zotero插件因为版本限制无法安装时,那种感觉就像找到一本绝版书却被图书馆管理员拦在门外。作为文献管理工具的中坚力量,Zotero 6.0用户常常面临这样的困境——新插件要求…...

优化Windows开发环境:迁移Yarn全局目录释放C盘空间

1. 为什么你的C盘总是不够用? 作为一个长期在Windows下搞开发的老鸟,我太懂那种看着C盘空间一点点被蚕食的痛苦了。特别是用了Yarn之后,你会发现不知不觉中C盘就红了。这其实是因为Yarn默认把所有全局安装的包、缓存文件都塞进了你的用户目录…...

老鼠监测站 鼠害监测系统

设备搭载高效太阳能供电模块,采用单晶硅太阳能电池板,可将太阳能转化为电能,一部分直接供给设备正常运行,另一部分存储至内置大容量锂电池中,实现“白天储能、夜间/阴雨天供电”的自主循环,全程无需接入市电…...

河流水位雨量监测系统 雨量水位监测站

自动监测系统凭借超强抗干扰能力、精准监测性能、便捷安装与操作优势,广泛应用于各类河道监测场景,为防汛抗旱、水资源管理、水环境治理等工作提供可靠支撑,具体应用场景如下:河道水位日常监测:部署于各类天然河道、人…...

六要素自动气象站 自动气象站六要素

六要素自动气象站设备搭载低功耗采集器,静态功耗小于1mA,大幅降低电能消耗,搭配太阳能充电管理系统,可实现长期稳定运行,无需频繁更换电源或充电。即使在光照不足的阴雨天,也能凭借低功耗特性延长续航时间&…...

[Python] 实战解析百度慧眼API:构建城市人口热力数据自动化采集与可视化系统

1. 百度慧眼API与城市人口热力数据简介 百度慧眼是百度地图面向政企用户推出的城市大数据分析平台,其中人口热力图功能能够直观展示城市中的人群分布密度。作为一名长期从事城市数据分析的研究者,我经常需要获取这类数据来分析商业区人流规律、交通枢纽拥…...

tao-8k部署教程(Linux/macOS双平台):Xinference源码安装与模型注册

tao-8k部署教程(Linux/macOS双平台):Xinference源码安装与模型注册 1. 引言:为什么选择tao-8k? 如果你正在寻找一个能处理超长文本的嵌入模型,tao-8k绝对值得你花时间了解一下。这个由Hugging Face开发者…...

深度解析:Windows11DragAndDropToTaskbarFix如何强力恢复Windows 11任务栏拖放功能

深度解析:Windows11DragAndDropToTaskbarFix如何强力恢复Windows 11任务栏拖放功能 【免费下载链接】Windows11DragAndDropToTaskbarFix "Windows 11 Drag & Drop to the Taskbar (Fix)" fixes the missing "Drag & Drop to the Taskbar&quo…...

飞机发动机‘健康密码‘解析:5个提高EGT裕度的冷门技巧(航司工程师亲测有效)

飞机发动机健康密码解析:5个提高EGT裕度的冷门技巧(航司工程师亲测有效) 在航空公司的日常运营中,发动机性能管理一直是机务工作的重中之重。EGT(排气温度)裕度作为衡量发动机健康状况的关键指标&#xff…...

深入解析原型网络:小样本学习中的高效聚类与分类策略

1. 为什么需要原型网络?从小样本学习的困境说起 想象你是一名幼儿园老师,今天班里转来了五个新同学。校长给你一张每个孩子的照片和名字,要求你明天必须记住所有新同学的面孔。这就是典型的小样本学习场景——你只有极少的样本(每…...

从无人机航拍到数字孪生:一文搞懂摄影测量学的核心概念与应用场景

从无人机航拍到数字孪生:摄影测量学的现代技术融合与实践指南 当DJI无人机在百米高空自动拍摄数百张重叠照片时,很少有人意识到这背后是一套起源于19世纪的科学技术体系——摄影测量学。这门学科已经从传统的测绘领域悄然渗透到我们日常生活的方方面面&a…...

BDD100K:从10万小时真实驾驶数据到自动驾驶感知系统的技术革命

BDD100K:从10万小时真实驾驶数据到自动驾驶感知系统的技术革命 【免费下载链接】bdd100k Toolkit of BDD100K Dataset for Heterogeneous Multitask Learning - CVPR 2020 Oral Paper 项目地址: https://gitcode.com/gh_mirrors/bdd/bdd100k 在自动驾驶技术从…...

EdgeRemover深度解析:如何优雅解决Windows Edge卸载难题?

EdgeRemover深度解析:如何优雅解决Windows Edge卸载难题? 【免费下载链接】EdgeRemover A PowerShell script that correctly uninstalls or reinstalls Microsoft Edge on Windows 10 & 11. 项目地址: https://gitcode.com/gh_mirrors/ed/EdgeRem…...

【Jackson】全局配置与注解优先级冲突:深入解析JsonDeserializer与@JsonFormat的博弈

1. 当全局配置遇上局部注解:Jackson的优先级之争 在Java生态中,Jackson无疑是处理JSON数据的标杆库。但当你同时使用全局配置和JsonFormat注解时,可能会遇到一个令人头疼的问题:明明在字段上标注了特定日期格式,为什么…...

三步掌握免费离线OCR:Umi-OCR完整使用指南

三步掌握免费离线OCR:Umi-OCR完整使用指南 【免费下载链接】Umi-OCR OCR software, free and offline. 开源、免费的离线OCR软件。支持截屏/批量导入图片,PDF文档识别,排除水印/页眉页脚,扫描/生成二维码。内置多国语言库。 项目…...

JupyterLab进阶指南:从核心特性到高效工作流构建

1. JupyterLab的核心优势与模块化设计 第一次打开JupyterLab时,很多人会误以为这只是个带分栏功能的Notebook。但当我深度使用三个月后,发现它的模块化设计才是真正改变工作方式的杀手锏。想象你的工作台可以像乐高积木一样自由组合——左侧是实时刷新的…...

终极RapidOCR实战指南:5分钟实现跨平台多语言文字识别

终极RapidOCR实战指南:5分钟实现跨平台多语言文字识别 【免费下载链接】RapidOCR 📄 Awesome OCR multiple programing languages toolkits based on ONNX Runtime, OpenVINO, MNN, PaddlePaddle, TensorRT and PyTorch. 项目地址: https://gitcode.co…...

B站缓存视频格式转换完整指南:3步实现永久保存

B站缓存视频格式转换完整指南:3步实现永久保存 【免费下载链接】m4s-converter 一个跨平台小工具,将bilibili缓存的m4s格式音视频文件合并成mp4 项目地址: https://gitcode.com/gh_mirrors/m4/m4s-converter 你是否曾遇到过这样的困扰&#xff1f…...

从SMS网格到FVCOM输入:.grd与.2dm文件结构解析与实战转换指南

1. 认识SMS网格文件与FVCOM输入需求 搞海洋数值模拟的朋友们都知道,FVCOM作为常用的三维海洋环流模型,对输入网格文件有着特定要求。而SMS(Surface-water Modeling System)则是我们最常用的网格生成工具之一。在实际项目中&#x…...

【多模态交互设计黄金法则】:SITS2026首席架构师首次公开7大反直觉设计原则(含3个已落地医疗AI案例)

第一章:SITS2026多模态交互设计全景图谱 2026奇点智能技术大会(https://ml-summit.org) SITS2026(Smart Interactive Transmodal Systems 2026)定义了一套面向下一代人机协同场景的多模态交互设计范式,其核心在于语义对齐、时序…...

Cesium Terrain Builder终极指南:5分钟掌握专业级3D地形构建技术

Cesium Terrain Builder终极指南:5分钟掌握专业级3D地形构建技术 【免费下载链接】cesium-terrain-builder A C library and associated command line tools designed to create terrain tiles for use in the Cesium JavaScript library 项目地址: https://gitco…...

前端 PWA 新方法:别再忽视 PWA 了

前端 PWA 新方法:别再忽视 PWA 了 什么是前端 PWA 新方法? 前端 PWA 新方法是指在前端开发中,随着技术的发展,出现的新的 PWA(Progressive Web App)技术和方法。别以为 PWA 只是添加一个 manifest.json 文件…...

前端微前端新方法:别再用传统的单体应用了

前端微前端新方法:别再用传统的单体应用了 什么是前端微前端新方法? 前端微前端新方法是指在前端开发中,随着技术的发展,出现的新的微前端技术和方法。别以为微前端只是简单的iframe集成,那是十年前的玩法了。 为什么需…...

SEED-VII数据集实战:5步搞定情感脑电图分析(附Python代码)

SEED-VII数据集实战:5步搞定情感脑电图分析(附Python代码) 第一次接触SEED-VII数据集时,我被它复杂的文件结构和多维度的情感标注搞得晕头转向。作为一个专注情感计算领域三年的研究者,我深知优质数据集对算法开发的重…...

FT8440A-RT电源芯片在小家电与智能家居中的高效应用(典型电路设计与优化)

1. FT8440A-RT电源芯片的核心特性解析 FT8440A-RT这颗非隔离PWM功率开关芯片,我在智能窗帘电机项目里用了不下500片。最让我惊喜的是它用FB脚就能搞定两种电压输出——悬空时输出12V300mA,接地时输出18V250mA。这种设计特别适合需要双电压档位的小家电&a…...