国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Verilog 實(shí)現(xiàn)超聲波測(cè)距

這篇具有很好參考價(jià)值的文章主要介紹了Verilog 實(shí)現(xiàn)超聲波測(cè)距。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

Verilog 實(shí)現(xiàn)超聲波測(cè)距

教學(xué)視頻: https://www.bilibili.com/video/BV1Ve411x75W?p=33&spm_id_from=pageDriver&vd_source=19ae31dff4056e52d2729a4ca212602b

超聲波測(cè)距原理

參考資料:STM32的超聲波測(cè)距程序_超聲波測(cè)距stm32程序_VaderZhang的博客-CSDN博客

推薦一波自己的文章:STM32藍(lán)牙控制循跡避障小車源代碼——3.舵機(jī)、超聲波測(cè)距模塊_stem32超聲波舵機(jī)代碼_靈風(fēng)_Brend的博客-CSDN博客

  • 超聲波模塊工作原理:
    輸出TRIG觸發(fā)測(cè)距,需要給最少10us的高電平信呈;
    模塊自動(dòng)發(fā)送8個(gè)40KHZ的方波,自動(dòng)檢測(cè)是否有信號(hào)返回;
    有信號(hào)返回,通過(guò)IO口ECHO輸出高電平,高電平持續(xù)時(shí)間就是超聲波從發(fā)射到返回的時(shí)間;
    測(cè)試距離=高電平持續(xù)時(shí)間*聲速/2

需求分析與功能定義:

  • 每隔100ms時(shí)間,定時(shí)產(chǎn)生10us時(shí)間的TRIG高脈沖給到超聲波測(cè)距模塊,用于觸發(fā)超聲波測(cè)距模塊工作
  • 采集回響信號(hào)ECHO的高脈沖保持時(shí)間
  • 將ECHO高脈沖保持時(shí)間換算成距離信息:s = 0.173*t
  • 人機(jī)交互

代碼思路:(詳細(xì)教學(xué)可以看最上面的鏈接)

代碼組成:

Verilog 實(shí)現(xiàn)超聲波測(cè)距,Verilog語(yǔ)法學(xué)習(xí),fpga開發(fā),學(xué)習(xí)


vlg_en :輸出clk_en信號(hào),對(duì)輸入時(shí)鐘clk做分頻計(jì)數(shù),產(chǎn)生1us的時(shí)鐘使能信號(hào)(計(jì)數(shù)單位為us)


module vlg_en #(
	parameter P_CLK_PERIORD = 20	//clk的時(shí)鐘周期為20ms
)
( 
	input 		clk,
	input 		rst_n,
	
	output reg 	clk_en
);

localparam P_DIVCLK_MAX = 1000/P_CLK_PERIORD - 1;	//分頻計(jì)數(shù)器的最大值
reg [7:0] r_divcnt;

///
//對(duì)輸入時(shí)鐘clk做分頻計(jì)數(shù),產(chǎn)生1us的時(shí)鐘使能信號(hào)
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

///
//產(chǎn)生時(shí)鐘使能信號(hào)
always @(posedge clk) begin
	if(r_divcnt == P_DIVCLK_MAX)
		clk_en <= 1'b1;
	else
		clk_en <= 1'b0;
end

endmodule

vlg_tirg :每隔100ms時(shí)間,定時(shí)產(chǎn)生10us時(shí)間的TRIG高脈沖給到超聲波測(cè)距模塊,用于觸發(fā)超聲波測(cè)距模塊工作

module vlg_tirg
( 
	input 		clk,
	input 		rst_n,
	input 		clk_en,
	
	output reg 	trig
);

localparam P_TRIG_PERIORD_MAX = 100_000 - 1;	//100ms計(jì)數(shù)最大值
localparam P_TRIG_HIGH_MAX = 10;			//10us高脈沖保持時(shí)間

reg [16:0] tricnt;

///
//100ms周期計(jì)數(shù)
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

///
//產(chǎn)生保持10us的trig信號(hào)
always @(posedge clk) begin
	if((tricnt > 'b0)&&(tricnt <= P_TRIG_HIGH_MAX))
		trig <= 1'b1;
	else
		trig <= 1'b0;
end

endmodule

上面兩個(gè)信號(hào)的波形展示:

Verilog 實(shí)現(xiàn)超聲波測(cè)距,Verilog語(yǔ)法學(xué)習(xí),fpga開發(fā),學(xué)習(xí)

vlg_echo : 采集回響信號(hào)ECHO的高脈沖保持時(shí)間。(echo信號(hào)的高電平保持時(shí)間即為超聲波往返的時(shí)間)

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;

///
//對(duì)echo信號(hào)鎖存兩拍,獲取邊沿檢測(cè)信號(hào),產(chǎn)生計(jì)數(shù)使能信號(hào)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

///
//對(duì)echo信號(hào)的高電平保持時(shí)間進(jìn)行1us為單位的計(jì)數(shù)
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	

///
//對(duì)echo_cnt計(jì)數(shù)最大值做鎖存
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 :將時(shí)間計(jì)算為距離。測(cè)試距離=高電平持續(xù)時(shí)間 * 聲速/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	 避免小數(shù)部分
	s=709*t/4096=709*t>>12
	
	709實(shí)現(xiàn)方法:  1)乘法器
				2)709=512+128+64+4+1
	本代碼使用乘法器來(lái)實(shí)現(xiàn)。直接調(diào)用乘法器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;

