xilinx fpga ddr mig axi

news2024/11/27 18:35:46

硬件

参考:
https://zhuanlan.zhihu.com/p/97491454
https://blog.csdn.net/qq_22222449/article/details/106492469
https://zhuanlan.zhihu.com/p/26327347
https://zhuanlan.zhihu.com/p/582524766
包括野火、正点原子的资料

一片内存是 1Gbit 128MByte 16bit DDR3,也就是下图里的 64Meg x 16,mig 里要选 …64M16…,这个关系到地址线的个数,下图中同容量不同位宽的内存芯片的 ‘… addressing’ 部分是有不同的,有的少有的多。在硬件上只要连 A0-A12 就行了,除非是要兼容更大的内存

行地址(row addr)总线为 A0-A12,行地址位宽为 13 位 , 行地址数为 8192(213)(8K) 行,列地址(column addr)为 A0-A9,位宽为 10 位 , 列地址数为1024(210)(1K)列,单个 Bank 中包含的存储单元个数为行地址数(8192)与列地址数(1024)相乘,8K×1K=8M(8Meg);“16”表示数据位宽,即每个存储单元存储数据的 bit 数;8Meg 与 16 相乘表示单个 Bank 中可存储的 Bit 数;“8 banks”表示一片 SDRAM 中包含的 Bank 个数,此 DDR3 SDRAM 芯片包含 8 个 Bank;由此可得 DDR3 SDRAM 芯片的存储容量为:1024MBit (8Meg×16×8 banks)

如果是 256MByte 16bit 位宽的内存,banks 同样为 8 的话,那就是 16Meg(地址数) x 16bit x 8 banks,Row addr 就有 14 位,那么 mig 里就选 …128M16…
在这里插入图片描述假设 mig ip 里的 Memory Part 选择 MT41J128M16XX-125,结尾数字里的意思:
Data Rate 是传输频率,电脑上的 DDR3 1866 就是这个意思
-125 所支持的最小时钟周期 tCK = 1.25ns,对应芯片支持的最大 IO 时钟频率为 800MHz,数据传输频率就是 1600MHz。传输频率 x 位宽 = 传输速率,MT41J128M16XX-125 的位宽是 16bit,最大传输速率就是 1600MHz x 16bit(2Byte) = 3200MB = 3.125GiB
在这里插入图片描述
在这里插入图片描述

下图是各频率之间的关系,100MHz 核心频率 = 400MHz IO 频率 = 800MHz 传输频率。mig ip 传输 400MHz IO 频率给 ddr3,ddr3 内部获得 100MHz 的核心频率
在这里插入图片描述

MIG ip 配置

下图:
勾选了 AXI
在这里插入图片描述在这里插入图片描述
下图:
Clock Period:400MHz,是给 DDR3 的 IO 时钟,一片内存的传输速率就是 800MHz * 16bit(2Byte) = 1600MB = 1.5625GiByte,两片就是 3200MB = 3.125GiByte
PHY to Controller Clock Ratio:mig ip 反给用户的时钟,因为之前勾选了 axi,也就是 axi 给用户用的时钟,Clock Period 除以 4,所以 axi 的时钟是 100MHz
Data Width:两片内存就是 32bit
Number of Bank Machines: 不是 banks 数,是一种 bank 控制策略,保持默认
在这里插入图片描述下图:
Data Width:AXI 的位宽,AXI 时钟(100MHz) x AXI 的位宽(32Byte) = 3200MByte,这样才可能跑满两片 ddr3 的速率
在这里插入图片描述

下图:
Input Clock Period:用户给 mig ip 的时钟,用 mmcm 传给 mig
在这里插入图片描述

下图:
Reference Clock:前一步 mig ip 的时钟输入选 200MHz 这里才能选 Use System Clock,这样 ip 实例化的时候就可以少一个 ref_clk 的接口
Internal Vref:
使用内部 Vref。Vref 是 FPGA 的 IO Bank 参考电压引脚,一般要外接参考电压,但是这里若传输速率小于等于 800MHz 就可以不用外接,转而使用内部 Vref,然后该 Vref 引脚就可以空出来给用户使用,这里 mig 需要两个 IO Bank,就能空出两个 Vref 引脚,然后就可以把这两个 Vref 连到 ddr 的地址线上。如果 ddr 的 IO 已经连了 Vref 就必选了,不然 IO Bank 没参考电压
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
下图:
先读取 .ucf,再校验

