APB总线详解及手撕代码

2023-11-13

本文的参考资料为官方文档AMBA™3 APB Protocol specification

文档下载地址: https://pan.baidu.com/s/1Vsj4RdyCLan6jE-quAsEuw?pwd=w5bi

提取码:w5bi

APB端口介绍

介绍总线具体握手规则之前,需要先熟悉一下APB总线端口,APB的端口如下:

大体可以分为以下三组:

系统信号:PCLK(系统时钟)、PRESETn(系统复位,低有效)

master信号:PADDR(地址信号,确定读写的地址)、PSELx(片选信号,拉出来接给搭载APB总线的slave,选中slave时,PSELx信号拉高)、PNEABLE(使能信号,在PSELx拉高一个周期后,必定拉高)、PWRITE(写使能信号,PWRITE为高时写有效为低时读有效)、PWDATA(写数据)

slave信号:PREADY(ready为高时,代表着一次APB数据传输的结束)、PRDATA(读数据)、PSLVERR(错误数据,由slave发出,具体逻辑由slave内部决定,当slave发现内部逻辑出现故障,譬如状态机状态出错、计数器数字异常等,slave都可以使用内部逻辑把该信号拉高,使得master接收到PSLVERR为高时,哪怕ready拉高表示APB结束了,也可以使master放弃该次传输或做出其他应对策略)。

APB写传输

如文档所示,APB的写分为两种情况:①没有等待状态的写②有等待状态的写

APB和AHB最大的不同就是APB不采用pipeline形式的写读方式,因此对于APB协议来说,最快的写入或者读出一个数据的周期是两周期,先给地址,再写数据;或者先给地址,再读数据。APB 协议文档中,将上述这种传输方式分为两个阶段(phase),给地址的阶段称为Set up phase;紧接着下一周期PENABLE信号拉高,标志着进入写/读数据的阶段,该阶段称为Access phase

Write with no wait states

一次没有等待状态的写传输如上图所示,计划写数据时,第一周期PSEL拉高,表示选中某个slave,同时给出地址信息Addr1和写入数据信息Data1,紧接着下一周期,PENABLE信号拉高,PREADY信号也拉高,这时数据写入完成。

没有等待状态的APB连续写波形如上所示(代码见后文),笔者将数据分为了两组,group1为APB slave的端口信号,group2为APB接的单端口SRAM信号。在第一个周期,也就是Setup phase,psel信号拉高,表示slave被选中,值得注意的是此时要将SRAM的写信号和使能信号同步拉高,因为我们写的是一个no wait states的APB接口,数据要在第二周期写进SRAM的话,就需要提前一拍拉高使能信号和写信号。然后到了第二周期,penable信号拉高,pready信号也拉高标志着这一次APB传输的结束。另外,也正是因为在setup phase我们把SRAM的en信号和we信号拉高了,因此在access phase数据传输结束的同时,数据也被写入到SRAM中。

Write with wait states

在文档中,对有等待周期的APB写传输描述如上,即:

一开始的setup phase和write with no wait没有区别,psel拉高,penable为低;紧跟着第二周期,penable拉高之后,进入access phase,进入access phase之后,penable不会拉低,直到pready为高标志着一次传输结束时,penable才会随着pready一起拉低。penable等待pready拉高的这段等待时间为additional cycles,在这个阶段PADDR、PWRITE、PSEL、PENABLE、PWDATA都应该保持不变,可以说总线被hold住了。

APB读传输

APB的读传输也分为两种情况:①没有等待状态的读②有等待状态的读

Read with no wait states

一次没有等待状态的读传输如上图所示,读状态和写状态不同,写数据时PWRITE=1,读数据时应该令PWRITE=0计划读数据时,第一周期PSEL拉高,表示选中某个slave,同时给出地址信息Addr1,紧接着下一周期,PENABLE信号拉高,PREADY信号也拉高,这时数据被读出,master接受到读出数据PRDATA。

