FPGA实现AXI4总线的读写_如何写axi4逻辑

FPGA实现AXI4总线的读写_如何写axi4逻辑

一、AXI4 接口描述

通道

信号

信号描述

全局信号

aclk

主机

全局时钟

aresetn

主机

全局复位,低有效

写通道地址与控制信号通道

M_AXI_WR_awid[3:0]

主机

写地址ID,用来标志一组写信号

M_AXI_WR_awaddr[31:0]

主机

写地址,给出一次写突发传输的写地址

M_AXI_WR_awlen[7:0]

主机

突发长度,给出突发传输的次数

M_AXI_WR_awsize[2:0]

主机

突发大小,给出每次突发传输的字节数

M_AXI_WR_awburst[1:0]

主机

突发类型

M_AXI_WR_awlock

主机

总线锁信号,可提供操作的原子性

M_AXI_WR_awcache[3:0]

主机

内存类型,表明一次传输是怎样通过系统的

M_AXI_WR_awprot[2:0]

主机

保护类型,表明一次传输的特权级及安全等级

M_AXI_WR_awqos[3:0]

主机

质量服务QoS

M_AXI_WR_awvalid

主机

有效信号,表明此通道的地址控制信号有效

M_AXI_WR_awready

从机

表明“从”可以接收地址和对应的控制信号

写通道数据通道

M_AXI_WR_wdata[63:0]

主机

写数据

M_AXI_WR_wstrb[7:0]

主机

写数据有效的字节线,用来表明哪8bits数据是有效的

M_AXI_WR_wlast

主机

表明此次传输是最后一个突发传输

M_AXI_WR_wvalid

主机

写有效,表明此次写有效

M_AXI_WR_wready

从机

表明从机可以接收写数据

写通道响应通道

M_AXI_WR_bid[3:0]

从机

写响应ID TAG

M_AXI_WR_bresp[1:0]

从机

写响应,表明写传输的状态

M_AXI_WR_bvalid

从机

写响应有效

M_AXI_WR_bready

主机

表明主机能够接收写响应

读通道地址与控制信号通道

M_AXI_RD_arid[3:0]

主机

读地址ID,用来标志一组写信号

M_AXI_RD_araddr[31:0]

主机

读地址,给出一次写突发传输的读地址

M_AXI_RD_arlen[7:0]

主机

突发长度,给出突发传输的次数

M_AXI_RD_arsize[2:0]

主机

突发大小,给出每次突发传输的字节数

M_AXI_RD_arburst[1:0]

主机

突发类型

M_AXI_RD_arlock[1:0]

主机

总线锁信号,可提供操作的原子性

M_AXI_RD_arcache[3:0]

主机

内存类型,表明一次传输是怎样通过系统的

M_AXI_RD_arprot[2:0]

主机

保护类型,表明一次传输的特权级及安全等级

M_AXI_RD_arqos[3:0]

主机

质量服务QOS

M_AXI_RD_arvalid

主机

有效信号,表明此通道的地址控制信号有效

M_AXI_RD_arready

从机

表明“从”可以接收地址和对应的控制信号

读通道数据通道

M_AXI_RD_rid[3:0]

从机

读IDtag

M_AXI_RD_rdata[63:0]

从机

读数据

M_AXI_RD_rresp[1:0]

从机

读响应,表明读传输的状态

M_AXI_RD_rlast

从机

表明读突发的最后一次传输

M_AXI_RD_rvalid

从机

表明此通道信号有效

M_AXI_RD_rready

主机

表明主机能够接收读数据和响应信息

二、地址通道的控制信号与地址描述

1、地址ID

AWID[3:0]与ARID[3:0]:对于只有一个主机从机设备,该值可设置为任意

2、地址结构