在这里插入图片描述
ddr3.ucf:

# clock, reset
NET "ddr3_ck_p[0]" LOC = "R3";
NET "ddr3_ck_n[0]" LOC = "R2";
NET "ddr3_reset_n" LOC = "W6";

# global control
NET "ddr3_cs_n[0]" LOC = "AB3";
NET "ddr3_cke[0]"  LOC = "T5";
NET "ddr3_odt[0]"  LOC = "U5";
NET "ddr3_we_n"    LOC = "AA1";

# address control
NET "ddr3_ba[0]" LOC = "AA3";
NET "ddr3_ba[1]" LOC = "Y3";
NET "ddr3_ba[2]" LOC = "Y4";
NET "ddr3_ras_n" LOC = "V4";
NET "ddr3_cas_n" LOC = "W4";

# address
NET "ddr3_addr[0]"  LOC = "AA4";
NET "ddr3_addr[1]"  LOC = "AB2";
NET "ddr3_addr[2]"  LOC = "AA5";
NET "ddr3_addr[3]"  LOC = "AB5";
NET "ddr3_addr[4]"  LOC = "AB1";
NET "ddr3_addr[5]"  LOC = "U3";
NET "ddr3_addr[6]"  LOC = "W1";
NET "ddr3_addr[7]"  LOC = "T1";
NET "ddr3_addr[8]"  LOC = "V2";
NET "ddr3_addr[9]"  LOC = "U2";
NET "ddr3_addr[10]" LOC = "Y1";
NET "ddr3_addr[11]" LOC = "W2";
NET "ddr3_addr[12]" LOC = "Y2";
NET "ddr3_addr[13]" LOC = "U1";

# data control
NET "ddr3_dqs_p[0]" LOC = "E1";
NET "ddr3_dqs_p[1]" LOC = "K2";
NET "ddr3_dqs_p[2]" LOC = "M1";
NET "ddr3_dqs_p[3]" LOC = "P5";
NET "ddr3_dqs_n[0]" LOC = "D1";
NET "ddr3_dqs_n[1]" LOC = "J2";
NET "ddr3_dqs_n[2]" LOC = "L1";
NET "ddr3_dqs_n[3]" LOC = "P4";

NET "ddr3_dm[0]" LOC = "D2";
NET "ddr3_dm[1]" LOC = "G2";
NET "ddr3_dm[2]" LOC = "M2";
NET "ddr3_dm[3]" LOC = "M5";

# data
NET "ddr3_dq[0]"  LOC = "C2";
NET "ddr3_dq[1]"  LOC = "G1";
NET "ddr3_dq[2]"  LOC = "A1";
NET "ddr3_dq[3]"  LOC = "F3";
NET "ddr3_dq[4]"  LOC = "B2";
NET "ddr3_dq[5]"  LOC = "F1";
NET "ddr3_dq[6]"  LOC = "B1";
NET "ddr3_dq[7]"  LOC = "E2";
NET "ddr3_dq[8]"  LOC = "H3";
NET "ddr3_dq[9]"  LOC = "G3";
NET "ddr3_dq[10]" LOC = "H2";
NET "ddr3_dq[11]" LOC = "H5";
NET "ddr3_dq[12]" LOC = "J1";
NET "ddr3_dq[13]" LOC = "J5";
NET "ddr3_dq[14]" LOC = "K1";
NET "ddr3_dq[15]" LOC = "H4";
NET "ddr3_dq[16]" LOC = "L4";
NET "ddr3_dq[17]" LOC = "M3";
NET "ddr3_dq[18]" LOC = "L3";
NET "ddr3_dq[19]" LOC = "J6";
NET "ddr3_dq[20]" LOC = "K3";
NET "ddr3_dq[21]" LOC = "K6";
NET "ddr3_dq[22]" LOC = "J4";
NET "ddr3_dq[23]" LOC = "L5";
NET "ddr3_dq[24]" LOC = "P1";
NET "ddr3_dq[25]" LOC = "N4";
NET "ddr3_dq[26]" LOC = "R1";
NET "ddr3_dq[27]" LOC = "N2";
NET "ddr3_dq[28]" LOC = "M6";
NET "ddr3_dq[29]" LOC = "N5";
NET "ddr3_dq[30]" LOC = "P6";
NET "ddr3_dq[31]" LOC = "P2";