上图为连续读的APB传输波形图,从第一次读数据可以看到,随着psel信号拉高,PWRITE=0标志着为读状态,此时传入地址给APB的SRAM,SRAM端口en=1,we=0标志着SRAM为读模式,数据在下一周期从SRAM给到prdata。

这边还要提一个APB的特点,也是大多人容易忽略的点,APB总线完成一次读传输或者写传输之后,PADDR和PWRITE不会改变,会一直维持到下一次的传输,这可以减少功耗。spec中描述如下:

手撕代码

笔者写了一个Write和Read都是with no states的APB SRAM,因为含有SRAM部分,所以在apb_sram中需要例化一个单端口ram,单端口ram代码如下:

dpram

module spram_generic#(
    parameter ADDR_BITS = 7,        //outside input 10
    parameter ADDR_AMOUNT = 128,    //outside input 1024
    parameter DATA_BITS = 32        //outside input 32
)(
    input                      clk     ,
    input                      en      ,
    input                      we      ,
    input      [ADDR_BITS-1:0] addr    ,
    input      [DATA_BITS-1:0] din     ,

    output reg [DATA_BITS-1:0] dout    
);
reg [DATA_BITS-1:0] mem [0:ADDR_AMOUNT-1];

always @(posedge clk)begin
    if(en)begin
        if(we == 1'b1)begin
            mem[addr] <= din;
        end
        else 
            dout      <= mem[addr];
    end
end

endmodule

apb_sram

module apb_sram#(
    parameter ADDR_BITS = 9,
    parameter DATA_BITS = 32,
    parameter MEM_DEPTH = 512
)(
    input                       pclk    ,
    input                       prstn   ,

    input                       psel    ,
    input                       penable ,

    input   [ADDR_BITS-1:0]     paddr   ,
    input                       pwrite  ,
    input   [DATA_BITS-1:0]     pwdata  ,

    output                      pready  ,
    output  [DATA_BITS-1:0]     prdata
);

// write part 
wire apb_write_setup;
reg  apb_ram_write;

assign apb_write_setup = (pwrite) && (!penable) && (psel);

always @(posedge pclk or negedge prstn)begin
    if(!prstn)begin
        apb_ram_write <= 1'b0; 
    end
    else if(apb_write_setup)begin
        apb_ram_write <= 1'b1;
    end
    else if(pready)begin
        apb_ram_write <= 1'b0;
    end
end

// read part
wire apb_read_setup;
reg  apb_ram_read;

assign apb_read_setup = (!pwrite) && (!penable) && (psel);

always @(posedge pclk or negedge prstn)begin
    if(!prstn)begin
        apb_ram_read <= 1'b0; 
    end
    else if(apb_read_setup)begin
        apb_ram_read <= 1'b1;
    end
    else if(pready)begin
        apb_ram_read <= 1'b0;
    end
end

assign pready = pwrite ? apb_ram_write : apb_ram_read;

wire mem_en,mem_we;
assign mem_en = apb_write_setup || apb_read_setup;
assign mem_we = apb_write_setup;

spram_generic #(
    .ADDR_BITS      (ADDR_BITS          ),
    .DATA_BITS      (DATA_BITS          ),
    .ADDR_AMOUNT    (2<<(ADDR_BITS-1)   )
)u_spram_generic(
    .clk    (pclk   ),
    .en     (mem_en ),
    .we     (mem_we ),
    .addr   (paddr  ),
    .din    (pwdata ),
    .dout   (prdata )
);

endmodule

tb

testbench例化apb_sram并给出激励,我这边在tb中发起了10次连续的随机写,然后再发起10次连续读,发现读出来的数据和写入的数据一致。

接着又测试了写和读无缝衔接在一起的apb传输,结果符合spec。tb代码如下:

`timescale 1ns/1ns
`define MEM_PATH u_apb_sram.u_spram_generic
module tb#(
    parameter ADDR_BITS = 9,
    parameter DATA_BITS = 32,
    parameter MEM_DEPTH = 512
)();

