FPGA控制88E1512 PHY芯片完成網絡通信

一、88E1512分析

? ? ? ? 本文不對88E1512進行詳細解析,僅對調試過程中重點使用的幾個寄存器進行說明。

1.1 MDIO時序分析

????????根據手冊,MDIO時序中,mdc時鐘最高為12Mhz。占空比和建立保持時間要求可以觀察上述表格。

? ? ? ? MDIO的讀數據時序圖如下:

? ? ? ? MDIO的寫數據時序圖如下:

????????各字段表示的含義如下:

1.2? 寄存器分析

1.2.1 頁地址寄存器

? ? ? ? 可能是受MDIO寄存器地址字段的位寬限制(5bits),88E1512提供了一個頁地址寄存器的功能,可以通過配置任意頁的寄存器地址22,實現頁的切換,比如從page0,切換到page1,實現遠超2^5的寄存器數目的配置。

? ? ? ? 通過配置此寄存器,可以完成頁的切換,實現不同寄存器的讀寫。

1.2.2? PHY ID寄存器

????????用于驗證MDIO總線是否正常,讀取page0的寄存器2,若回讀數據時0x141,則證明鏈路正確。(通過也需要確認MDIO時序中的TA字段,是否應答正確)

1.2.3 MAC特定控制寄存器

????????本寄存器中,重點關注bit4字段的信息(數據發送時序的控制,有時可能也涉及到bit5字段,數據接收時序的控制),一般FPGA中的MAC會默認增加網絡時鐘和網絡數據的延時,因此88E1512中可以取消其內部的延遲。這個需要根據實際情況進行控制。

? ? ? ? 以下重點看一下數據發送的時序圖。

????????當bit4字段設置為0時,可以從下面的時序圖中看到,此時要求88E1512的引腳上,接收到的時鐘和數據的時序關系應該為:在時鐘的邊沿位置,剛好為數據的穩定位置。即此時FPGA側若進行了時序上的相位處理,那么88E1512則不需要進行內部的延時,就可以達到時序收斂,穩定的接收到發送數據。

????????當bit4字段設置為1時,可以從下面的時序圖中看到,此時要求88E1512的引腳上,接收到的時鐘和數據的時序關系應該為:在時鐘的邊沿位置,剛好為數據的改變位置。即此時FPGA側若不進行了時序上的相位處理,時鐘和數據為相位對齊關系,那么88E1512則需要進行內部的延時,才可以達到時序收斂,穩定的接收到發送數據。

1.2.4 一般控制器1

????????從此寄存器中,可以看到,對于88E1512芯片而言,其默認的工作狀態為mode[2:0] = 3'b111,保留狀態。而我本次需要的工作狀態為RGMII to copper,因此需要進行配置使MODE[2:0]= 3'b000,

????????另外需要注意的是,配置完page6和page18的寄存器時,都需要對芯片進行軟復位,即bit15的SC字段,需要設置為1‘b1,88E1512會自動釋放復位信號。

二、FPGA的代碼實現

2.1 MDIO的時序模塊實現

? ? ? ? 此處也不啰嗦,直接上代碼,有興趣的自行查閱。

