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日
    浏览(58)
  • 基于STM32的HC_SR04模块实现超声波测距(附源码)

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

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

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

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

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

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

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

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

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

    2024年02月07日
    浏览(48)
  • 手把手教你,通过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日
    浏览(50)
  • 输入捕获模块的使用–超声波测距

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

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

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

    2024年02月13日
    浏览(48)
  • 基于STM32超声波测距系统设计

    随着社会的发展和科技的进步,人们对测距的要求越来越高,特别是在一些要求实时测距的场合,传统的测距方式已经无法满足人们的需求,而超声波测距由于其非接触和实时反馈的特点在生活中得到广泛应用。 本系统硬件部分由电源模块、控制模块、显示模块、报警模块、

    2024年02月04日
    浏览(56)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包