用FPGA驱动HC-SR04超声波测距模块

HC-SR04 超声波测距模块介绍:

HC-SR04 超声波测距模块是非接触式距离感测设备,具备2cm至400cm的测距范围。其测距精度高达3mm,使得在各种应用场景中都能实现精确的距离测量。模块由超声波发射器、接收器以及控制电路组成。

超声波传感器工作原理:
  • 确保IO 口 TRIG 信号的高电平持续时间至少为 10us
  • 模块自动发送 8 个 40khz 的方波,自动检测是否有信号返回
  • IO 口 ECHO 输出一个高电平,高电平持续的时间就是超声波从发射到返回的时间。使用计时器或计数器来精确测量 ECHO 信号的高电平时间。测试距离=(高电平时间*声速(340M/S))/2

 接线端口:

  • Vcc:+5V电源供电
  • Trig:输入触发信号(触发测距)
  • Echo:传出信号回响(传回时间差)
  • Gnd:接地

超声波时序图:

实验目的:设计一个可以用数码管实时显示测得距离大小

模块框图:

hcrs模块代码

module hcrs 
(
    input wire clk_50Mhz        , //系统时钟50Mhz
    input wire rst_n            , //全局复位
    input wire ech              , //输入信号回响,待测高电平的时间长短

    output reg trg              , //产生触发信号,用于触发测距
    output reg [31:0] data        //输出信号,用于显示测距结果
);

parameter CNT_20US_MAX =10'd999;//20us
parameter CNT_100MS_MAX = 26'd49_999_99;//100ms

reg ech_1;
reg ech_2;
wire ech_flag;

reg [25:0] cnt_ms;       

reg [9:0] cnt_20ns_dely;

reg [31:0] cnt_sum;

//每隔100ms的产生一次内部触发信号
always @(posedge clk_50Mhz or negedge rst_n) begin//ms
    if(rst_n==1'b0) begin
        cnt_ms <= 25'd0;
    end
    else if(cnt_ms==CNT_100MS_MAX) begin
        cnt_ms <= 25'd0;
    end
    else begin
        cnt_ms <= cnt_ms + 25'd1;
    end
end

//产生20us的触发信号,用于触发测距
always @(posedge clk_50Mhz or negedge rst_n) begin
    if(rst_n==1'b0) begin
        trg <= 1'd0;
    end
    else if(cnt_ms<=CNT_20US_MAX) begin
        trg <= 1'd1;
    end
    else begin
        trg <= 1'd0;
    end    
end

//对输入信号回响进行时钟同步
always @(posedge clk_50Mhz or negedge rst_n) begin//aligning
    if(rst_n==1'b0) begin
        ech_1 <= 1'd0;
    end
    else begin
        ech_1 <= ech;
    end 
end    

//对ech_1信号进行同步,防止亚稳态现象
always @(posedge clk_50Mhz or negedge rst_n) begin//aligning
    if(rst_n==1'b0) begin
        ech_2 <= 1'd0;
    end
    else begin
        ech_2 <= ech_1;
    end 
end 

//利用计数器计算回响信号的时间长短
always @(posedge clk_50Mhz or negedge rst_n) begin//count
    if(rst_n==1'b0) begin
        cnt_sum <= 20'd0;
    end
    else if(ech_2 ==1'd0) begin
        cnt_sum <= 20'd0;
    end
    else if(ech_2 ==1'd1) begin
        cnt_sum <= cnt_sum + 20'd1;
    end
    else begin
        cnt_sum <= cnt_sum;
    end
end

//产生计数时间数据提取标志
assign ech_flag = (~ech_1) & ech_2;

//进行距离计算处理 S = [(echo的高电平时间)* 340m/s]/2  这里注意单位
always @(posedge clk_50Mhz or negedge rst_n) begin//count
    if(rst_n==1'b0)
        data <= 20'd0;
    else if(ech_flag ==1'b1)
        data <= cnt_sum*34/1_000_0;//mm   
    else 
        data <= data; 
end


endmodule //hcrs

bcd_8421模块代码,见我的这一篇文章 :用FPGA设计8421BCD编码-优快云博客

smg模块代码,见我的这一篇文章 :用FPGA设计数码管-优快云博客

HC_SR_top模块代码

module HC_SR_top (
    input wire clk_50Mhz        , //系统时钟50Mhz
    input wire rst_n            , //全局复位
    input wire ech              , //输入信号回响,待测高电平的时间长短

    output reg trg              , //产生触发信号,用于触发测距
    output reg [7:0] smg_reg   ,  //输出单个数码管显示的数据信号
    output reg [7:0] smg_rel      //输出数码管选择信号
);

wire [26:0] data     ;
wire [31:0] bcd_data ;

hcrs hcrs_inst
(
    .clk_50Mhz  (clk_50Mhz)      , //系统时钟50Mhz
    .rst_n      (rst_n    )      , //全局复位
    .ech        (ech      )      , //输入信号回响,待测高电平的时间长短

    .trg        (trg      )      , //产生触发信号,用于触发测距
    .data       (data     )        //输出信号,用于显示测距结果

);


bcd_8421 bcd_8421_inst
(
    .clk_50mhz   (clk_50mhz)           ,      //系统时钟50Mhz     
    .rst_n       (rst_n    )           ,      //全局复位
    .data        (data     )           ,      //待编码数据

    .bcd_data    (bcd_data )                  //编码后的数据
);

smg smg_inst
(

    .clk_50Mhz  (clk_50Mhz)     , //系统时钟50Mhz
    .rst_n      (rst_n    )     , //全局复位
    .data_in    (bcd_data )     , //输入信号
    .point      (8'd0     )     , //小数点显示,高电平有效

    .smg_reg    (smg_reg  )     , //输出单个数码管显示的数据信号
    .smg_rel    (smg_rel  )       //输出数码管选择信号

);


endmodule //HC_SR_top

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值