FPGA學習——驅動WS2812光源并進行動態顯示

文章目錄

  • 一、WS2812手冊分析
    • 1.1 WS2812燈源特性及概述
    • 1.2 手冊重點內容分析
      • 1.2.1 產品概述
      • 1.2.2 碼型及24bit數據設計
  • 二、系統設計
    • 2.1 模塊設計
    • 2.2 模塊分析
      • 2.2.1 驅動模塊
      • 2.2.1 數據控制模塊
  • 三、IP核設置及項目源碼
    • 3.1 MIF文件設計
    • 3.2 ROM IP核調用
    • 3.3 FIFO IP核調用
    • 3.4 項目各模塊源碼
  • 四、最終顯示效果
  • 五、總結

一、WS2812手冊分析

1.1 WS2812燈源特性及概述

在這里插入圖片描述

1.2 手冊重點內容分析

1.2.1 產品概述

在這里插入圖片描述
由產品概述可以得到的重要信息有:

  • 該燈源數據協議采用單線歸零碼的通訊方式
  • 一個像素點需要24bit數據才能正常工作(該燈板共有8×8 64個像素點)
  • 復位時間需要至少280us
  • 傳輸數據每經過一個像素點便會被鎖存24bit數據,因此數據會逐級減少
  • 數據發送速度最高為800Kbps

1.2.2 碼型及24bit數據設計

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

由上述手冊截圖可以看出,該光源0碼和1碼占空比并不相同,同時一個碼元持續時間也可以不同,因此在設計碼型時,一個碼元持續時間需要同時滿足0碼和1碼。

數據傳輸方法與前文概述所說一樣,沒經過一個像素點便會被鎖存24bit數據,然后繼續逐級傳輸,同時每一次24bit數據傳輸結束需要經過經過至少280us的復位才能繼續傳輸下一個24bit數據。

同時該光源所需24bit數據結構為GRB順序,在設計時需要將RGB數據進行重新拼接,該拼接過程可以在傳入數據時,也可以在傳出數據時。

二、系統設計

2.1 模塊設計

設計本項目時,建議將模塊劃分為:驅動模塊,控制模塊,以及頂層模塊。

  • 在控制模塊中設計不同數據的輸入
  • 在驅動模塊中設計碼型以及輸入數據的拼接及輸出
  • 頂層模塊僅進行邏輯連線,不建議在頂層模塊進行任何邏輯編寫

2.2 模塊分析

2.2.1 驅動模塊

在驅動模塊中,首先我們主要考慮的是64個24bit數據的傳輸。

  • 由上述分析可知,每24bit數據傳輸間隔中我們需要至少280us的復位,復位結束才能傳輸下一個24bit數據,因此我們可以設計一個狀態機實現數據傳輸與復位的狀態切換。

  • 同時我們可以設計一個ready使能信號,將該信號傳輸給控制模塊,該信號拉高后代表驅動模塊處于空閑狀態,可以進入復位狀態。

  • 同時我們可以在控制模塊設計一個data_vld信號,將該信號輸入驅動模塊,該信號拉高驅動模塊應該立即進入復位狀態,并在復位結束后即刻準備接受數據。

  • 再由手冊的介紹可知,在該模塊我們至少需要四個計數器,分別為:

    • 24bit數據計數器,計數從控制模塊傳來的數據量。
    • 64個像素點計數器,該燈板共有8×8 64個像素點,每個像素點均需要24bit數據。
    • 一個碼元持續時間計數器,由于該光源1碼和0碼要求時間可以不同,因此我們需要取一個能同時滿足0碼和1碼的值作為一個碼元的傳輸時間。博主的一個碼元所需傳輸時間設置為1200ns(既能滿足0碼(220ns-380ns的高電平時間以及580ns-1us的低電平時間)也能滿足1碼高低電平時間(均為580ns-1us))。
    • 復位時間計數器,至少為280us,博主設計為400us。
  • 同時,由于該光源數據格式為GRB,因此我們還需要在驅動模塊對傳入的RGB數據重新進行拼接。

  • 此外,由于時鐘數據采用頻率為50MHz,而該光源發送速率只有800Kbps,傳入數據的速度遠大于傳出數據的速度,因此博主調用了一個FIFO核,用來臨時存儲傳入驅動模塊的數據,避免造成數據丟失。