在这里插入图片描述

代码

mig.v:

module mig (
    input clk,
    input rst_n,

    // ddr3
    output [13 : 0] ddr3_addr,    // output [13 : 0] ddr3_addr
    output [ 2 : 0] ddr3_ba,      // output [ 2 : 0] ddr3_ba
    output          ddr3_cas_n,   // output          ddr3_cas_n
    output          ddr3_ck_n,    // output          ddr3_ck_n
    output          ddr3_ck_p,    // output          ddr3_ck_p
    output          ddr3_cke,     // output          ddr3_cke
    output          ddr3_ras_n,   // output          ddr3_ras_n
    output          ddr3_reset_n, // output          ddr3_reset_n 
    output          ddr3_we_n,    // output          ddr3_we_n
    inout  [31 : 0] ddr3_dq,      // inout  [31 : 0] ddr3_dq
    inout  [ 3 : 0] ddr3_dqs_n,   // inout  [ 3 : 0] ddr3_dqs_n
    inout  [ 3 : 0] ddr3_dqs_p,   // inout  [ 3 : 0] ddr3_dqs_p
    output [ 0 : 0] ddr3_cs_n,    // output [ 0 : 0] ddr3_cs_n
    output [ 3 : 0] ddr3_dm,      // output [ 3 : 0] ddr3_dm
    output [ 0 : 0] ddr3_odt,     // output [ 0 : 0] ddr3_odt

    // user
    // axi
    output ui_clk,          // output ui_clk
    output ui_clk_sync_rst, // output ui_clk_sync_rst

    // read address
    input [28 : 0] s_axi_araddr,  // input [28 : 0] s_axi_araddr
    input [ 7 : 0] s_axi_arlen,   // input [ 7 : 0] s_axi_arlen
    input          s_axi_arvalid, // input          s_axi_arvalid
    output         s_axi_arready, // output         s_axi_arready

    // read data
    output [255 : 0] s_axi_rdata, // output [255 : 0] s_axi_rdata
    output          s_axi_rlast,  // output           s_axi_rlast
    input           s_axi_rready, // input            s_axi_rready
    output          s_axi_rvalid, // output           s_axi_rvalid

    // write address
    input [28 : 0] s_axi_awaddr,  // input [28 : 0] s_axi_awaddr
    input [ 7 : 0] s_axi_awlen,   // input [ 7 : 0] s_axi_awlen
    input          s_axi_awvalid, // input          s_axi_awvalid
    output         s_axi_awready, // output         s_axi_awready

    // wirte data
    input [255 : 0] s_axi_wdata, // input [255 : 0] s_axi_wdata
    input [ 31 : 0] s_axi_wstrb, // input [ 31 : 0] s_axi_wstrb
    input          s_axi_wlast,  // input           s_axi_wlast
    input          s_axi_wvalid, // input           s_axi_wvalid
    output         s_axi_wready, // output          s_axi_wready

    // write response
    output s_axi_bvalid, // output s_axi_bvalid
    input  s_axi_bready  // input  s_axi_bready
);

