首先先夸一下黑金的FPGA开发板和相关教程,真心不错,下面的内容也是学习黑金的开发板获得的。
一、 RGMII简单说明
RGMII实际上是是简化版的GMII,时钟频率依旧是125MHz,为了保持1000Mbps的传输速率不变,在时钟的上升沿和下降沿都采样数据,在参考时钟的上升沿处理GMII接口中的TXD[3:0]/RXD[3:0],在下降沿处理TXD[7:4]/RXD[7:4],在TX_EN信号线上传送TX_EN和TX_ER两种信息,在TX_CLK的上升沿发送TX_EN,下降沿发送TX_ER;同样,RX_DV信号线上传输RX_DV和RX_ER两种信息,在RX_CLK的上升沿发送RX_DV,下降沿发送RX_ER。采用RGMII的主要作用是为了降低电路成本。

RGMII还有个优势就是同时也兼容100Mbps和10Mbps两种速率,所以对于自适应的网络特别适用,此时的参考时钟分别为25MHz和2.5MHz。对于数据的处理在上升沿进行处理,与100Mbps的处理方式有所不同,所以为了达到自适应网络,FPGA程序部分需要做点处理,可能处理的方式有很多种,下面推荐一种处理方式。
二、 具体实现
下面方法以xilinx为模板做的。一般3种通信速率的PHY芯片都支持自检测通信速率,可以通过这个检测作为参考进行相应的处理。在数据的接口部分3种速率的处理方式都是一样的,在时钟的上升沿和下降沿都对数据进行处理,会用到原语IDDR和ODDR(这两个原语一个针对接收,一个针对发送,主要是在时钟的上升沿和下降沿都对数据进行处理)。为10Mbps/100Mbps时,接口传送的数据接口为4位,而数据处理时为8位处理,所以这可以当做是跨时钟域处理了,这就用到FIFO了,这里不管发送还是接收,都会用到2个FIFO,这2个FIFO的作用一个用来缓存数据,一个用来缓存数据长度,有人可能会觉得缓存数据长度的FIFO是多余的,非也,听我细细道来。在实际应用中,很多情况下发送的帧数据的长度并不是一个固定值,而是一个随机值,其次还有,这一帧数据还没处理结束,下一帧数据就过来了,所以也要对数据长度做一个缓存。其次,这个方式也不仅仅针对自适应以太网,在很多通信跨时钟域处理中都可以应用此方法。
下面还是看看程序的实现。
首先接口部分,可以看看上面的图,接收时钟由PHY部分提供,发送时钟由MAC部分提供,在写代码时,可以直接进行赋值就可以了,如果这个时钟不仅仅做一个转换的话,还是建议调用一下原语BUFG,这是提供全局时钟的。

ODDR #(.DDR_CLK_EDGE("SAME_EDGE")) rgmii_txc_out (.Q (rgmii_txc),.C (gmii_tx_clk_s),.CE(1),.D1(1),.D2(0),.R(tx_reset_sync),.S(0));generategenvar i;for (i = 0; i < 4; i = i + 1) begin : gen_tx_dataODDR #(.DDR_CLK_EDGE("SAME_EDGE")) rgmii_td_out (.Q (rgmii_td[i]),.C (gmii_tx_clk_s),.CE(1),.D1(gmii_txd_r_d1[i]),.D2(gmii_txd_low[i]),.R(tx_reset_sync),.S(0));endendgenerateODDR #(.DDR_CLK_EDGE("SAME_EDGE")) rgmii_tx_ctl_out (.Q (rgmii_tx_ctl),.C (gmii_tx_clk_s),.CE(1),.D1(gmii_tx_en_r_d1),.D2(rgmii_tx_ctl_r),.R(tx_reset_sync),.S(0));generatefor (i = 0; i < 4; i = i + 1) beginIDDR #(.DDR_CLK_EDGE("SAME_EDGE_PIPELINED")) rgmii_rx_iddr (.Q1(gmii_rxd_s[i]),.Q2(gmii_rxd_s[i+4]),.C(gmii_rx_clk),.CE(1),.D(rgmii_rd[i]),.R(0),.S(0));endendgenerateIDDR #(.DDR_CLK_EDGE("SAME_EDGE_PIPELINED")) rgmii_rx_ctl_iddr (.Q1(gmii_rx_dv_s),.Q2(rgmii_rx_ctl_s),.C(gmii_rx_clk),.CE(1),.D(rgmii_rx_ctl),.R(0),.S(0));

