• ZYNQ_project:LCD


     

     

    模块框图:

    时序图:

    代码:

    1. /*
    2. // 24'h000000 4324 9Mhz 480*272
    3. // 24'h800000 7084 33Mhz 800*480
    4. // 24'h008080 7016 50Mhz 1024*600
    5. // 24'h000080 4384 33Mhz 800*480
    6. // 24'h800080 1018 70Mhz 1280*800
    7. */
    8. module rd_id(
    9. input wire sys_clk ,
    10. input wire sys_rst_n ,
    11. input wire [23:0] lcd_rgb ,
    12. output reg [15:0] lcd_id
    13. );
    14. reg rd_flag ;
    15. always @(posedge sys_clk or negedge sys_rst_n) begin
    16. if(~sys_rst_n)
    17. rd_flag <= 1'b1 ;
    18. else
    19. rd_flag <= 1'b0 ;
    20. end
    21. always @(posedge sys_clk or negedge sys_rst_n) begin
    22. if(~sys_rst_n)
    23. lcd_id <= 24'd0 ;
    24. else if(rd_flag) begin
    25. case (lcd_rgb)
    26. 24'h000000: lcd_id <= 16'd4324 ;
    27. 24'h800000: lcd_id <= 16'd7084 ;
    28. 24'h008080: lcd_id <= 16'd7016 ;
    29. 24'h000080: lcd_id <= 16'd4384 ;
    30. 24'h800080: lcd_id <= 16'd1018 ;
    31. default : lcd_id <= 16'd1018 ;
    32. endcase
    33. end
    34. end
    35. endmodule
    1. module clk_div(
    2. input wire sys_clk ,
    3. input wire sys_rst_n ,
    4. input wire [15:0] lcd_id ,
    5. output reg clk_lcd ,
    6. output wire rst_n
    7. );
    8. wire clk_9Mhz ;
    9. wire clk_33Mhz ;
    10. wire clk_50Mhz ;
    11. wire clk_70Mhz ;
    12. wire locked ;
    13. assign rst_n = (sys_rst_n && locked) ;
    14. always @(*) begin
    15. case (lcd_id)
    16. 16'd4324: clk_lcd <= clk_9Mhz ;
    17. 16'd7084: clk_lcd <= clk_33Mhz ;
    18. 16'd7016: clk_lcd <= clk_50Mhz ;
    19. 16'd4384: clk_lcd <= clk_33Mhz ;
    20. 16'd1018: clk_lcd <= clk_70Mhz ;
    21. default : clk_lcd <= 1'b0 ;
    22. endcase
    23. end
    24. pll pll_inst(
    25. .clk_in ( sys_clk ) ,
    26. .resetn ( sys_rst_n ) ,
    27. .clk_9Mhz ( clk_9Mhz ) ,
    28. .clk_33Mhz ( clk_33Mhz ) ,
    29. .clk_50Mhz ( clk_50Mhz ) ,
    30. .clk_70Mhz ( clk_70Mhz ) ,
    31. .locked ( locked )
    32. );
    33. endmodule
    1. // 根据传进来的有效图像坐标信息,产生有效的像素数据。
    2. module lcd_display (
    3. input wire sys_clk ,
    4. input wire sys_rst_n ,
    5. input wire [10:0] axi_x ,
    6. input wire [10:0] axi_y ,
    7. input wire [10:0] H_SYNC ,
    8. input wire [10:0] H_BACK ,
    9. input wire [10:0] H_DISP ,
    10. input wire [10:0] V_SYNC ,
    11. input wire [10:0] V_BACK ,
    12. input wire [10:0] V_DISP ,
    13. output reg [23:0] pix_data
    14. );
    15. localparam BLACK = 24'h000000 , // 黑色
    16. WHITE = 24'hFFFFFF , // 白色
    17. RosyBrown = 24'hBC8F8F , // 玫瑰褐
    18. RED = 24'hFF0000 , // 红色
    19. APRICOT = 24'hE69966 , // 杏黄色
    20. VIOLET = 24'h8B00FF , // 紫罗兰色
    21. LINEN = 24'hFAF0E6 , // 亚麻色
    22. KHAKI = 24'h996B1F , // 卡其色
    23. PEACH = 24'hFFE5B4 , // 桃色
    24. GOLDEN = 24'hFFD700 , // 金色
    25. SkyBule = 24'h87CEEB ; // 天空蓝
    26. always @(posedge sys_clk or negedge sys_rst_n) begin
    27. if(~sys_rst_n)
    28. pix_data <= BLACK ;
    29. else if((axi_y >= V_SYNC + V_BACK) && (axi_y <= V_SYNC + V_BACK + V_DISP - 1)) begin// 在场同步有效区间内
    30. if((axi_x >= H_SYNC + H_BACK) && (axi_x <= H_SYNC + H_BACK + H_DISP/10 - 1))
    31. pix_data <= WHITE ;
    32. else
    33. if((axi_x >= H_SYNC + H_BACK + H_DISP/10) && (axi_x <= H_SYNC + H_BACK + (H_DISP/10)*2 - 1))
    34. pix_data <= BLACK ;
    35. else
    36. if((axi_x >= H_SYNC + H_BACK + (H_DISP/10)*2) && (axi_x <= H_SYNC + H_BACK + (H_DISP/10)*3 - 1))
    37. pix_data <= RosyBrown ;
    38. else
    39. if((axi_x >= H_SYNC + H_BACK + (H_DISP/10)*3) && (axi_x <= H_SYNC + H_BACK + (H_DISP/10)*4 - 1))
    40. pix_data <= APRICOT ;
    41. else
    42. if((axi_x >= H_SYNC + H_BACK + (H_DISP/10)*4) && (axi_x <= H_SYNC + H_BACK + (H_DISP/10)*5 - 1))
    43. pix_data <= RED ;
    44. else
    45. if((axi_x >= H_SYNC + H_BACK + (H_DISP/10)*5) && (axi_x <= H_SYNC + H_BACK + (H_DISP/10)*6 - 1))
    46. pix_data <= VIOLET ;
    47. else
    48. if((axi_x >= H_SYNC + H_BACK + (H_DISP/10)*6) && (axi_x <= H_SYNC + H_BACK + (H_DISP/10)*7 - 1))
    49. pix_data <= KHAKI ;
    50. else
    51. if((axi_x >= H_SYNC + H_BACK + (H_DISP/10)*7) && (axi_x <= H_SYNC + H_BACK + (H_DISP/10)*8 - 1))
    52. pix_data <= PEACH ;
    53. else
    54. if((axi_x >= H_SYNC + H_BACK + (H_DISP/10)*8) && (axi_x <= H_SYNC + H_BACK + (H_DISP/10)*9 - 1))
    55. pix_data <= GOLDEN ;
    56. else
    57. if((axi_x >= H_SYNC + H_BACK + (H_DISP/10)*9) && (axi_x <= H_SYNC + H_BACK + (H_DISP/10)*10 - 1))
    58. pix_data <= SkyBule ;
    59. else
    60. pix_data <= BLACK ;
    61. end
    62. else
    63. pix_data <= BLACK ;
    64. end
    65. endmodule
    1. // 接口模块,产生接口时序。又名驱动模块。
    2. // 产生像素信息,有效信号。其余信号直接赋值1
    3. module lcd_driver (
    4. input wire sys_clk ,
    5. input wire sys_rst_n ,
    6. input wire [23:0] pix_data ,
    7. input wire [15:0] lcd_id ,
    8. output wire [10:0] H_SYNCtoDIS ,
    9. output wire [10:0] H_BACKtoDIS ,
    10. output wire [10:0] H_DISPtoDIS ,
    11. output wire [10:0] V_SYNCtoDIS ,
    12. output wire [10:0] V_BACKtoDIS ,
    13. output wire [10:0] V_DISPtoDIS ,
    14. output reg lcd_de ,
    15. output wire [23:0] lcd_rgb_out ,
    16. output wire lcd_bl ,
    17. output wire lcd_rstn ,
    18. output wire lcd_hsync ,
    19. output wire lcd_vsync ,
    20. output wire lcd_clk ,
    21. output wire [10:0] axi_x ,
    22. output wire [10:0] axi_y
    23. );
    24. // localparam
    25. // 4.3' 480*272
    26. localparam H_SYNC_4342 = 11'd41 ,
    27. H_BACK_4342 = 11'd2 ,
    28. H_DISP_4342 = 11'd480 ,
    29. H_FRONT_4342 = 11'd2 ,
    30. H_TOTAL_4342 = 11'd525 ,
    31. V_SYNC_4342 = 11'd10 ,
    32. V_BACK_4342 = 11'd2 ,
    33. V_DISP_4342 = 11'd272 ,
    34. V_FRONT_4342 = 11'd2 ,
    35. V_TOTAL_4342 = 11'd286 ,
    36. // 7' 800*480
    37. H_SYNC_7084 = 11'd128 ,
    38. H_BACK_7084 = 11'd88 ,
    39. H_DISP_7084 = 11'd800 ,
    40. H_FRONT_7084 = 11'd40 ,
    41. H_TOTAL_7084 = 11'd1056 ,
    42. V_SYNC_7084 = 11'd2 ,
    43. V_BACK_7084 = 11'd33 ,
    44. V_DISP_7084 = 11'd480 ,
    45. V_FRONT_7084 = 11'd10 ,
    46. V_TOTAL_7084 = 11'd525 ,
    47. // 7' 1024*600
    48. H_SYNC_7016 = 11'd20 ,
    49. H_BACK_7016 = 11'd140 ,
    50. H_DISP_7016 = 11'd1024 ,
    51. H_FRONT_7016 = 11'd160 ,
    52. H_TOTAL_7016 = 11'd1344 ,
    53. V_SYNC_7016 = 11'd3 ,
    54. V_BACK_7016 = 11'd20 ,
    55. V_DISP_7016 = 11'd600 ,
    56. V_FRONT_7016 = 11'd12 ,
    57. V_TOTAL_7016 = 11'd635 ,
    58. // 10.1' 1280*800
    59. H_SYNC_1018 = 11'd10 ,
    60. H_BACK_1018 = 11'd80 ,
    61. H_DISP_1018 = 11'd1280 ,
    62. H_FRONT_1018 = 11'd70 ,
    63. H_TOTAL_1018 = 11'd1440 ,
    64. V_SYNC_1018 = 11'd3 ,
    65. V_BACK_1018 = 11'd10 ,
    66. V_DISP_1018 = 11'd800 ,
    67. V_FRONT_1018 = 11'd10 ,
    68. V_TOTAL_1018 = 11'd823 ,
    69. // 4.3' 800*480
    70. H_SYNC_4384 = 11'd128 ,
    71. H_BACK_4384 = 11'd88 ,
    72. H_DISP_4384 = 11'd800 ,
    73. H_FRONT_4384 = 11'd40 ,
    74. H_TOTAL_4384 = 11'd1056 ,
    75. V_SYNC_4384 = 11'd2 ,
    76. V_BACK_4384 = 11'd33 ,
    77. V_DISP_4384 = 11'd480 ,
    78. V_FRONT_4384 = 11'd10 ,
    79. V_TOTAL_4384 = 11'd525 ;
    80. // 不同分辨率时序参数不同
    81. reg [10:0] H_SYNC ;
    82. reg [10:0] H_BACK ;
    83. reg [10:0] H_DISP ;
    84. reg [10:0] H_FRONT ;
    85. reg [10:0] H_TOTAL ;
    86. reg [10:0] V_SYNC ;
    87. reg [10:0] V_BACK ;
    88. reg [10:0] V_DISP ;
    89. reg [10:0] V_FRONT ;
    90. reg [10:0] V_TOTAL ;
    91. // reg signal define
    92. reg [10:0] cnt_row ; // 行计数器,记录一行中的第几列。行计数器归零,说明一行扫描完。
    93. reg [10:0] cnt_col ; // 列计数器,记录一列中的第几行。列计数器归零,说明一帧图像扫描完。
    94. // wire signal define
    95. wire valid_H ; // 行时序有效信号
    96. wire valid_V ; // 列时序有效信号
    97. wire valid_HV; // 图像有效信号,由于lcd_display模块中产生像素数据信息是时序逻辑,所以lcd_de信号要对图像有效信号打1拍。
    98. /******************************************************************************************
    99. ********************************************main code**************************************
    100. *******************************************************************************************/
    101. // 时序参数赋值
    102. always @(*) begin
    103. case(lcd_id)
    104. 16'd4324: begin
    105. H_SYNC = H_SYNC_4342 ;
    106. H_BACK = H_BACK_4342 ;
    107. H_DISP = H_DISP_4342 ;
    108. H_FRONT = H_FRONT_4342 ;
    109. H_TOTAL = H_TOTAL_4342 ;
    110. V_SYNC = V_SYNC_4342 ;
    111. V_BACK = V_BACK_4342 ;
    112. V_DISP = V_DISP_4342 ;
    113. V_FRONT = V_FRONT_4342 ;
    114. V_TOTAL = V_TOTAL_4342 ;
    115. end
    116. 16'd7084: begin
    117. H_SYNC = H_SYNC_7084 ;
    118. H_BACK = H_BACK_7084 ;
    119. H_DISP = H_DISP_7084 ;
    120. H_FRONT = H_FRONT_7084 ;
    121. H_TOTAL = H_TOTAL_7084 ;
    122. V_SYNC = V_SYNC_7084 ;
    123. V_BACK = V_BACK_7084 ;
    124. V_DISP = V_DISP_7084 ;
    125. V_FRONT = V_FRONT_7084 ;
    126. V_TOTAL = V_TOTAL_7084 ;
    127. end
    128. 16'd7016: begin
    129. H_SYNC = H_SYNC_7016 ;
    130. H_BACK = H_BACK_7016 ;
    131. H_DISP = H_DISP_7016 ;
    132. H_FRONT = H_FRONT_7016 ;
    133. H_TOTAL = H_TOTAL_7016 ;
    134. V_SYNC = V_SYNC_7016 ;
    135. V_BACK = V_BACK_7016 ;
    136. V_DISP = V_DISP_7016 ;
    137. V_FRONT = V_FRONT_7016 ;
    138. V_TOTAL = V_TOTAL_7016 ;
    139. end
    140. 16'd4384: begin
    141. H_SYNC = H_SYNC_4384 ;
    142. H_BACK = H_BACK_4384 ;
    143. H_DISP = H_DISP_4384 ;
    144. H_FRONT = H_FRONT_4384 ;
    145. H_TOTAL = H_TOTAL_4384 ;
    146. V_SYNC = V_SYNC_4384 ;
    147. V_BACK = V_BACK_4384 ;
    148. V_DISP = V_DISP_4384 ;
    149. V_FRONT = V_FRONT_4384 ;
    150. V_TOTAL = V_TOTAL_4384 ;
    151. end
    152. 16'd1018: begin
    153. H_SYNC = H_SYNC_1018 ;
    154. H_BACK = H_BACK_1018 ;
    155. H_DISP = H_DISP_1018 ;
    156. H_FRONT = H_FRONT_1018 ;
    157. H_TOTAL = H_TOTAL_1018 ;
    158. V_SYNC = V_SYNC_1018 ;
    159. V_BACK = V_BACK_1018 ;
    160. V_DISP = V_DISP_1018 ;
    161. V_FRONT = V_FRONT_1018 ;
    162. V_TOTAL = V_TOTAL_1018 ;
    163. end
    164. default : begin
    165. H_SYNC = H_SYNC_1018 ;
    166. H_BACK = H_BACK_1018 ;
    167. H_DISP = H_DISP_1018 ;
    168. H_FRONT = H_FRONT_1018 ;
    169. H_TOTAL = H_TOTAL_1018 ;
    170. V_SYNC = V_SYNC_1018 ;
    171. V_BACK = V_BACK_1018 ;
    172. V_DISP = V_DISP_1018 ;
    173. V_FRONT = V_FRONT_1018 ;
    174. V_TOTAL = V_TOTAL_1018 ;
    175. end
    176. endcase
    177. end
    178. // // reg signal define
    179. // reg [10:0] cnt_row ; // 行计数器,记录一行中的第几列。行计数器归零,说明一行扫描完。
    180. always @(posedge sys_clk or negedge sys_rst_n) begin
    181. if(~sys_rst_n)
    182. cnt_row <= 11'd0 ;
    183. else if(cnt_row == (H_TOTAL - 1))
    184. cnt_row <= 11'd0 ;
    185. else
    186. cnt_row <= cnt_row + 1'b1 ;
    187. end
    188. // reg [10:0] cnt_col ; // 列计数器,记录一列中的第几行。列计数器归零,说明一帧图像扫描完。
    189. always @(posedge sys_clk or negedge sys_rst_n) begin
    190. if(~sys_rst_n)
    191. cnt_col <= 11'd0 ;
    192. else if((cnt_col == (V_TOTAL - 1)) && (cnt_row == (H_TOTAL - 1)))
    193. cnt_col <= 11'd0 ;
    194. else if(cnt_row == (H_TOTAL - 1))
    195. cnt_col <= cnt_col + 1'b1 ;
    196. else
    197. cnt_col <= cnt_col ;
    198. end
    199. // // wire signal define
    200. // wire valid_H ; // 行时序有效信号
    201. assign valid_H = ((cnt_row >= H_SYNC + H_BACK) && (cnt_row <= H_SYNC + H_BACK + H_DISP - 1)) ? 1'b1 : 1'b0 ;
    202. // wire valid_V ; // 列时序有效信号
    203. assign valid_V = ((cnt_col >= V_SYNC + V_BACK) && (cnt_col <= V_SYNC + V_BACK + V_DISP - 1)) ? 1'b1 : 1'b0 ;
    204. // wire valid_HV; // 图像有效信号,由于lcd_display模块中产生像素数据信息是时序逻辑,所以lcd_de信号要对图像有效信号打1拍。
    205. assign valid_HV = (valid_H && valid_V) ;
    206. // output wire [10:0] axi_x ,
    207. assign axi_x = (valid_HV) ? cnt_row : 11'd0 ;
    208. // output wire [10:0] axi_y ,
    209. assign axi_y = (valid_HV) ? cnt_col : 11'd0 ;
    210. // output wire [23:0] lcd_rgb_out ,
    211. assign lcd_rgb_out = pix_data ;
    212. // output reg lcd_de ,
    213. always @(posedge sys_clk or negedge sys_rst_n) begin
    214. if(~sys_rst_n)
    215. lcd_de <= 1'b0 ;
    216. else
    217. lcd_de <= valid_HV ;
    218. end
    219. // 本实验没用到的信号,赋值1;
    220. assign lcd_bl = 1'b1 ;
    221. assign lcd_rstn = 1'b1 ;
    222. assign lcd_hsync = 1'b1 ;
    223. assign lcd_vsync = 1'b1 ;
    224. assign lcd_clk = (sys_rst_n == 1'b1) ? sys_clk : 1'b0 ;
    225. // 传给像素数据生成模块的时序参数
    226. assign H_SYNCtoDIS = H_SYNC ;
    227. assign H_BACKtoDIS = H_BACK ;
    228. assign H_DISPtoDIS = H_DISP ;
    229. assign V_SYNCtoDIS = V_SYNC ;
    230. assign V_BACKtoDIS = V_BACK ;
    231. assign V_DISPtoDIS = V_DISP ;
    232. endmodule

    1. module top (
    2. input wire sys_clk ,
    3. input wire sys_rst_n ,
    4. inout wire [23:0] lcd_rgb ,
    5. output wire lcd_de ,
    6. output wire lcd_bl ,
    7. output wire lcd_rstn ,
    8. output wire lcd_hsync ,
    9. output wire lcd_vsync ,
    10. output wire lcd_clk
    11. );
    12. // inout
    13. wire [23:0] lcd_rgb_out ;
    14. wire [23:0] lcd_rgb_in ;
    15. assign lcd_rgb = (lcd_de) ? lcd_rgb_out : 24'dz ;
    16. assign lcd_rgb_in = lcd_rgb ;
    17. // 例化间连线
    18. wire [15:0] lcd_id ;
    19. wire clk_lcd ;
    20. wire rst_n ;
    21. wire [10:0] H_SYNCtoDIS ;
    22. wire [10:0] H_BACKtoDIS ;
    23. wire [10:0] H_DISPtoDIS ;
    24. wire [10:0] V_SYNCtoDIS ;
    25. wire [10:0] V_BACKtoDIS ;
    26. wire [10:0] V_DISPtoDIS ;
    27. wire [10:0] axi_x ;
    28. wire [10:0] axi_y ;
    29. wire [23:0] pix_data ;
    30. rd_id rd_id_inst(
    31. .sys_clk ( sys_clk ) ,
    32. .sys_rst_n ( sys_rst_n ) ,
    33. .lcd_rgb ( lcd_rgb_in ) ,
    34. .lcd_id ( lcd_id )
    35. );
    36. clk_div clk_div_inst(
    37. .sys_clk ( sys_clk ) ,
    38. .sys_rst_n ( sys_rst_n ) ,
    39. .lcd_id ( lcd_id ) ,
    40. .clk_lcd ( clk_lcd ) ,
    41. .rst_n ( rst_n )
    42. );
    43. lcd_driver lcd_driver_inst(
    44. .sys_clk ( clk_lcd ) ,
    45. .sys_rst_n ( rst_n ) ,
    46. .pix_data ( pix_data ) ,
    47. .lcd_id ( lcd_id ) ,
    48. .H_SYNCtoDIS ( H_SYNCtoDIS ) ,
    49. .H_BACKtoDIS ( H_BACKtoDIS ) ,
    50. .H_DISPtoDIS ( H_DISPtoDIS ) ,
    51. .V_SYNCtoDIS ( V_SYNCtoDIS ) ,
    52. .V_BACKtoDIS ( V_BACKtoDIS ) ,
    53. .V_DISPtoDIS ( V_DISPtoDIS ) ,
    54. .lcd_de ( lcd_de ) ,
    55. .lcd_rgb_out ( lcd_rgb_out ) ,
    56. .lcd_bl ( lcd_bl ) ,
    57. .lcd_rstn ( lcd_rstn ) ,
    58. .lcd_hsync ( lcd_hsync ) ,
    59. .lcd_vsync ( lcd_vsync ) ,
    60. .lcd_clk ( lcd_clk ) ,
    61. .axi_x ( axi_x ) ,
    62. .axi_y ( axi_y )
    63. );
    64. lcd_display lcd_display_inst(
    65. .sys_clk ( clk_lcd ) ,
    66. .sys_rst_n ( rst_n ) ,
    67. .axi_x ( axi_x ) ,
    68. .axi_y ( axi_y ) ,
    69. .H_SYNC ( H_SYNCtoDIS ) ,
    70. .H_BACK ( H_BACKtoDIS ) ,
    71. .H_DISP ( H_DISPtoDIS ) ,
    72. .V_SYNC ( V_SYNCtoDIS ) ,
    73. .V_BACK ( V_BACKtoDIS ) ,
    74. .V_DISP ( V_DISPtoDIS ) ,
    75. .pix_data ( pix_data )
    76. );
    77. endmodule

    1. `timescale 1ns/1ns
    2. module test_top();
    3. reg sys_clk ;
    4. reg sys_rst_n ;
    5. wire [23:0] lcd_rgb ;
    6. wire lcd_de ;
    7. wire lcd_bl ;
    8. wire lcd_rstn ;
    9. wire lcd_hsync ;
    10. wire lcd_vsync ;
    11. wire lcd_clk ;
    12. assign lcd_rgb = lcd_de ? {24{1'bz}} : 24'h80;
    13. top top_inst(
    14. .sys_clk ( sys_clk ) ,
    15. .sys_rst_n ( sys_rst_n ) ,
    16. .lcd_rgb ( lcd_rgb ) ,
    17. .lcd_de ( lcd_de ) ,
    18. .lcd_bl ( lcd_bl ) ,
    19. .lcd_rstn ( lcd_rstn ) ,
    20. .lcd_hsync ( lcd_hsync ) ,
    21. .lcd_vsync ( lcd_vsync ) ,
    22. .lcd_clk ( lcd_clk )
    23. );
    24. parameter CYCLE = 20 ;
    25. initial begin
    26. sys_clk = 1'b1 ;
    27. sys_rst_n <= 1'b0 ;
    28. #( CYCLE * 10 ) ;
    29. #2 ;
    30. sys_rst_n <= 1'b1 ;
    31. #( CYCLE * 1000 ) ;
    32. $stop ;
    33. end
    34. always #( CYCLE / 2 ) sys_clk = ~sys_clk ;
    35. endmodule

    仿真:

  • 相关阅读:
    今天就跟你们聊聊缓存穿透吧
    计算机毕业设计(附源码)python装修服务分析系统
    ProcessExtensionsAutoConfiguration
    OS11 - 计数器和警报的配置(2)【Davinci Cfg】
    01_Flutter之下拉刷新和上拉加载
    Spring(18) @Order注解介绍、使用、底层原理
    python——装饰器深入研究(二)
    白银现货K线走势图分析
    A Philosophy of Software Design读书笔记——设计两次&写注释
    Docker基本管理
  • 原文地址:https://blog.csdn.net/Meng_long2022/article/details/134474525