名称:Quartus超声波测距设计verilog代码青创QC-FPGA开发板(文末获取)
软件:Quartus
语言:Verilog
代码功能:
超声波测距设计
控制超声波测距模块,
数码管显示测量结果,单位mm
本代码已在青创QC-FPGA开发板验证,青创QC-FPGA开发板如下,其他开发板可以修改管脚适配:
1. 超声波测距原理
超声波模块采用HC-SR04
超声波测距模块工作原理
(1)采用IO口trig触发测距,给至少10us的高电平信号(本代码设计为15us);
(2)模块自动发送8个40khz的方波,自动检测是否有信号返回;
(3)有信号返回,通过IO口echo输出一个高电平,高电平持续的时间就是超声波从发射到返回的时间。测试距离=(高电平时间*声速(340M/S))/2;
(4)本模块使用方法简单,一个控制口发一个10US以上的高电平,就可以在接收口等待高电平输出。一有输出就可以开始计时,当此口变为低电平时停止计时,根据计时值即可算出距离。
2. 工程文件
3. 程序文件
4. 程序编译
5. RTL图
6. Testbench
7. 仿真图
整体仿真图
上图为整体仿真图即整体仿真图的局部放大图,可以看到发出trig触发信号,给至少10us的高电平信号,然后从echo端口接收到一段高电平。测出的距离值通过数码管显示。
超声波测距模块
可以看到发出trig触发信号,给15us的高电平信号,然后从echo端口接收到一段高电平,对高电平的时间进行计时,计数值为10000,一个计数为20ns,10000即对应200000ns,换算出的距离值为34mm。
数码管显示模块
将距离值进行显示,4个数码管依次选通(低电平选通),显示距离值的千、百、十、个位。图中距离34mm显示为0034。
部分代码展示:
//超声波测距模块 module Ultrasonic ( input clk_50M, input reset_n, input echo,//接收距离高电平 output reg trig,//发送15us脉冲 output [15:0] distance//输出距离 ); reg [31:0] clk_10Hz_count=32'd0; always@(posedge clk_50M) if(reset_n==0) clk_10Hz_count<=32'd0; else if(clk_10Hz_count>=32'd5000000)//计数5000000次就是5000000分频,50MHz分频到10Hz clk_10Hz_count<=32'd0; else clk_10Hz_count<=clk_10Hz_count+32'd1; always@(posedge clk_50M) if(reset_n==0) trig<=0; else if(clk_10Hz_count>32'd1 && clk_10Hz_count<32'd750)//750*20ns=15000ns=15us trig<=1;//发送15us高电平 else trig<=0; reg [31:0] echo_count=32'd0; reg [31:0] echo_count_buf=32'd0; reg echo_buf1=0; reg echo_buf2=0; always@(posedge clk_50M) begin echo_buf1<=echo; echo_buf2<=echo_buf1; end wire echo_posedge;//echo信号上升沿 assign echo_posedge=echo_buf1 & ~echo_buf2; always@(posedge clk_50M) if(echo_posedge)begin echo_count<=32'd0; echo_count_buf<=echo_count;//缓存echo高电平计数 end else if(echo_buf2==1)begin echo_count<=echo_count+32'd1; echo_count_buf<=echo_count_buf; end assign distance=echo_count_buf*34/10000; endmodule
完整代码
扫描文章末尾的公众号二维码