上面是接口调用原语部分。
在接收数据时,要注意一下,在接口接收数据时接收了8位数据,其实在10Mbps/100Mbps时,高4位的数据就是低四位的数据;计数器计数的值为帧头的一半;还有就是缓存数据长度的FIFO写使能在数据有效信号的下降沿进行使能操作。具体实现主要分为2个状态,一个是检查缓存数据长度的FIFO是否有数据状态,另一个就是读FIFO数据状态了。具体相关代码如下:

`timescale 1ns / 1ps
//
// Module Name:    ethernet_test
//
module gmii_rx_buffer
(input              clk,input              rst_n,input              eth_100m_en,   //ethernet 100M enableinput              eth_10m_en,    //ethernet 100M enableinput              link,          //ethernet link signalinput              gmii_rx_dv,    //gmii rx dvinput  [7:0]       gmii_rxd,      //gmii rxd(* MARK_DEBUG="true" *)output reg         e10_100_rx_dv, //ethernet 10/100 rx_dv(* MARK_DEBUG="true" *)output    [7:0]    e10_100_rxd    //ethernet 10/100 rxd);reg  [15:0]           rx_cnt        ;   //write fifo counter
reg                   rx_wren       ;   //write fifo wren
reg  [7:0]            rx_wdata      ;   //write fifo data
reg  [15:0]           rx_data_cnt   ;   //read fifo counter
reg                   rx_rden       ;   //read fifo rden
wire [7:0]            rx_rdata      ;   //read fifo data
reg  [3:0]            rxd_high      ;   //rxd high 4 bit
reg  [3:0]            rxd_low       ;   //rxd low 4 bit(* MARK_DEBUG="true" *)reg                   gmii_rx_dv_d0 ;
(* MARK_DEBUG="true" *)reg                   gmii_rx_dv_d1 ;
reg                   gmii_rx_dv_d2 ;reg  [15:0]           pack_len      ;   //package length
reg  [1:0]            len_cnt       ;   //length latch counter
wire [4:0]            pack_num      ;   //length fifo usedw
reg                   rx_len_wren   ;   //length wren
reg  [15:0]           rx_len_wdata  ;   //length write data
reg                   rx_len_rden   ;   //length rden
wire [15:0]           rx_len        ;   //legnth read datalocalparam IDLE             = 4'd0 ;
localparam CHECK_FIFO       = 4'd1 ;
localparam LEN_LATCH        = 4'd2 ;
localparam REC_WAIT         = 4'd3 ;
localparam READ_FIFO        = 4'd4 ;
localparam REC_END          = 4'd5 ;reg [3:0]    state  ;
reg [3:0]    next_state ;always @(posedge clk or negedge rst_n)beginif (~rst_n)state  <=  IDLE  ;elsestate  <= next_state ;  endalways @(*)begincase(state)IDLE  : beginnext_state <= CHECK_FIFO ;endCHECK_FIFO :beginif (pack_num > 5'd0)                // if length fifo usedw > 0, means there is package in data fifonext_state <= LEN_LATCH ;else next_state <= CHECK_FIFO ;      end    LEN_LATCH:beginif (len_cnt == 2'd3)               // delay some clocknext_state <= REC_WAIT ;else next_state <= LEN_LATCH ;endREC_WAIT :next_state <= READ_FIFO ;    READ_FIFO :beginif (rx_data_cnt == pack_len - 1)   // when reach package length read endnext_state <= REC_END ;else next_state <= READ_FIFO ;end  REC_END :next_state <= IDLE ;default :next_state <= IDLE ;endcaseend  /*************************************************
write length to fifo
*************************************************/
always @(posedge clk or negedge rst_n)beginif (~rst_n)begingmii_rx_dv_d0  <= 1'b0 ;gmii_rx_dv_d1  <= 1'b0 ;gmii_rx_dv_d2  <= 1'b0 ;endelsebegingmii_rx_dv_d0  <= gmii_rx_dv  ;gmii_rx_dv_d1  <= gmii_rx_dv_d0 ;gmii_rx_dv_d2  <= gmii_rx_dv_d1 ;endend
//write rx length wren to fifo when gmii_rx_dv negedge
always @(posedge clk or negedge rst_n)beginif (~rst_n)rx_len_wren <=  1'b0 ;else if (gmii_rx_dv == 1'b0 && gmii_rx_dv_d0 == 1'b1)rx_len_wren <=  eth_100m_en | eth_10m_en  ;else rx_len_wren <=  1'b0 ;
endalways @(posedge clk or negedge rst_n)beginif (~rst_n)rx_cnt   <= 16'd0  ;//else if (eth_10m_en &  (gmii_rx_dv_d0 | gmii_rx_dv_d1))     //when 10M mode, there is one unnecessary 4 bits data need to be take outelse if (eth_10m_en &  (gmii_rx_dv | gmii_rx_dv_d0))     //when 10M mode, there is one unnecessary 4 bits data need to be take outrx_cnt   <= rx_cnt + 1'b1 ;else if (eth_100m_en & (gmii_rx_dv | gmii_rx_dv_d1))rx_cnt   <= rx_cnt + 1'b1 ;else if (state == REC_WAIT)rx_cnt   <= 16'd0  ;end//write length to fifo
always @(posedge clk or negedge rst_n)beginif (~rst_n)rx_len_wdata <= 16'd0 ;elserx_len_wdata <=  rx_cnt ;
end/*************************************************
write data to fifo
*************************************************/
always @(posedge clk or negedge rst_n)beginif (~rst_n)beginrxd_high   <= 4'd0 ;rxd_low    <= 4'd0 ;endelse if (gmii_rx_dv | gmii_rx_dv_d1)beginif (rx_cnt[0])beginrxd_high <= gmii_rxd[3:0] ;    endelsebeginrxd_low  <= gmii_rxd[3:0] ;endendelsebeginrxd_high <= 4'd0 ;rxd_low  <= 4'd0 ;endend  always @(posedge clk or negedge rst_n)beginif (~rst_n)beginrx_wren  <= 1'b0 ; rx_wdata <= 8'd0 ;endelse if (gmii_rx_dv_d1)beginif (rx_cnt[0])beginrx_wren  <= 1'b0 ;        endelsebeginrx_wdata <= {rxd_high,rxd_low} ;rx_wren  <= eth_100m_en | eth_10m_en ;      endendelsebeginrx_wren  <= 1'b0 ;  rx_wdata <= 8'd0 ;endend  /*************************************************
read length from fifo
*************************************************/
always @(posedge clk or negedge rst_n)beginif (~rst_n)rx_len_rden <=  1'b0 ;else if (state == LEN_LATCH && len_cnt == 2'd0)rx_len_rden <=  eth_100m_en | eth_10m_en  ;else rx_len_rden <=  1'b0 ;
endalways @(posedge clk or negedge rst_n)beginif (~rst_n)len_cnt <=  2'd0 ;else if (state == LEN_LATCH)len_cnt <=  len_cnt + 1'b1 ;else len_cnt <=  2'd0 ;
end
//package total length
always @(posedge clk or negedge rst_n)beginif (~rst_n)pack_len <= 16'd0 ;else if (state == REC_WAIT)pack_len <= rx_len/2 ;
end/*************************************************
read data from fifo
*************************************************/  //read data counter
always @(posedge clk or negedge rst_n)beginif (~rst_n)rx_data_cnt   <= 16'd0  ;else if (state == READ_FIFO)rx_data_cnt   <= rx_data_cnt + 1'b1 ;elserx_data_cnt   <= 16'd0  ;end//read enable
always @(posedge clk or negedge rst_n)beginif (~rst_n)rx_rden   <= 1'b0  ;else if (state == READ_FIFO)rx_rden   <= eth_100m_en | eth_10m_en  ;else rx_rden   <= 1'b0  ;end always @(posedge clk or negedge rst_n)beginif (~rst_n)e10_100_rx_dv   <= 1'b0  ;else e10_100_rx_dv   <= rx_rden  ;end  assign e10_100_rxd = rx_rdata ;eth_data_fifo rx_fifo (.clk        (clk            ),                // input wire clk.rst        (~link          ),                // input wire rst.din        (rx_wdata       ),                // input wire [7 : 0] din.wr_en      (rx_wren        ),            // input wire wr_en.rd_en      (rx_rden        ),            // input wire rd_en.dout       (rx_rdata       ),              // output wire [7 : 0] dout.full       (               ),              // output wire full.empty      (               ),            // output wire empty.data_count (               )  // output wire [11 : 0] data_count);  len_fifo rx_len_fifo(   .clk        (clk            ),                // input wire clk.rst        (~link          ),                // input wire rst.din        (rx_len_wdata   ),                // input wire [7 : 0] din.wr_en      (rx_len_wren    ),            // input wire wr_en.rd_en      (rx_len_rden    ),            // input wire rd_en.dout       (rx_len         ),              // output wire [7 : 0] dout.full       (               ),              // output wire full.empty      (               ),            // output wire empty.data_count (pack_num       )  // output wire [11 : 0] data_count);
endmodule

在发送时,也和接收数据时差不多,只不过把接收数据的处理方式反过来了。具体相关代码如下:

`timescale 1ns / 1ps
//
// Module Name:    ethernet_test
//
module gmii_tx_buffer
(input              clk,input              rst_n, input              eth_10_100m_en,      //ethernet 10M/100M enableinput              link,                //ethernet link signalinput              gmii_tx_en,          //gmii tx enableinput  [7:0]       gmii_txd,            //gmii txdoutput reg         e10_100_tx_en,       //ethernet 10/100M tx enableoutput reg [7:0]   e10_100_txd          //ethernet 10/100M txd);(* MARK_DEBUG="true" *)reg  [7:0]            tx_wdata    ;      //tx data fifo write data
(* MARK_DEBUG="true" *)reg                   tx_wren     ;      //tx data fifo write enable
(* MARK_DEBUG="true" *)reg                   tx_rden     ;      //tx data fifo read enable
(* MARK_DEBUG="true" *)reg  [15:0]           tx_data_cnt ;      //tx data counter
(* MARK_DEBUG="true" *)wire [7:0]            tx_rdata    ;      //tx fifo read datareg  [16:0]           pack_len    ;      //package length
reg                   tx_en       ;      //tx enable
reg  [3:0]            txd_high    ;      //high 4 bits
reg  [3:0]            txd_low     ;      //low 4 bitsreg                   tx_en_d0    ;
reg                   tx_en_d1    ;reg   [15:0]          tx_len_cnt    ;    //tx length counter
reg                   gmii_tx_en_d0 ;
reg   [1:0]           len_cnt       ;    //length latch counter
wire  [4:0]           pack_num      ;    //length fifo usedw
reg                   tx_len_wren   ;    //length fifo wren
reg                   tx_len_rden   ;    //length fifo rden
wire  [15:0]          tx_len_wdata  ;    //length fifo write data
wire  [15:0]          tx_len        ;    //length fifo read datalocalparam IDLE            = 4'd0 ;
localparam CHECK_FIFO      = 4'd1 ;
localparam LEN_LATCH       = 4'd2 ;
localparam SEND_WAIT       = 4'd3 ;
localparam SEND            = 4'd4 ;
localparam SEND_WAIT_1     = 4'd5 ;
localparam SEND_END        = 4'd6 ;reg [3:0]    state  ;
reg [3:0]    next_state ;always @(posedge clk or negedge rst_n)beginif (~rst_n)state  <=  IDLE  ;elsestate  <= next_state ;  endalways @(*)begincase(state)IDLE  :        beginnext_state <= CHECK_FIFO ;endCHECK_FIFO :   beginif (pack_num > 5'd0)                  //check length fifo, if usedw > 0 ,there is a package in data fifonext_state <= LEN_LATCH ;else next_state <= CHECK_FIFO ;        end    LEN_LATCH:     beginif (len_cnt == 2'd3)                  //wait for read length fifo datanext_state <= SEND_WAIT ;else next_state <= LEN_LATCH ;endSEND_WAIT :    next_state <= SEND ;SEND :         beginif (tx_data_cnt == pack_len - 1)      //read data fifo and send outnext_state <= SEND_WAIT_1 ;else next_state <= SEND ;end  SEND_WAIT_1 :   beginif (tx_data_cnt == pack_len + 1)      //wait some clock for data latchnext_state <= SEND_END ;else next_state <= SEND_WAIT_1 ;end   SEND_END :    next_state <= IDLE ;default :next_state <= IDLE ;endcaseend
/*************************************************
write length to tx_len_fifo
*************************************************/
always @(posedge clk or negedge rst_n)beginif (~rst_n)gmii_tx_en_d0 <= 1'b0 ;elsegmii_tx_en_d0 <=  gmii_tx_en  ;
end
//write tx length to fifo when gmii_tx_en negedge
always @(posedge clk or negedge rst_n)beginif (~rst_n)tx_len_wren <=  1'b0 ;else if (gmii_tx_en == 1'b0 && gmii_tx_en_d0 == 1'b1)tx_len_wren <=  eth_10_100m_en  ;else tx_len_wren <=  1'b0 ;
end
//calculate tx length
always @(posedge clk or negedge rst_n)beginif (~rst_n)tx_len_cnt <= 16'd0 ;else if (gmii_tx_en)tx_len_cnt <=  tx_len_cnt + 1'b1  ;else if (tx_len_wren)tx_len_cnt <= 16'd0 ;
endassign tx_len_wdata = tx_len_cnt ;     //write length data /*************************************************
read length from tx_len_fifo
*************************************************/
always @(posedge clk or negedge rst_n)beginif (~rst_n)tx_len_rden <=  1'b0 ;else if (state == LEN_LATCH && len_cnt == 2'd0)tx_len_rden <=  eth_10_100m_en  ;else tx_len_rden <=  1'b0 ;
endalways @(posedge clk or negedge rst_n)beginif (~rst_n)len_cnt <=  2'd0 ;else if (state == LEN_LATCH)len_cnt <=  len_cnt + 1'b1 ;else len_cnt <=  2'd0 ;
end
//package total length
always @(posedge clk or negedge rst_n)beginif (~rst_n)pack_len <= 17'd0 ;else if (state == SEND_WAIT)pack_len <= 2*(tx_len) ;
end
//write data to tx_fifo
always @(posedge clk or negedge rst_n)beginif (~rst_n)begintx_wren   <= 1'b0 ;tx_wdata  <= 8'd0 ;endelsebegintx_wren   <= gmii_tx_en & eth_10_100m_en ;tx_wdata  <= gmii_txd ;endend  /*************************************************
read tx_fifo
*************************************************/
always @(posedge clk or negedge rst_n)beginif (~rst_n)tx_data_cnt   <= 16'd0  ;else if (state == SEND || state == SEND_WAIT_1)tx_data_cnt   <= tx_data_cnt + 1'b1 ;else tx_data_cnt   <= 16'd0  ;end
//read data enable
always @(posedge clk or negedge rst_n)beginif (~rst_n)tx_rden   <= 1'b0  ;else if (state == SEND)tx_rden   <= ~tx_data_cnt[0] & eth_10_100m_en ;else tx_rden   <= 1'b0  ;end
//gmii tx enable
always @(posedge clk or negedge rst_n)beginif (~rst_n)tx_en   <= 1'b0  ;else if (state == SEND)tx_en   <= 1'b1 ;else tx_en   <= 1'b0  ;endalways @(posedge clk or negedge rst_n)beginif (~rst_n)begintx_en_d0   <= 1'b0  ;tx_en_d1   <= 1'b0  ;endelsebegintx_en_d0   <= tx_en ;tx_en_d1   <= tx_en_d0 ;endendalways @(posedge clk or negedge rst_n)beginif (~rst_n)begintxd_high <= 4'd0 ;txd_low  <= 4'd0 ;endelsebeginif (tx_data_cnt[0])txd_high   <= tx_rdata[7:4]  ;else txd_low   <= tx_rdata[3:0]  ;endend  //ethernet 10/100M tx enable
always @(posedge clk or negedge rst_n)beginif (~rst_n)e10_100_tx_en   <= 1'b0  ;elsee10_100_tx_en   <= tx_en_d1 ;endalways @(posedge clk or negedge rst_n)beginif (~rst_n)e10_100_txd   <= 8'd0  ;else if (tx_data_cnt[0])e10_100_txd   <= {txd_low[3:0],txd_low[3:0]} ;elsee10_100_txd   <= {txd_high[3:0],txd_high[3:0]} ;end eth_data_fifo tx_fifo (.clk        (clk            ),                // input wire clk.rst        (~link          ),                // input wire rst.din        (tx_wdata       ),                // input wire [7 : 0] din.wr_en      (tx_wren        ),            // input wire wr_en.rd_en      (tx_rden        ),            // input wire rd_en.dout       (tx_rdata       ),              // output wire [7 : 0] dout.full       (               ),              // output wire full.empty      (               ),            // output wire empty.data_count (               )  // output wire [11 : 0] data_count);  len_fifo tx_len_fifo(    .clk        (clk            ),                // input wire clk.rst        (~link          ),                // input wire rst.din        (tx_len_wdata   ),                // input wire [7 : 0] din.wr_en      (tx_len_wren    ),            // input wire wr_en.rd_en      (tx_len_rden    ),            // input wire rd_en.dout       (tx_len         ),              // output wire [7 : 0] dout.full       (               ),              // output wire full.empty      (               ),            // output wire empty.data_count (pack_num       )  // output wire [11 : 0] data_count);  endmodule

RGMII自适应网络数据的处理方式相关推荐

  1. Arduino ESP32 获取网络数据(HTTP POST方式)

    Arduino ESP32 获取网络数据(HTTP POST方式) 相关篇<Arduino ESP32 获取网络数据(HTTP GET方式)> <Arduino ESP32 获取网络 ...

  2. Arduino ESP32 获取网络数据(HTTP GET方式)

    Arduino ESP32 获取网络数据(HTTP GET方式) 相关篇<Arduino ESP32 获取网络数据(HTTP POST方式)> <Arduino ESP32 获取网络 ...

  3. android—获取网络数据

    取网络数据主要靠发交易(或者说请求,接口等),而这些交易由java中的网络通信,HttpURLConnection和HttpClient实现,以下是具体例子. 大家都知道,网络通信,发送请求有两种方式 ...

  4. android网络请求分析工具,android网络数据请求

    网络数据请求在android中应用很广泛,也很重要,所以我记录了上课讲的获取数据: 大家都知道,网络通信,发送请求有两种方式,GET和POST,这里也不例外. 1.HttpURLConnection的 ...

  5. Android网络之数据解析----SAX方式解析XML数据

    ​[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...

  6. 网络——提交表单数据(post方式)

    [0]README 1) 本文文字描述 转自 core java volume 2 , 旨在理解 网络--提交表单数据 的基础知识 : 2) for source code, please visit ...

  7. 互联网协议 — Ethernet — 网络数据报文的传输方式

    目录 文章目录 目录 网络数据包的传输方式 网络数据包的传输方式 单播(Unicast):在发送者和接收者之间实现点对点网络连接.如果发送者同时给多个的接收者传输相同的数据,也必须相应的复制多份相同的 ...

  8. Linux网络数据包的揭秘以及常见的调优方式总结

    Linux网络数据包的揭秘以及常见的调优方式总结 (网易游戏运维平台) 关注我们,获一手游戏运维方案 lott 网易游戏业务 SRE, 专注于业务运维的质量和效率 , 喜欢研究 Linux 系统原理. ...

  9. 甚小孔径终端(VSAT)卫星网络拓扑结构及接入方式

    甚小孔径终端(VSAT)卫星网络拓扑结构及接入方式 文章目录 甚小孔径终端(VSAT)卫星网络拓扑结构及接入方式 前言 一.VSAT网络类型 1.星型拓扑结构网络 2.网状拓扑结构网络 二.VSAT网 ...

  10. Packet Chasing:通过缓存侧信道监视网络数据包

    摘要 本文介绍了一种对网络的攻击–Packet Chasing,这种攻击不需要访问网络,无论接收数据包的进程的特权级别如何,都能发挥作用.一个间谍进程可以很容易地探测和发现网络驱动程序使用的每个缓冲区 ...