reg clk, rstn;
always #5 clk = ~clk;

reg                     psel, penable, pwrite;
reg     [DATA_BITS-1:0] pwdata, ref_data;
reg     [ADDR_BITS-1:0] paddr ;
wire                    pready;
wire    [DATA_BITS-1:0] prdata;

reg     [DATA_BITS-1:0] pwdata_rand;
reg     [DATA_BITS-1:0] prdata_read;

task apb_write;
input [ADDR_BITS-1:0] addr;
input [DATA_BITS-1:0] wdata;
begin
    @(posedge clk);#1;
    penable = 0; psel = 1; pwrite = 1; paddr = addr; pwdata = wdata;
    @(posedge clk);#1;
    penable = 1;
end
endtask

task apb_read;
input [ADDR_BITS-1:0] addr;
output [DATA_BITS-1:0] rdata;
begin
    @(posedge clk); #1;
    penable = 0; psel = 1; pwrite = 0; paddr = addr;
    @(posedge clk); #1;
    penable = 1;
    @(negedge clk); #1;
    rdata = prdata;
end
endtask

integer i,j;
initial begin
    clk     <= 1'b0;
    rstn    <= 1'b0;
    pwrite  <= 1'b1;
    psel    <= 1'b0;
    penable <= 1'b0;
    pwdata  <= 32'd0;
    repeat(2) @(posedge clk);
    rstn    <= 1'b1;
    repeat(3) @(posedge clk);
    // SRAM data initial
    for (i = 0; i < MEM_DEPTH; i = i + 1)begin
        pwdata = $random();
        `MEM_PATH.mem[i] = pwdata;
    end
    repeat(5) @(posedge clk); #1;
    $display("\ncontinuous writing");
    // SRAM data continuous writing
    fork 
        begin
            @(posedge clk);#1
            paddr = 32'd0; 
            for (j = 0; j < 10; j = j + 1)begin
                repeat(2) @(posedge clk) #1;
                paddr = paddr + 1;
                @(negedge clk) #1;
                ref_data = `MEM_PATH.mem[paddr-1];
                $display("ref_data = %d, addr = %d", ref_data, paddr-1);
            end
        end
        begin 
            for (i = 0; i < 10; i = i + 1)begin
                pwdata_rand = $random();
                apb_write(paddr, pwdata_rand);
                $display("pwdata = %d", pwdata);
            end
        end
    join_none
    
    
    repeat(21) @(posedge clk);#1;
    penable = 1'b0;psel = 1'b0;pwrite = 1'b0;
    
    repeat(5) @(posedge clk);#1;
    $display("\ncontinuous reading");
    //SRAM continuous reading
    fork 
        begin
            @(posedge clk);#1;
            paddr = 32'd0;
            for (j = 0; j < 10; j = j + 1)begin
                repeat(2) @(posedge clk);#1;
                paddr = paddr + 1;
            end
        end
        begin
            for (i = 0; i < 10; i = i + 1)begin
                apb_read(paddr, prdata_read);
                $display("prdata_read = %d", prdata_read);
            end
        end
    join
    penable = 0;psel = 0;
    
    repeat(5) @(posedge clk);#1;
    $display("\ncontinuos writing and reading");
    //SRAM continuous write and read
    fork 
        begin
            @(posedge clk);#1;
            paddr = 32'd0;
            for (j = 0; j < 10; j = j + 1)begin
                repeat (4) @(posedge clk); #1;
                paddr = paddr + 1;
            end
        end
        begin
            for (i = 0; i < 10; i = i + 1)begin
                pwdata_rand = $random();
                apb_write(paddr, pwdata_rand);
                apb_read(paddr, prdata_read);
                $display("write data is %d, read data is %d", pwdata_rand, prdata_read);
            end
        end
    join
    penable = 0;psel = 0;

    // finish simulation
    repeat(20) @(posedge clk);
    $finish();