mig_7series_0 mig_7series_0_i (
    .sys_clk_i(clk),
    .sys_rst  (rst_n),

    // ddr3
    .ddr3_addr          (ddr3_addr),    // output [13 : 0] ddr3_addr
    .ddr3_ba            (ddr3_ba),      // output [ 2 : 0] ddr3_ba
    .ddr3_cas_n         (ddr3_cas_n),   // output          ddr3_cas_n
    .ddr3_ck_n          (ddr3_ck_n),    // output          ddr3_ck_n
    .ddr3_ck_p          (ddr3_ck_p),    // output          ddr3_ck_p
    .ddr3_cke           (ddr3_cke),     // output          ddr3_cke
    .ddr3_ras_n         (ddr3_ras_n),   // output          ddr3_ras_n
    .ddr3_reset_n       (ddr3_reset_n), // output          ddr3_reset_n
    .ddr3_we_n          (ddr3_we_n),    // output          ddr3_we_n
    .ddr3_dq            (ddr3_dq),      // inout  [31 : 0] ddr3_dq
    .ddr3_dqs_n         (ddr3_dqs_n),   // inout  [ 3 : 0] ddr3_dqs_n
    .ddr3_dqs_p         (ddr3_dqs_p),   // inout  [ 3 : 0] ddr3_dqs_p
    .init_calib_complete(),             // output          init_calib_complete
	.ddr3_cs_n          (ddr3_cs_n),    // output [ 0 : 0] ddr3_cs_n
    .ddr3_dm            (ddr3_dm),      // output [ 3 : 0] ddr3_dm
    .ddr3_odt           (ddr3_odt),     // output [ 0 : 0] ddr3_odt

    // user
    // axi
    .ui_clk         (ui_clk),          // output ui_clk
    .ui_clk_sync_rst(ui_clk_sync_rst), // output ui_clk_sync_rst
    .mmcm_locked    (),                // output mmcm_locked
    .aresetn        (rst_n),           // input  aresetn
    .app_sr_req     (0),               // input  app_sr_req
    .app_ref_req    (0),               // input  app_ref_req
    .app_zq_req     (0),               // input  app_zq_req
    .app_sr_active  (),                // output app_sr_active
    .app_ref_ack    (),                // output app_ref_ack
    .app_zq_ack     (),                // output app_zq_ack

    // read address
    .s_axi_arid   (0),             // input [ 0 : 0] s_axi_arid
    .s_axi_araddr (s_axi_araddr),  // input [28 : 0] s_axi_araddr
    .s_axi_arlen  (s_axi_arlen),   // input [ 7 : 0] s_axi_arlen
    .s_axi_arsize (5),             // input [ 2 : 0] s_axi_arsize
    .s_axi_arburst(1),             // input [ 1 : 0] s_axi_arburst
    .s_axi_arlock (0),             // input [ 0 : 0] s_axi_arlock
    .s_axi_arcache(0),             // input [ 3 : 0] s_axi_arcache
    .s_axi_arprot (0),             // input [ 2 : 0] s_axi_arprot
    .s_axi_arqos  (0),             // input [ 3 : 0] s_axi_arqos
    .s_axi_arvalid(s_axi_arvalid), // input          s_axi_arvalid
    .s_axi_arready(s_axi_arready), // output         s_axi_arready

    // read data
    .s_axi_rid   (),             // output [  0 : 0] s_axi_rid
    .s_axi_rdata (s_axi_rdata),  // output [255 : 0] s_axi_rdata
    .s_axi_rresp (),             // output [  1 : 0] s_axi_rresp
    .s_axi_rlast (s_axi_rlast),  // output           s_axi_rlast
    .s_axi_rvalid(s_axi_rvalid), // output           s_axi_rvalid
    .s_axi_rready(s_axi_rready), // input            s_axi_rready

    // write address
    .s_axi_awid   (0),             // input [ 0 : 0] s_axi_awid
    .s_axi_awaddr (s_axi_awaddr),  // input [28 : 0] s_axi_awaddr
    .s_axi_awlen  (s_axi_awlen),   // input [ 7 : 0] s_axi_awlen
    .s_axi_awsize (5),             // input [ 2 : 0] s_axi_awsize
    .s_axi_awburst(1),             // input [ 1 : 0] s_axi_awburst
    .s_axi_awlock (0),             // input [ 0 : 0] s_axi_awlock
    .s_axi_awcache(0),             // input [ 3 : 0] s_axi_awcache
    .s_axi_awprot (0),             // input [ 2 : 0] s_axi_awprot
    .s_axi_awqos  (0),             // input [ 3 : 0] s_axi_awqos
    .s_axi_awvalid(s_axi_awvalid), // input          s_axi_awvalid
    .s_axi_awready(s_axi_awready), // output         s_axi_awready

    // wirte data
    .s_axi_wdata (s_axi_wdata),  // input [255 : 0] s_axi_wdata
    .s_axi_wstrb (s_axi_wstrb),  // input [ 31 : 0] s_axi_wstrb
    .s_axi_wlast (s_axi_wlast),  // input           s_axi_wlast
    .s_axi_wvalid(s_axi_wvalid), // input           s_axi_wvalid
    .s_axi_wready(s_axi_wready), // output          s_axi_wready

    // write response
    .s_axi_bid   (),             // output [0 : 0] s_axi_bid
    .s_axi_bresp (),             // output [1 : 0] s_axi_bresp
    .s_axi_bvalid(s_axi_bvalid), // output         s_axi_bvalid
    .s_axi_bready(s_axi_bready)  // input          s_axi_bready
);

