Quartus超声波测距设计verilog代码青创QC-FPGA开发板

名称:Quartus超声波测距设计verilog代码青创QC-FPGA开发板(文末获取)

软件:Quartus

语言:Verilog

代码功能:

超声波测距设计

控制超声波测距模块,

数码管显示测量结果,单位mm

本代码已在青创QC-FPGA开发板验证,青创QC-FPGA开发板如下,其他开发板可以修改管脚适配:

青创QC-FPGA开发板.png

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
完整代码

 扫描文章末尾的公众号二维码

  • 22
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用US-100超声波传感器实现FPGA超声波测距的驱动代码,使用VHDL语言编写: ```vhdl library IEEE; use IEEE.STD_LOGIC_1164.ALL; entity us100 is Port ( trig : in STD_LOGIC; echo : out STD_LOGIC; clk : in STD_LOGIC; rst : in STD_LOGIC; distance : out integer range 0 to 4000); end us100; architecture Behavioral of us100 is signal start : std_logic := '0'; signal done : std_logic := '0'; signal count : integer range 0 to 40000 := 0; signal distance_raw : integer range 0 to 4000 := 0; begin -- 计数器计数 count <= count + 1 when clk'event and clk = '1' and rst = '0' and done = '0'; -- 触发信号 start <= trig and not trig'last_value when trig'event and trig = '1'; -- 计算距离 process (clk, rst) begin if rst = '1' then distance_raw <= 0; done <= '0'; elsif clk'event and clk = '1' then if start = '1' then distance_raw <= count / 58; done <= '1'; end if; end if; end process; -- 距离输出 distance <= distance_raw when done = '1' else 0; -- 回波信号输出 echo <= '1' when count < distance_raw * 58 else '0'; end Behavioral; ``` 在代码中,`trig`为超声波传感器的触发信号输入,`echo`为回波信号输出,`clk`为时钟信号输入,`rst`为复位信号输入,`distance`为距离输出。在代码中,使用计数器来计算超声波发射和接收的时间,并根据时间计算距离,最终输出距离和回波信号。需要注意的是,本代码中使用的距离单位为厘米,因此需要将计算结果除以58转换为厘米。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值