end


initial begin
    $fsdbDumpfile("apb_sram.fsdb");
    $fsdbDumpvars(0);
end

apb_sram #(
    .ADDR_BITS(ADDR_BITS),
    .DATA_BITS(DATA_BITS),
    .MEM_DEPTH(MEM_DEPTH)
) u_apb_sram(
    .pclk   (clk    ),
    .prstn  (rstn   ),
    
    .psel   (psel   ),
    .penable(penable),
    .paddr  (paddr  ),
    .pwrite (pwrite ),
    .pwdata (pwdata ),

    .pready (pready ),
    .prdata (prdata )
);

endmodule

vcs仿真结果如下:

continuous writing
pwdata = 620927818
ref_data = 620927818, addr = 0
pwdata = 1557269945
ref_data = 1557269945, addr = 1
pwdata = 160312595
ref_data = 160312595, addr = 2
pwdata = 164115731
ref_data = 164115731, addr = 3
pwdata = 853295461
ref_data = 853295461, addr = 4
pwdata = 684074833
ref_data = 684074833, addr = 5
pwdata = 3684186807
ref_data = 3684186807, addr = 6
pwdata = 3432517785
ref_data = 3432517785, addr = 7
pwdata = 2635204666
ref_data = 2635204666, addr = 8
pwdata = 3102358129
ref_data = 3102358129, addr = 9

continuous reading
prdata_read = 620927818
prdata_read = 1557269945
prdata_read = 160312595
prdata_read = 164115731
prdata_read = 853295461
prdata_read = 684074833
prdata_read = 3684186807
prdata_read = 3432517785
prdata_read = 2635204666
prdata_read = 3102358129

continuos writing and reading
write data is 830211938, read data is 830211938
write data is 4063587044, read data is 4063587044
write data is 353623338, read data is 353623338
write data is 3201975421, read data is 3201975421
write data is 753819481, read data is 753819481
write data is 1925424101, read data is 1925424101
write data is 1994288109, read data is 1994288109
write data is 3836215497, read data is 3836215497
write data is 2695810113, read data is 2695810113
write data is 1472319919, read data is 1472319919

波形图

连续10次写、连续10次读、连续10次读写波形如下

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