AWADDR[31:0]与ARADDR[31:0]:AXI协议是基于burst(突发)的,主机只给出突发传输的第一个字节的地址,从机必须计算突发传输后续的地址。突发传输不能跨4KB边界(防止突发跨越两个从机的边界,也限制了从机所需支持的地址自增数

3、突发长度

AWLEN[7:0]与ARLEN[7:0]:ARLEN[7:0]决定读传输的突发长度,AWLEN[7:0]决定写传输的突发长度。AXI4扩展突发长度支持INCR突发类型为1256次传输,对于其他的传输类型依然保持116次突发传输(Burst_Length=AxLEN[7:0]+1)

4、突发大小

ARSIZE[2:0],读突发传输;AWSIZE[2:0],写突发传输。

AxSIZE[2:0]

传输字节大小

3'b000

1

3'b001

2

3'b010

4

3'b011

8

3'b100

16

3'b101

32

3'b110

64

3'b111

128

5、突发类型

AWBURST[1:0]与ARBURST[1:0]:

AxBURST[1:0]

突发类型

2'b00

FIXED

2'b01

INCR

2'b10

WRAP

2'b11

Reserved

FIXED:突发传输过程中地址固定,用于FIFO访问

INCR:增量突发,传输过程中,地址递增。增加量取决AxSIZE的值

WRAP:回环突发,和增量突发类似,但会在特定高地址的边界处回到低地址处。回环突发的长度只能是2,4,8,16次传输,传输首地址和每次传输的大小对齐。最低的地址整个传输的数据大小对齐。回环边界等于(AxSIZE*AxLEN)

三、数据通道信号描述

1、WDATA与RDATA:写与读数据线信号

WSTRB:有效字节,WSTRB[n:0]对应于对应的写字节,WSTRB[n]对应WDATA[8n+7:8n],也就是对于的数据宽度的字节数是否有效。WVALID为低时,WSTRB可以为任意值,WVALID为高时,WSTRB为高的字节线必须指示有效的数据。对于一般应用,将WSTRB全部置1即可,保证全部数据有效。读通道无该信号。

2、WLAST与RLAST

写与读最后一个字节,拉高表示传输最后一个字节,也意味着传输结束

3、burst[1:0]

描述读写相应结构

burst[1:0]

00

常规访问成功

01

独占访问成功

10

从机错误

11

解码错误

四、突发写时序:

AXI4突发写可以分为7个状态,写空闲,写通道写地址等待,写通道写地址,写数据等待,写数据循环,接受写应答,写结束这7种状态。之所以划分为7个状态是为了后续写程序的状态机做准备。

7种状态

1、写空闲:等待触发突发信号

2、写通道写地址等待:准备好写地址AWADDR,然后拉高AWVALID。

3、写通道写地址:从机接受到AWVALID,发出AWREADY。

4、写数据等待:准备好数据WDATA,拉高WVALID。

5、写数据循环:从机接受WVALID,确认数据WDATA有效并且接受,发出WREADY,AXI是突发传输:循环该操作到接受到WLAST最后一个数据标志位。

6、接受写应答:接受到从机发出的BVALID,主机发出BREADY。

7、写结束:拉低未拉低的信号,进入写空闲

五、突发读时序

AXI4突发读可以分为6个状态,读空闲,读通道写地址等待,读通道写地址,读数据等待,读数据循环,读结束这6种状态。之所以划分为6个状态是为了后续写程序的状态机做准备。

6种状态

1、读空闲:等待触发突发信号。

2、读通道写地址等待:准备好写地址ARADDR,然后拉高ARVALID。

3、读通道写地址:从机接受到ARVALID,发出ARREADY。

4、读数据等待:从机准备好数据WDATA,从机拉高RVALID。

5、读数据循环:主机接受RVALID,确认数据RDATA有效并且接受,发出RREADY给从机,AXI是突发传输:循环该操作到接受到RLAST最后一个数据标志位

6、读结束:拉低未拉低的信号,进入读空闲

注:

1、读数据必须总是跟在与其数据相关联的地址之后。

2、写响应必须总是跟在与其相关联的写事务的最后出现。

六、写时序状态机

七、写时序代码

module axi4_write(
    input               clk             ,
    input               resetn          ,
    input               enable_write    ,  //写使能
    input  [31:0]       w_addr          ,  //地址
    input  [63:0]       w_data          ,  //数据
    output reg          write_done      ,  //写完成
    output reg          write_data      ,  //表示数据写入,突发模式下可用于切换数据的指示信号
    //axi4写通道地址通道
    output  [3:0]       m_axi_awid      , //写地址ID,用来标志一组写信号
    output reg[31:0]    m_axi_awaddr    ,//写地址,给出一次写突发传输的写地址 
    output [7:0]        m_axi_awlen     , //突发长度,给出突发传输的次数 
    output [2:0]        m_axi_awsize    , //突发大小,给出每次突发传输的字节数 
    output [1:0]        m_axi_awburst   , //突发类型 
    output              m_axi_awlock    , //总线锁信号,可提供操作的原子性 
    output [3:0]        m_axi_awcache   , //内存类型,表明一次传输是怎样通过系统的
    output [2:0]        m_axi_awprot    , //保护类型,表明一次传输的特权级及安全等级 
    output [3:0]        m_axi_awqos     , //质量服务QoS
    output reg          m_axi_awvalid   , //有效信号,表明此通道的地址控制信号有效 
    input               m_axi_awready   , //表明“从”可以接收地址和对应的控制信号
    //axi4写通道数据通道
    output reg[63:0]    m_axi_wdata     , //写数据 
    output [7:0]        m_axi_wstrb     , //写数据有效的字节线 
    output reg          m_axi_wlast     , //表明此次传输是最后一个突发传输
    output reg          m_axi_wvalid    , //写有效,表明此次写有效
    input               m_axi_wready    , //表明从机可以接收写数据 
    //axi4写通道应答通道 
    input [3:0]         m_axi_bid       , //写响应ID TAG
    input [1:0]         m_axi_bresp     , //写响应,表明写传输的状态
    input               m_axi_bvalid    , //写响应有效
    output reg          m_axi_bready      //表明主机能够接收写响应
    );

//*******************参数*****************************
    localparam  W_IDLEW     = 3'b001    ; //空闲等待
    localparam  W_DRIVEW    = 3'b011    ; //准备、取地址
    localparam  W_HANDS     = 3'b010    ; //握手
    localparam  W_WSTBR     = 3'b110    ; //突发
    localparam  W_WAIT      = 3'b111    ; //等待结束的信息
    localparam  W_END       = 3'b101    ; //写数据阶段

    parameter   LEN_NUM     = 1         ;
    parameter   AWID        = 0         ;
//*********内部信号******************************
    reg  [2:0]  state ,   next_state   ;
    reg         wready_over            ;
    reg  [7:0]  len                    ;

    assign  m_axi_awid    = AWID[3:0] ;    // [3:0]  //写地址ID,用来标志一组写信号  
    assign  m_axi_awlen   = LEN_NUM-1 ;    // [7:0]  //突发长度,给出突发传输的次数  
    assign  m_axi_awsize  = 3'b011    ;    // [2:0]  //突发大小,给出每次突发传输的字节数  
    assign  m_axi_awburst = 2'b10     ;    // [1:0]  //突发类型  
    assign  m_axi_awlock  = 1'b0      ;    //        //总线锁信号,可提供操作的原子性  
    assign  m_axi_awcache = 4'b0010   ;    // [3:0]  //内存类型,表明一次传输是怎样通过系统的 
    assign  m_axi_awprot  = 3'b000    ;    // [2:0]  //保护类型,表明一次传输的特权级及安全等级 
    assign  m_axi_awqos   = 4'b0000   ;    // [3:0]  //质量服务QoS 
    assign  m_axi_wstrb   = 8'hff     ;

//状态机
    always @(*) begin
        state   =   next_state    ;
    end    


    always @(posedge clk or negedge resetn) begin
        if(!resetn) begin
            wready_over<=0;
        end
        else if(state==W_IDLEW || state==W_END )
            wready_over<=0;
        else if(m_axi_wready)
            wready_over<=1;
    end
   
    always @(posedge clk or negedge resetn) begin
        if(!resetn) begin
            next_state  <=  W_IDLEW   ;
            len <=0 ;
        end
        else case(state)
                W_IDLEW :   if(enable_write) next_state <= W_DRIVEW  ;  else next_state<=W_IDLEW    ;
                W_DRIVEW:   if(m_axi_awready) begin
                                next_state <= W_HANDS ; 
                                len<=LEN_NUM-1          ; 
                            end 
                            else next_state<=W_DRIVEW   ;
                W_HANDS :   if(wready_over && len==0)
                                next_state <= W_WAIT ;  
                            else   if(wready_over ) next_state <= W_WSTBR   ;
                            else next_state<=W_HANDS  ;
                W_WSTBR :   if(len==1)       next_state <= W_WAIT ;  
                            else begin 
                                next_state <= W_WSTBR ;
                                len <=len-1           ;
                            end
                W_WAIT  :   next_state<=W_END ;  
                W_END   :   if(m_axi_bvalid)next_state <= W_IDLEW  ;  else next_state<=W_END    ;
                default :   next_state<=W_IDLEW ;
        endcase   
    end
  // 组合逻辑输出
    always @(* ) begin
        case(state)
            W_IDLEW :   begin
                            m_axi_wlast    =   0        ;
                            m_axi_awaddr   =   0        ;
                            m_axi_awvalid  =   0        ;
                            m_axi_wdata    =   0        ;
                            m_axi_wvalid   =   0        ;
                            m_axi_bready   =   0        ;
                            write_done     =   0        ;
                            write_data     =   0        ;
                    end
            W_DRIVEW:   begin
                            m_axi_wlast    =   0       ;
                            m_axi_awaddr   =   w_addr  ;
                            m_axi_awvalid  =   1       ;
                            m_axi_wdata    =   0       ;
                            m_axi_wvalid   =   0       ;
                            m_axi_bready   =   0       ;
                            write_done     =   0       ;
                            write_data     =   0       ;
                    end
            W_HANDS :   begin
                            m_axi_wlast    =   0       ;
                            m_axi_awaddr   =   0       ;
                            m_axi_awvalid  =   0       ;
                            m_axi_wdata    =   0       ;
                            m_axi_wvalid   =   0       ;
                            m_axi_bready   =   0       ;
                            write_done     =   0       ;
                            write_data     =   0       ;
                    end
            W_WSTBR :   begin
                            m_axi_wlast    =   0       ;
                            m_axi_awaddr   =   0       ;
                            m_axi_awvalid  =   0       ;
                            m_axi_wdata    =   w_data  ;
                            m_axi_wvalid   =   1       ;
                            m_axi_bready   =   0       ;
                            write_done     =   0       ;
                            write_data     =   1       ;
                    end
            W_WAIT  :   begin
                            m_axi_wlast    =   1       ;
                            m_axi_awaddr   =   0       ;
                            m_axi_awvalid  =   0       ;
                            m_axi_wdata    =   w_data  ;
                            m_axi_wvalid   =   1       ;
                            m_axi_bready   =   0       ;
                            write_done     =   1       ;
                            write_data     =   1       ;
                    end
           
            W_END   :   begin
                            m_axi_wlast    =   0       ;
                            m_axi_awaddr   =   0       ;
                            m_axi_awvalid  =   0       ;
                            m_axi_wdata    =   0       ;
                            m_axi_wvalid   =   0       ;
                            m_axi_bready   =   1       ;
                            write_done     =   0       ;
                            write_data     =   0       ;
                    end
            default :   begin
                            m_axi_wlast    =   0   ;
                            m_axi_awaddr   =   0   ;
                            m_axi_awvalid  =   0   ;
                            m_axi_wdata    =   0   ;
                            m_axi_wvalid   =   0   ;
                            m_axi_bready   =   0   ;
                            write_done     =   0   ;
                            write_data     =   0   ;
                    end
        endcase
    end
endmodule

八、读时序状态机

九、读时序代码

module axi4_read(
    input               resetn          ,//axi复位 
    input               clk             ,  //axi时钟 
    input               enable_read     ,
    output              read_data       ,
    output              read_done       ,
    input       [31:0]  r_addr          ,
    output  reg [63:0]  r_data          ,
    //axi读通道写地址 
     output     [3:0]   m_axi_arid      , //读地址ID,用来标志一组写信号
     output reg [31:0]  m_axi_araddr    , //读地址,给出一次写突发传输的读地址
     output     [7:0]   m_axi_arlen     , //突发长度,给出突发传输的次数
     output     [2:0]   m_axi_arsize    , //突发大小,给出每次突发传输的字节数
     output     [1:0]   m_axi_arburst   , //突发类型
     output     [1:0]   m_axi_arlock    , //总线锁信号,可提供操作的原子性
     output     [3:0]   m_axi_arcache   , //内存类型,表明一次传输是怎样通过系统的 
     output     [2:0]   m_axi_arprot    , //保护类型,表明一次传输的特权级及安全等级
     output     [3:0]   m_axi_arqos     , //质量服务QOS 
     output reg         m_axi_arvalid   , //有效信号,表明此通道的地址控制信号有效 
     input              m_axi_arready   , //表明“从”可以接收地址和对应的控制信号
     //axi读通道读数据 
     input      [3:0]   m_axi_rid       , //读ID tag 
     input      [63:0]  m_axi_rdata     , //读数据 
     input      [1:0]   m_axi_rresp     , //读响应,表明读传输的状态
     input              m_axi_rlast     , //表明读突发的最后一次传输
     input              m_axi_rvalid    , //表明此通道信号有效 
     output reg         m_axi_rready      //表明主机能够接收读数据和响应信息
    
    );
//
    localparam [2:0] R_IDLER      =  3'b001   ;
    localparam [2:0] R_WAIT       =  3'b011   ;
    localparam [2:0] R_BURST      =  3'b010   ;
    localparam [2:0] R_END        =  3'b110   ;

    parameter  ARID   = 0    ;
    parameter  RD_LEN = 1    ;
//
    reg [2:0] state , next_state    ;
    reg          rvalid_over    ;
//    
    assign m_axi_arid      = ARID[3:0]      ;//地址id 
    assign m_axi_arlen     = RD_LEN-32'd1   ;//突发长度
    assign m_axi_arsize    = 3'b011         ;//表示AXI总线每个数据宽度是8字节,64位 
    assign m_axi_arburst   = 2'b01          ;//地址递增方式传输
    assign m_axi_arlock    = 1'b0           ;
    assign m_axi_arcache   = 4'b0010        ; 
    assign m_axi_arprot    = 3'b000         ;
    assign m_axi_arqos     = 4'b0000        ;

    assign read_data       =  m_axi_rvalid  ;
    assign read_done       = m_axi_rlast    ;
//axi读状态机
    always @(*) begin
        state   =   next_state  ;
    end
    //
    always @(posedge clk  or negedge resetn) begin
        if(!resetn) begin
            rvalid_over <=0  ;
        end 
        else if(state==R_IDLER) begin
            rvalid_over <=0  ;
        end
        else if(m_axi_rvalid)begin
            rvalid_over <= 1 ;
        end
    end

    always @(posedge clk or negedge resetn) begin
        if(!resetn)
            next_state <= R_IDLER;
        else    case(state)
                    R_IDLER  :  if(enable_read) next_state <= R_WAIT ;else next_state<=R_IDLER   ; 
                    R_WAIT   :  if(m_axi_arready) next_state<=R_BURST  ;else next_state<=R_WAIT  ;  
                    R_BURST  :  if(m_axi_rlast)  next_state<=R_END    ;else next_state  <=  R_BURST ;
                    R_END    :  if(rvalid_over) next_state<=R_IDLER;else next_state<=R_END ;  
                    default  :  next_state<=R_IDLER ;
        endcase
    end
    //
    always @(*) begin
        case(state)
            R_IDLER  :  begin
                            m_axi_araddr  = 0       ;  
                            m_axi_arvalid = 0       ;  
                            m_axi_rready  = 0       ;  
                            r_data        = 0       ;  
                        end 
            R_WAIT   :  begin
                            m_axi_araddr  = r_addr      ;  
                            m_axi_arvalid = 1           ;  
                            m_axi_rready  = 0           ;  
                            r_data        = 0           ;    
                        end             
            R_BURST  :  begin
                            m_axi_araddr  = 0           ;  
                            m_axi_arvalid = 0           ;  
                            m_axi_rready  = 1           ;  
                            r_data        = m_axi_rdata ;      
                        end   
            R_END    :  begin
                            m_axi_araddr  = 0           ;  
                            m_axi_arvalid = 0           ;  
                            m_axi_rready  = 1           ;  
                            r_data        = 0           ;     
                        end 
            default  :  begin
                            m_axi_araddr  = 0           ;  
                            m_axi_arvalid = 0           ;  
                            m_axi_rready  = 0           ;  
                            r_data        = 0           ;     
                        end 
        endcase
    end

endmodule

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

贪吃蛇身子改进加贪吃蛇向右移动

1. 蛇移动的思想&#xff1a; 其实就是删除头节点 &#xff0c;增加尾节点&#xff1b;一句代码搞定 struct Snake *p; p head; head head -> next; free(p) 防止造成多的空间节点 2.增加尾节点代码思想&#xff1a; 2.1 .开辟new 节点的空间 struct Snake *new (stru…

每日OJ题_DFS回溯剪枝①_力扣46. 全排列(回溯算法简介)

目录 回溯算法简介 力扣46. 全排列 解析代码 回溯算法简介 回溯算法是一种经典的递归算法&#xff0c;通常⽤于解决组合问题、排列问题和搜索问题等。 回溯算法的基本思想&#xff1a;从一个初始状态开始&#xff0c;按照⼀定的规则向前搜索&#xff0c;当搜索到某个状态无…

Quarto Dashboards 教程 3:Dashboard Data Display

「写在前面」 学习一个软件最好的方法就是啃它的官方文档。本着自己学习、分享他人的态度&#xff0c;分享官方文档的中文教程。软件可能随时更新&#xff0c;建议配合官方文档一起阅读。推荐先按顺序阅读往期内容&#xff1a; 1.quarto 教程 1&#xff1a;Hello, Quarto 2.qu…

耐酸碱腐蚀PFA冷凝回流装置进口透明聚四氟材质PFA梨形漏斗特氟龙圆底烧瓶

PFA分液漏斗&#xff1a;也叫特氟龙分液漏斗、特氟龙梨型分液漏斗。 规格参考&#xff1a;125ml、250ml、500ml、1000ml 其主要特性有&#xff1a; 1.内壁对溶剂无粘贴性和吸附&#xff0c;可完全排空&#xff0c;分界面清晰可见&#xff1b; 2.密封性好&#xff0c;可防止…

excel文件导入dbeaver中文乱码

1.将excel文件进行另存为&#xff0c;保存类型选择【CSV】 2.选择【工具】–>【web选项】–> 【编码】–> 【简体中文&#xff08;GB18030&#xff09;】 3.在DBeaver进行数据导入 直接导入应该就可以&#xff0c;如果不行的话按下面处理。 选择【导入数据——选择cs…

云原生Kubernetes: K8S 1.29版本 部署Nexus

目录 一、实验 1.环境 2.搭建NFS 3. K8S 1.29版本 部署Nexus 二、问题 1.volumeMode有哪几种模式 一、实验 1.环境 &#xff08;1&#xff09;主机 表1 主机 主机架构版本IP备注masterK8S master节点1.29.0192.168.204.8 node1K8S node节点1.29.0192.168.204.9node2K…

Java毕业设计 基于SpringBoot vue养老院管理系统 微信小程序

Java毕业设计 基于SpringBoot vue养老院管理系统 微信小程序 SpringBoot 养老院管理系统 功能介绍 小程序 护工登录注册 忘记密码 护工信息维护 首页 图片轮播 床位调动申请 床位展示 床位详情 床位分配 房间展示 公告信息 公告详情 健康信息 请假申请 离职申请 后台管理 登…

09.JAVAEE之网络初识

1.网络 单机时代 >局域网时代 >广域网时代 >移动互联网时代 1.1 局域网LAN 局域网&#xff0c;即 Local Area Network&#xff0c;简称LAN。 Local 即标识了局域网是本地&#xff0c;局部组建的一种私有网络。 局域网内的主机之间能方便的进行网络通信&#xff0…

有哪些人工智能/数据分析领域可以考取的证书?

一、TensorFlow谷歌开发者认证 TensorFlow面向学生、开发者、数据科学家等人群&#xff0c;帮助他们展示自己在用 TensorFlow 构建、训练模型的过程中所学到的实用机器学习技能。 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; TensorFlow 的产品总监 …

抖音智能运营系统源码

这是一个一站式服务的抖音智能运营系统&#xff0c;旨在提升内容创作者和营销人员的工作效率。它是一个综合性的在线服务平台&#xff0c;专为抖音内容创作者和营销人员设计。系统基于高性能、可扩展性强的ThinkPHP框架&#xff0c;整合了视频处理、数据分析、文案生成与配音等…

Redis网络部分相关的结构体2 和 绑定回调函数细节

目录 1. struct connection ConnectionType属性 创建connection 2. struct client 3. 绑定客户端回调函数的流程 3.1. 读事件回调函数的设置 3.2. 写事件回调函数的设置 3.3. connSocketEventHandler函数 3.4. Redis5版本的设置回调函数 3.5. 个人的一些想法&#xf…

2024贵州康博会|特色健康食品展|医药展|医疗器械展会

2024 中国(贵州)大健康产业博览会2024 特色食品(农产品、水、饮料)暨第22届医药及医疗器械、设备展览会邀请函 时间:2024 年 9 月 26 日 -28 日(共三天) 地点:贵阳国际会议展览中心 &#xff08;观山湖区&#xff09; 主办单位: 贵州省天然饮用水行业协会 贵州省大健康产业…

diskMirror docker 使用容器部署 diskMirror 服务器!!!

Welcome to diskMirror-docker 获取项目 这个项目是 diskMirror-spring-boot 镜像版本的项目&#xff0c;您可以使用下面的命令将此项目编译为一个镜像&#xff01; # 进入到您下载的源码包目录 cd diskMirror-docker# 点击脚本来进行版本的设置以及对应版本的下载 设置 和 编…

FastGPT编译前端界面,并将前端界面映射到Docker容器中

建议在linux系统下编译 1、克隆代码 git clone https://github.com/labring/FastGPT 2、进入FastGPT目录&#xff0c;执行 npm install 3、进入projects/app目录&#xff0c;执行 npm run dev 此时会自动下载依赖包&#xff0c;这里如果执行npm install的话&#xff0c;…

IDEA2024最新版的激活与安装-保姆级教学

目录 一、idea 介绍 二、官网下载 2.1 进入官网&#xff0c;下载zip绿色版即可 2.2 输入网址下载jetbra.zip 2.3 执行idea/soft/scripts/install-allusers.vbs文件&#xff08;根据自己安装路径改变&#xff09; 2.4 启动idea/soft/bin/idea64.exe 将事先复制好的码复制进去…

MATLAB线性函数拟合并预测

线性函数拟合&#xff0c;由线性函数很好描述的一个数集,也就是说如果我们所考虑的数据是以y(x)的形式给出&#xff0c;并且其中f(x)满足: 要求得 m 和b的值&#xff0c;我们可以使用一个称为 polyii(x,y,n)的 MATLAB 函数&#xff0c;其中n是我们要 MATLAB 求出的多项式的次数…

Ribbon负载均衡的两种方案

1.服务端负载均衡 在消费者和服务提供方中间使用独立的代理方式进行负载&#xff0c;有硬件的&#xff08;比如 F5&#xff09;&#xff0c;也有软件的&#xff08;比如 Nginx&#xff0c;openResty&#xff09; 例如Nginx&#xff0c;通过Nginx进行负载均衡&#xff0c;先发送…

李沐66_使用注意力机制的seq2seq——自学笔记

加入注意力 1.编码器对每次词的输出作为key和value 2.解码器RNN对上一个词的输出是query 3.注意力的输出和下一个词的词嵌入合并进入RNN 一个带有Bahdanau注意力的循环神经网络编码器-解码器模型 总结 1.seq2seq通过隐状态在编码器和解码器中传递信息 2.注意力机制可以根…

.NET 个人博客-添加RSS订阅功能

个人博客-添加RSS订阅功能 前言 个人博客系列已经完成了 留言板文章归档推荐文章优化推荐文章排序 博客地址 然后博客开源的原作者也是百忙之中添加了一个名为RSS订阅的功能&#xff0c;那么我就来简述一下这个功能是干嘛的&#xff0c;然后照葫芦画瓢实现一下。 RSS简述…

php代码比对工具优化版

下载地址&#xff1a;php代码比对工具优化版.zip 一款强大且专业的文件对比工具(php代码比对)&#xff0c;用户可以直接在线进行两个或多个文件的差异对比&#xff0c;支持用户进行多种格式的问价对比&#xff0c;用户可以在这里轻松查找出相同会不同之处&#xff0c;支持用户…