当前位置:   article > 正文

Xilinx FPGA:vivado这里记录一个小小的问题

Xilinx FPGA:vivado这里记录一个小小的问题

问题描述:uart_data从rx模块输入到ctrl模块后就没有值了。

问题一:首先我仿真例化了两个模块,并且,我选取了单独例化的rx模块中的uart_data 的值,所以在仿真中它是有值的。

  1. `timescale 1ns / 1ps
  2. module test_bench_TOP( );
  3. reg sys_clk ;
  4. reg rst_n ;
  5. reg key ;
  6. reg echo ;
  7. wire trig ;
  8. wire tx_data ;
  9. reg rx_data ;
  10. wire[7:0] uart_data ;
  11. wire rx_done ;
  12. parameter SYSCLK = 50_000_000 ;
  13. parameter Baud = 115200 ;
  14. parameter COUNT = SYSCLK/Baud ;//434 传输1比特所需要的时钟周期
  15. parameter MID = COUNT/2 ;
  16. initial
  17. begin
  18. sys_clk = 0 ;
  19. rst_n = 0 ;
  20. key = 1 ;
  21. #10
  22. rst_n = 1 ;
  23. #50000
  24. key = 0 ;
  25. #50000
  26. key = 1 ;
  27. #50000
  28. key = 0 ;
  29. #50000
  30. key = 1 ;
  31. #50000
  32. key = 0 ;
  33. #50000
  34. key = 1 ;
  35. end
  36. always #1 sys_clk = ~sys_clk ; //2ns
  37. initial
  38. begin
  39. uart_out (8'h33); //0011_0011
  40. uart_out (8'hff); //1111_1111
  41. uart_out (8'h18); //0001_1000
  42. uart_out (8'h78);
  43. uart_out (8'h66);
  44. end
  45. //任务函数
  46. task uart_out ;
  47. input [7:0] DATA ;
  48. begin
  49. rx_data = 1 ;///空闲位初始
  50. #20
  51. rx_data = 0 ;///起始位
  52. ///传输1bit的计时次数*1周期时间=总时间
  53. #(COUNT*2) rx_data = DATA[0] ;///数据位第一位
  54. #(COUNT*2) rx_data = DATA[1] ;///数据位第二位
  55. #(COUNT*2) rx_data = DATA[2] ;
  56. #(COUNT*2) rx_data = DATA[3] ;
  57. #(COUNT*2) rx_data = DATA[4] ;
  58. #(COUNT*2) rx_data = DATA[5] ;
  59. #(COUNT*2) rx_data = DATA[6] ;
  60. #(COUNT*2) rx_data = DATA[7] ;
  61. #(COUNT*2) rx_data = 0 ;
  62. /*这一步相当于代替了串口调试工具,串口调试工具根据选择的"偶校验"
  63. 自动在数据位后面生成"0"或者"1",我们这边只能赋值一个数"0"或者"1"
  64. 我选择赋值为0,所以注定了"8'h31""8'hef""8'h10"是通不过的。
  65. */
  66. #(COUNT*2) rx_data = 1 ;
  67. #(COUNT*2) ;//停止位也需要时间
  68. # 80000 ;
  69. end
  70. endtask
  71. TOP TOP_1(
  72. . sys_clk ( sys_clk) ,
  73. . rst_n ( rst_n ) ,
  74. . key ( key ) ,
  75. // . rx_data (rx_data ) , //输入串行数据distance
  76. . echo ( echo ) ,
  77. . trig ( trig ) ,
  78. . tx_data ( tx_data)
  79. );
  80. uart_rx uart_rx_1(
  81. . sys_clk (sys_clk ) ,
  82. . rst_n (rst_n ) ,
  83. . rx_data (rx_data ) , //输入串行数据distance
  84. . uart_data(uart_data) , // 输出并行数据
  85. . rx_done (rx_done ) //数据传输完成结束信号
  86. );
  87. endmodule

如果选取TOP模块中的uart_data,它同样是没有值的:

问题二:TOP模块中没有uart_data输入进来,我们仿真的是TOP模块,uart_data都没有输入进来,肯定是没有值的。

改正后:

  1. `timescale 1ns / 1ps
  2. module test_bench_TOP( );
  3. reg sys_clk ;
  4. reg rst_n ;
  5. reg key ;
  6. reg echo ;
  7. wire trig ;
  8. wire tx_data ;
  9. reg rx_data ;
  10. parameter SYSCLK = 50_000_000 ;
  11. parameter Baud = 115200 ;
  12. parameter COUNT = SYSCLK/Baud ;//434 传输1比特所需要的时钟周期
  13. parameter MID = COUNT/2 ;
  14. initial
  15. begin
  16. sys_clk = 0 ;
  17. rst_n = 0 ;
  18. key = 1 ;
  19. #10
  20. rst_n = 1 ;
  21. #50000
  22. key = 0 ;
  23. #50000
  24. key = 1 ;
  25. #50000
  26. key = 0 ;
  27. #50000
  28. key = 1 ;
  29. #50000
  30. key = 0 ;
  31. #50000
  32. key = 1 ;
  33. end
  34. always #1 sys_clk = ~sys_clk ; //2ns
  35. initial
  36. begin
  37. uart_out (8'h33); //0011_0011
  38. uart_out (8'hff); //1111_1111
  39. uart_out (8'h18); //0001_1000
  40. uart_out (8'h78);
  41. uart_out (8'h66);
  42. end
  43. //任务函数
  44. task uart_out ;
  45. input [7:0] DATA ;
  46. begin
  47. rx_data = 1 ;///空闲位初始
  48. #20
  49. rx_data = 0 ;///起始位
  50. ///传输1bit的计时次数*1周期时间=总时间
  51. #(COUNT*2) rx_data = DATA[0] ;///数据位第一位
  52. #(COUNT*2) rx_data = DATA[1] ;///数据位第二位
  53. #(COUNT*2) rx_data = DATA[2] ;
  54. #(COUNT*2) rx_data = DATA[3] ;
  55. #(COUNT*2) rx_data = DATA[4] ;
  56. #(COUNT*2) rx_data = DATA[5] ;
  57. #(COUNT*2) rx_data = DATA[6] ;
  58. #(COUNT*2) rx_data = DATA[7] ;
  59. #(COUNT*2) rx_data = 0 ;
  60. /*这一步相当于代替了串口调试工具,串口调试工具根据选择的"偶校验"
  61. 自动在数据位后面生成"0"或者"1",我们这边只能赋值一个数"0"或者"1"
  62. 我选择赋值为0,所以注定了"8'h31""8'hef""8'h10"是通不过的。
  63. */
  64. #(COUNT*2) rx_data = 1 ;
  65. #(COUNT*2) ;//停止位也需要时间
  66. # 80000 ;
  67. end
  68. endtask
  69. TOP TOP_1(
  70. . sys_clk ( sys_clk) ,
  71. . rst_n ( rst_n ) ,
  72. . key ( key ) ,
  73. . rx_data (rx_data ) , //输入串行数据distance
  74. . echo ( echo ) ,
  75. . trig ( trig ) ,
  76. . tx_data ( tx_data)
  77. );
  78. //uart_rx uart_rx_1(
  79. // . sys_clk (sys_clk ) ,
  80. // . rst_n (rst_n ) ,
  81. // . rx_data (rx_data ) , //输入串行数据distance
  82. // . uart_data(uart_data) , // 输出并行数据
  83. // . rx_done (rx_done ) //数据传输完成结束信号
  84. // );
  85. endmodule

问题背景:

我没有认识到rx_data信号只能由电脑产生发送给卡发版,我以为由超声波返回的echo信号计算出的distance也可以作为输入信号让rx接收。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/木道寻08/article/detail/776051
推荐阅读
相关标签
  

闽ICP备14008679号