該模塊狀態機設計如下:

在這里插入圖片描述
其中,end_cnt_rst為復位計數器結束信號,end_cnt_pix為64個像素點計數器結束信號。

2.2.1 數據控制模塊

在該模塊我們所需要的考慮僅為所需數據的存儲以及如何傳入驅動模塊。

  • 為了存儲我們設計好的數據,博主在該模塊調用了一個ROM IP核。
  • 同時博主在該模塊設計了X,Y兩個計數器,計數最大值均為8。將X,Y作為光源像素點的坐標從而確定ROM中所要取得的數據。
  • 為了方便設計并存儲數據,在調用ROM時需要設計MIF文件初始化ROM,在后文博主會將自己設計MIF文件的方式和工具分享給大家。

三、IP核設置及項目源碼

3.1 MIF文件設計

打開系統自帶的畫圖工具,點擊左上角文件,選擇圖像屬性

在這里插入圖片描述

在圖像屬性中設置圖像為 32×8(大家可以根據自己所需自由設計寬度(如果自定義寬度,就需要在ROM核設置的時候進行更改,同時需要在博主的數據控制模塊進行一個小細節的更改,博主會在后文標明),但高度固定因為動態顯示相當于滾動移動寬度,無法移動高度)

在這里插入圖片描述

然后在畫圖中設計自己想要顯示的圖案即可

在這里插入圖片描述

設計完成后點擊右上角文件另存為24位寬BMP文件注意必須為24位寬

在這里插入圖片描述

然后利用格式轉換工具,將該BMP文件轉化為mif文件

在這里插入圖片描述

然后將生成的文件存放在自己創建的quartus prj文件夾下

在這里插入圖片描述

3.2 ROM IP核調用

在quartus IP Catalog中搜索ROM并選擇單端口ROM
在這里插入圖片描述

按照下圖進行設置:

  • 輸出數據設置為24bit寬
  • 深度設置為256,若BMP圖像高度不是博主設置的32,各位需要自行更改所需深度,將其改為:你所設置的寬度×8

在這里插入圖片描述

點擊next,按下圖進行如下設置:

在這里插入圖片描述

  • 將輸出q寄存一拍(勾選則在后續讀使能需要打兩拍,博主個人習慣,可以不選,后續只需打一拍)
  • 勾選異步復位信號
  • 勾選讀使能信號

點擊next按照下圖進行如下設置:
在這里插入圖片描述

  • 點擊Browse選擇前文所設置的MIF文件,對ROM進行初始化

一路next至總結界面:

在這里插入圖片描述

  • 勾選例化模板

最終設置如下:

在這里插入圖片描述

點擊finish完成ROM IP核配置

3.3 FIFO IP核調用

在IP Catalog中搜索FIFO,進入配置選項卡

在這里插入圖片描述

  • 數據寬度同樣為24bit,深度同ROM
  • 由于本項目為跨時鐘域,因此FIFO讀寫選擇單時鐘即可

點擊next,按下圖進行設置:

在這里插入圖片描述

  • 空、滿信號可用于確定讀寫請求
  • usew可在仿真時看到FIFO中的數據個數(此處不勾選,不仿真用不到)
  • 勾選異步復位信號

點擊next,按下圖進行配置:

在這里插入圖片描述

  • 勾選前顯模式

一路next至總結界面:

在這里插入圖片描述

  • 勾選例化模板

FIFO總體配置如下:

在這里插入圖片描述

3.4 項目各模塊源碼

驅動模塊:

module ws2812_driver (input   wire                clk         ,input   wire                rst_n       ,input   wire    [23:0]      pix_data    ,//輸入數據input   wire                pix_data_vld,//輸入數據有效信號output  wire                ready       ,output  reg                 ws2812_io    //輸出碼元信號
);//內部參數定義//狀態參數定義parameter   IDLE = 3'b001   ,RST  = 3'b010   ,DATA = 3'b100   ;//碼元電平參數定義parameter   T0H = 300/20    ,T0L = 900/20    ,T1H = 600/20    ,T1L = 600/20    ;//復位碼元計數參數parameter RST_MAX = 14'd15_000;//內部信號定義//現態、次態寄存器reg         [2:0]   cstate          ;reg         [2:0]   nstate          ;//跳轉條件定義wire                idle2rst        ;wire                rst2data        ;wire                data2idle       ;//一個碼元時間計數器reg			[5:0]	cnt_time	   	;wire				add_cnt_time	;wire				end_cnt_time	;//24bit計數器reg			[4:0]	cnt_bit	   	    ;wire				add_cnt_bit	    ;wire				end_cnt_bit	    ;//64個數據計數器reg			[5:0]	cnt_pix	   	    ;wire				add_cnt_pix	    ;wire				end_cnt_pix	    ;//復位碼元計數器reg			[13:0]	cnt_reset	   	;wire				add_cnt_reset	;wire				end_cnt_reset	;//FIFO信號定義wire        [23:0]  fifo_wr_data    ;wire                fifo_rd_req     ;wire                fifo_wr_req     ;wire                fifo_empty      ;wire                fifo_full       ;wire        [23:0]  fifo_rd_data    ;wire        [7:0]   fifo_usedw      ;//FIFO例化fifo	fifo_inst (.aclr       ( ~rst_n        ),.clock      ( clk           ),.data       ( fifo_wr_data  ),.rdreq      ( fifo_rd_req   ),.wrreq      ( fifo_wr_req   ),.empty      ( fifo_empty    ),.full       ( fifo_full     ),.q          ( fifo_rd_data  ),.usedw      ( fifo_usedw    ));assign fifo_wr_data = {pix_data[15:8],pix_data[23:16],pix_data[7:0]};//將傳入的24bit RGB數據轉為GRB順序//24'hff0000;assign fifo_wr_req  = pix_data_vld && ~fifo_full;//1'b1 && ~fifo_full;//assign fifo_rd_req  = end_cnt_bit && ~fifo_empty;//三段式狀態機//第一段always @(posedge clk or negedge rst_n) beginif(!rst_n)begincstate <= IDLE;endelse begincstate <= nstate;endend//第二段組合邏輯always@(*)begincase(cstate)IDLE    :   beginif(idle2rst)beginnstate = RST;endelse beginnstate = cstate;endendRST     :   beginif(rst2data)beginnstate = DATA;endelse beginnstate = cstate;endendDATA    :   beginif(data2idle)beginnstate = IDLE;endelse beginnstate = cstate;endenddefault : nstate <= cstate;endcaseendassign idle2rst  =  cstate == IDLE && pix_data_vld  ;//1'b1;//assign rst2data  =  cstate == RST  && end_cnt_reset ;assign data2idle =  cstate == DATA && end_cnt_pix   ;//碼元最低持續時間計數器always @(posedge clk or negedge rst_n)begin if(!rst_n)begincnt_time <= 'd0;end else if(add_cnt_time)begin if(end_cnt_time)begin cnt_time <= 'd0;endelse begin cnt_time <= cnt_time + 1'b1;end endend assign add_cnt_time = cstate == DATA;assign end_cnt_time = add_cnt_time && cnt_time == 6'd59;//一位數據的24bit數計數器always @(posedge clk or negedge rst_n)begin if(!rst_n)begincnt_bit <= 'd0;end else if(add_cnt_bit)begin if(end_cnt_bit)begin cnt_bit <= 'd0;endelse begin cnt_bit <= cnt_bit + 1'b1;end endend assign add_cnt_bit = end_cnt_time;assign end_cnt_bit = add_cnt_bit && cnt_bit == 5'd23;//64個數據計數器always @(posedge clk or negedge rst_n)begin if(!rst_n)begincnt_pix <= 'd0;end else if(add_cnt_pix)begin if(end_cnt_pix)begin cnt_pix <= 'd0;endelse begin cnt_pix <= cnt_pix + 1'b1;end endend assign add_cnt_pix = end_cnt_bit;assign end_cnt_pix = add_cnt_pix && cnt_pix == 6'd63;//復位計數器always @(posedge clk or negedge rst_n)begin if(!rst_n)begincnt_reset <= 'd0;end else if(add_cnt_reset)begin if(end_cnt_reset)begin cnt_reset <= 'd0;endelse begin cnt_reset <= cnt_reset + 1'b1;end endend assign add_cnt_reset = cstate == RST;assign end_cnt_reset = add_cnt_reset && cnt_reset == RST_MAX - 1'b1;//第三段 狀態機輸出always@(*)begincase(cstate)IDLE    :   ws2812_io = 1'b0;RST     :   ws2812_io = 1'b0;DATA    :   beginif(fifo_rd_data[23 - cnt_bit])beginif(cnt_time < T1H)beginws2812_io = 1'b1;endelse beginws2812_io = 1'b0;endendelse beginif(cnt_time < T0H)beginws2812_io = 1'b1;endelse beginws2812_io = 1'b0;endendenddefault :   ws2812_io = 1'b0;endcaseend //ready使能信號賦值
assign ready = cstate == IDLE;endmodule