最新文章

  1. 阿里某员工:发完年终奖后就离职,工作让我心力交瘁
  2. 简单理解:同步、异步、阻塞、非阻塞
  3. CodeForces - 487B Strip(线段树+dp+二分)
  4. Java JNI初探
  5. 服务器性能考察指标,服务器性能考察指标
  6. “让天下没有难开的店”,宣言来自无人车公司AutoX
  7. POJ 4047 Garden 线段树 区间更新
  8. FFmpeg使用教程
  9. 电量分析 —— 优化耗电
  10. java实现时间轮定时器_基于侵入式链表的时间轮定时器实现
  11. 关于SSDP协议的基础知识
  12. 9.1 Servlet容器实例
  13. 浅谈(零火)智能开关和(单火)智能开关的工作原理和优势区别
  14. CUDA RuntimeError问题
  15. python 操作word页眉表格_pythondocx读写word文档:插入图片和表格,设置表格样式、章节、页眉、页脚等,Pythondocx,Word...
  16. 二叉树的自下而上、从右到左的层次遍历算法实现
  17. CSharp中的集合与字典:不同数据量的内存占用情况
  18. Vue 艺术字体下载、设置
  19. 16年就火起来的VR技术,为什么还没有崛起?
  20. 微信刷脸支付设置及关闭方法,看看你的脸都授权了哪些商户,他们都能获得你的信息!

热门文章

  1. CMMB手机电视入网咋就这么难?
  2. Python网络爬虫实战-李强强-专题视频课程
  3. 支持android11的画质修改器,pubgtool画质修改器
  4. 转:读“DataBase Sharding at Netlog”,看DataBase Scale Out
  5. HENKAKU!PSV(Vita)编程小白探索笔记(一)信息收集篇
  6. 计算机蓝屏代码0x0000007b,开机出现蓝屏代码0X0000007B原因分析及解决方法
  7. 最新抖音下载无水印视频
  8. IP地址物理位置查询
  9. 论文笔记 ACL 2020|Exploring Interpretability in Event Extraction: Multitask Learning of a Neural Event C
  10. 微信朋友圈 腾讯服务器,朋友圈@微信能得一面红旗?腾讯服务器一度宕机