APB总线详解及手撕代码 的相关文章

  • 低功耗技术(三)UPF的使用

    UPF是一个统一的 被广泛应用的低功耗实现标准 它用一些标准的语言描述用户的低功耗设计意图 一 UPF所需要的特殊单元库 1 Level Shifter和Isolation Cell 对于多电压设计 需要用Level shifter来实现不
  • 低功耗技术(一)动态功耗与静态功耗

    一 动态功耗 翻转功耗 Switching Power 翻转功耗是由充放电电容引起的动态功耗 其推导过程很简单 但是这个最终的结果却十分重要 1 switching power 和负载电容 电压 0到1变化事件的发生次数 时钟频率有关 2
  • 学习笔记--Verilog HDL高级数字设计--第六章组合逻辑与时序逻辑的综合

    组合逻辑与时序逻辑的综合 综合引擎能够自动完成一组布尔函数的最简化 并将结果映射成能满足设计目标的硬件实现 转换 优化 映射 本章将介绍如何编写易于综合的Verilog模型 综合工具完成的工作 1 检测并消除冗余项 2 查找组合反馈环路 3
  • DFT知识点扫盲——DFT概览

    IC设计公司 无论是研发 测试 PE 质量等岗位 对DFT的概念都不陌生 接下来的几篇内容 谈谈对DFT的理解 有聊得不对的地方 也请做DFT的同行 不吝赐教 1 什么是DFT DFT Design for Test 可测试性是一种设计属性
  • 【HDLBits 刷题 4】Verilog Language(4)Procedures 和 More Verilog Features 部分

    目录 写在前面 Procedures Alwaysblock1 Alwaysblock2 Always if Always if2 Always case Always case2 Always casez Always nolatches
  • IC新人必看:芯片设计流程最全讲解!

    对于消费者而言 一个可以使用的系统 有数字集成电路部分 模拟集成电路部分 系统软件及上层应用部分 关于各个部分的功能 借用IC 咖啡胡总的精品图可以一目了然 外部世界是一个模拟世界 故所有需要与外部世界接口的部分都需要模拟集成电路 模拟集成
  • 数字IC手撕代码--联发科(总线访问仲裁)

    题目描述 当A B两组的信号请求访问某个模块时 为了保证正确的访问 需要对这些信号进行仲裁 请用Verilog实现一个仲裁器 对两组请求信号进行仲后 要求 协议如图所示 请求方发送req request 信号1表示有请求给仲裁器 仲裁器响应
  • 利用python摘取文本中所需信息,并保存为txt格式

    项目所需 IC设计中难免会处理大量文本信息 我就在项目中遇到了 对于一个几万行的解码模块 提取出其中的指令 如果不用脚本将会很麻烦 下面我将一个小小的例子分享给大家 刚学python 如果有更方便的实现方法清多多指教 目的 1 在几万行解码
  • 关于“异步复位,同步复位,异步复位同步释放”的理解

    文章目录 1 异步复位 2 同步复位 3 异步复位同步释放 今天好好理一理异步复位 同步复位 以及亚稳态中的异步复位同步释放 1 异步复位 一般让复位信号低电平有效 复位信号不受时钟的控制 只要复位信号有效 那么电路就会复位 对应的写法为
  • disable path和false path的作用与区别

    disable path和false path的作用与区别C 欢迎使用Markdown编辑器 链接 disable与false的相同与不同 false path 指定某一条path 工具计算delay 但不报时序 disable path
  • CRC算法并行运算Verilog实现

    因为CRC循环冗余校验码的算法和硬件电路结构比较简单 所以CRC是一种在工程中常用的数据校验方法 尽管CRC简单 但在工程应用中还是有些问题会对工程师产生困惑 这篇文章将介绍一下CRC 希望对大家有所帮助 一 CRC算法介绍 CRC校验原理
  • 数字IC设计学习笔记_静态时序分析STA_ PrimeTime 基本概述

    数字IC设计学习笔记 PrimeTime 基本概述 1 PrimeTime 基本概述 2 运行模式 1 PrimeTime 基本概述 PrimeTime Synopsys公司提出的 针对于复杂的 全芯片的 门级静态时序分析的工具 可集成在逻
  • 芯片面积估计方法

    一 概念 芯片面积的主要涵盖部分分为三部分 IO 芯片的信号及电源pad等 Standard cell 实现芯片的功能逻辑 Macro block 第三方IP PLL DAC POR Memory etc 芯片面积估计就是通过目标工艺的库信
  • APB总线详解及手撕代码

    本文的参考资料为官方文档AMBA 3 APB Protocol specification 文档下载地址 https pan baidu com s 1Vsj4RdyCLan6jE quAsEuw pwd w5bi 提取码 w5bi APB
  • 数字IC手撕代码---百题斩

    前言 本篇导览目录 用来索引笔者写的其他手撕代码文章 本专栏旨在记录高频笔面试手撕代码题 以备数字前端秋招 本专栏所有文章提供原理分析 代码及波形 所有代码均经过本人验证 目录如下 1 数字IC手撕代码 分频器 任意偶数分频 2 数字IC手
  • AMBA低功耗接口(一)Q_Channel

    AMBA提供了 低功耗的接口 用于实现power控制功能 目前 AMBA里面 包含2种低功耗接口 Q Channel 实现简单的power控制 如上电 下电 P Channel 实现复杂的power控制 如全上电 半上电 1 4上电等 AR
  • 集成电路模拟版图入门-版图基础学习笔记(一)

    IC模拟版图设计 了解版图 版图的定义 版图是在掩膜制造产品上实现 电路功能且满足电路功耗 性能等 从版图上减少工艺制造对电路的偏差 提高芯片的精准性 版图的意义 1 集成电路掩膜版图设计师实现集成电路制造所必不可少的设计环节 它不仅关系到
  • Design Compiler指南——设计综合过程

    在前面一章介绍完施加约束之后 接下来要做的工作就是将设计进行综合编译 compile 本文我们将主要讨论综合编译的过程 主要分为这样几个部分 优化的三个阶段及其特点 编译的策略 编译层次化的设计 一 优化的三个阶段 这一节我们介绍Desig
  • 数字IC手撕代码-兆易创新笔试真题

    前言 本专栏旨在记录高频笔面试手撕代码题 以备数字前端秋招 本专栏所有文章提供原理分析 代码及波形 所有代码均经过本人验证 目录如下 1 数字IC手撕代码 分频器 任意偶数分频 2 数字IC手撕代码 分频器 任意奇数分频 3 数字IC手撕代
  • IC Compiler指南——数据准备

    一 概述 ICC数据设置的文件关系框图如图 后端工具在数据设置阶段需要对两大类数据进行设置 包括从前端设计继承的综合数据 以及后端设计需要的物理数据 综合数据主要包括前端逻辑综合已经设置过的逻辑与时序库文件 设计约束文件sdc以 及综合网表

