基于 ZYNQ ECO开发板 超声波模块

超声波模块

  1. `timescale 1ns / 1ps
  2. module SR_04(
  3. input clk ,
  4. input rst_n ,
  5. input echo , //接收端,判断端口返回值
  6. output [15:0] dis , //最终距离
  7. output trig //脉冲发出
  8. );
  9. parameter delay = (50*15) + (50*1000*100); //60ms以上的周期
  10. parameter s1 = 0; //空闲
  11. parameter s2 = 1; //echo开始计时
  12. parameter s3 = 2; //计时结束
  13. reg [31:0] cnt_trig;
  14. reg [31:0] cnt_echo;
  15. reg [31:0] cnt_echo_reg;
  16. reg [2:0] c_state;
  17. reg [2:0] n_state;
  18. always @(posedge clk)
  19. if(!rst_n)
  20. cnt_trig <= 0;
  21. else if(cnt_trig == delay -1)
  22. cnt_trig <= 0;
  23. else
  24. cnt_trig <= cnt_trig +1
  25. ;
  26. assign trig = ((cnt_trig >0) && (cnt_trig<(50*15))) ? 1:0;
  27. always @(posedge clk)
  28. if(!rst_n)
  29. c_state <= s1;
  30. else
  31. c_state <= n_state;
  32. always @(*)
  33. case(c_state)
  34. s1: begin
  35. if(echo == 1)
  36. n_state = s2;
  37. else
  38. n_state = s1;
  39. end
  40. s2: begin
  41. if(echo == 0)
  42. n_state = s3;
  43. else
  44. n_state = s2;
  45. end
  46. s3: begin
  47. n_state = s1;
  48. end
  49. endcase
  50. always @(posedge clk)
  51. if(!rst_n)begin
  52. cnt_echo<=0;
  53. cnt_echo_reg <= 0;
  54. end
  55. else begin
  56. case(c_state)
  57. s1: begin
  58. cnt_echo<=0;
  59. cnt_echo_reg <= cnt_echo_reg;
  60. end
  61. s2: begin
  62. cnt_echo<=cnt_echo +1;
  63. cnt_echo_reg <= cnt_echo_reg;
  64. end
  65. s3: begin
  66. cnt_echo<=cnt_echo;
  67. cnt_echo_reg <= cnt_echo;
  68. end
  69. endcase
  70. end
  71. assign dis = (cnt_echo_reg * 20)/1000/58;
  72. endmodule

模块的输入包括时钟信号clk、复位信号rst_n、echo信号(接收端返回值);输出包括距离信号dis和脉冲发出信号trig。

该模块定义了一些参数和寄存器用于跟踪计数。delay参数定义了周期的延迟时间,s1、s2和s3分别表示状态机的三个状态。

在时钟信号上升沿触发的always块中,根据复位信号的状态设置计数器cnt_trig的值。当cnt_trig达到delay-1时,将其重置为0。根据cnt_trig的值,将trig输出设置为1或0,以控制脉冲发出。

另一个时钟信号上升沿触发的always块中,根据复位信号和状态机的当前状态设置计数器cnt_echo和cnt_echo_reg的值。根据状态机的状态,cnt_echo的值会进行递增或保持不变。cnt_echo_reg保存上一个状态的计数器值。

最后,通过组合逻辑,将cnt_echo_reg乘以20,除以1000,再除以58,得到距离值dis。

这个超声波模块的功能是通过计数器实现超声波测距。它通过测量超声波从发射到接收的时间,然后将时间转换为距离值。相当于我们可以在其他地方得到超声波距离。

输出dis单位为 cm

LED

  1. `timescale 1ns / 1ps
  2. module led_mk(
  3. input clk ,
  4. input rst_n ,
  5. input [4:0] led_zt ,
  6. output reg[3:0] led
  7. );
  8. parameter led1 = 0;
  9. parameter led2 = 1;
  10. parameter led3 = 2;
  11. parameter led4 = 3;
  12. parameter led5 = 4;
  13. reg [3:0] c_led;
  14. reg [3:0] n_led;
  15. always @(posedge clk)
  16. if(!rst_n)
  17. c_led <= led1;
  18. else
  19. c_led <= n_led;
  20. always @(*)
  21. if(!rst_n)
  22. n_led = 0;
  23. else begin
  24. case(led_zt)
  25. led1: begin
  26. n_led = led1;
  27. end
  28. led2:begin
  29. n_led = led2;
  30. end
  31. led3:begin
  32. n_led = led3;
  33. end
  34. led4:begin
  35. n_led = led4;
  36. end
  37. led5:begin
  38. n_led = led5;
  39. end
  40. default:
  41. n_led = n_led;
  42. endcase
  43. end
  44. always @(posedge clk)
  45. if(!rst_n)
  46. led <= 0;
  47. else begin
  48. case(c_led)
  49. led1: begin
  50. led <= 4'b0000;
  51. end
  52. led2:begin
  53. led <= 4'b0001;
  54. end
  55. led3:begin
  56. led <= 4'b0011;
  57. end
  58. led4:begin
  59. led <= 4'b0111;
  60. end
  61. led5:begin
  62. led <= 4'b1111;
  63. end
  64. default:
  65. led <= led;
  66. endcase
  67. end
  68. endmodule

这里通过输入的led_zt来控制ed显示的状态

超声波测距

  1. `timescale 1ns / 1ps
  2. module sr_led(
  3. input clk ,
  4. input rst_n ,
  5. input echo , //接收端,判断端口返回值
  6. output trig , //脉冲发出
  7. output reg [3:0] led
  8. );
  9. wire [15:0] dis;
  10. wire [3:0] led_dd;
  11. reg [4:0] led_zt;
  12. always @(posedge clk)
  13. if(!rst_n) begin
  14. led <= 0;
  15. end
  16. else
  17. led <= led_dd;
  18. parameter csb0 = 0;
  19. parameter csb1 = 2;
  20. parameter csb2 = 4;
  21. parameter csb3 = 6;
  22. parameter csb4 = 8;
  23. always @(posedge clk)
  24. if(!rst_n)
  25. led_zt <= 0;
  26. else if (dis > csb4 )
  27. led_zt <= 4;
  28. else if (dis > csb3 && dis <= csb4)
  29. led_zt <= 3;
  30. else if (dis > csb2 && dis <= csb3)
  31. led_zt <= 2;
  32. else if (dis > csb1 && dis <= csb2)
  33. led_zt <= 1;
  34. else if (dis > csb0 && dis <= csb1)
  35. led_zt <= 0;
  36. led_mk kk(
  37. . clk (clk ) ,
  38. . rst_n (rst_n ) ,
  39. . led_zt (led_zt) ,
  40. . led (led_dd )
  41. );
  42. SR_04 sr(
  43. . clk (clk ) ,
  44. . rst_n (rst_n) ,
  45. . echo (echo ) , //接收端,判断端口返回值
  46. . dis (dis ) , //最终距离
  47. . trig (trig ) //脉冲发出
  48. );
  49. endmodule

通过调用l超声波距离远近来控制led状态

本文原创,作者:FPGA小白,其版权均为FPGA线上课程平台|最全栈的FPGA学习平台|FPGA工程师认证培训所有。
如需转载,请注明出处:https://z.shaonianxue.cn/9114.html

"愿我的文字能带给您一丝美好"

还没有人赞赏,支持一下

评论

A 为本文作者,G 为游客总数:0
加载中…

提交评论

游客,您好,欢迎参与讨论。

我的购物车

购物车为空

优惠券

没有优惠券