endmodule

work:

module work (
    input clk,
    input rst_n,

    // ddr3
    output [13 : 0] ddr3_addr,
    output [ 2 : 0] ddr3_ba,
    output          ddr3_cas_n,
    output          ddr3_ck_n,
    output          ddr3_ck_p,
    output          ddr3_cke,
    output          ddr3_ras_n,
    output          ddr3_reset_n,
    output          ddr3_we_n,
    inout  [31 : 0] ddr3_dq,
    inout  [ 3 : 0] ddr3_dqs_n,
    inout  [ 3 : 0] ddr3_dqs_p,
    output [ 0 : 0] ddr3_cs_n,
    output [ 3 : 0] ddr3_dm,
    output [ 0 : 0] ddr3_odt
);


// mig
wire mig_clk;

wire mig_ui_clk;
wire mig_ui_clk_sync_rst;

reg [28 : 0] mig_s_axi_araddr;
reg [ 7 : 0] mig_s_axi_arlen;
reg          mig_s_axi_arvalid;
wire         mig_s_axi_arready;

wire [255 : 0] mig_s_axi_rdata;
wire           mig_s_axi_rlast;
wire           mig_s_axi_rvalid;

reg [28 : 0] mig_s_axi_awaddr;
reg [ 7 : 0] mig_s_axi_awlen;
reg          mig_s_axi_awvalid;
wire         mig_s_axi_awready;

reg [255 : 0] mig_s_axi_wdata;
reg [ 31 : 0] mig_s_axi_wstrb;
reg           mig_s_axi_wlast;
reg           mig_s_axi_wvalid;
wire          mig_s_axi_wready;

wire mig_s_axi_bvalid;

mig mig_i (
    .clk  (mig_clk),
    .rst_n(rst_n),

    // ddr3
    .ddr3_addr          (ddr3_addr),    // output [13 : 0] ddr3_addr
    .ddr3_ba            (ddr3_ba),      // output [ 2 : 0] ddr3_ba
    .ddr3_cas_n         (ddr3_cas_n),   // output          ddr3_cas_n
    .ddr3_ck_n          (ddr3_ck_n),    // output          ddr3_ck_n
    .ddr3_ck_p          (ddr3_ck_p),    // output          ddr3_ck_p
    .ddr3_cke           (ddr3_cke),     // output          ddr3_cke
    .ddr3_ras_n         (ddr3_ras_n),   // output          ddr3_ras_n
    .ddr3_reset_n       (ddr3_reset_n), // output          ddr3_reset_n
    .ddr3_we_n          (ddr3_we_n),    // output          ddr3_we_n
    .ddr3_dq            (ddr3_dq),      // inout  [31 : 0] ddr3_dq
    .ddr3_dqs_n         (ddr3_dqs_n),   // inout  [ 3 : 0] ddr3_dqs_n
    .ddr3_dqs_p         (ddr3_dqs_p),   // inout  [ 3 : 0] ddr3_dqs_p
	.ddr3_cs_n          (ddr3_cs_n),    // output [ 0 : 0] ddr3_cs_n
    .ddr3_dm            (ddr3_dm),      // output [ 3 : 0] ddr3_dm
    .ddr3_odt           (ddr3_odt),     // output [ 0 : 0] ddr3_odt

    // user
    // axi
    .ui_clk         (mig_ui_clk),          // output ui_clk
    .ui_clk_sync_rst(mig_ui_clk_sync_rst), // output ui_clk_sync_rst

    // read address
    .s_axi_araddr (mig_s_axi_araddr),  // input [28 : 0] s_axi_araddr
    .s_axi_arlen  (mig_s_axi_arlen),   // input [ 7 : 0] s_axi_arlen
    .s_axi_arvalid(mig_s_axi_arvalid), // input          s_axi_arvalid
    .s_axi_arready(mig_s_axi_arready), // output         s_axi_arready

    // read data
    .s_axi_rdata (mig_s_axi_rdata),  // output [255 : 0] s_axi_rdata
    .s_axi_rlast (mig_s_axi_rlast),  // output           s_axi_rlast
    .s_axi_rvalid(mig_s_axi_rvalid), // output           s_axi_rvalid
    .s_axi_rready(mig_s_axi_rvalid), // input            s_axi_rready

    // write address
    .s_axi_awaddr (mig_s_axi_awaddr),  // input [28 : 0] s_axi_awaddr
    .s_axi_awlen  (mig_s_axi_awlen),   // input [ 7 : 0] s_axi_awlen
    .s_axi_awvalid(mig_s_axi_awvalid), // input          s_axi_awvalid
    .s_axi_awready(mig_s_axi_awready), // output         s_axi_awready

    // wirte data
    .s_axi_wdata (mig_s_axi_wdata),  // input [255 : 0] s_axi_wdata
    .s_axi_wstrb (mig_s_axi_wstrb),  // input [ 31 : 0] s_axi_wstrb
    .s_axi_wlast (mig_s_axi_wlast),  // input           s_axi_wlast
    .s_axi_wvalid(mig_s_axi_wvalid), // input           s_axi_wvalid
    .s_axi_wready(mig_s_axi_wready), // output          s_axi_wready

    // write response
    .s_axi_bvalid(mig_s_axi_bvalid), // output s_axi_bvalid
    .s_axi_bready(mig_s_axi_bvalid)  // input  s_axi_bready
);