随机推荐

  • 中国开发者真实现状:40 岁不做开发,算法工程师最稀缺!

    戳蓝字 CSDN云计算 关注我们哦 互联网的 2018 年 注定是不平凡的一年 浩浩荡荡的美国制裁中兴事件唤醒了科技界对芯片产业的重视 倒逼了一系列芯片方面的布局和投资 互联网人口红利不断消耗 推动百度 腾讯 阿里巴巴等科技巨头先后实施战略
  • 常用的几种通信协议

    协议 约定 就比如我们的普通话 网络通信协议 速率 传输码率 代码结构 传输控制 问题大事化小 分层 TCP IP协议簇 重要 TCP 用户传输协议 UDP 用户数据报协议 知名协议 TCP IP 网络互联协议 TCP UDP 对比 TCP
  • SVN 检查修改或者提交代码时候一直显示"please wait"的解决办法(汉化版本显示"请稍候")

    在提交使用vue写的前端代码时候一直显示 请稍候 检查修改时候也是这样显示 原因是 下载代码后 npm install 安装了依赖 可以在SVN中取消对相关依赖的控制 操作方法
  • iscsi使用教程(中)

    服务端管理命令 tgtadm 是一个模式化的命令 其使用格式如下 tgtadm lld driver op operation mode mode OPTION 其中模式 mode 和操作 operation 对应关系如下 模式 操作 ta
  • JAVA经典面试题

    九种基本类型及封装类 基本类型 boolean byte char short int long double void 二进制位数 1 8 一字节 16 2字节 16 2字节 32 4字节 64 8字节 64 8字节 封装器类 Boole
  • sqli-labs通关(less1~less10)

    目录 题外话 Less 1 Less 2 Less 3 Less 4 Less 5 Less 6 Less 7 Less 8 Less 9 Less 10 这10关都是GET型的 包括了union注入 报错注入 布尔盲注和时间盲注 虽然包含
  • 一文读懂MySQL事务:提升你的数据库操作技能

    概述 事务可以保证多个操作原子性 要么全成功 要么全失败 对于数据库来说事务保证批量的DML要么全成功 要么全失败 事务具有四个特征ACID 原子性 Atomicity 整个事务中的所有操作 必须作为一个单元全部完成 或全部取消 一致性 C
  • pytdx接口API说明

    标准行情接口API pytdx hq 下面是如何在程序里面调用本接口 首先需要引入 from pytdx hq import TdxHq API 然后 创建对象 api TdxHq API 之后 通常是如下的格式 if api connec
  • python可以在多种平台运行 这体现了python语言的_Python快速编程入门课后习题答案...

    目录 前言 第一章 一 填空题 二 判断题 三 选择题 第二章 一 填空题 二 判断题 三 选择题 第三章 一 填空题 二 判断题 三 选择题 第四章 一 单选题 二 判断题 三 填空题 第五章 一 选择题 二 判断题 三 填空题 第六章
  • 3_服务容错_保护断路器_@EnableCircuitBreaker和引入@SpringCloudApplication

    前言 前面做了一个简单的服务 注册 服务发现 服务提供者和消费者的项目 现在我们还是准备之前的项目代码 1 服务容错保护 准备的项目工程 1 服务注册中心 端口为1111 2 服务提供者 端口为8080 8081 3 服务消费者 端口为90
  • 华为OD机试真题- 天然蓄水库【2023】【JAVA、Python、C++】

    题目描述 描述 公元2919年 人类终于发现了一颗宜居星球 X星 现想在X星一片连绵起伏的山脉间建一个天热蓄水库 如何选取水库边界 使蓄水量最大 要求 山脉用正整数数组s表示 每个元素代表山脉的高度 选取山脉上两个点作为蓄水库的边界 则边界
  • Springboot连接FISCO-BCOS链

    依赖 FISCO BOCS 2 5 0 JAVA 1 8 Spring Boot 2 0 2 官方文档 前期准备 部署FISCO BOCS 2 5 0 引入SDK
  • ue 清理缓存_mpvue应用之组件数据缓存清理

    题图 被mpvue周期搞疯的你 之前介绍过美团外卖C端 H5 小程序页面大量基于mpvue框架的能力 使用Vue组件打通了原生小程序页面和H5页面的隔阂 再结合小程序自带的原生组件功能 就构成了整个外卖跨端应用的终端部分架构 但是随着页面规
  • 唐诗三百首出现最多的字是什么?大数据分析告诉你

    一个人要是长时间一直做一件事 思维容易固化 就像那些从太空回来的宇航员 吃饭时容易丢开拿在手里的勺子 当勺子掉在地上时 哦 我已经回到地球了 所以 适当尝试新鲜事物 既是对大脑的放松 也是开阔思路的好机会 好方法 那这次 博主尝试的新事物是
  • 腾讯面经 集合

    腾讯机器学习复试 gbtd和xgboost区别和优缺点 XGBoost是GBDT一个工程化的实现 第一 GBDT将目标函数泰勒展开到一阶 而xgboost将目标函数泰勒展开到了二阶 使用泰勒展开到二阶的原因 统一损失函数求导的形式以支持自定
  • CFLAGS详解

    Makefile选项CFLAGS LDFLAGS LIBS CFLAGS 表示用于 C 编译器的选项 CXXFLAGS 表示用于 C 编译器的选项 这两个变量实际上涵盖了编译和汇编两个步骤 CFLAGS 指定头文件 h文件 的路径 如 CF
  • XXXXXXXXXXXXX

    Netflix主机性能监视工具Vector http www chinaz com web 2015 0414 398451 shtml 云雀科技是总部位于西雅图的新兴的云服务公司 利用业界 最新技术打造下一代具有高密度动态计算能力的云平台
  • 初学网络安全不可不知的:10款开源安全工具

    随着互联网的不断发展 安全问题也越来越受到企业的重视 但安全问题往往需要大量资金的投入 例如聘请安全工程师 产品研发 测试等流程 这对于那些原本就资金紧缺的企业而言 是绝对无法接受的 因此 为了减少在这方面的资金投入 许多安全人员都会选择使
  • keyframes介绍与调用动画方法

    keyframes介绍 keyframes changecolor 0 background red 50 background red 100 background green 在一个 keyframes 中的样式规则可以由多个百分比构成
  • APB总线详解及手撕代码

    本文的参考资料为官方文档AMBA 3 APB Protocol specification 文档下载地址 https pan baidu com s 1Vsj4RdyCLan6jE quAsEuw pwd w5bi 提取码 w5bi APB