原创 verilog笔记之--超声波模块控制

2014-6-3 14:17 1441 11 14 分类: FPGA/CPLD 文集: Verilog

前编:

学习verilog也快半年了,期间一直没有怎么做过总结或者笔记。好不容易中途写了好厚一本笔记,记录了关于fpga控制液晶显示的很多心得,结果一不小心搞丢了,很是郁闷。不过想想,做做笔记,做做总结总还是比纯凭记忆的好。EDN是个很不错的平台,氛围也很好,索性就借这个平台来记录自己的成长吧,也可以和坛子里的朋友们分享,以后回头来看必定颇有感慨。

这次用的超声波模块型号是HC-SR04,根据datasheet,一共有四个管脚

20140531211814643.jpg

基本工作原理:

(1)采用 IO 口 TRIG 触发测距,给最少 10us 的高电平信呈。

(2)模块自动发送 8 个 40khz 的方波,自动检测是否有信号返回;

(3)有信号返回,通过 IO 口 ECHO 输出一个高电平,高电平持续的时间就是超声

波从发射到返回的时间。测试距离=(高电平时间*声速(340M/S))/2;

时序图如下

20140531212038539.jpg

我的基本思想是设置一个100ms的计数器(datasheet中建议测量周期最好大于60ms)为测量周期提供时序控制。以pll产生的1MHz时钟信号,在最开始的20us内获取上一次echo的脉冲宽度寄存器的值,在20us-40us时发送一个trig信号,同时清零脉冲宽度寄存器的值。随后,模块应该连续发出8个40KHz的脉冲,可以开始等待echo信号,在脉冲持续期间,以1us为单位计数,直到脉冲完成,这样便可得到脉冲宽度,并且可以保持到下一个trig脉冲到来之前。其它的就简单了,得到的脉冲宽度可以通过换算公式的到距离,再转换成对应的ascii码便可以显示在lcd1602液晶上。下面是具体代码:

/*************************************************************************************************

*This module is used to measure the distance between the ultrasonic module and the target.       *

*1 clk 1 us

*************************************************************************************************/

module ultrasonic(clk,fpga_rst,trig,echo,t,s);

 

input  clk;

input  fpga_rst;

input  echo;

output trig;

output [16:0] t;

output [16:0] s;

 

reg [19:0] cnt;

 

always@(posedge clk)//this 100ms period signal is used to control the time_sequence

begin

if(!fpga_rst)

cnt<=20'd0;

else if(cnt>=20'd1000_00)

cnt<=20'd0;

else

cnt<=cnt+20'd1;

end

 

reg trig;

 

always@(posedge clk)//generate a >10us pulse,it will be tranformed into 8 continue 40KHz ultrasonic wave by the module

begin

if(!fpga_rst)

trig<=1'b0;

else if((cnt>=20'd20)&&(cnt<=20'd40))

trig<=1'b1;

else

trig<=1'b0;

end

 

reg [16:0] t; 

 

always@(posedge clk)//get the time from the sonic wave send and the echo receive,the t will be clear when the trig pulse gen

begin

if(!fpga_rst)

t<=17'd0;

else if((cnt>=20'd20)&&(cnt<=20'd40))

t<=17'd0;

else if(echo)

t<=t+17'd1;

end

 

reg [16:0] s;

 

always@(posedge clk)

begin

if(!fpga_rst)

s<=17'd0;

else if(cnt<20'd10)

s<=t/58;

end

 

endmodule 

 

PARTNER CONTENT

文章评论3条评论)

登录后参与讨论

用户377235 2015-4-13 20:39

请问程序中的t和s代表什么?

用户377235 2015-4-13 20:37

请问程序中t和s代表的是什么?

用户1721644 2014-10-28 22:02

虽然我看不懂,但我还是觉得很有道理的。

用户1371937 2014-10-13 11:25

膜拜的圣地阿,仰望

用户401004 2014-10-2 09:44

都是高手呀!

hot.summer_2010_438634915 2014-9-6 13:23

学习了,谢谢

用户1443740 2014-9-1 11:28

6-7
相关推荐阅读
EE直播间
更多
我要评论
3
11
关闭 站长推荐上一条 /3 下一条