//使能時(shí)鐘產(chǎn)生模塊
vlg_en #(
	.P_CLK_PERIORD (P_CLK_PERIORD)	//clk的時(shí)鐘周期為20ns
)
u_vlg_en( 
	.clk 		(clk),
	.rst_n 		(rst_n),
	
	.clk_en 	(clk_en)
);

//產(chǎn)生觸發(fā)信號(hào)trig
vlg_tirg u_vlg_tirg(
	.clk	(clk),
    .rst_n	(rst_n),
    .clk_en	(clk_en),

    .trig   (trig)
);

//測(cè)距模塊的回響信號(hào)echo的高電平采集時(shí)間
vlg_echo u_vlg_echo(
	.clk	(clk),
	.rst_n	(rst_n),
	.clk_en	(clk_en),
	.echo	(echo),

	.t_us   (t_us)
);

//乘法器,計(jì)算距離
cal u_cal(
	.clk	(clk),
	.rst_n	(rst_n),
	.t_us	(t_us),

	.s_mm   (s_mm)
);

endmodule

調(diào)用乘法器IP核

點(diǎn)擊IP核,輸入MUL,進(jìn)行下面的操作:

Verilog 實(shí)現(xiàn)超聲波測(cè)距,Verilog語(yǔ)法學(xué)習(xí),fpga開發(fā),學(xué)習(xí)


Verilog 實(shí)現(xiàn)超聲波測(cè)距,Verilog語(yǔ)法學(xué)習(xí),fpga開發(fā),學(xué)習(xí)

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)
);

//產(chǎn)生時(shí)鐘
initial clk = 1;
always #10 clk = ~clk;


//測(cè)試激勵(lì)產(chǎn)生
initial begin
	rst_n = 0;
	echo = 0;
	#200;
	rst_n = 1;
	
end

//函數(shù)實(shí)現(xiàn) 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

仿真結(jié)果

  • 仿真波形

Verilog 實(shí)現(xiàn)超聲波測(cè)距,Verilog語(yǔ)法學(xué)習(xí),fpga開發(fā),學(xué)習(xí)

  • 結(jié)果

Verilog 實(shí)現(xiàn)超聲波測(cè)距,Verilog語(yǔ)法學(xué)習(xí),fpga開發(fā),學(xué)習(xí)文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-673690.html