`timescale 1ns / 1ps
//
//實現MDC和MDIO時序的SMI接口module phy_smi #(parameter	CLK_FREQ = 100_000_000,//系統時鐘頻率 100Mparameter	MDC_DIV	= 1000 //MDC分頻系數 1000 得到100K時鐘
)
(input				clk,input				rst_n,output		reg		mdc,inout				mdio,input		[4:0]	phy_addr, //PHY芯片的地址input		[4:0]	reg_addr, //寄存器地址//wr_req信號上升沿有效input				wr_req,input		[15:0]	wr_data,//rd_req信號上升沿有效input				rd_req,output	reg	[15:0]	rd_data = 16'd0,output	reg			rd_valid = 1'b0,	//接收到的數據有效標志output	reg			rd_error = 1'b0,	//接收數據失敗標志output		busy );reg mdc_gen_en = 1'b0; //時鐘生成使能,mdc可以不是持續性時鐘
reg [15:0] mdc_div_cnt = 0;
wire mdc_pos;//MDC上升沿
wire mdc_neg; //MDC下降沿
wire mdc_hig; //MDC高電平中心位置
wire mdc_low;//MDC低電平中心位置reg	mdio_buf = 1'b0;
reg	mdio_dir = 1'b0;//FPGA是否輸出mdio,1'b1表示FPGA控制輸出,反之為高阻態//-----------------edge detect---------------------------
reg	wr_req_rise = 1'b0;
reg	wr_req_d0 = 1'b0;
reg	wr_req_d1 = 1'b0;reg	rd_req_rise = 1'b0;
reg	rd_req_d0 = 1'b0;
reg	rd_req_d1 = 1'b0;//---------------------FSM-------------------------------
localparam	[3:0] S_IDLE	= 4'd0;//空閑態
localparam	[3:0] S_PRE_RD	= 4'd1;//前導態
localparam	[3:0] S_RD	= 4'd2;//讀狀態
localparam	[3:0] S_PRE_WR	= 4'd3;//前導態
localparam	[3:0] S_WR	= 4'd4;//寫狀態
localparam	[3:0] S_DONE	= 4'd5;//完成態reg		[3:0]	state = S_IDLE;localparam	START_FIELD	= 2'b01; //開始2bits信息,指示開始傳輸數據
localparam	READ_CODE_FIELD = 2'b10; //讀操作碼
localparam	WRITE_CODE_FIELD = 2'b01; //寫操作碼
localparam	TA_FIELD = 2'b10; //turn around。寫時,直接發送2'b10即可,讀操作時,MDIO控制權交給PHY,此時FPGA的MDIO為高阻reg		[4:0]	bit_cnt;//一次讀寫正好 32bit Pre + 32bit WR/RDassign mdc_low = (mdc_div_cnt == 16'd0);
assign mdc_hig = (mdc_div_cnt == (MDC_DIV/2) -1);
assign mdc_pos = (mdc_div_cnt == (MDC_DIV/4) -1);
assign mdc_neg = (mdc_div_cnt == (MDC_DIV/2) + (MDC_DIV/4) -1);always @(posedge clk) beginwr_req_d0	<= wr_req;wr_req_d1	<= wr_req_d0;wr_req_rise	<= ~wr_req_d1 & wr_req_d0;rd_req_d0	<= rd_req;rd_req_d1	<= rd_req_d0;rd_req_rise	<= ~rd_req_d1 & rd_req_d0;
endalways @(posedge clk) 
beginif(mdc_gen_en) beginif( mdc_div_cnt <= MDC_DIV - 1)mdc_div_cnt <= mdc_div_cnt + 1'b1;elsemdc_div_cnt <= 0;endelsemdc_div_cnt <= 0;
endalways @(posedge clk) 
beginif(mdc_gen_en) beginif( mdc_pos )mdc <= 1'b1;else if(mdc_neg)mdc <= 1'b0;endelsemdc <= 0;
endalways @(posedge clk or negedge rst_n) 
beginif(~rst_n) beginstate	<= S_IDLE;mdc_gen_en <= 1'b0;rd_valid <= 1'b0;endelse beginrd_valid <= 1'b0;case(state)S_IDLE : beginmdc_gen_en <= 1'b0;bit_cnt <= 0;rd_error <= 1'b0;if(rd_req_rise)state <= S_PRE_RD;else if(wr_req_rise)state <= S_PRE_WR;   endS_PRE_RD : beginmdc_gen_en <= 1'b1;if(mdc_neg) beginif(bit_cnt==5'd31) begin //發送完32個前導1'b1bit_cnt <= 0;state	<= S_RD;endelse beginbit_cnt <= bit_cnt + 1'b1;endend//前導碼均為1,FPGA輸出mdio_buf <= 1'b1;mdio_dir <= 1'b1;endS_RD : beginmdc_gen_en <= 1'b1;if(mdc_neg) beginif(bit_cnt==5'd31) begin //完成32bits的通信bit_cnt <= 0;state	<= S_DONE;endelse beginbit_cnt <= bit_cnt + 1'b1;endendcase(bit_cnt)5'd0: begin mdio_dir <= 1'b1; mdio_buf	<= START_FIELD[1];end5'd1: begin mdio_dir <= 1'b1; mdio_buf	<= START_FIELD[0];end5'd2: begin mdio_dir <= 1'b1;mdio_buf	<= READ_CODE_FIELD[1];end5'd3: begin mdio_dir <= 1'b1;mdio_buf	<= READ_CODE_FIELD[0];end5'd4: begin mdio_dir <= 1'b1;mdio_buf	<= phy_addr[4];end5'd5: begin mdio_dir <= 1'b1;mdio_buf	<= phy_addr[3];end5'd6: begin mdio_dir <= 1'b1;mdio_buf	<= phy_addr[2];end5'd7: begin mdio_dir <= 1'b1;mdio_buf	<= phy_addr[1];end5'd8: begin mdio_dir <= 1'b1;mdio_buf	<= phy_addr[0];end5'd9: begin mdio_dir <= 1'b1;mdio_buf	<= reg_addr[4];end5'd10: begin mdio_dir <= 1'b1;mdio_buf	<= reg_addr[3];end5'd11: begin mdio_dir <= 1'b1;mdio_buf	<= reg_addr[2];end5'd12: begin mdio_dir <= 1'b1;mdio_buf	<= reg_addr[1];end5'd13: begin mdio_dir <= 1'b1;mdio_buf	<= reg_addr[0];enddefault: begin mdio_dir <= 1'b0;end endcase//MDC下降沿時取數據if(mdc_neg) begincase(bit_cnt)5'd14: rd_error	<= mdio; //若PHY應答,此處會被拉低,否則失敗;5'd15: rd_data[15]	<= mdio;5'd16: rd_data[14]	<= mdio;5'd17: rd_data[13]	<= mdio;5'd18: rd_data[12]	<= mdio;5'd19: rd_data[11]	<= mdio;5'd20: rd_data[10]	<= mdio;5'd21: rd_data[9]	<= mdio;5'd22: rd_data[8]	<= mdio;5'd23: rd_data[7]	<= mdio;5'd24: rd_data[6]	<= mdio;5'd25: rd_data[5]	<= mdio;5'd26: rd_data[4]	<= mdio;5'd27: rd_data[3]	<= mdio;5'd28: rd_data[2]	<= mdio;5'd29: rd_data[1]	<= mdio;5'd30:begin rd_data[0]	<= mdio; rd_valid <= 1'b1;enddefault:;endcaseendendS_PRE_WR : beginmdc_gen_en <= 1'b1;if(mdc_neg) beginif(bit_cnt==5'd31) begin //發送完32個前導1'b1bit_cnt <= 0;state	<= S_WR;endelse beginbit_cnt <= bit_cnt + 1'b1;endend//前導碼均為1,FPGA輸出mdio_buf <= 1'b1;mdio_dir <= 1'b1;endS_WR : beginmdc_gen_en <= 1'b1;if(mdc_neg) beginif(bit_cnt==5'd31) begin //完成32bits的通信bit_cnt <= 0;state	<= S_DONE;endelse beginbit_cnt <= bit_cnt + 1'b1;endendcase(bit_cnt)5'd0: begin mdio_dir <= 1'b1; mdio_buf	<= START_FIELD[1];end5'd1: begin mdio_dir <= 1'b1; mdio_buf	<= START_FIELD[0];end5'd2: begin mdio_dir <= 1'b1;mdio_buf	<= WRITE_CODE_FIELD[1];end5'd3: begin mdio_dir <= 1'b1;mdio_buf	<= WRITE_CODE_FIELD[0];end5'd4: begin mdio_dir <= 1'b1;mdio_buf	<= phy_addr[4];end5'd5: begin mdio_dir <= 1'b1;mdio_buf	<= phy_addr[3];end5'd6: begin mdio_dir <= 1'b1;mdio_buf	<= phy_addr[2];end5'd7: begin mdio_dir <= 1'b1;mdio_buf	<= phy_addr[1];end5'd8: begin mdio_dir <= 1'b1;mdio_buf	<= phy_addr[0];end5'd9: begin mdio_dir <= 1'b1;mdio_buf	<= reg_addr[4];end5'd10: begin mdio_dir <= 1'b1;mdio_buf	<= reg_addr[3];end5'd11: begin mdio_dir <= 1'b1;mdio_buf	<= reg_addr[2];end5'd12: begin mdio_dir <= 1'b1;mdio_buf	<= reg_addr[1];end5'd13: begin mdio_dir <= 1'b1;mdio_buf	<= reg_addr[0];end5'd14: begin mdio_dir <= 1'b1;mdio_buf	<= TA_FIELD[1];end5'd15: begin mdio_dir <= 1'b1;mdio_buf	<= TA_FIELD[0];end5'd16: begin mdio_dir <= 1'b1; mdio_buf	<= wr_data[15];end5'd17: begin mdio_dir <= 1'b1; mdio_buf	<= wr_data[14];end5'd18: begin mdio_dir <= 1'b1; mdio_buf	<= wr_data[13];end5'd19: begin mdio_dir <= 1'b1; mdio_buf	<= wr_data[12];end5'd20: begin mdio_dir <= 1'b1; mdio_buf	<= wr_data[11];end5'd21: begin mdio_dir <= 1'b1; mdio_buf	<= wr_data[10];end5'd22: begin mdio_dir <= 1'b1; mdio_buf	<= wr_data[9];end5'd23: begin mdio_dir <= 1'b1; mdio_buf	<= wr_data[8];end5'd24: begin mdio_dir <= 1'b1; mdio_buf	<= wr_data[7];end5'd25: begin mdio_dir <= 1'b1; mdio_buf	<= wr_data[6];end5'd26: begin mdio_dir <= 1'b1; mdio_buf	<= wr_data[5];end5'd27: begin mdio_dir <= 1'b1; mdio_buf	<= wr_data[4];end5'd28: begin mdio_dir <= 1'b1; mdio_buf	<= wr_data[3];end5'd29: begin mdio_dir <= 1'b1; mdio_buf	<= wr_data[2];end5'd30: begin mdio_dir <= 1'b1; mdio_buf	<= wr_data[1];end5'd31: begin mdio_dir <= 1'b1; mdio_buf	<= wr_data[0];enddefault:;endcaseendS_DONE : beginmdc_gen_en <= 1'b0;state	<= S_IDLE;endendcaseend
endassign busy = (state != S_IDLE);assign mdio = mdio_dir ? mdio_buf : 1'bZ;//wire mdio_in;
//assign mdio_in = mdio;endmodule

2.2 88E1512的控制代碼

`timescale 1ns / 1psmodule PHY_88E1512(input clk,input rst_n,output mdc, //inout mdio, //input config_start, //啟動88E1512的配置,使FPGA可在RGMII 1G模式下通信output reg link_ok = 1'b0, //讀取PHY ID驗證鏈路是否正確output reg link_error = 1'b0, //讀取PHY ID驗證鏈路是否正確output reg config_done  //配置完成);localparam PHY_88E1512_ADDR = 5'd0;localparam IDLE_STATE = 4'd0;
localparam ARB_STATE = 4'd1;
localparam LINK_READY_STATE = 4'd2; //讀取PHY ID :bit3:18  數值為0x0141即通信鏈路正常
localparam CFG_READY_STATE = 4'd3;
localparam WR_OP_STATE = 4'd4;
localparam RD_OP_STATE = 4'd5;
localparam LINK_ERR_STATE = 4'd6;
localparam DONE_STATE = 4'd7;reg [3:0] state = IDLE_STATE;reg config_start_d1 = 1'b0;reg [3:0] link_cnt = 4'd0;//鏈路驗證時寄存器計數
reg [3:0] wr_cnt = 4'd0; //寫讀寄存器計數
reg [15:0] rd_data_latch = 0;//SMI接口信號
//reg [4:0] phy_addr = 5'd0; //PHY芯片的地址
reg [4:0] reg_addr = 5'd0; //寄存器地址//wr_req信號上升沿有效
reg wr_req = 1'b0;
reg [15:0] wr_data = 16'd0;//rd_req信號上升沿有效
reg rd_req = 1'b0;
wire [15:0]rd_data;
wire rd_valid;	//接收到的數據有效標志
wire rd_error;	//接收數據失敗標志wire busy ;
reg busy_d1 = 1'b0;always@(posedge clk)
beginbusy_d1 <= busy;
endalways@(posedge clk)
beginconfig_start_d1 <= config_start;
endalways@(posedge clk or negedge rst_n)
beginif(!rst_n) beginstate <= IDLE_STATE;wr_req <= 1'b0;wr_cnt <= 0;rd_req <= 1'b0;link_cnt <= 0;rd_data_latch <= 16'h0;end else begincase(state)IDLE_STATE: beginwr_req <= 1'b0;wr_cnt <= 0;rd_req <= 1'b0;link_cnt <= 0;if(!config_start_d1 & config_start) beginstate <= ARB_STATE;rd_data_latch <= 16'h0;link_ok <= 1'b0;link_error <= 1'b0;config_done <= 1'b0;endendARB_STATE : beginwr_req <= 1'b0;rd_req <= 1'b0;if(link_ok == 1'b0) //先進行鏈路驗證state <= LINK_READY_STATE;else if(config_done == 1'b0) //再配置寄存器state <= CFG_READY_STATE;elsestate <= IDLE_STATE;endLINK_READY_STATE : begincase(link_cnt)4'd0: begin  //首先寫寄存器,選中page0link_cnt <= 4'd1;reg_addr <= 5'd22; //寄存器地址22wr_data <= 16'd0;state <= WR_OP_STATE;end4'd1: begin  //其次讀取PHY IDlink_cnt <= 4'd2;reg_addr <= 5'd2; //寄存器地址2state <= RD_OP_STATE;end4'd2: begin //驗證回讀ID是否正確if(rd_data_latch == 16'h0141) beginstate <= ARB_STATE;link_ok <= 1'b1;endelse beginstate <= LINK_ERR_STATE;endenddefault:state <= IDLE_STATE;endcaseendCFG_READY_STATE : beginwr_cnt <= wr_cnt + 4'd1;case(wr_cnt)//-----由于FPGA MAC核已經調整好時序,因此PHY處不需要進行時序延時4'd0: begin  //首先寫寄存器,選中page2reg_addr <= 5'd22; //寄存器地址22wr_data <= 16'd2;state <= WR_OP_STATE;end4'd1: begin  //讀寄存器reg_addr <= 5'd21; //寄存器地址21state <= RD_OP_STATE;end  4'd2: begin  //取消PHY內部的延時reg_addr <= 5'd21; //寄存器地址21wr_data <= rd_data_latch & 16'hFFEF;//bit4置為0state <= WR_OP_STATE;end      //-----PHY工作在RGMII to Copper模式4'd3: begin  //首先寫寄存器,選中page18reg_addr <= 5'd22; //寄存器地址22wr_data <= 16'd18;state <= WR_OP_STATE;end4'd4: begin  //其次配置MODE參數,使PHY工作在RGMII to Copper模式reg_addr <= 5'd20; //寄存器地址20wr_data <= 16'h0;//bit15表示軟復位,bit[2:0]表示RGMII to Copper模式,其余為默認值state <= WR_OP_STATE;end4'd5: begin  //其次配置MODE參數,使PHY工作在RGMII to Copper模式reg_addr <= 5'd20; //寄存器地址20wr_data <= 16'h8000;//bit15表示軟復位,bit[2:0]表示RGMII to Copper模式,其余為默認值state <= WR_OP_STATE;config_done <= 1'b1;enddefault:state <= IDLE_STATE;endcaseendWR_OP_STATE : beginwr_req <= 1'b1;if(busy_d1 & !busy) //busy下降沿state <= ARB_STATE;endRD_OP_STATE : begin rd_req <= 1'b1;if(rd_valid) beginrd_data_latch <= rd_data;endif(rd_error)state <= LINK_ERR_STATE;else if(busy_d1 & !busy) //busy下降沿state <= ARB_STATE;endLINK_ERR_STATE : beginlink_error <= 1'b1;state <= IDLE_STATE;endDONE_STATE : beginstate <= IDLE_STATE;enddefault : beginstate <= IDLE_STATE;endendcaseend
endphy_smi #(.CLK_FREQ(25_000_000),//系統時鐘頻率 25M.MDC_DIV(50) //MDC分頻系數 50 得到500K時鐘
)
phy_smi(.clk(clk),//input				clk,.rst_n(rst_n),//input				rst_n,.mdc(mdc),//output		reg		mdc,.mdio(mdio),//inout				mdio,.phy_addr(PHY_88E1512_ADDR),//input		[4:0]	phy_addr, //PHY芯片的地址.reg_addr(reg_addr),//input		[4:0]	reg_addr, //寄存器地址//wr_req信號上升沿有效.wr_req(wr_req),//input				wr_req,.wr_data(wr_data),//input		[15:0]	wr_data,//rd_req信號上升沿有效.rd_req(rd_req),//input				rd_req,.rd_data(rd_data),//output	reg	[15:0]	rd_data = 16'd0,.rd_valid(rd_valid),//output	reg			rd_valid = 1'b0,	//接收到的數據有效標志.rd_error(rd_error),//output	reg			rd_error = 1'b0,	//接收數據失敗標志.busy(busy) //output		busy );
endmodule

2.3 整體網絡通信的驗證

????????網絡通信模塊,借用了米聯客的UDP通信模塊。基本上根據根據上述代碼部分,應該可以自行完成通信調試,若需要原始工程的,可以自行下載使用。

? ? ?https://download.csdn.net/download/yindq1220/91200585

電腦側IP地址192.168.137.1
電腦側UDP端口號6001
開發板側IP地址192.168.137.2
開發板側UDP端口號6002

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

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

相關文章

Ai大模型 - ocr圖像識別形成結構化數據(pp-ocr+nlp結合) 以及訓練微調實現方案(初稿)

全局目錄,一步到位 功能流程第一階段 基于現有條件進行 調研,測試與評估1.1 ocr深度學習模型 pp-ocr1.2 nlp結構化模型1.3 硬件要求: 第二階段 模型訓練微調2.1 更換ocr-GPU模型, 下載相關環境2.2 nlp模型 語義訓練2.3 最低硬件要求:2.4 樣本數據: (重點)2.5 進一步增強模型能力…

【Linux】軟硬鏈接,動靜態庫

目錄 一、認識一下常用指令 1、建立一個軟鏈接 2、建立一個硬鏈接 3、刪除文件的第二種方式&#xff1a;刪除鏈接unlink指令 二、什么是硬鏈接&#xff1f; 三、軟硬鏈接的原理&#xff1a; 四、應用場景 1、建立一個軟鏈接可以快速在一個比較深的路徑中找到目標文件進行…

VRR(可變刷新率)和QMS(快速媒體切換)

&#x1f527; 一、技術原理的本質區別 技術VRR (可變刷新率)QMS (快速媒體切換)核心目標消除動態幀率波動導致的畫面撕裂/卡頓消除靜態幀率切換時的黑屏中斷工作機制實時調整顯示器刷新率&#xff08;Hz&#xff09;匹配GPU輸出幀率&#xff08;FPS&#xff09;→ 動態延長/縮…

GO 語言學習 之 Map

map 是 Go 語言中非常重要的數據結構&#xff0c;常用于需要快速查找、統計或分組數據的場景。 map定義&#xff1a; package mainimport "fmt"func main() {var m1 map[int]string // 創建一個 mapm2 : make(map[int]string) // 創建一個 map m3…

什么是可觀測性?監控、日志、追蹤三者之間有什么區別?

一、引言&#xff1a;為什么現代系統需要“看得見”&#xff1f; 你是否遇到過這樣的情況&#xff1a;系統運行突然變慢&#xff0c;但沒人知道問題出在哪&#xff1f;隨著微服務、云原生架構的普及&#xff0c;系統的復雜度越來越高&#xff0c;傳統的“靠經驗判斷”已經無法…

扣子(coze)實戰|自動搬運+改寫+歸檔!自媒體矩陣終極方案

今天給大家分享的是用coze做一個工作流來自動提取抖音/小紅書視頻文案及改寫并傳入到飛書多維表格&#xff0c;我們先來看案例 上傳視頻鏈接即可一鍵生成&#xff0c;廢話不多說&#xff0c;上教程~ 一、整體工作流如下&#xff1a; 二、開發思路&#xff1a; 三、詳細工作流分…

K8s環境下基于Nginx WebDAV與TLS/SSL的文件上傳下載部署指南

#作者&#xff1a;閆乾苓 文章目錄 1.問題及背景2.方案說明3.部署步驟3.1 制作TLS/SSL私有證書3.2 創建訪問nginx賬戶密碼文件并創建secret3.3 為TLS/SSL私有證書創建secret3.4 為Nginx 配置文件創建confimap3.5 使用deployment&#xff0c;svc部署nginx3.6 客戶端curl上傳下載…

【Day 7-N17】Python函數(1)——函數定義、位置參數調用函數、關鍵字參數調用函數、函數的默認值

挑戰14天學會Python&#xff0c;第7天學習筆記&#xff01;加油&#xff01; 一、概述 函數&#xff08;Function&#xff09;是 Python 中用于封裝可重用代碼塊的基本結構。通過定義函數&#xff0c;我們可以將復雜邏輯拆分為更小、更易管理的單元&#xff0c;并通過參數傳遞…

STM32 驅動 ADS1015 單端 差分 多通道模式 ADC 轉換

文章目錄 一、ADS1015簡介二、引腳功能三、寄存器介紹1.Conversion Register 轉化數據存放寄存器2.Config Register 配置寄存器 四、IIC時序1.寫寄存器2.讀寄存器 五、程序六、實驗現象1.單端模式2.差分模式3.偽多通道模式 一、ADS1015簡介 ADS1015 是一款由德州儀器&#xff…

RabbitMQ 消費冪等性與消息重放實現

一、冪等性實現 1.1 什么是冪等性&#xff1f; 冪等性是指同一條消息無論被消費多少次&#xff0c;業務結果都只生效一次&#xff0c;防止重復扣款、重復發貨等問題。 RabbitMQ 的投遞模式是“至少一次交付”(at-least-once delivery)&#xff0c;如果消費者處理失敗或者沒有及…

【HarmonyOS 5】鴻蒙TEE(可信執行環境)詳解

【HarmonyOS 5】鴻蒙TEE&#xff08;可信執行環境&#xff09;詳解 一、TEE是什么&#xff1f; 1、TEE的定義&#xff1a; 可信執行環境&#xff08;Trusted Execution Environment&#xff09;&#xff0c;簡稱TEE&#xff0c;是存在于智能手機、平板或任意移動設備主處理器…

算法: 冒泡排序

冒泡排序是一種簡單的排序算法&#xff0c;通過相鄰元素的比較和交換&#xff0c;使較大的元素逐漸"浮"到數組末尾。 時間復雜度:最佳 O(n) | 平均 O(n) | 最差 O(n) 空間復雜度:O(1) 穩定性:穩定 應用場景/前提條件 適用于小規模數據對幾乎已排序的數據效率較高…

基于SpringBoot的家電銷售展示平臺

源碼編號&#xff1a;S567 源碼名稱&#xff1a;基于SpringBoot的家電銷售展示平臺 用戶類型&#xff1a;雙角色&#xff0c;用戶、管理員 數據庫表數量&#xff1a;14 張表 主要技術&#xff1a;Java、Vue、ElementUl 、SpringBoot、Maven 運行環境&#xff1a;Windows/M…

java+vue+SpringBoo智慧旅游系統(程序+數據庫+報告+部署教程+答辯指導)

源代碼數據庫LW文檔&#xff08;1萬字以上&#xff09;開題報告答辯稿ppt部署教程代碼講解代碼時間修改工具 技術實現 開發語言&#xff1a;后端&#xff1a;Java 前端&#xff1a;vue框架&#xff1a;springboot數據庫&#xff1a;mysql 開發工具 JDK版本&#xff1a;JDK1.…

Docker 入門教程(三):鏡像操作命令

文章目錄 &#x1f433; Docker 入門教程&#xff08;三&#xff09;&#xff1a;鏡像操作命令獲取鏡像&#xff1a;docker pull查看鏡像&#xff1a;docker images刪除鏡像&#xff1a;docker rmi搜索鏡像&#xff1a;docker search鏡像打標簽&#xff1a;docker tag鏡像詳情與…

如何修改discuz文章標題字數限制 修改成255

在 Discuz! X3.5 中&#xff0c;文章&#xff08;主題&#xff09;標題字數的限制可以通過修改數據庫結構以及后臺配置來實現&#xff0c;以下是完整的修改方法&#xff0c;將標題長度限制改為 255 個字符&#xff1a; ? 一、修改數據庫字段長度 Discuz 默認標題字段是 subje…

基于BP神經網絡的26個英文字母識別

本課題旨在設計并實現一個基于BP&#xff08;反向傳播&#xff09;神經網絡的英文字母識別系統&#xff0c;實現對手寫或打印的26個英文字母&#xff08;A-Z&#xff09;的自動分類識別。項目首先對字母圖像進行預處理&#xff08;如灰度化、歸一化、二值化和特征提取&#xff…

系統架構設計師論文分享-論云原生技術的應用

我的軟考歷程 摘要 2023年2月&#xff0c;我所在的公司做了開發紗線MES系統的決定&#xff0c;該系統為國內紗線工廠提供SAAS服務&#xff0c;旨在提高紗線工廠的智能化和數字化水平。我在該項目中被任命為系統架構設計師&#xff0c;全面掌管該項目的架構設計工作。該項目涉…

重置 MySQL root 密碼

引言 在linux可能存在安裝mysql安裝失敗&#xff0c;一直不出現默認密碼 /usr/local/mysql/mysql-8.0.26/bin/mysqld --defaults-file/etc/my.cnf --usermysql --basedir/usr/local/mysql/mysql-8.0.26 --datadir/usr/local/mysql/mysql-8.0.26/data --lower-case-table-name…

面試八股---HTML

面試八股 1、HTML 1.1 src和href的區別 src 用于替換當前元素&#xff0c;href 用于在當前文檔和引用資源之間確立聯系。 核心區別在于 href 關聯的資源&#xff08;主要是 CSS&#xff09;是用于描述頁面外觀的&#xff0c;瀏覽器可以先生成內容再應用樣式&#xff0c;因此…