module echo( input wire Clk , //clock 100MHz input wire clk_us , //system clock 1MHz input wire Rst_n , //reset ,low valid input wire echo , // output wire [9:00] data_o //检测距离,保留3位整数,*1000实现 ); /* S(um) = 17 * t --> x.abc cm */ //Parameter Declarations parameter T_MAX = 16'd36_000;//300cm左右 对应计数值 //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 <= 'd0; end else if (echo_neg) begin data_r <= (cnt >> 3); // 将计数值向右移动3位,即除以8,然后向下取整为整数 end else begin data_r <= data_r; end end assign data_o = data_r ; endmodule
时间: 2024-04-06 09:29:47 浏览: 73
这段 Verilog 代码实现了一个测量距离的模块。模块中包括了输入时钟信号 Clk、系统时钟信号 clk_us、复位信号 Rst_n、距离测量信号 echo,以及输出距离值 data_o。具体实现如下:
- 第 8 ~ 13 行定义了模块中需要使用的参数和变量。其中,T_MAX 表示最大的计数值,即测量范围上限;r1_echo 和 r2_echo 为边沿检测所需的寄存器;echo_pos 和 echo_neg 分别表示上升沿和下降沿检测信号;cnt 为计数器,用于记录距离测量的计数值;add_cnt 和 end_cnt 分别为计数器的使能和复位信号;data_r 为记录计数值转换后的距离值的寄存器。
- 第 15 ~ 20 行定义了边沿检测信号 echo_pos 和 echo_neg,用于检测距离测量信号 echo 的上升沿和下降沿。
- 第 22 ~ 34 行定义了计数器 cnt,用于记录距离测量的计数值。当 echo 为高电平时,计数器使能,cnt 的值每次加 1;当 echo 为低电平时,计数器复位,cnt 的值归零。
- 第 36 ~ 37 行定义了计数器使能信号 add_cnt。当 echo 为高电平时,计数器使能。
- 第 38 ~ 39 行定义了计数器复位信号 end_cnt。当 echo 从高电平变为低电平时,计数器复位。当 cnt 达到最大值 T_MAX 时,也会触发计数器复位。
- 第 41 ~ 48 行实现了计数值到距离值的转换。当 echo 从高电平变为低电平时,将计数值向右移动 3 位,即除以 8,然后向下取整为整数,得到实际的距离值。转换后的距离值保存在 data_r 中。
- 第 50 行将转换后的距离值 data_r 输出给 data_o。
总的来说,这段代码实现了一个简单的距离测量模块,通过计数器记录距离测量的计数值,并将计数值转换为实际的距离值输出。
阅读全文