// mig 读写测试
reg [255 : 0] wdata;

reg [3 : 0] step;

always @(posedge mig_ui_clk) begin                                        
    if(mig_ui_clk_sync_rst) begin
        mig_s_axi_araddr  <= 0;
        mig_s_axi_arlen   <= 0;
        mig_s_axi_arvalid <= 0;

        mig_s_axi_awaddr  <= 0;
        mig_s_axi_awlen   <= 0;
        mig_s_axi_awvalid <= 0;

        mig_s_axi_wdata  <= 0;
        mig_s_axi_wstrb  <= 0;
        mig_s_axi_wlast  <= 0;
        mig_s_axi_wvalid <= 0;

        wdata <= 0;
        step  <= 0;
    end
    else begin
        case (step)
            0: begin
                // 准备写地址
                mig_s_axi_awaddr  <= 0;
                mig_s_axi_awlen   <= 1 - 1;
                mig_s_axi_awvalid <= 1; // 写地址有效

                wdata <= wdata + 1;

                step <= step + 1;
            end

            1: begin
                // 待地址写入成功
                if (mig_s_axi_awready) begin
                    mig_s_axi_awvalid <= 0; // 写地址无效

                    // 准备写数据
                    mig_s_axi_wdata  <= wdata;
                    mig_s_axi_wstrb  <= {256{1'b1}};
                    mig_s_axi_wlast  <= 1;
                    mig_s_axi_wvalid <= 1; // 写数据有效

                    step <= step + 1;
                end
            end

            2: begin
                // 待数据写入成功
                // 只写了一次可以直接判断
                if (mig_s_axi_wready) begin
                    mig_s_axi_wlast  <= 0;
                    mig_s_axi_wvalid <= 0; // 写数据无效

                    step <= step + 1;
                end
            end

            3: begin
                // 待写响应有效
                if (mig_s_axi_bvalid) begin
                    step <= step + 1;
                end
            end

            // 至此,写入成功

            4: begin
                // 准备读地址
                mig_s_axi_araddr  <= 0;
                mig_s_axi_arlen   <= 1 - 1;
                mig_s_axi_arvalid <= 1; // 读地址有效
                step <= step + 1;
            end

            5: begin
                // 待地址写入成功
                if (mig_s_axi_arready) begin
                    mig_s_axi_arvalid <= 0; // 读地址无效
                    step <= step + 1;
                end
            end

            6: begin
                // 待数据接收
                if (mig_s_axi_rvalid) begin
                    step <= 0;
                end
            end
        endcase
    end
end

clk_wiz_0 clk_wiz_0_i (
    .clk_in1(clk),   // input clk_in1
    .resetn (rst_n), // input reset

    // user
    .clk_out1(mig_clk), // output clk_out1 200M
);

ila_0 ila_0_i (
	.clk(mig_ui_clk), // input wire clk

    .probe0(step),           // input wire [3:0]  probe0  
	.probe1(mig_s_axi_rdata) // input wire [255:0]  probe1
);

endmodule

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1170214.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【教3妹学编程-算法题】数组中两个数的最大异或值

3妹&#xff1a;“太阳当空照&#xff0c;花儿对我笑&#xff0c;小鸟说早早早&#xff0c;你为什么背上炸药包” 2哥 :3妹&#xff0c;什么事呀这么开心呀。 3妹&#xff1a;2哥你看今天的天气多好啊&#xff0c;阳光明媚、万里无云、秋高气爽&#xff0c;适合秋游。 2哥&…

成人编程先学什么?成人编程一般要学几年

成人编程先学什么&#xff1f;成人编程一般要学几年 给大家分享一款中文编程工具&#xff0c;零基础轻松学编程&#xff0c;不需英语基础&#xff0c;编程工具可下载。 这款工具不但可以连接部分硬件&#xff0c;而且可以开发大型的软件&#xff0c;向如图这个实例就是用这个…

【操作系统】多线程同步与互斥

文章目录 一. 实验目的二. 实验内容三. 实验步骤四. 实验结果五. 实验总结 一. 实验目的 &#xff08;1&#xff09;加强对进程同步和互斥的理解&#xff0c;学会使用信号量解决资源共享问题。 &#xff08;2&#xff09;熟悉Linux 进程同步原语。 &#xff08;3&#xff09;掌…

第8章_聚合函数

文章目录 1 聚合函数介绍1.1 AVG和SUM函数1.2 MIN和Max函数1.3 COUNT函数演示代码 2 GROUP BY2.1 基本使用2.2 使用多个列分组2.3 演示代码 3 HAVING3.1 基本使用3.2 WHERE和HAVING的对比3.3 演示代码 4 SELECT的执行过程4.1 查询的结构4.2 SELECT执行顺序4.3 SQL的执行原理演示…

前K个高频单词(Java详解)

一、题目描述 给定一个单词列表 words 和一个整数 k &#xff0c;返回前 k 个出现次数最多的单词。 返回的答案应该按单词出现频率由高到低排序。如果不同的单词有相同出现频率&#xff0c; 按字典顺序 排序。 示例1&#xff1a; 输入: words ["i", "love&…

curl(四)证书相关

一 证书相关 ① -k 1、客户端忽略服务端证书校验 -k | --insecure --> 单向[1]、这个选项显式地允许curl 执行不安全 的SSL连接和传输[2]、所有SSL连接都试图通过使用默认安装的CA证书捆绑包来确保安全[3]、这使得所有被认为是不安全的连接失败,除非使用-k --> 自签…

Android logd日志简介及典型案例分析

在程序开发过程中&#xff0c;日志打印属于最普遍的操作&#xff0c;是代码调试和验证过程必不可少的手段。在Android开发过程中&#xff0c;我们经常通过Log\Slog等方式写入日志&#xff0c;然后通过对应的logcat命令读取相应的日志信息。具体日志如何写入或者读出&#xff0c…

oracle查询数据库内全部的表名、列明、注释、数据类型、长度、精度等

Oracle查询数据库内全部的表名、列明、注释、数据类型、长度、精度 SELECT a.TABLE_NAME 表名, row_number() over(partition by a.TABLE_NAME order by a.COLUMN_NAME desc) 字段顺序,a.COLUMN_NAME 列名, b.COMMENTS 注释,a.DATA_TYPE 数据类型, a.DATA_LENGTH 长度,DATA_SC…

Linux高级命令(扩展)二

一、Linux下用户管理 1、用户概念以及基本作用 用户&#xff1a;指的是Linux操作系统中用于管理系统或者服务的人 一问&#xff1a;管理系统到底在管理什么&#xff1f; 答&#xff1a;Linux下一切皆文件&#xff0c;所以用户管理的是相应的文件 二问&#xff1a;如何管理…

SpringBoot集成Redis客户端

文章目录 Redis 的 Java 客户端Spring Data Redis 介绍Spring Data Redis 使用方式 Redis 的 Java 客户端 Redis 的 Java 客户端很多&#xff0c;常用的几种&#xff1a; JedisLettuceSpring Data Redis Spring Data Redis 介绍 Spring Data Redis 是 Spring 的一部分&…

跨境电商年底风控升级,测评养号如何选择稳定且纯净的IP环境?

随着年底跨境电商平台风控的升级&#xff0c;许多测评团队的账号存活率有所下降。对于自养号测评的卖家来说&#xff0c;IP的重要性不言而喻。除了设置参数阻断&#xff0c;IP的质量也直接影响到账户的稳定性和成功率。因此&#xff0c;在年底这个特殊时期&#xff0c;所有测评…

Kali Linux:网络与安全专家的终极武器

文章目录 一、Kali Linux 简介二、Kali Linux 的优势三、使用 Kali Linux 进行安全任务推荐阅读 ——《Kali Linux高级渗透测试》适读人群内容简介作者简介目录 Kali Linux&#xff1a;网络与安全专家的终极武器 Kali Linux&#xff0c;对于许多网络和安全专业人士来说&#x…

【APUE】并发 — 线程

目录 一、线程的概念 1.1 定义 1.2 POSIX 线程标准 1.3 线程标识 1.4 相关函数 1.5 一些补充 二、线程的创建、终止与取消 2.1 创建 2.2 终止 2.2.1 return 2.2.2 pthread_exit 2.3 取消 2.3.1 函数介绍 2.3.2 禁止线程被取消 2.3.3 线程取消方式 2.4 清…

第7章_单行函数

文章目录 1 函数的理解1.1 什么是函数1.2 不同DBMS函数的差异 2 数值函数2.1 基本函数2.2 角度与弧度2.3 三角函数2.4 指数函数、对数函数2.5 进制间的转换 3 字符串函数4 日期和时间函数4.1 获取日期、时间4.2 日期与时间戳的转换4.3 获取月份、星期、星期数、天数4.4 日期的操…

零代码复现-TCGA联合GEO免疫基因结合代谢基因生信套路(二)

零代码复现-TCGA联合GEO免疫基因结合代谢基因生信套路&#xff08;二&#xff09;-关键基因集的获取和生存数据准备 前面的分析中&#xff0c;下载TCGA和GEO的数据&#xff0c;并进行简单的处理&#xff0c;接下来就是相关基因集的获取和整理&#xff0c;为后期聚类和降维做准…

[ element-ui:table ] 设置table中某些行数据禁止被选中,通过selectable 定义方法解决

业务需求&#xff1a;需要做到table表格中某些行数据不能被选中&#xff0c;比如在审核一些记录数据时&#xff0c;已经被审核的数据就不能再次提交审核&#xff0c;特别是批量多选的情况&#xff0c;列表中既有已经审核的&#xff0c;也有未审核的&#xff0c;只要求选中未审核…

USB Type-C reference circuit

1.OTG功能&#xff0c;只能对负载供电&#xff0c;不能从电脑端给板子供电 2. USB TTL作为usb串口&#xff0c;可以从电脑端给板子供电 3.USB Type-C power supply,仅仅用来从USB电源得到工作电压。但是外部电源供电电压must supply 12V or greater. 4.功能完整的USB3.0 T…

​实现1个电脑打开多个微信​

实现1个电脑打开多个微信&#xff1a;1、快速双击打开微信&#xff0c;可打开多个微信。2、按住回车键&#xff0c;双击打开微信&#xff0c;并快速放开回车键即可打开多个微信。3、用命令符也可打开多个微信。4、建立一个批处理文件实现打开多个微信。 方法一&#xff1a;最简…

飞书开发学习笔记(一)-应用创建和测试

飞书开发学习笔记(一)-应用创建和测试 一.前言 现在大企业用的办公IM软件中,飞书是口碑最好的&#xff0c;不得不说&#xff0c;字节在开发产品方面&#xff0c;确实有自己独到的竞争力&#xff0c;比如说抖音、头条、飞书。在办公会议和云文档的体验上&#xff0c;其它的办公…

[JavaWeb]——过滤器filter与拦截器Interceptor的使用、执行过程、区别

&#x1f308;键盘敲烂&#xff0c;年薪30万&#x1f308; 目录 一、过滤器filter 概念介绍&#xff1a; 过滤器的使用&#xff1a; 过滤器的执行流程&#xff1a; 应用场景(登录校验)&#xff1a; 二、拦截器Interceptor 概念介绍&#xff1a; 拦截器的使用&#xff1…