數據控制模塊:

/**************************************************************
@File    :   ws2812_control.v
@Time    :   2023/08/11 15:09:52
@Author  :   majiko 
@EditTool:   VS Code 
@Font    :   UTF-8 
@Function:   提供64個RGB像素數據,給到ws2812接口模塊,用于驗證接口模塊
**************************************************************/
module ws2812_ctrl2(input                   clk             ,input                   rst_n           ,input                   ready           ,//可以接收圖像數據了output         [23:0]   pix_data        ,output                  pix_data_vld    );parameter   IDLE     =   0,DATA     =   1,DELAY    =   2;parameter   DELAY_TIME = 25'd25_000_000;wire    rom_rd_req      ;reg     rom_rd_req1     ;reg     rom_rd_req2     ;wire    rom_rd_data     ;reg     [2:0]       state   ;reg	    [5:0]       cnt_x    ;wire		        add_x_cnt;wire                end_x_cnt;	reg	    [4:0]       cnt_y    ;wire		        add_y_cnt;wire                end_y_cnt;reg			[4:0]	cnt_offset	   	;wire				add_cnt_offset	;wire				end_cnt_offset	;reg			[24:0]	cnt_delay	   	;wire				add_cnt_delay	;wire				end_cnt_delay	;	// localparam	RED     =   24'hFF0000,   //紅色// ORANGE  =   24'hFF8000,   //橙色// YELLOW  =   24'hFFFF00,   //黃色// GREEN   =   24'h00FF00,   //綠色// CYAN    =   24'h00FFFF,   //青色// BLUE    =   24'h0000FF,   //藍色// PURPPLE =   24'h8000FF,   //紫色// BLACK   =   24'h000000,   //黑色// WHITE   =   24'hFFFFFF,   //白色// GRAY    =   24'hC0C0C0;	  //灰色/**************************************************************狀態機
**************************************************************/always@(posedge clk or negedge rst_n)if(!rst_n)state <= IDLE;else case(state)IDLE	:	if(ready)state <=DATA;DATA	:	if(end_y_cnt)state <=DELAY;DELAY   :   if(end_cnt_delay)state <=IDLE;default :	state <= IDLE;endcase//幀間隔計數器always @(posedge clk or negedge rst_n)begin if(!rst_n)begincnt_delay <= 'd0;end else if(add_cnt_delay)begin if(end_cnt_delay)begin cnt_delay <= 'd0;endelse begin cnt_delay <= cnt_delay + 1'b1;end endend assign add_cnt_delay = state == DELAY;assign end_cnt_delay = add_cnt_delay && cnt_delay == DELAY_TIME - 1;/**************************************************************圖像數據個數計數器
**************************************************************/       always@(posedge clk or negedge rst_n)	if(!rst_n)								cnt_x <= 'd0;						else    if(add_x_cnt) begin				if(end_x_cnt)						cnt_x <= 'd0;  				else									cnt_x <= cnt_x + 1'b1;		end											assign add_x_cnt = state == DATA;assign end_x_cnt = add_x_cnt && cnt_x == 8 - 1;always@(posedge clk or negedge rst_n)	if(!rst_n)								cnt_y <= 'd0;						else    if(add_y_cnt) begin				if(end_y_cnt)						cnt_y <= 'd0;  				else									cnt_y <= cnt_y + 1'b1;		end											assign add_y_cnt = end_x_cnt;assign end_y_cnt = add_y_cnt && cnt_y == 8 - 1;//偏移計數器always @(posedge clk or negedge rst_n)begin if(!rst_n)begincnt_offset <= 'd0;end else if(add_cnt_offset)begin if(end_cnt_offset)begin cnt_offset <= 'd0;endelse begin cnt_offset <= cnt_offset + 1'b1;end endend assign add_cnt_offset = end_cnt_delay;assign end_cnt_offset = add_cnt_offset && cnt_offset == 5'd23;// assign pix_data_vld = add_x_cnt;// always@(*)// case(cnt_y)// 0       :   pix_data = RED      ;// 1       :   pix_data = ORANGE   ;// 2       :   pix_data = YELLOW   ;// 3       :   pix_data = GREEN    ;// 4       :   pix_data = CYAN     ;// 5       :   pix_data = BLUE     ;// 6       :   pix_data = PURPPLE  ;// 7       :   pix_data = GRAY     ;// default :   pix_data = RED      ;// endcasewire [4:0]  real_row    ;assign real_row = cnt_x + cnt_offset;rom	rom_inst (.aclr       ( ~rst_n        ),.address    ( cnt_y*32 + real_row),.clock      ( clk           ),.rden       ( rom_rd_req    ),.q          ( pix_data      ));//ROM讀請求打兩拍always@(posedge clk or negedge rst_n)beginif(!rst_n)beginrom_rd_req1 <= 1'b0;rom_rd_req2 <= 1'b0;endelse beginrom_rd_req1 <= rom_rd_req;rom_rd_req2 <= rom_rd_req1;endendassign rom_rd_req   = state == DATA;assign rom_rd_data  = rom_rd_req2  ;assign pix_data_vld = rom_rd_data  ;endmodule

頂層模塊:

module ws2812_top(input   wire    clk         ,input   wire    rst_n       ,output  wire    ws2812_io   
);wire    [23:0]      pix_data    ;
wire                ready       ;
wire                pix_data_vld;//模塊例化
//顯示圖片
// ws2812_ctrl u_ws2812_ctrl(// .clk             (clk           ),// .rst_n           (rst_n         ),// .pix_data        (pix_data      ),// .pix_data_vld    (pix_data_vld  ),// .ready           (ready         ) 
// );//動態顯示圖片
ws2812_ctrl2 u_ws2812_ctrl2(.clk             (clk           ),.rst_n           (rst_n         ),.pix_data        (pix_data      ),.pix_data_vld    (pix_data_vld  ),.ready           (ready         ) 
);interface u_interface(.clk          (clk         ),.rst_n        (rst_n       ),.pix_data     (pix_data    ),.pix_data_vld (pix_data_vld),.ready        (ready       ),.ws2812_io    (ws2812_io   ) 
);endmodule

四、最終顯示效果

引腳綁定如下:

在這里插入圖片描述

實現效果:

在這里插入圖片描述

五、總結

博主本人為FPGA初學者,因此才會寫下此篇博客作為自己對WS2812的一個總結,如果有和博主一樣的初學者,希望此博文能夠幫助到你。

這也是博主第一次利用FPGA驅動外設,第一次設計一個較為簡單的單總線通訊協議,盡管很大程度博主都是依靠著博主老師的代碼才完成的。

如果此篇博文有任何錯誤,還請各位提出!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/36813.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/36813.shtml
英文地址,請注明出處:http://en.pswp.cn/news/36813.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

源碼斷點分析Spring的占位符(Placeholder)是怎么工作的

項目中經常需要使用到占位符來滿足多環境不同配置信息的需求&#xff0c;比如&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <beans xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xmlns"http://www.springframe…

InnoDB文件物理結構解析7 - FIL_PAGE_SDI

在數據庫系統中&#xff0c;通常包含數據字典(data dictionary)用于記錄數據庫對象的元數據(表&#xff0c;分區&#xff0c;觸發器&#xff0c;存儲過程&#xff0c;函數的定義)&#xff0c;我們可以通過information_schema(i_s)數據庫下的視圖(view)或者SHOW語句來訪問數據字…

【愛書不愛輸的程序猿】CPOLAR+HFS,低成本搭建NAS

歡迎來到愛書不愛輸的程序猿的博客, 本博客致力于知識分享&#xff0c;與更多的人進行學習交流 通過HFS低成本搭建NAS&#xff0c;并內網穿透實現公網訪問 - cpolar 極點云 前言1.下載安裝cpolar1.1 設置HFS訪客1.2 虛擬文件系統 2. 使用cpolar建立一條內網穿透數據隧道2.1 保留…

(三) 搞定SOME/IP通信之CommonAPI庫

本章主要介紹在SOME/IP通信過程中的另外一個IPC通信利劍,CommonAPI庫,文章將從如下幾個角度讓讀者了解什么是CommonAPI, 以及庫在實際工作中的作用 SOME/IP通信之CommonAPI CommonAPI庫是什么CommonAPI庫的編譯寫個Demo實戰一下CommonAPI庫是什么 CommonAPI是GENIVI組織開發…

推出 Elasticsearch 查詢語言 (ES|QL)

作者&#xff1a;Costin Leau 我很高興地宣布&#xff0c;經過大約一年的開發&#xff0c;Elasticsearch 查詢語言 (ES|QL) 已準備好與世界共享&#xff0c;并已登陸 Elasticsearch 存儲庫。 ES|QL 是 Elasticsearch 原生的強大聲明性語言&#xff0c;專為可組合性、表現力和速…

Django-配置郵箱功能(一):使用django自帶的發送郵件功能

一、獲取郵箱授權碼 以QQ郵箱為例子&#xff1a; 1、進入到設置&#xff0c;找到賬戶 2、開啟POP3等服務&#xff0c;點擊管理服務 3、進入管理服務&#xff0c;生成授權碼 4、按照要求發送短信就可以了 5、將授權碼復制保存&#xff0c;離開界面就看不到了 二、django項目中…

2023上半年京東手機行業品牌銷售排行榜(京東數據平臺)

后疫情時代&#xff0c;不少行業都迎來消費復蘇&#xff0c;我國智能手機市場在今年上半年也實現溫和的復蘇&#xff0c;手機市場的出貨量回暖。 根據鯨參謀平臺的數據顯示&#xff0c;2023年上半年&#xff0c;京東平臺上手機的銷量為2830萬&#xff0c;環比增長約4%&#xf…

劍指 Offer ! 61. 撲克牌中的順子

參考資料&#xff1a;力扣K神的講解 劍指 Offer 61. 撲克牌中的順子 簡單 351 相關企業 從若干副撲克牌中隨機抽 5 張牌&#xff0c;判斷是不是一個順子&#xff0c;即這5張牌是不是連續的。2&#xff5e;10為數字本身&#xff0c;A為1&#xff0c;J為11&#xff0c;Q為12&…

引入三階失真的非線性放大器的模擬輸出及使用中值濾波器去除峰值研究(Matlab代碼實現)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;歡迎來到本博客????&#x1f4a5;&#x1f4a5; &#x1f3c6;博主優勢&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客內容盡量做到思維縝密&#xff0c;邏輯清晰&#xff0c;為了方便讀者。 ??座右銘&a…

【C/C++】STL queue 非線程安全接口,危險!

STL 中的 queue 是非線程安全的&#xff0c;一個組合操作&#xff1a;front(); pop() 先讀取隊首元素然后刪除隊首元素&#xff0c;若是有多個線程執行這個組合操作的話&#xff0c;可能會發生執行序列交替執行&#xff0c;導致一些意想不到的行為。因此需要重新設計線程安全的…

JVM 內存結構

1、方法區&#xff08;線程共享&#xff09; 存儲靜態變量(靜態方法、變量、代碼塊)、常量池、類信息 2、堆信息&#xff08;線程共享&#xff09; 存儲實例對象&#xff0c;例如 new 出來的對象信息 A a1 new A() 3、虛擬機棧&#xff08;線程隔離&#xff09; 每個線程的都有…

三、MySql表的操作

文章目錄 一、創建表&#xff08;一&#xff09;語法&#xff1a;&#xff08;二&#xff09;說明&#xff1a; 二、創建表案例&#xff08;一&#xff09;代碼&#xff1a;&#xff08;二&#xff09;說明&#xff1a; 三、查看表結構&#xff08;一&#xff09;語法&#xff…

docker相關命令總結(停止、重啟、重加載配置文件)

常用命令 # 配置 Docker 守護進程的行為和參數 vi /etc/docker/daemon.json# 停止docker服務 sudo systemctl stop docker# 啟動 Docker 服務&#xff1a; sudo systemctl start docker# 重新加載systemd守護程序的配置文件&#xff0c;不會重啟服務&#xff08;配置文件&…

Go語言template模板語法

Go語言模板語法 文章目錄 <center> Go語言模板語法連接前后端的符號: {{}}注釋管道(pipeline)變量條件判斷range 關鍵字with 關鍵字比較函數自定義函數嵌套模板模板繼承 連接前后端的符號: {{}} 模板語法都包含在{{}}之中,其中{{.}}中的.表示當前對象.在傳入一個結構體對…

sql-libs靶場-----0x00、環境準備

文章目錄 一、PhPstudy下載、安裝二、Sqli-libs下載、搭建三、啟用Sqli-libs phpstudy地址&#xff1a;https://www.xp.cn/ sqli-libs地址&#xff1a;https://github.com/Audi-1/sqli-labs 一、PhPstudy下載、安裝 1、下載–解壓–安裝&#xff0c;安裝完成如下圖 2、更換php…

【學習筆記】[AGC021F] Trinity

有點難&#x1f605; 考慮加入每一列&#xff0c;發現我們只關心當前還未確定的行的數目 有點難算&#x1f605; 設 d p i , j dp_{i,j} dpi,j?表示有 i i i列&#xff0c;其中 j j j行未確定的方案數。欽定每一列至少有一個黑色格子。 d p i , j j ( j 1 ) 2 d p i ? 1…

IGV.js 的完全本地化運行探索

問題及解決方法 IGV.js 完全本地化是為了合規&#xff0c;不使用外網的情況下查看基因組。不聯網需要下載 genomes.json 文件及其中的內容之外&#xff0c;還需要修改 igv.js本身&#xff0c;防止5s超時后才顯示網頁內容。修改的關鍵詞是: genomes.json&#xff0c;改為本地的…

Leetcode-每日一題【劍指 Offer 13. 機器人的運動范圍】

題目 地上有一個m行n列的方格&#xff0c;從坐標 [0,0] 到坐標 [m-1,n-1] 。一個機器人從坐標 [0, 0] 的格子開始移動&#xff0c;它每次可以向左、右、上、下移動一格&#xff08;不能移動到方格外&#xff09;&#xff0c;也不能進入行坐標和列坐標的數位之和大于k的格子。例…

一個簡單實用的線程池及線程池組的實現!

1.線程池簡介 線程池&#xff0c;顧名思義&#xff0c;就是一個“池子”里面放有多個線程。為什么要使用線程池呢&#xff1f;當我們編寫的代碼需要并發異步處理很多任務時候&#xff0c;一般的處理辦法是一個任務開啟一個線程去處理&#xff0c;處理結束后釋放線程。可是這樣…

【QT】窗口通過dragEnterEvent和dropEvent拖拽導入文件

【QT】窗口通過dragEnterEvent和dropEvent拖拽導入文件 界面允許接受拖拽 在界面的構造函數中設置接受拖拽放置文件 setAcceptDrops(true); 拖拽進入、放下事件 dragEnterEvent函數對拖動的文件進行過濾&#xff0c;如果不符合過濾條件按將無法拖拽進入窗口 dropEvent函數…