• FPGA project: uart_rs485


    1. module ctrl(
    2. input wire sys_clk ,
    3. input wire sys_rst_n ,
    4. input wire key_w ,
    5. input wire key_b ,
    6. output wire [7:0] po_data , // 由于w_en 与b_en 使能信号是reg型,虽然po_data是时序逻辑,但是相对于按键按下信号,仍然要延后一个时钟周期。
    7. output reg po_flag // 所以po_data 应该用reg
    8. );
    9. reg w_en ;
    10. reg b_en ;
    11. always @(posedge sys_clk or negedge sys_rst_n) begin
    12. if(~sys_rst_n) begin
    13. w_en <= 1'b0 ;
    14. end else begin
    15. if(key_w == 1'b1) begin
    16. w_en <= ~w_en ;
    17. end else begin
    18. if(key_b == 1'b1) begin
    19. w_en <= 1'b0 ;
    20. end else begin
    21. w_en <= w_en ;
    22. end
    23. end
    24. end
    25. end
    26. // b_en
    27. always @(posedge sys_clk or negedge sys_rst_n) begin
    28. if(~sys_rst_n) begin
    29. b_en <= 1'b0 ;
    30. end else begin
    31. if(key_b == 1'b1) begin
    32. b_en <= ~b_en ;
    33. end else begin
    34. if(key_w == 1'b1) begin
    35. b_en <= 1'b0 ;
    36. end else begin
    37. b_en <= b_en ;
    38. end
    39. end
    40. end
    41. end
    42. // [7:0] po_data ,
    43. assign po_data = {6'd0,w_en,b_en} ;
    44. // po_flag
    45. always @(posedge sys_clk or negedge sys_rst_n) begin
    46. if(~sys_rst_n) begin
    47. po_flag <= 1'b0 ;
    48. end else begin
    49. po_flag <= key_b || key_w ;
    50. end
    51. end
    52. endmodule
    1. `timescale 1ns/1ns
    2. module test_ctrl();
    3. reg sys_clk ;
    4. reg sys_rst_n ;
    5. reg key_w ;
    6. reg key_b ;
    7. wire [7:0] po_data ;
    8. wire po_flag ;
    9. ctrl ctrl_insert(
    10. .sys_clk ( sys_clk ) ,
    11. .sys_rst_n ( sys_rst_n ) ,
    12. .key_w ( key_w ) ,
    13. .key_b ( key_b ) ,
    14. .po_data ( po_data ) ,
    15. .po_flag ( po_flag )
    16. );
    17. parameter CYCLE = 20 ;
    18. initial begin
    19. sys_clk = 1'b1 ;
    20. sys_rst_n <= 1'b0 ;
    21. key_w <= 1'b0 ;
    22. key_b <= 1'b0 ;
    23. #( CYCLE * 10 ) ;
    24. sys_rst_n <= 1'b1 ;
    25. #( 210 ) ;
    26. sys_rst_n <= 1'b0 ;
    27. #( 10 ) ;
    28. #( CYCLE * 10 ) ;
    29. sys_rst_n <= 1'b1 ;
    30. #( CYCLE * 100 ) ;
    31. key_w <= 1'b1 ;
    32. #( CYCLE ) ;
    33. key_w <= 1'b0 ;
    34. #( CYCLE * 500) ;
    35. key_b <= 1'b1 ;
    36. #( CYCLE ) ;
    37. key_b <= 1'b0 ;
    38. #( CYCLE * 500) ;
    39. key_w <= 1'b1 ;
    40. #( CYCLE ) ;
    41. key_w <= 1'b0 ;
    42. #( CYCLE * 500) ;
    43. key_b <= 1'b1 ;
    44. #( CYCLE ) ;
    45. key_b <= 1'b0 ;
    46. #( CYCLE * 500) ;
    47. key_w <= 1'b1 ;
    48. #( CYCLE ) ;
    49. key_w <= 1'b0 ;
    50. #( CYCLE * 500) ;
    51. key_w <= 1'b1 ;
    52. #( CYCLE ) ;
    53. key_w <= 1'b0 ;
    54. #( CYCLE * 500) ;
    55. $stop ;
    56. end
    57. always #( CYCLE / 2 ) sys_clk = ~sys_clk ;
    58. endmodule
    1. module be_ctrl(
    2. input wire sys_clk ,
    3. input wire sys_rst_n ,
    4. // input wire key_w , // 作为被控制板模块的ctrl 一些端口信号用不到的。
    5. // input wire key_b ,
    6. input wire [7:0] pi_data ,
    7. input wire pi_flag ,
    8. input wire [3:0] led_w ,
    9. input wire [3:0] led_b ,
    10. // output wire [7:0] po_data ,
    11. // output wire po_flag
    12. output reg [3:0] led_out // 也可以用组合逻辑
    13. );
    14. reg w_en ;
    15. reg b_en ;
    16. always @(posedge sys_clk or negedge sys_rst_n) begin
    17. if(~sys_rst_n) begin
    18. w_en <= 1'b0 ;
    19. end else begin
    20. if(pi_data[1]) begin
    21. w_en <= ~w_en ;
    22. end else begin
    23. if(pi_data[0]) begin
    24. w_en <= 1'b0 ;
    25. end else begin
    26. w_en <= w_en ;
    27. end
    28. end
    29. end
    30. end
    31. // b_en
    32. always @(posedge sys_clk or negedge sys_rst_n) begin
    33. if(~sys_rst_n) begin
    34. b_en <= 1'b0 ;
    35. end else begin
    36. if(pi_data[0]) begin
    37. b_en <= ~b_en ;
    38. end else begin
    39. if(pi_data[1]) begin
    40. b_en <= 1'b0 ;
    41. end else begin
    42. b_en <= b_en ;
    43. end
    44. end
    45. end
    46. end
    47. // [3:0] led_out
    48. always @(posedge sys_clk or negedge sys_rst_n) begin
    49. if(~sys_rst_n) begin
    50. led_out <= 3'd0 ;
    51. end else begin
    52. if(w_en == 1'b1) begin
    53. led_out <= led_w;
    54. end else begin
    55. if(b_en == 1'b1) begin
    56. led_out <= led_b;
    57. end else begin
    58. led_out <= led_out ;
    59. end
    60. end
    61. end
    62. end
    63. endmodule

    1. `timescale 1ns/1ns
    2. module test_be_ctrl();
    3. reg sys_clk ;
    4. reg sys_rst_n ;
    5. reg [7:0] pi_data_w ;
    6. reg pi_flag_w ;
    7. wire [3:0] led_out ;
    8. // 由例化的模块产生
    9. wire [3:0] led_w_w ;
    10. wire [3:0] led_b_w ;
    11. water_led
    12. #(
    13. .MAX_CNT ( 25'd25_0) // 00_000
    14. )water_led_insert
    15. (
    16. .sys_clk ( sys_clk ) ,
    17. .sys_rst_n ( sys_rst_n ) ,
    18. .led ( led_w_w )
    19. );
    20. breath_led
    21. #(
    22. .CNT_1US ( 5 ) ,
    23. .CNT_1K ( 10 )
    24. )breath_led_insert
    25. (
    26. .sys_clk ( sys_clk ) ,
    27. .sys_rst_n ( sys_rst_n ) ,
    28. .led_out_1 ( led_b_w[0] ) ,
    29. .led_out_2 ( led_b_w[1] ) ,
    30. .led_out_3 ( led_b_w[2] ) ,
    31. .led_out_4 ( led_b_w[3] )
    32. );
    33. be_ctrl be_ctrl_insert(
    34. .sys_clk ( sys_clk ) ,
    35. .sys_rst_n ( sys_rst_n ) ,
    36. .pi_data ( pi_data_w ) ,
    37. .pi_flag ( pi_flag_w ) ,
    38. .led_w ( led_w_w ) ,
    39. .led_b ( led_b_w ) ,
    40. .led_out ( led_out )
    41. );
    42. parameter CYCLE = 20 ;
    43. initial begin
    44. sys_clk = 1'b1 ;
    45. sys_rst_n <= 1'b0 ;
    46. pi_data_w <= 8'd0 ;
    47. pi_flag_w <= 1'b0 ;
    48. #( CYCLE * 10 ) ;
    49. sys_rst_n <= 1'b1 ;
    50. #( 210 ) ;
    51. sys_rst_n <= 1'b0 ;
    52. #( 10 ) ;
    53. #( CYCLE * 10 ) ;
    54. sys_rst_n <= 1'b1 ; // 复位释放。
    55. #( 50 * CYCLE) ;
    56. pi_data_w <= 8'd1 ; // 呼吸灯控制按键按下
    57. pi_flag_w <= 1'b1 ;
    58. #( CYCLE ) ;
    59. pi_data_w <= 8'd0 ;
    60. pi_flag_w <= 1'b0 ;
    61. #( CYCLE * 500 ) ;
    62. pi_data_w <= 8'd1 ; // 呼吸灯控制按键按下
    63. pi_flag_w <= 1'b1 ;
    64. #( CYCLE ) ;
    65. pi_data_w <= 8'd0 ;
    66. pi_flag_w <= 1'b0 ;
    67. #( CYCLE * 500 ) ;
    68. pi_data_w <= 8'd2 ; // 流水灯控制按键按下
    69. pi_flag_w <= 1'b1 ;
    70. #( CYCLE ) ;
    71. pi_data_w <= 8'd0 ;
    72. pi_flag_w <= 1'b0 ;
    73. #( CYCLE * 500 ) ;
    74. pi_data_w <= 8'd1 ; // 呼吸灯控制按键按下
    75. pi_flag_w <= 1'b1 ;
    76. #( CYCLE ) ;
    77. pi_data_w <= 8'd0 ;
    78. pi_flag_w <= 1'b0 ;
    79. #( CYCLE * 500 ) ;
    80. $stop ;
    81. end
    82. always #( CYCLE / 2 ) sys_clk = ~sys_clk ;
    83. endmodule
    84. 流水灯模块与呼吸灯模块是之前工程里的。
    1. module rs_485_tx (
    2. input wire sys_clk ,
    3. input wire sys_rst_n ,
    4. input wire [7:0] pi_data ,
    5. input wire pi_flag ,
    6. output reg tx ,
    7. output reg re
    8. );
    9. // reg signal define
    10. reg pi_flag_r ;
    11. reg [7:0] pi_data_r ;
    12. reg work_en ;
    13. reg [12:00] baud_cnt ;
    14. reg bit_flag ;
    15. reg [ 3: 0] bit_cnt ;
    16. // pi_flag_r ;
    17. always @(posedge sys_clk or negedge sys_rst_n) begin
    18. if(~sys_rst_n) begin
    19. pi_flag_r <= 1'b0 ;
    20. end else begin
    21. if(pi_flag == 1'b1) begin
    22. pi_flag_r <= 1'b1 ;
    23. end else begin
    24. pi_flag_r <= 1'b0 ;
    25. end
    26. end
    27. end
    28. // [7:0] pi_data_r ;
    29. always @(posedge sys_clk or negedge sys_rst_n) begin
    30. if(~sys_rst_n) begin
    31. pi_data_r <= 1'b0 ;
    32. end else begin
    33. if(pi_flag == 1'b1) begin
    34. pi_data_r <= pi_data ;
    35. end else begin
    36. pi_data_r <= pi_data_r ;
    37. end
    38. end
    39. end
    40. // work_en ;
    41. always @(posedge sys_clk or negedge sys_rst_n) begin
    42. if(~sys_rst_n) begin
    43. work_en <= 1'b0 ;
    44. end else begin
    45. if(baud_cnt == 13'd5027 && bit_cnt == 4'd9) begin
    46. work_en <= 1'b0 ;
    47. end else begin
    48. if(pi_flag_r == 1'b1) begin
    49. work_en <= 1'b1 ;
    50. end else begin
    51. work_en <= work_en ;
    52. end
    53. end
    54. end
    55. end
    56. // [12:00] baud_cnt ;
    57. always @(posedge sys_clk or negedge sys_rst_n) begin
    58. if(~sys_rst_n) begin
    59. baud_cnt <= 13'd0 ;
    60. end else begin
    61. if(work_en == 1'b1 && baud_cnt == 13'd5027 || work_en == 1'b0) begin
    62. baud_cnt <= 13'd0 ;
    63. end else begin
    64. if(work_en == 1'b1) begin
    65. baud_cnt <= baud_cnt + 1'b1 ;
    66. end else begin
    67. baud_cnt <= 13'd0 ;
    68. end
    69. end
    70. end
    71. end
    72. // bit_flag ;
    73. always @(posedge sys_clk or negedge sys_rst_n) begin
    74. if(~sys_rst_n) begin
    75. bit_flag <= 1'b0 ;
    76. end else begin
    77. if(baud_cnt == 13'd5026) begin // 野火上是等于 1 .
    78. bit_flag <= 1'b1 ;
    79. end else begin
    80. bit_flag <= 1'b0 ;
    81. end
    82. end
    83. end
    84. // [ 3: 0] bit_cnt ;
    85. always @(posedge sys_clk or negedge sys_rst_n) begin
    86. if(~sys_rst_n) begin
    87. bit_cnt <= 4'd0 ;
    88. end else begin
    89. if(bit_flag == 1'b1 && bit_cnt == 4'd9 || work_en == 1'b0) begin
    90. bit_cnt <= 4'd0 ;
    91. end else begin
    92. if(bit_flag == 1'b1) begin
    93. bit_cnt <= bit_cnt + 1'b1 ;
    94. end else begin
    95. bit_cnt <= bit_cnt ;
    96. end
    97. end
    98. end
    99. end
    100. // output signal
    101. // tx
    102. always @(posedge sys_clk or negedge sys_rst_n) begin
    103. if(~sys_rst_n) begin
    104. tx <= 1'b1 ;
    105. end else begin
    106. if(work_en == 1'b1 && bit_cnt == 4'd0) begin
    107. tx <= 1'b0 ;
    108. end else begin
    109. if(work_en == 1'b1 && bit_cnt == 4'd9 || work_en == 1'b0) begin
    110. tx <= 1'b1 ;
    111. end else begin
    112. tx <= pi_data_r[bit_cnt - 1'b1] ;
    113. end
    114. end
    115. end
    116. end
    117. // re
    118. always @(posedge sys_clk or negedge sys_rst_n) begin
    119. if(~sys_rst_n) begin
    120. re <= 1'b0 ;
    121. end else begin
    122. re <= work_en ;
    123. end
    124. end
    125. endmodule
    1. `timescale 1ns/1ns
    2. module test_rs_485_tx();
    3. reg sys_clk ;
    4. reg sys_rst_n ;
    5. reg [7:0] pi_data ;
    6. reg pi_flag ;
    7. wire tx ;
    8. wire re ;
    9. rs_485_tx rs_485_tx_insert(
    10. .sys_clk ( sys_clk ) ,
    11. .sys_rst_n ( sys_rst_n ) ,
    12. .pi_data ( pi_data ) ,
    13. .pi_flag ( pi_flag ) ,
    14. .tx ( tx ) ,
    15. .re ( re )
    16. );
    17. parameter CYCLE = 20 ;
    18. initial begin
    19. sys_clk = 1'b1 ;
    20. sys_rst_n <= 1'b0 ;
    21. pi_data <= 8'd0 ;
    22. pi_flag <= 1'b0 ;
    23. #( CYCLE * 10 ) ;
    24. sys_rst_n <= 1'b1 ;
    25. #( 210 ) ;
    26. sys_rst_n <= 1'b0 ;
    27. #( 10 ) ;
    28. #( CYCLE * 10 ) ;
    29. sys_rst_n <= 1'b1 ; // 复位释放。
    30. #( 50 * CYCLE) ;
    31. pi_data <= 8'd1 ; // 呼吸灯控制按键按下
    32. pi_flag <= 1'b1 ;
    33. #( CYCLE ) ;
    34. pi_data <= 8'd0 ;
    35. pi_flag <= 1'b0 ;
    36. #( CYCLE * 96100 ) ;
    37. pi_data <= 8'd1 ; // 呼吸灯控制按键按下
    38. pi_flag <= 1'b1 ;
    39. #( CYCLE ) ;
    40. pi_data <= 8'd0 ;
    41. pi_flag <= 1'b0 ;
    42. #( CYCLE * 96100 ) ;
    43. pi_data <= 8'd2 ; // 流水灯控制按键按下
    44. pi_flag <= 1'b1 ;
    45. #( CYCLE ) ;
    46. pi_data <= 8'd0 ;
    47. pi_flag <= 1'b0 ;
    48. #( CYCLE * 96100 ) ;
    49. pi_data <= 8'd1 ; // 呼吸灯控制按键按下
    50. pi_flag <= 1'b1 ;
    51. #( CYCLE ) ;
    52. pi_data <= 8'd0 ;
    53. pi_flag <= 1'b0 ;
    54. #( CYCLE * 96100 ) ;
    55. $stop ;
    56. end
    57. always #( CYCLE / 2 ) sys_clk = ~sys_clk ;
    58. endmodule

     

  • 相关阅读:
    vmware16安装macOS
    python基于PHP+MySQL的投资理财网站的设计与实现
    谷粒学苑 —— 7、课程管理:课程发布页面2 —— 课程大纲
    32位单片机越来越多人用?简单跟上科技趋势
    Java 设计模式——外观模式
    ubuntu-hadoop伪分布
    RabbitMQ的安装
    枫叶时代影视:联想工作站助力中国影视行业发展
    Linux-正则三剑客
    基于Spring Boot的房屋租赁系统
  • 原文地址:https://blog.csdn.net/Meng_long2022/article/details/132889357