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总线详解及手撕代码 的相关文章

  • 数字IC笔试面试常考问题及答案

    来源 知乎 链接 https zhuanlan zhihu com p 261298869 基础知识 原理务必理解透彻 锁存器的结构 DFF的结构 建立保持时间 亚稳态 STA CDC 亚稳态的成因 危害 解决方法 建立保持时间的计算 违例
  • 流水线设计

    1 global stall 用全局使能信号控制整条pipeline 一般会使用clock enable CE 这样在综合后会自动插入ICG 从而降低动态功耗 always posedge clk begin if ce out data
  • DFT知识点扫盲——DFT概览

    IC设计公司 无论是研发 测试 PE 质量等岗位 对DFT的概念都不陌生 接下来的几篇内容 谈谈对DFT的理解 有聊得不对的地方 也请做DFT的同行 不吝赐教 1 什么是DFT DFT Design for Test 可测试性是一种设计属性
  • spyglass的waiver使用问题总结-工具(八)

    spyglass使用过程中waiver warning及error过程中总会出现生效不成功的问题 总结使用步骤供参考 实践出真知 解决问题就是好方法 1 在spyglass的prj中设置默认waiver文件 2 如何waiver 3 查看已
  • A Simple RGB ISP

    设计一个最简单的RGB ISP需要多少个模块呢 答案可能是4个 分别是CFA CCM GAMMA和RGB2YUV 有了这4个模块 我们就可以将Sensor输出的RAW data转化为在显示器上可以观看的画面了 CFA Color Filte
  • 数字后端知识点扫盲——芯片harden block的划分

    后端在floorplan阶段 如何摆放macro是一个很重要的问题 如果采用层次化设计 对于每一个block来说都需要在block内部把锁分配的macro摆好 如果某一个block里的macro很多 而且又很大 std cell再多一些 这
  • (四)RTL级低功耗设计

    前面介绍了系统级的低功耗设计 换句话说就是在系统级降低功耗可以考虑的方面 系统级的低功耗设计 主要是由系统级设计 具有丰富经验的人员实现 虽然还轮不到我们设计 我们了解一下还是比较好的 我们前端设计人员的重点不在系统级设计上面 而是在RTL
  • 关于“异步复位,同步复位,异步复位同步释放”的理解

    文章目录 1 异步复位 2 同步复位 3 异步复位同步释放 今天好好理一理异步复位 同步复位 以及亚稳态中的异步复位同步释放 1 异步复位 一般让复位信号低电平有效 复位信号不受时钟的控制 只要复位信号有效 那么电路就会复位 对应的写法为
  • 数字IC设计学习笔记_静态时序分析STA_ PrimeTime 基本概述

    数字IC设计学习笔记 PrimeTime 基本概述 1 PrimeTime 基本概述 2 运行模式 1 PrimeTime 基本概述 PrimeTime Synopsys公司提出的 针对于复杂的 全芯片的 门级静态时序分析的工具 可集成在逻
  • 【Verilog 常见设计】(0)二进制码和格雷码互转 Verilog 实现

    目录 格雷码介绍 转化原理 Verilog 实现 testbench 测试代码 仿真波形 格雷码介绍 在一组数的编码中 若任意两个相邻的代码只有一位二进制数不同 则称这种编码为格雷码 Gray Code 另外由于最大数与最小数之间也仅一位数
  • verdi显示数据

    在波形数据上点右键 2 s complement 就是大家计算机课上学的 补码 1 s complement 是课上讲的 反码 signed magnitude 最高位是符号位 0 正数 1 负数 低位是绝对值 另外 ncverilog v
  • 芯片面积估计方法

    一 概念 芯片面积的主要涵盖部分分为三部分 IO 芯片的信号及电源pad等 Standard cell 实现芯片的功能逻辑 Macro block 第三方IP PLL DAC POR Memory etc 芯片面积估计就是通过目标工艺的库信
  • 【HDLBits 刷题 12】Circuits(8)Finite State Manchines 27-34

    目录 写在前面 Finite State Manchines 2014 q3c m2014 q6b m2014 q6c m2014 q6 2012 q2fsm 2012 q2b 2013 q2afsm 2013 q2bfsm 写在前面 HD
  • AMBA低功耗接口(一)Q_Channel

    AMBA提供了 低功耗的接口 用于实现power控制功能 目前 AMBA里面 包含2种低功耗接口 Q Channel 实现简单的power控制 如上电 下电 P Channel 实现复杂的power控制 如全上电 半上电 1 4上电等 AR
  • 软复位与硬复位

    软复位与硬复位 1 软复位与硬复位 软复位信号名称中通常包含soft 硬复位信号名称中通常包含hard 软复位 常用于复位逻辑模块 硬复位 常用于配置寄存器模块 配置信号同步模块 硬复位有效会驱动软复位有效 一个模块出现问题时 可以使其软复
  • 电力电子转战数字IC——我的IC面试(2022.10.14更新)

    目录 感谢信 HKWS10 14面试 25mins JXC10 13面试 30mins JDSK9 23面试 42mins 快速的自我介绍 介绍一下这个MCDF的项目 你这里写SV搭建的验证环境 和UVM搭建的有什么区别吗 你这里写了覆盖率
  • 约束综合中的逻辑互斥时钟(Logically Exclusive Clocks)

    注 本文翻译自Constraining Logically Exclusive Clocks in Synthesis 逻辑互斥时钟的定义 逻辑互斥时钟是指设计中活跃 activate 但不彼此影响的时钟 常见的情况是 两个时钟作为一个多路
  • 数字IC设计知识点及综合题详解(提前批、秋招必刷基础题)——(二)时序分析基础(Slack、Setup、Hold、Jitter、Skew、亚稳态)异步复位,同步释放

    目录 一 常见名词 1 1 时钟偏移Skew 1 1 1 Skew出现的原因 1 1 2 Skew解决方法 1 2 抖动Jitter 1 2 1 Jitter出现的原因 1 2 2 时钟抖动永远存在 1 3 扇入扇出Fan in Fan o
  • 数字后端知识点扫盲——CTS (上)

    后端和前端一样在IC设计中扮演着非常重要的角色 甚至可以说入门的前端设计工程师对timing的理解远不如一个后端设计工程师 因此想要更好的理解电路的timing在后端P R之后或者说在大规模的设计中后端如何实现clock对DFF的驱动 就需
  • 数字后端知识点扫盲——后端设计流程及使用工具

    1 DFT Design For Test 可测性设计 芯片每一步往往都自带测试电路 DFT的目的就是在设计的时候就考虑将来的测试 DFT的常见方法是 在设计中插入scan chain 将非扫描单元 如寄存器 变为扫描单元 DFT工具是sy

随机推荐

  • 中国开发者真实现状: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