首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

不同的AXI总线卷积加速模块5

不同的AXI总线卷积加速模块5

本帖最后由 look_w 于 2017-10-20 21:54 编辑

// 写响应有效。为高指示响应数据有效        // Write response valid. This signal indicates that the channel    // is signaling a valid write response.        output wire  S_AXI_BVALID,        // 写响应准备。为高表示主设备空闲,准备接收写响应;为低表示主设备忙。        // Response ready. This signal indicates that the master    // can accept a write response.        input wire  S_AXI_BREADY,        //         // 读地址。读地址给出突发数据传输的第一个传输地址。        // Read address (issued by master, acceped by Slave)        input wire [C_S_AXI_ADDR_WIDTH-1 : 0] S_AXI_ARADDR,        // 保护类型,建议值为000。        // Protection type. This signal indicates the privilege    // and security level of the transaction, and whether the    // transaction is a data access or an instruction access.        input wire [2 : 0] S_AXI_ARPROT,        //         // Read address valid. This signal indicates that the channel    // is signaling valid read address and control information.        input wire  S_AXI_ARVALID,        // 读地址准备信号。为高表示从设备空闲,准备接收地址;为低表示从设备忙。        // Read address ready. This signal indicates that the slave is    // ready to accept an address and associated control signals.        output wire  S_AXI_ARREADY,        // Read data (issued by slave)        output wire [C_S_AXI_DATA_WIDTH-1 : 0] S_AXI_RDATA,        // Read response. This signal indicates the status of the            // read transfer.        output wire [1 : 0] S_AXI_RRESP,        // Read valid. This signal indicates that the channel is            // signaling the required read data.        output wire  S_AXI_RVALID,        // Read ready. This signal indicates that the master can            // accept the read data and response information.        input wire  S_AXI_RREADY    );    // AXI4LITE signals    reg [C_S_AXI_ADDR_WIDTH-1 : 0]  axi_awaddr;    reg     axi_awready;    reg     axi_wready;    reg [1 : 0]     axi_bresp;    reg     axi_bvalid;    reg [C_S_AXI_ADDR_WIDTH-1 : 0]  axi_araddr;    reg     axi_arready;    reg [C_S_AXI_DATA_WIDTH-1 : 0]  axi_rdata;    reg [1 : 0]     axi_rresp;    reg     axi_rvalid;其中最为重要的读取总线信号寻址的部分:
assign slv_reg_wren = axi_wready && S_AXI_WVALID && axi_awready && S_AXI_AWVALID;    always @( posedge S_AXI_ACLK )    begin      if ( S_AXI_ARESETN == 1'b0 )        begin          slv_reg0 <= 0;          slv_reg1 <= 0;          slv_reg2 <= 0;          slv_reg3 <= 0;          slv_reg4 <= 0;          slv_reg5 <= 0;          slv_reg6 <= 0;          slv_reg7 <= 0;          slv_reg8 <= 0;          slv_reg9 <= 0;        end       else begin        if (slv_reg_wren)          begin                  // 进行寻址                    // 地址寻址 是这么玩的                    // 当寄存器是32位的 最后就是 2位 4个Byte ADDR_LSB = 2                    // 当寄存器是64位的 最后就是 3位 8个Byte ADDR_LSB = 3                    // OPT_MEM_ADDR_BITS 用来寻址寄存器 这里选了十个寄存器 所以这里就是4位            case ( axi_awaddr[ADDR_LSB+OPT_MEM_ADDR_BITS:ADDR_LSB] )              4'h0:                for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )                              // 只有在对应的Bit位置为1的时候才能开始读取                  if ( S_AXI_WSTRB[byte_index] == 1 ) begin                    // Respective byte enables are asserted as per write strobes                     // Slave register 0                    slv_reg0[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];                  end                4'h1:                for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )                  if ( S_AXI_WSTRB[byte_index] == 1 ) begin                    // Respective byte enables are asserted as per write strobes                     // Slave register 1                    slv_reg1[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];                  end                4'h2:                for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )                  if ( S_AXI_WSTRB[byte_index] == 1 ) begin                    // Respective byte enables are asserted as per write strobes                     // Slave register 2                    slv_reg2[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];                  end                4'h3:                for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )                  if ( S_AXI_WSTRB[byte_index] == 1 ) begin                    // Respective byte enables are asserted as per write strobes                     // Slave register 3                    slv_reg3[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];                  end                4'h4:                for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )                  if ( S_AXI_WSTRB[byte_index] == 1 ) begin                    // Respective byte enables are asserted as per write strobes                     // Slave register 4                    slv_reg4[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];                  end                4'h5:                for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )                  if ( S_AXI_WSTRB[byte_index] == 1 ) begin                    // Respective byte enables are asserted as per write strobes                     // Slave register 5                    slv_reg5[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];                  end                4'h6:                for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )                  if ( S_AXI_WSTRB[byte_index] == 1 ) begin                    // Respective byte enables are asserted as per write strobes                     // Slave register 6                    slv_reg6[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];                  end                4'h7:                for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )                  if ( S_AXI_WSTRB[byte_index] == 1 ) begin                    // Respective byte enables are asserted as per write strobes                     // Slave register 7                    slv_reg7[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];                  end                4'h8:                for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )                  if ( S_AXI_WSTRB[byte_index] == 1 ) begin                    // Respective byte enables are asserted as per write strobes                     // Slave register 8                    slv_reg8[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];                  end                4'h9:                for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 )                  if ( S_AXI_WSTRB[byte_index] == 1 ) begin                    // Respective byte enables are asserted as per write strobes                     // Slave register 9                    slv_reg9[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];                  end                default : begin                          slv_reg0 <= slv_reg0;                          slv_reg1 <= slv_reg1;                          slv_reg2 <= slv_reg2;                          slv_reg3 <= slv_reg3;                          slv_reg4 <= slv_reg4;                          slv_reg5 <= slv_reg5;                          slv_reg6 <= slv_reg6;                          slv_reg7 <= slv_reg7;                          slv_reg8 <= slv_reg8;                          slv_reg9 <= slv_reg9;                        end            endcase          end      end    end
返回列表