基于FPGA的超声波测距(verilog)
目录
一、超声波测距模块(HC-SR04)
1、产品特色
2、产品实物
二、超声波测距原理
三、模块代码
一、超声波测距模块(HC-SR04)
1、产品特色
2、产品实物
图一、HC_SR04实物图
二、超声波测距原理
(1)采用 IO 触发测距,给至少 10us 的高电平信号;
(2)模块自动发送 8 个 40khz 的方波,自动检测是否有信号返回;
(3)有信号返回,通过 IO 输出一高电平,高电平持续的时间就是
(4)超声波从发射到返回的时间.测试距离=(高电平时间*声速(340M/S))/2;
图二、超声波时序图
以上时序图表明只需要提供一个10uS 以上脉冲触发信号,该模块内部将发出8个40kHz 周期电平并检测回波。一旦检测到有回波信号则输出回响信号。回响信号的脉冲宽度与所测的距离成正比。由此通过发射信号到收到的回响信号时间间隔可以计算得到距离。公式:uS/58=厘米或者uS/148=英寸;或是:距离=高电平时间*声速(340M/S)/2;建议测量周期为60ms 以上,以防止发射信号对回响信号的影响。于是基于FPGA的电路实现主要包括触发信号产生、回响信号计时两个模块。
FPGA 产生周期性的 TRIG 脉冲信号,使得超声波模块周期性发出测距脉冲,当这些脉冲发出后遇到障碍物返回,超声波模块将返回的脉冲处理整形后返回给 FPGA,即 ECHO 信号。我们通过对 ECHO 信号的高脉冲保持时间就可以推算出超声波脉冲和障碍物之间的距离。
本实例的功能如图三所示,FPGA 产生 10us 脉冲 TRIG 给超声波测距模块,然后以 10us 为单位计算超声波测距模块返回的回响信号 ECHO 的高电平保持时间。ECHO 的高电平保持时间通过一定的换算后可以得到障碍物和超声波测距模块之间的距离(由距离公式计算&进制换算模块实现),我们将最终获得的以 mm 为单位的距离信息显示在 4 位数码管上。
图三、模块框图
三、模块代码
1、vlg_en模块
//产生1us为周期的时钟使能信号
//1us/20ns=50,r_divcnt内部计数周期为0~49module vlg_en#(parameter P_CLK_PERIORD = 20) //i_clk的时钟周期为20ns,50MHZ( input i_clk, input i_rst_n,output reg o_clk_en //o_clk_en的时钟周期为1us
);
reg[7:0] r_divcnt; //对输入时钟i_clk做分频计数,产生1us的时钟使能信号always @(posedge i_clk) if(!i_rst_n) r_divcnt <= 'b0;else if(r_divcnt<50)r_divcnt <= r_divcnt+1'b1;else r_divcnt <= 'b0;//产生时钟使能信号
always @(posedge i_clk) if(!i_rst_n)o_clk_en<= 'b0;else if(r_divcnt==49)o_clk_en<= 'b1;else o_clk_en <= 'b0;endmodule
2、vlg_trig模块
module vlg_trig(input i_clk,input i_rst_n,input i_clk_en,output reg o_trig
);
reg[16:0] r_tricnt;//100ms的周期计数always @(posedge i_clk) if(!i_rst_n) r_tricnt <= 'b0;else if((i_clk_en==1)&&(r_tricnt<99999))r_tricnt <= r_tricnt+1'b1;else r_tricnt <= 'b0;//产生保持10us的高脉冲o_trig信号
always @(posedge i_clk) if(!i_rst_n) o_trig<=1'b0;else if((r_tricnt > 'b0) && (r_tricnt <= 10))o_trig<=1'b1;else o_trig<=1'b0;endmodule
3、vlg_echo模块
module vlg_echo(input i_clk,input i_rst_n,input i_clk_en,input i_echo,output reg[15:0] o_t_us
);reg[1:0] r_echo;
wire pos_echo,neg_echo;
reg r_cnt_en;
reg[15:0] r_echo_cnt;//对i_echo信号同步处理,获取边沿检测信号,产生计数使能信号r_cnt_enalways @(posedge i_clk) if(!i_rst_n) r_echo<= 'b0;else r_echo <= {r_echo[0],i_echo};assign pos_echo =r_echo[0] & ~r_echo[1] ;
assign neg_echo = ~r_echo[0] &r_echo[1] ; always @(posedge i_clk) if(!i_rst_n) r_cnt_en <= 'b0;else if(pos_echo) r_cnt_en <= 'b1;else if(neg_echo) r_cnt_en <= 'b0;else ;//对i_echo信号高脉冲计时,以us为单位always @(posedge i_clk) if(!i_rst_n) r_echo_cnt <= 'b0;else if(!r_cnt_en) r_echo_cnt <= 'b0;else if(i_clk_en) r_echo_cnt <= r_echo_cnt+1;else ;//对r_echo_cnt计数最大值做锁存always @(posedge i_clk) if(!i_rst_n) o_t_us <= 'b0;else if(neg_echo) o_t_us <= r_echo_cnt;endmodule
4、乘法器IP例化计算距离
module vlg_cal(input i_clk,input i_rst_n,input[15:0] i_t_us,output[13:0] o_s_mm
);//乘法器IP例化
wire[25:0] w_mult_result;mult_gen_0 uut_mult_gen_0 (.CLK(i_clk), // input wire CLK.A(10'd709), // input wire [9 : 0] A.B(i_t_us), // input wire [15 : 0] B.P(w_mult_result) // output wire [25 : 0] P
); assign o_s_mm = w_mult_result[25:12];endmodule
5、顶层模块例化
module vlg_design(input i_clk,input i_rst_n,output o_trig,input i_echo);localparam P_CLK_PERIORD = 20;
wire w_clk_en;
wire[15:0] w_t_us;
wire[13:0] o_s_mm;//
//使能时钟产生模块 vlg_en #(.P_CLK_PERIORD(P_CLK_PERIORD) //i_clk的时钟周期为20ns
)
uut_vlg_en(.i_clk(i_clk),.i_rst_n(i_rst_n),.o_clk_en(w_clk_en)); //
//产生超声波测距模块的触发信号o_trigvlg_trig uut_vlg_trig(.i_clk(i_clk),.i_rst_n(i_rst_n),.i_clk_en(w_clk_en),.o_trig(o_trig)
); //
//超声波测距模块的回响信号i_echo的高电平时间采集vlg_echo uut_vlg_echo(.i_clk(i_clk),.i_rst_n(i_rst_n),.i_clk_en(w_clk_en),.i_echo(i_echo),.o_t_us(w_t_us)
);//
//进行时间和距离的转换运算s = 0.179tvlg_cal uut_vlg_cal(.i_clk(i_clk),.i_rst_n(i_rst_n),.i_t_us(w_t_us),.o_s_mm(o_s_mm)
);//
//VIO IP例化debug_vio uut_debug_vio (.clk(i_clk), // input wire clk.probe_in0(o_s_mm) // input wire [13 : 0] probe_in0
);endmodule
基于FPGA的超声波测距(verilog)相关推荐
- 基于FPGA的超声波测距
文章目录 一.项目框架 二.超声波测距模块 三.串口模块 1.串口发送模块 2.串口发送控制模块 四.蜂鸣器模块 五.vga显示模块 1.vga协议驱动代码 2.vga数据控制模块 六.数码管 1.数 ...
- 创意发明: 基于STC51单片机超声波测距(精简设计只需三个元件)
基于STC51单片机超声波测距精简设计只需三个元件(测距模块暂且算做是一个元件吧) 1.所需元件:STC单片机+超声波模块+4位共阳数码管 2.原理:单片机向测距模块trig脚发送20us的高电平触发 ...
- 2022-4-15 基于单片机的超声波测距报警
基于单片机的超声波测距报警 系统设计软件:Proteus8.10和keil4 .proteus8.10版本安装包可在微信公众号下载 系统源代码和仿真等资料可在文末的链接中下载 系统组成:单片机最小系统 ...
- 基于STM32和超声波测距传感器的测距功能设计
基于STM32和超声波测距传感器的测距功能设计(使用陌生传感器的流程介绍) 引言 项目设计 项目简介 开发工具 硬件设计 软件设计 开发流程 阅读手册 配置并测试传感器相关设置 软件开发 总结 后续 ...
- 基于51单片机超声波测距液位检测-温度检测
[毕设课设]基于51单片机超声波测距液位检测-温度检测 效果图 Proteus仿真: 功能简介: 文件内容: 程序框架: 网盘链接: 效果图 更多内容请关注@WENJIE电子科技 基于51单片 ...
- 基于FPGA开发板使用Verilog设计PWM呼吸灯实验
基于FPGA开发板使用Verilog设计PWM呼吸灯实验 1,实验原理 2,实验模块设计 2.1 RTL设计,呼吸灯模块设计 2.2,测试数据,下载到FPGA开发板板级的数据 2.3,两个模块综合的n ...
- 基于FPGA的超声波信号发生器设计:程序和电路原理图
基于FPGA的超声波信号发生器设计:程序和电路原理图,产生方波,正弦波和三角波,双通道. ID:28800618610960372
- 基于FPGA,解扰码器Verilog的实现,以及扰码器与解扰码器的联合仿真。附上仿真结果。
文章目录 前言 一.扰码器 二.解扰码器 三.Descrambler的Verilog实现 1.descrambler.v 2.descrambler_tb.v 四.扰码器与解扰码器的联合仿真 1.sc ...
- 基于51单片机 超声波测距 倒车雷达
基于51单片机 超声波测距 倒车雷达 51单片机最小系统电路+LCD1602+蜂鸣器报警电路+按键电路+超声波模块+电源电路 实现液晶显示距离 超设置数值报警 按键可修改数值 可加蓝牙模块 用户可以通 ...
- 【 FPGA 】超声波测距小实验(一)
超声波测距原理: 超声波测距原理是在超声波发射装置发出超声波,它的根据是接收器接到超声波时的时间差,与雷达测距原理相似. 超声波发射器向某一方向发射超声波,在发射时刻的同时开始计时,超声波在空气中传播 ...
最新文章
- android intent-fliter 标准Category
- GitHub 近 100,000 程序员“起义”:向“996”开炮!
- DOM2-document操作
- 三维重建:SLAM的尺度和方法论问题
- Yii框架常见问题汇总
- 【CF113D】Museum【概率期望】【高斯消元】
- 代换-置换网络(SP网络)
- java 代理ip工具类_Java基础之java处理ip的工具类
- Ubuntu安装包时报错 E:Unable to locate package xxx(如:python3-pip)
- 【软件质量】改善结构松散的代码
- 水表读数自动识别,基于DB和CRNN的方法
- android 蓝牙 多线程,Android蓝牙示例
- mysql单机热备份_mysql数据库热备份
- 以下会使线程进入到阻塞状态的是_Python并行编程(五):多线程同步之event(事件)...
- 2. SVM线性分类器
- 计算机软件知识pdf,[计算机软件及应用]PDF基础知识.doc
- 带有记忆的菲波那切数列
- 就业管理系统(Java毕业设计)
- xp大容量u盘补丁_u盘128g 个性 大容量电脑系统修复
- 测试工程师需掌握的技能
热门文章
- 龙芯源码编译mysql_龙芯服务器安装总结
- html+css基础教程入门之CSS 尺寸
- Ubuntu交叉编译工具链安装
- libsvm多分类python_LIBSVM (三) 葡萄酒种类识别
- mysql char archer_mysql - 常用sql
- matlab逻辑回归两次成绩录取查询,【多元逻辑回归分类】基于matlab的MNIST实践
- 浅议化学与社会的关系——兼议绿色化学重要性
- SpringBoot 动态添加定时任务
- Win7系统自动关机设定让你更轻松
- 【Redis-6.0.8】Redis中的RAX