• FPGA project : fifo_sum


    实验目标:

    col(列) = 4 ;line(行) = 5。相邻三行,按列求和。输出新的数据流

    实现方法:

    通过rs232通信协议,输入数据流。第一行存进fifo1,第二行存进fifo2.当输入第三行第一个数据的时候,从fifo1和ffo2中读数据,并于当前输入数据相加,并输出结果与标志信号。

    设计中注意的事情:

    1,这个fifo,读写信号同时拉高,我进行功能仿真时,它是写满后,同时拉高,写不进数据。我放一张仿真图:

     所以我设计的时序图,fifo1和fifo2都是先读出数据,然后再写数据。

    2,数据与标志信号在设计的时候,要注意时序上的对齐。这种小工程,仿真时,时序没问题没问题,上板子后出错,我觉得应该不是时序上的问题(亚稳态)。应该是代码的问题。

    因为我在调用之前的uart_rs232模块,修改了参数,结果上板子出错了。就是这个uart模块的问题。苦恼了很久,一开始以为是fifo_sum的问题。我的写法和野火教程里是不完全一样的。

    3,大于2的数字,尽量用参数parameter定义。在这方面,吃了大亏(uart模块又花了一个晚上重新写的)。

    模块框图:

    时序图:

     

    代码: 

    1. module uart_rx(
    2. input wire sys_clk ,
    3. input wire sys_rst_n ,
    4. input wire rx ,
    5. output reg po_flag ,
    6. output reg [7:0] po_data
    7. );
    8. // parameter
    9. parameter CLK_UART = 50_000_000 ,
    10. BPS = 9600 ;
    11. localparam MAX_BPS = CLK_UART / BPS ;
    12. // reg signal define
    13. reg rx_reg1 ;
    14. reg rx_reg2 ;
    15. reg rx_reg3 ;
    16. wire start ;
    17. reg work_en ;
    18. reg [12:0] cnt_bps ;
    19. reg [ 3:0] cnt_bit ;
    20. reg bit_flag;
    21. reg [ 7:0] rx_data ; // 对rx_reg3采样,把串行数据转化为8bit并行数据。
    22. reg rx_flag ; // 转化完拉高一个时钟周期。
    23. /********************************************************/
    24. // reg rx_reg1 ;
    25. // reg rx_reg2 ;
    26. // reg rx_reg3 ;
    27. always @(posedge sys_clk or negedge sys_rst_n) begin
    28. if(~sys_rst_n) begin
    29. rx_reg1 <= 1'b1 ; // 由于空闲状态,rx是高电平。
    30. rx_reg2 <= 1'b1 ;
    31. rx_reg3 <= 1'b1 ;
    32. end else begin
    33. rx_reg1 <= rx ;
    34. rx_reg2 <= rx_reg1 ;
    35. rx_reg3 <= rx_reg2 ;
    36. end
    37. end
    38. // reg start ; // 检测到下降沿,拉高一个sys_clk.
    39. assign start = ~rx_reg2 && rx_reg3 ;
    40. // reg work_en ;
    41. always @(posedge sys_clk or negedge sys_rst_n) begin
    42. if(~sys_rst_n)
    43. work_en <= 1'b0 ;
    44. else if((cnt_bit == 4'd0 && start) || (cnt_bit == 4'd8 && bit_flag)) // 正常来讲,这个两个条件应该是交替出现的。
    45. work_en <= ~work_en ;
    46. else
    47. work_en <= work_en ;
    48. end
    49. // reg [12:0] cnt_bps ;
    50. always @(posedge sys_clk or negedge sys_rst_n) begin
    51. if(~sys_rst_n)
    52. cnt_bps <= 13'd0 ;
    53. else if(work_en && cnt_bps == (MAX_BPS - 1))
    54. cnt_bps <= 13'd0 ;
    55. else if(work_en)
    56. cnt_bps <= cnt_bps + 1'b1 ;
    57. else
    58. cnt_bps <= 13'd0 ;
    59. end
    60. // reg bit_flag;
    61. always @(posedge sys_clk or negedge sys_rst_n) begin
    62. if(~sys_rst_n)
    63. bit_flag <= 1'b0 ;
    64. else if(cnt_bps == MAX_BPS - 1) // 波特率计数器的最大值
    65. bit_flag <= 1'b1 ;
    66. else
    67. bit_flag <= 1'b0 ;
    68. end
    69. // reg [ 3:0] cnt_bit ;
    70. always @(posedge sys_clk or negedge sys_rst_n) begin
    71. if(~sys_rst_n)
    72. cnt_bit <= 4'd0 ;
    73. else if(bit_flag && cnt_bit == 4'd8)
    74. cnt_bit <= 4'd0 ;
    75. else if(bit_flag)
    76. cnt_bit <= cnt_bit + 1'b1 ;
    77. else
    78. cnt_bit <= cnt_bit ;
    79. end
    80. // reg [ 7:0] rx_data ; // 对rx_reg3采样,把串行数据转化为8bit并行数据。
    81. // always @(posedge sys_clk or negedge sys_rst_n) begin
    82. // if(~sys_rst_n)
    83. // rx_data <= 8'd0 ;
    84. // else if(work_en == 1'b1 && (cnt_bit >= 1) && (cnt_bps == MAX_BPS/2))
    85. // rx_data <= {rx_reg3,rx_data[7:1]} ; // 由于rx是先发低位,所以rx_reg3放在前面.右移。
    86. // else if(work_en == 1'b1 && (cnt_bit >= 1))
    87. // rx_data <= rx_data ;
    88. // else
    89. // rx_data <= rx_data ;
    90. // end
    91. always @(posedge sys_clk or negedge sys_rst_n) begin
    92. if(~sys_rst_n)
    93. rx_data <= 8'd0 ;
    94. else if(work_en == 1'b1 && (cnt_bit >= 1)) begin
    95. if(cnt_bps == MAX_BPS/2)
    96. rx_data <= {rx_reg3,rx_data[7:1]} ;
    97. else
    98. rx_data <= rx_data ;
    99. end else begin
    100. rx_data <= rx_data ;
    101. end
    102. end
    103. // reg rx_flag ; // 转化完拉高一个时钟周期。
    104. always @(posedge sys_clk or negedge sys_rst_n) begin
    105. if(~sys_rst_n)
    106. rx_flag <= 1'b0 ;
    107. else if(cnt_bit == 4'd8 && bit_flag)
    108. rx_flag <= 1'b1 ;
    109. else
    110. rx_flag <= 1'b0 ;
    111. end
    112. /***********************************************************/
    113. // output signal
    114. // po_falg ,
    115. always @(posedge sys_clk or negedge sys_rst_n) begin
    116. if(~sys_rst_n)
    117. po_flag <= 1'b0 ;
    118. else if(rx_flag) // 可以理解为打一拍子或者使用时序逻辑采样
    119. po_flag <= 1'b1 ;
    120. else
    121. po_flag <= 1'b0 ;
    122. end
    123. // po_data
    124. always @(posedge sys_clk or negedge sys_rst_n) begin
    125. if(~sys_rst_n)
    126. po_data <= 8'd0 ;
    127. else if(rx_flag) // 可以理解为打一拍子或者使用时序逻辑采样
    128. po_data <= rx_data ;
    129. else
    130. po_data <= po_data ; // 可以归零,也可以保持。
    131. end
    132. endmodule
    1. module uart_tx (
    2. input wire sys_clk ,
    3. input wire sys_rst_n ,
    4. input wire pi_flag ,
    5. input wire [7:0] pi_data ,
    6. output reg tx
    7. );
    8. // parameter
    9. parameter SUB_1K = 1000 , // 缩减第十位,空闲位的时间。
    10. CLK_UART = 50_000_000 ,
    11. BPS = 9600 ;
    12. localparam MAX_BPS = CLK_UART / BPS ;
    13. // reg signal define
    14. reg pi_flag_reg1 ;
    15. reg [ 7:0] pi_data_reg1 ;
    16. reg work_en ;
    17. reg [12:0] cnt_bps ;
    18. reg [ 3:0] cnt_bit ;
    19. reg bit_flag ;
    20. /**********************************************/
    21. // reg pi_flag_reg1 ;
    22. always @(posedge sys_clk or negedge sys_rst_n) begin
    23. if(~sys_rst_n)
    24. pi_flag_reg1 <= 1'b0 ;
    25. else
    26. pi_flag_reg1 <= pi_flag ;
    27. end
    28. // reg pi_data_reg1 ;
    29. always @(posedge sys_clk or negedge sys_rst_n) begin
    30. if(~sys_rst_n)
    31. pi_data_reg1 <= 8'd0 ;
    32. else
    33. pi_data_reg1 <= pi_data ;
    34. end
    35. // reg work_en ;
    36. always @(posedge sys_clk or negedge sys_rst_n) begin
    37. if(~sys_rst_n)
    38. work_en <= 1'b0 ;
    39. else if(((cnt_bit == 4'd0) && pi_flag_reg1) || (cnt_bit == 4'd9) && (bit_flag))
    40. work_en <= ~work_en ;
    41. else
    42. work_en <= work_en ;
    43. end
    44. // reg [12:0] cnt_bps ;
    45. always @(posedge sys_clk or negedge sys_rst_n) begin
    46. if(~sys_rst_n)
    47. cnt_bps <= 13'd0 ;
    48. else if(work_en && cnt_bps == MAX_BPS - 1) // 波特率计数器计数到最大值。
    49. cnt_bps <= 13'd0 ;
    50. else if(work_en)
    51. cnt_bps <= cnt_bps + 1'b1 ;
    52. else
    53. cnt_bps <= 13'd0 ;
    54. end
    55. // reg bit_flag ;
    56. always @(posedge sys_clk or negedge sys_rst_n) begin
    57. if(~sys_rst_n)
    58. bit_flag <= 1'b0 ;
    59. else if((work_en && cnt_bps == MAX_BPS - 1) || (work_en && cnt_bps == MAX_BPS - SUB_1K && cnt_bit == 9))
    60. bit_flag <= 1'b1 ;
    61. else
    62. bit_flag <= 1'b0 ;
    63. end
    64. // reg [ 3:0] cnt_bit ;
    65. always @(posedge sys_clk or negedge sys_rst_n) begin
    66. if(~sys_rst_n)
    67. cnt_bit <= 4'd0 ;
    68. else if(work_en && bit_flag && cnt_bit == 4'd9) // 传递完第十位,位计数器要归零。
    69. cnt_bit <= 4'd0 ;
    70. else if(work_en && bit_flag)
    71. cnt_bit <= cnt_bit + 1'b1 ;
    72. else if(work_en)
    73. cnt_bit <= cnt_bit ;
    74. else
    75. cnt_bit <= 4'd0 ;
    76. end
    77. /****************************************/
    78. // output signal
    79. // tx
    80. always @(posedge sys_clk or negedge sys_rst_n) begin
    81. if(~sys_rst_n)
    82. tx <= 1'b1 ;
    83. else if(work_en) begin
    84. case (cnt_bit)
    85. 0 : tx <= 1'b0 ;
    86. 1 : tx <= pi_data_reg1[0] ; // 先发最低位。
    87. 2 : tx <= pi_data_reg1[1] ;
    88. 3 : tx <= pi_data_reg1[2] ;
    89. 4 : tx <= pi_data_reg1[3] ;
    90. 5 : tx <= pi_data_reg1[4] ;
    91. 6 : tx <= pi_data_reg1[5] ;
    92. 7 : tx <= pi_data_reg1[6] ;
    93. 8 : tx <= pi_data_reg1[7] ;
    94. 9 : tx <= 1'b1 ;
    95. default: tx <= 1'b1 ;
    96. endcase
    97. end else begin
    98. tx <= 1'b1 ;
    99. end
    100. end
    101. endmodule
    1. module fifo_sum(
    2. input wire sys_clk ,
    3. input wire sys_rst_n ,
    4. input wire [7:0] data_in ,
    5. input wire data_flag ,
    6. output reg [7:0] po_data ,
    7. output reg po_data_falg
    8. );
    9. // parameter
    10. parameter XLINE_SUM = 3 ,
    11. MAX_LINE = 5 ,
    12. MAX_COL = 4 ;
    13. // reg signal define
    14. reg [7:0] cnt_line ;
    15. reg [7:0] cnt_col ;
    16. reg rdreq_r ; // fifo1 fifo2 公用一个读使能。
    17. reg wrreq1_r ;
    18. reg [7:0] dataF1_in_r ;
    19. reg wrreq2_r ;
    20. reg [7:0] dataF2_in_r ;
    21. reg [7:0] data_in_reg1;
    22. reg [7:0] data_in_reg2;
    23. reg flag_sum_r ;
    24. // 例化连线
    25. wire rdreq ;
    26. wire [7:0] dataF1_in ;
    27. wire wrreq1 ;
    28. wire empty1 ;
    29. wire full1 ;
    30. wire [7:0] dataF1_out ;
    31. wire [2:0] usedw1 ;
    32. wire [7:0] dataF2_in ;
    33. wire wrreq2 ;
    34. wire empty2 ;
    35. wire full2 ;
    36. wire [7:0] dataF2_out ;
    37. wire [2:0] usedw2 ;
    38. /*************************************************************/
    39. // reg [7:0] cnt_line
    40. always @(posedge sys_clk or negedge sys_rst_n) begin
    41. if(~sys_rst_n)
    42. cnt_line <= 8'd0 ;
    43. else if(data_flag && cnt_col == MAX_COL - 1 && cnt_line == MAX_LINE - 1)
    44. cnt_line <= 8'd0 ;
    45. else if(data_flag && cnt_col == MAX_COL - 1)
    46. cnt_line <= cnt_line + 1'b1 ;
    47. else
    48. cnt_line <= cnt_line ;
    49. end
    50. // reg [7:0] cnt_col
    51. always @(posedge sys_clk or negedge sys_rst_n) begin
    52. if(~sys_rst_n)
    53. cnt_col <= 8'd0 ;
    54. else if(data_flag && cnt_col == MAX_COL - 1)
    55. cnt_col <= 8'd0 ;
    56. else if(data_flag)
    57. cnt_col <= cnt_col + 1'b1 ;
    58. else
    59. cnt_col <= cnt_col ;
    60. end
    61. // reg rdreq_r ; // fifo1 fifo2 公用一个读使能。
    62. always @(posedge sys_clk or negedge sys_rst_n) begin
    63. if(~sys_rst_n)
    64. rdreq_r <= 1'b0 ;
    65. else if(cnt_line >= XLINE_SUM - 1)
    66. rdreq_r <= data_flag ;
    67. else
    68. rdreq_r <= 1'b0 ;
    69. end
    70. // reg wrreq1_r ;
    71. always @(posedge sys_clk or negedge sys_rst_n) begin
    72. if(~sys_rst_n)
    73. wrreq1_r <= 1'b0 ;
    74. else if(cnt_line == 0)
    75. wrreq1_r <= data_flag ;
    76. else if((cnt_line == (XLINE_SUM - 1) && cnt_col != 0) || (cnt_line > (XLINE_SUM - 1) && cnt_line <= (MAX_LINE - 2)) || (cnt_line == (MAX_LINE - 1) && cnt_col == 0))
    77. wrreq1_r <= wrreq2_r ;
    78. else
    79. wrreq1_r <= 1'b0 ;
    80. end
    81. // reg [7:0] dataF1_in_r ;
    82. always @(posedge sys_clk or negedge sys_rst_n) begin
    83. if(~sys_rst_n)
    84. dataF1_in_r <= 8'd0 ;
    85. else if(cnt_line == 0)
    86. dataF1_in_r <= data_in ;
    87. else if((cnt_line >= (XLINE_SUM - 1) && cnt_line <= (MAX_LINE - 2)) || (cnt_line == (MAX_LINE - 1) && cnt_col == 0))
    88. dataF1_in_r <= dataF2_out ;
    89. else
    90. dataF1_in_r <= dataF1_in_r ;
    91. end
    92. // reg wrreq2_r ;
    93. always @(posedge sys_clk or negedge sys_rst_n) begin
    94. if(~sys_rst_n)
    95. wrreq2_r <= 1'b0 ;
    96. else if(cnt_line == 1)
    97. wrreq2_r <= data_flag ;
    98. else if((cnt_line >= (XLINE_SUM - 1) && cnt_line <= (MAX_LINE - 2)) || (cnt_line == (MAX_LINE - 1) && cnt_col == 0))
    99. wrreq2_r <= rdreq_r ;
    100. end
    101. // reg [7:0] dataF2_in_r ;
    102. always @(posedge sys_clk or negedge sys_rst_n) begin
    103. if(~sys_rst_n)
    104. dataF2_in_r <= 8'd0 ;
    105. else if(cnt_line == 1)
    106. dataF2_in_r <= data_in ;
    107. else if((cnt_line >= (XLINE_SUM - 1) && cnt_line <= (MAX_LINE - 2)) || (cnt_line == (MAX_LINE - 1) && cnt_col == 0))
    108. dataF2_in_r <= data_in_reg1 ;
    109. else
    110. dataF2_in_r <= dataF2_in_r ;
    111. end
    112. // reg flag_sum_r ;
    113. always @(posedge sys_clk or negedge sys_rst_n) begin
    114. if(~sys_rst_n)
    115. flag_sum_r <= 1'b0 ;
    116. else
    117. flag_sum_r <= rdreq_r ;
    118. end
    119. /**********************************************************/
    120. // reg [7:0] po_data ;
    121. always @(posedge sys_clk or negedge sys_rst_n) begin
    122. if(~sys_rst_n)
    123. po_data <= 8'd0 ;
    124. else if(flag_sum_r)
    125. po_data <= dataF1_out + dataF2_out + data_in_reg2 ;
    126. else
    127. po_data <= po_data ;
    128. end
    129. // reg po_data_falg ;
    130. always @(posedge sys_clk or negedge sys_rst_n) begin
    131. if(~sys_rst_n)
    132. po_data_falg <= 1'b0 ;
    133. else if(flag_sum_r)
    134. po_data_falg <=1'b1 ;
    135. else
    136. po_data_falg <= 1'b0 ;
    137. end
    138. // reg [7:0] data_in_reg1;
    139. // reg [7:0] data_in_reg2;
    140. always @(posedge sys_clk or negedge sys_rst_n) begin
    141. if(~sys_rst_n) begin
    142. data_in_reg1 <= 8'd0 ;
    143. data_in_reg2 <= 8'd0 ;
    144. end else begin
    145. data_in_reg1 <= data_in ;
    146. data_in_reg2 <= data_in_reg1 ;
    147. end
    148. end
    149. /*************************************************************/
    150. assign dataF1_in = dataF1_in_r ;
    151. assign wrreq1 = wrreq1_r ;
    152. assign rdreq = rdreq_r ;
    153. assign dataF2_in = dataF2_in_r ;
    154. assign wrreq2 = wrreq2_r ;
    155. fifo_8x8 fifo_8x8_inst1( // 我测试了一下这个fifo 写满了之后读写信号同时拉高,要写的数据不会被写进去。除非有余量才能同时拉高,并且写入数据。
    156. .clock ( sys_clk ) ,
    157. .data ( dataF1_in ) ,
    158. .rdreq ( rdreq ) ,
    159. .wrreq ( wrreq1 ) ,
    160. .empty ( empty1 ) ,
    161. .full ( full1 ) ,
    162. .q ( dataF1_out ) ,
    163. .usedw ( usedw1 )
    164. );
    165. fifo_8x8 fifo_8x8_inst2(
    166. .clock ( sys_clk ) ,
    167. .data ( dataF2_in ) ,
    168. .rdreq ( rdreq ) ,
    169. .wrreq ( wrreq2 ) ,
    170. .empty ( empty2 ) ,
    171. .full ( full2 ) ,
    172. .q ( dataF2_out ) ,
    173. .usedw ( usedw2 )
    174. );
    175. endmodule
    1. module top(
    2. input wire sys_clk ,
    3. input wire sys_rst_n ,
    4. input wire rx ,
    5. output wire tx
    6. );
    7. // 例化间连线
    8. wire po_flag ;
    9. wire [7:0] po_data ;
    10. wire sum_flag ;
    11. wire [7:0] sum_data ;
    12. uart_rx uart_rx_inst(
    13. .sys_clk ( sys_clk ) ,
    14. .sys_rst_n ( sys_rst_n ) ,
    15. .rx ( rx ) ,
    16. .po_flag ( po_flag ) ,
    17. .po_data ( po_data )
    18. );
    19. fifo_sum fifo_sum_inst(
    20. .sys_clk ( sys_clk ) ,
    21. .sys_rst_n ( sys_rst_n ) ,
    22. .data_in ( po_data ) ,
    23. .data_flag ( po_flag ) ,
    24. .po_data ( sum_data ) ,
    25. .po_data_falg ( sum_flag )
    26. );
    27. uart_tx uart_tx_inst(
    28. .sys_clk ( sys_clk ) ,
    29. .sys_rst_n ( sys_rst_n ) ,
    30. .pi_flag ( sum_flag ) ,
    31. .pi_data ( sum_data ) ,
    32. .tx ( tx )
    33. );
    34. endmodule

    1. `timescale 1ns/1ns
    2. module test_top();
    3. reg sys_clk ;
    4. reg sys_rst_n ;
    5. reg rx ;
    6. wire tx ;
    7. // Instantiation
    8. top top_inst(
    9. .sys_clk ( sys_clk ) ,
    10. .sys_rst_n ( sys_rst_n ) ,
    11. .rx ( rx ) ,
    12. .tx ( tx )
    13. );
    14. parameter CYCLE = 20 ;
    15. defparam top_inst.uart_rx_inst.CLK_UART = 50_000_0 ;
    16. defparam top_inst.uart_tx_inst.CLK_UART = 50_000_0 ;
    17. defparam top_inst.uart_tx_inst.SUB_1K = 10 ;
    18. task rx_bit ;
    19. input [7:0] data ;
    20. integer i ;
    21. for (i = 0;i <= 9 ;i = i + 1 ) begin
    22. case (i)
    23. 0: rx <= 1'b0 ;
    24. 1: rx <= data[i - 1];
    25. 2: rx <= data[i - 1];
    26. 3: rx <= data[i - 1];
    27. 4: rx <= data[i - 1];
    28. 5: rx <= data[i - 1];
    29. 6: rx <= data[i - 1];
    30. 7: rx <= data[i - 1];
    31. 8: rx <= data[i - 1];
    32. 9: rx <= 1'b1 ;
    33. default: rx <= 1'b1 ;
    34. endcase
    35. #(CYCLE * 52) ;
    36. end
    37. endtask
    38. initial begin
    39. sys_clk = 1'b1 ;
    40. sys_rst_n <= 1'b0 ;
    41. rx <= 1'b1 ;
    42. #( CYCLE * 10 ) ;
    43. sys_rst_n <= 1'b1 ;
    44. #( 210 ) ;
    45. sys_rst_n <= 1'b0 ;
    46. #( 10 ) ;
    47. #( CYCLE * 10 ) ;
    48. sys_rst_n <= 1'b1 ;
    49. #( CYCLE * 100 ) ;
    50. rx_bit(8'd1) ;
    51. rx_bit(8'd1) ;
    52. rx_bit(8'd2) ;
    53. rx_bit(8'd2) ;
    54. rx_bit(8'd3) ;
    55. rx_bit(8'd3) ;
    56. rx_bit(8'd4) ;
    57. rx_bit(8'd4) ;
    58. rx_bit(8'd5) ;
    59. rx_bit(8'd5) ;
    60. rx_bit(8'd6) ;
    61. rx_bit(8'd6) ;
    62. rx_bit(8'd7) ;
    63. rx_bit(8'd7) ;
    64. rx_bit(8'd8) ;
    65. rx_bit(8'd8) ;
    66. rx_bit(8'd9) ;
    67. rx_bit(8'd9) ;
    68. rx_bit(8'd1) ;
    69. rx_bit(8'd1) ;
    70. rx_bit(8'd1) ;
    71. rx_bit(8'd1) ;
    72. rx_bit(8'd1) ;
    73. rx_bit(8'd1) ;
    74. rx_bit(8'd2) ;
    75. rx_bit(8'd2) ;
    76. rx_bit(8'd2) ;
    77. rx_bit(8'd2) ;
    78. rx_bit(8'd1) ;
    79. rx_bit(8'd1) ;
    80. rx_bit(8'd1) ;
    81. rx_bit(8'd1) ;
    82. rx_bit(8'd3) ;
    83. rx_bit(8'd3) ;
    84. rx_bit(8'd3) ;
    85. rx_bit(8'd3) ;
    86. rx_bit(8'd3) ;
    87. rx_bit(8'd3) ;
    88. rx_bit(8'd3) ;
    89. rx_bit(8'd3) ;
    90. $stop ;
    91. end
    92. always #( CYCLE / 2 ) sys_clk = ~sys_clk ;
    93. endmodule

     仿真波形:

    忘记截图了。

    上板验证:

  • 相关阅读:
    APP安全测试详解
    supervisor的使用
    outsystems合集系列(二)
    13.LoadRunner内置参数和事务定义
    【THREEJS】如何使用THREEJS展示车辆效果
    【Mysql】——索引的深度理解
    yamot:一款功能强大的基于Web的服务器安全监控工具
    月薪12K,蝶变向新,勇往直前—她通过转行测试实现月薪翻倍~
    智能小车—PWM方式实现小车调速和转向
    VMware workstation 中centos7虚拟机在nat模式下怎么配置网卡,指定我想要的IP并且可以联网
  • 原文地址:https://blog.csdn.net/Meng_long2022/article/details/133623925