到了這里,關(guān)于Verilog 實(shí)現(xiàn)超聲波測(cè)距的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 基于STM32F407實(shí)現(xiàn)超聲波測(cè)距(SR04)

    基于STM32F407實(shí)現(xiàn)超聲波測(cè)距(SR04)

    今天要實(shí)現(xiàn)的功能是超聲波測(cè)距,這一功能在很多的地方都能用到,比如:在智能小車上可以添加超聲波避障功能。今天需要用到SR04超聲波模塊,在使用這一模塊的時(shí)候我很會(huì)接觸到時(shí)序圖。 模塊如圖所示: 模塊有四個(gè)引腳 VCC 供 5V電源, GND 為地線, TRIG 觸 發(fā) 控 制 信 號(hào)

    2024年02月11日
    瀏覽(21)
  • 基于STM32的HC_SR04模塊實(shí)現(xiàn)超聲波測(cè)距(附源碼)

    基于STM32的HC_SR04模塊實(shí)現(xiàn)超聲波測(cè)距(附源碼)

    本次實(shí)驗(yàn)需要通過(guò)STM32與HC_SR04模塊實(shí)現(xiàn)實(shí)時(shí)測(cè)距,并將測(cè)距信息通過(guò)串口顯示在電腦上 原理 超聲波測(cè)距原理是在超聲波發(fā)射裝置發(fā)出超聲波,它的根據(jù)是接收器接到超聲波時(shí)的時(shí)間差,與雷達(dá)測(cè)距原理相似。 超聲波發(fā)射器向某一方向發(fā)射超聲波,在發(fā)射時(shí)刻的同時(shí)開始計(jì)時(shí)

    2024年02月11日
    瀏覽(20)
  • 超聲波測(cè)距系統(tǒng)

    ??具有測(cè)距、溫度補(bǔ)充、實(shí)時(shí)時(shí)鐘、記憶、閾值警報(bào)、串口數(shù)據(jù)發(fā)送等等功能,通過(guò)LCD1602顯示,按鍵進(jìn)行相關(guān)操作。 ??LCD1602顯示共有五個(gè)界面,按鍵一用于切換顯示界面。 ??此界面測(cè)距為連續(xù)測(cè)距模式,LCD1602不間斷刷新測(cè)量距離和溫度,一旦測(cè)量距離小于設(shè)置的閾

    2024年02月03日
    瀏覽(22)
  • 超聲波測(cè)距仿真

    超聲波測(cè)距仿真

    萌新第一次寫博客,有格式不正確的地方還請(qǐng)大家見(jiàn)諒。 用HCSR04超聲波傳感器測(cè)量距離,測(cè)量范圍0~170cm,精確到小數(shù)點(diǎn)后一位。 用LCD1602或者數(shù)碼管顯示測(cè)量到的距離。 當(dāng)距離大于120cm時(shí),綠色LED燈亮; (1)當(dāng)距離在50-120cm之間,蜂鳴器間斷發(fā)聲“滴 滴 滴 ”提示,黃色LED燈亮

    2024年02月05日
    瀏覽(24)
  • 全志ARM-超聲波測(cè)距

    全志ARM-超聲波測(cè)距

    超聲波測(cè)距模塊是用來(lái)測(cè)量距離的一種產(chǎn)品,通過(guò)發(fā)送和收超聲波,利用時(shí)間差和聲音傳播速度, 計(jì)算出模塊到前方障礙物的距離 1.測(cè)距原理: 給Trig端口至少10us的高電平發(fā)送聲波,Echo信號(hào),由低電平跳轉(zhuǎn)到高電平,開始發(fā)送波;Echo,由高電平跳轉(zhuǎn)回低電平,表示波回來(lái)了

    2024年04月28日
    瀏覽(25)
  • 基于FPGA的超聲波測(cè)距

    基于FPGA的超聲波測(cè)距

    distance超聲波測(cè)距模塊負(fù)責(zé)數(shù)據(jù)的采集,vga、uart、beep、數(shù)碼管根據(jù)采集到的數(shù)據(jù)分別進(jìn)行vga的屏幕打點(diǎn)、串口輸出到上位機(jī)、蜂鳴器根據(jù)數(shù)據(jù)大小進(jìn)行鳴叫以及數(shù)碼管顯示采集到的數(shù)據(jù)。 RTL視圖 代碼 串口控制模塊把接受到的24位BCD碼轉(zhuǎn)換成ASSIC碼,并且清除高位零位和添加

    2024年02月07日
    瀏覽(24)
  • 手把手教你,通過(guò)HAL庫(kù)實(shí)現(xiàn)STM32的超聲波測(cè)距--以SR-04為例

    手把手教你,通過(guò)HAL庫(kù)實(shí)現(xiàn)STM32的超聲波測(cè)距--以SR-04為例

    目錄 0、SR-04基本原理 1、準(zhǔn)備工作 2、連線 ?3、STM32CUBEMX設(shè)置 3.1新建工程 3.2芯片通用設(shè)置 3.3定時(shí)器捕獲設(shè)置 ?3.4其他設(shè)置 3.5生成工程 ?4、程序完善 4.1完善打印輸出函數(shù) ?4.2完善tim.c 4.3完善gpio.c? 4.4完善main函數(shù)? ?5、總結(jié) 聲波遇到障礙物會(huì)反射,而聲波的速度已知,所以

    2024年02月14日
    瀏覽(24)
  • 基于STM32的超聲波測(cè)距

    基于STM32的超聲波測(cè)距

    一、HC-SR04模塊介紹 HC-SR04超聲波測(cè)距模塊可提供2cm-400cm的非接觸式距離感測(cè)功能,測(cè)距精度可高達(dá)3mm;模塊包括超聲波發(fā)射器、接收器、與控制電路。 模塊的基本工作原理為: (1)采用 IO口 TRIG觸發(fā)測(cè)距,給最少 10us的高電平信呈。 (2)模塊自動(dòng)發(fā)送 8個(gè) 40khz的方波,自動(dòng)檢測(cè)是

    2024年02月13日
    瀏覽(28)
  • 輸入捕獲模塊的使用–超聲波測(cè)距

    輸入捕獲模塊的使用–超聲波測(cè)距

    @(MSP432P401R) 輸入捕獲的配置 基本默認(rèn)即可 輸入捕獲的API的使用 參數(shù) Capture_Mode即捕獲模式,經(jīng)實(shí)際測(cè)試,MSP432P401R只能使用前三種模式 Capture_CallBackFxn即回調(diào)函數(shù) Capture_PeriodUnits即捕獲周期單位 函數(shù)表 全局配置,在ti_drivers_config.c文件中生成 功能函數(shù) 文檔鏈接:file:///D:/MSP%

    2024年02月15日
    瀏覽(42)
  • 基于單片機(jī)超聲波測(cè)距語(yǔ)音播放

    基于單片機(jī)超聲波測(cè)距語(yǔ)音播放

    一、系統(tǒng)方案 本設(shè)計(jì)采用52單片機(jī)作為主控器,HC-SR04測(cè)距,液晶1602顯示,按鍵設(shè)置報(bào)警閥值,語(yǔ)音報(bào)警。 二、硬件設(shè)計(jì) 原理圖如下: 三、單片機(jī)軟件設(shè)計(jì) 1、首先是系統(tǒng)初始化 uint dist; // 保存超聲波模塊測(cè)量到的結(jié)果 2、液晶顯示程序 / / // 1602液晶寫命令函數(shù),cmd就是要寫

    2024年02月09日
    瀏覽(22)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包