Verilog 实现超声波测距

这篇具有很好参考价值的文章主要介绍了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
  • 人机交互

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

代码组成:

Verilog 实现超声波测距,Verilog语法学习,fpga开发,学习


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) begin
	if(!rst_n)
		r_divcnt <= 8'b0;
	else if(r_divcnt < P_DIVCLK_MAX)
		r_divcnt <= r_divcnt + 1'b1;
	else
		r_divcnt <= 8'b0;
end

///
//产生时钟使能信号
always @(posedge clk) begin
	if(r_divcnt == P_DIVCLK_MAX)
		clk_en <= 1'b1;
	else
		clk_en <= 1'b0;
end

endmodule

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) begin
	if(!rst_n)
		tricnt <= 'b0;
	else if(clk_en)begin
		if(tricnt < P_TRIG_PERIORD_MAX)
			tricnt <= tricnt + 1'b1;
		else
			tricnt <= 'b0;
	end		
end

///
//产生保持10us的trig信号
always @(posedge clk) begin
	if((tricnt > 'b0)&&(tricnt <= P_TRIG_HIGH_MAX))
		trig <= 1'b1;
	else
		trig <= 1'b0;
end

endmodule

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

Verilog 实现超声波测距,Verilog语法学习,fpga开发,学习

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) begin
	if(!rst_n)
		r_echo <= 'b0;
	else
		r_echo <= {r_echo[0],echo};	//高位锁存,低位移位	
end

assign pos_echo = ~r_echo[1] & r_echo[0];
assign neg_echo = r_echo[1] & ~r_echo[0];

always @(posedge clk or negedge rst_n) begin
	if(!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) begin
	if(!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) begin
	if(!rst_n)
		t_us <= 'b0;
	else if(neg_echo)
		t_us <= echo_cnt;
end

endmodule

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*t
	s*4096=0.173*t*4096=709*t	 避免小数部分
	s=709*t/4096=709*t>>12
	
	709实现方法:  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,进行下面的操作:

Verilog 实现超声波测距,Verilog语法学习,fpga开发,学习


Verilog 实现超声波测距,Verilog语法学习,fpga开发,学习

TB文件

`timescale 1ns/1ps

module 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 begin
	rst_n = 0;
	echo = 0;
	#200;
	rst_n = 1;
	
end

//函数实现 s=0.173*t
function real function_t2s;
	input real t;
	begin
		function_t2s = 0.173*t;
	end
endfunction

integer tricnt = 0;
integer dly_time;

always @(posedge trig)begin
	tricnt = 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;
end


endmodule

仿真结果

  • 仿真波形

Verilog 实现超声波测距,Verilog语法学习,fpga开发,学习

  • 结果

Verilog 实现超声波测距,Verilog语法学习,fpga开发,学习文章来源地址https://www.toymoban.com/news/detail-673690.html

到了这里,关于Verilog 实现超声波测距的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于STM32F407实现超声波测距(SR04)

    今天要实现的功能是超声波测距,这一功能在很多的地方都能用到,比如:在智能小车上可以添加超声波避障功能。今天需要用到SR04超声波模块,在使用这一模块的时候我很会接触到时序图。 模块如图所示: 模块有四个引脚 VCC 供 5V电源, GND 为地线, TRIG 触 发 控 制 信 号

    2024年02月11日
    浏览(46)
  • 基于STM32的HC_SR04模块实现超声波测距(附源码)

    本次实验需要通过STM32与HC_SR04模块实现实时测距,并将测距信息通过串口显示在电脑上 原理 超声波测距原理是在超声波发射装置发出超声波,它的根据是接收器接到超声波时的时间差,与雷达测距原理相似。 超声波发射器向某一方向发射超声波,在发射时刻的同时开始计时

    2024年02月11日
    浏览(40)
  • 超声波测距仿真

    萌新第一次写博客,有格式不正确的地方还请大家见谅。 用HCSR04超声波传感器测量距离,测量范围0~170cm,精确到小数点后一位。 用LCD1602或者数码管显示测量到的距离。 当距离大于120cm时,绿色LED灯亮; (1)当距离在50-120cm之间,蜂鸣器间断发声“滴 滴 滴 ”提示,黄色LED灯亮

    2024年02月05日
    浏览(33)
  • 超声波测距系统

      具有测距、温度补充、实时时钟、记忆、阈值警报、串口数据发送等等功能,通过LCD1602显示,按键进行相关操作。   LCD1602显示共有五个界面,按键一用于切换显示界面。   此界面测距为连续测距模式,LCD1602不间断刷新测量距离和温度,一旦测量距离小于设置的阈

    2024年02月03日
    浏览(32)
  • 全志ARM-超声波测距

    超声波测距模块是用来测量距离的一种产品,通过发送和收超声波,利用时间差和声音传播速度, 计算出模块到前方障碍物的距离 1.测距原理: 给Trig端口至少10us的高电平发送声波,Echo信号,由低电平跳转到高电平,开始发送波;Echo,由高电平跳转回低电平,表示波回来了

    2024年04月28日
    浏览(28)
  • 基于FPGA的超声波测距

    distance超声波测距模块负责数据的采集,vga、uart、beep、数码管根据采集到的数据分别进行vga的屏幕打点、串口输出到上位机、蜂鸣器根据数据大小进行鸣叫以及数码管显示采集到的数据。 RTL视图 代码 串口控制模块把接受到的24位BCD码转换成ASSIC码,并且清除高位零位和添加

    2024年02月07日
    浏览(38)
  • 手把手教你,通过HAL库实现STM32的超声波测距--以SR-04为例

    目录 0、SR-04基本原理 1、准备工作 2、连线  3、STM32CUBEMX设置 3.1新建工程 3.2芯片通用设置 3.3定时器捕获设置 ​3.4其他设置 3.5生成工程  4、程序完善 4.1完善打印输出函数  4.2完善tim.c 4.3完善gpio.c  4.4完善main函数   5、总结 声波遇到障碍物会反射,而声波的速度已知,所以

    2024年02月14日
    浏览(40)
  • 输入捕获模块的使用–超声波测距

    @(MSP432P401R) 输入捕获的配置 基本默认即可 输入捕获的API的使用 参数 Capture_Mode即捕获模式,经实际测试,MSP432P401R只能使用前三种模式 Capture_CallBackFxn即回调函数 Capture_PeriodUnits即捕获周期单位 函数表 全局配置,在ti_drivers_config.c文件中生成 功能函数 文档链接:file:///D:/MSP%

    2024年02月15日
    浏览(67)
  • 基于STM32的超声波测距

    一、HC-SR04模块介绍 HC-SR04超声波测距模块可提供2cm-400cm的非接触式距离感测功能,测距精度可高达3mm;模块包括超声波发射器、接收器、与控制电路。 模块的基本工作原理为: (1)采用 IO口 TRIG触发测距,给最少 10us的高电平信呈。 (2)模块自动发送 8个 40khz的方波,自动检测是

    2024年02月13日
    浏览(38)
  • stm32之14.超声波测距代码

           -------------------- 源码  

    2024年02月11日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包