module hc_sr_echo( input wire Clk , //clock 50MHz input wire clk_us , //system clock 1MHz input wire Rst_n , //reset ,low valid input wire echo , // output wire [18:00] data_o //检测距离,保留3位小数,*1000实现 ); /* S(um) = 17 * t --> x.abc cm */ //Parameter Declarations parameter T_MAX = 16'd60_000;//510cm 对应计数值 //Interrnal wire/reg declarations reg r1_echo,r2_echo; //边沿检测 wire echo_pos,echo_neg; // reg [15:00] cnt ; //Counter wire add_cnt ; //Counter Enable wire end_cnt ; //Counter Reset reg [18:00] data_r ; //Logic Description //如果使用clk_us 检测边沿,延时2us,差值过大 always @(posedge Clk or negedge Rst_n)begin if(!Rst_n)begin r1_echo <= 1'b0; r2_echo <= 1'b0; end else begin r1_echo <= echo; r2_echo <= r1_echo; end end assign echo_pos = r1_echo & ~r2_echo; assign echo_neg = ~r1_echo & r2_echo; always @(posedge clk_us or negedge Rst_n)begin if(!Rst_n)begin cnt <= 'd0; end else if(add_cnt)begin if(end_cnt)begin cnt <= cnt; end else begin cnt <= cnt + 1'b1; end end else begin //echo 低电平 归零 cnt <= 'd0; end end assign add_cnt = echo; assign end_cnt = add_cnt && cnt >= T_MAX - 1; //超出最大测量范围则保持不变,极限 always @(posedge Clk or negedge Rst_n)begin if(!Rst_n)begin data_r <= 'd2; end else if(echo_neg)begin data_r <= (cnt << 4) + cnt; end else begin data_r <= data_r; end end //always end assign data_o = data_r >> 1; endmodule
时间: 2024-04-05 09:29:13 浏览: 62
ESP-PSRAM64H/64手册
这是一个 Verilog 语言编写的模块,用于控制 HC-SR04 超声波测距模块。其中:
- Clk 表示时钟信号,频率为 50MHz。
- clk_us 表示系统时钟信号,频率为 1MHz。
- Rst_n 表示复位信号,低电平有效。
- echo 表示超声波接收信号。
- data_o 表示测量到的距离值,保留 3 位小数,单位为毫米。
该模块的功能是测量 HC-SR04 模块发送超声波到障碍物并返回的时间,然后通过一定的计算得到距离值。具体实现方式如下:
- 通过 r1_echo 和 r2_echo 两个寄存器检测超声波接收信号的边沿,用于控制计数器的工作状态。
- 计数器 cnt 用于计算超声波发送和接收的时间间隔,从而得到距离值。
- add_cnt 和 end_cnt 信号用于控制计数器的计数和复位。
- data_r 寄存器存储测量到的距离值的计算结果。
- 最后通过右移操作得到距离值的整数部分,单位为毫米。
阅读全文