FPGA中的IP核

一、IP核

1.1 IP核是什么

1.2 为什么要用IP核

1.3 IP核和原语的实质性区别是什么

一句话区别:原语是硬件底层资源的最小封装;IP 核是基于原语或行为描述封装的高层可配置逻辑模块。

原语(Primitive)的特点:小 & 底层 & 用户不可配置

  • 底层、固定、不可配置:通常由 FPGA 厂商提供,和芯片架构直接对应。
  • 编译器内置支持,如 Xilinx 的 IBUFDSBUFG, RAM32X1D, FDRE 等。
  • 不需要生成或综合,直接通过综合器(如 Vivado Synthesis)映射到物理资源。
  • 作用相当于“门级模块”或“标准单元”,如 LUT、寄存器、IO buffer、时钟 buffer。

IP核(IP Core)的特点:大 & 高层 & 用户可配置

  • 高层封装模块:可以由多个原语、HDL模块、状态机等组合而成。
  • 用户可配置:通过 Vivado IP Catalog 的 GUI 设定端口数量、参数宽度、行为选项等。
  • 需要先在 Vivado 中 “Generate Output Products” 才能综合、实现。
  • 通常带有 .xci(Vivado IP 描述文件)、.v(包装模块)、.dcp(综合后网表)等文件。

二、IP核两种使用方式

  1. 在verilog代码中直接写IP核语句:
    例如:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    module Clk_Divider#
    (
    parameter DEBUG_ENABLE = 1'b1
    )
    (...
    );
    ...
    generate
    if (DEBUG_ENABLE == 1'b1) begin : debugcore
    // 添加 ILA IP,ChipScope 观察信号
    ila_0 ila_0_0 (
    .clk(clk_i), // ILA 时钟
    .probe0(div2hz_o), // 输入探针 0
    .probe1({div2_o, div3_o, div4_o, div8_o}) // 输入探针 1,宽度为4
    );
    end
    endgenerate

    在这里使用了一个generate if语句来实现测试的时候,我加上ILA这个IP,来进行对信号的实时监测,而工程落地后,我可以选择将DEBUG_ENABLE置0来实现让ILA这个IP核不工作。

    那么如何去查一个没用过的IP核呢(怎么用,代码怎么写都不知道)。

    image-20260303130227516

    先点击IP Catalog打开IP核库,然后搜索需要的IP,双击编辑IP核

    image-20260303130319445

    然后点击OK,并generate,这个IP核就添加到工程中了。但此时还是游离在外的状态,下面还需要将其添加到工程中接线:

    image-20260303130459598

    点击箭头,Show IP Hierarchy,查看这个ip的.v头文件。

    image-20260303130640729

    此时就可以直接用其头文件,在自己的文件中例化这个IP核,然后正常使用了,添加成功后,ip将不再游离在外,会被添加到工程之中。

  2. 在Block Design中,使用 Vivado 的 IP Integrator图形化添加IP核:

    1. 打开 Block Design,点击 “Add IP”,搜索并添加 ILA
    2. 自动配置探针宽度、数量,并连接到需要监控的信号。
    3. 启用 Debug Bridge(如有 JTAG 接入需求)。

三、常见的IP公版IP核

3.1 ila_0

功能:ILA(Integrated Logic Analyzer)是 Vivado 提供的一个调试 IP 核,能够:

  • 实时采集并缓存 FPGA 内部信号
  • 通过 JTAG 与 Vivado Hardware Manager 建立通信
  • 显示波形、设置触发条件,进行逻辑行为分析

它相当于FPGA 内嵌的逻辑分析仪

例化示例:

1
2
3
4
5
ila_0 ila_0_0 (
.clk(clk_i), // ILA采样时钟
.probe0(div2hz_o), // 1位信号
.probe1({div2_o, div3_o, div4_o, div8_o}) // 4位信号
);
端口名称 类型 说明
.clk input 采样时钟,所有探针数据在此时钟下同步采样
.probe0 input [0:0] 单位宽信号,可用于控制信号、标志位
.probe1 input [3:0] 4位并行信号,典型用法是多个分频信号或控制信号组合
.trigger input(可选) 外部触发条件,通常配合 Hardware Manager 设置
.capture input(可选) 控制是否采样数据
.resetn input(可选) 对 ILA 内部状态机进行复位
.qual input(可选) 数据限定条件控制,只在 qual 有效时采样

3.2 clk_wiz

image-20260304134039099

功能:clk_wiz(Clocking Wizard)是 Vivado 提供的时钟管理 IP 核,能够:

  • 对输入时钟进行频率综合,生成多路不同频率的输出时钟
  • 支持相位偏移、占空比调整
  • 基于 MMCM 或 PLL 原语实现,提供 locked 信号指示时钟锁定状态

它相当于 FPGA 内部的时钟管理单元(CMT)的封装。

1
2
3
4
5
6
7
8
9
10
clk_wiz_0 clk_wiz_0_inst (
.clk_out1(clk_480m_90), // 480MHz, 90度相移
.clk_out2(clk_120m), // 120MHz
.clk_out3(clk_40m), // 40MHz
.clk_out4(clk_80m), // 80MHz
.clk_out5(clk_480m), // 480MHz
.reset(reset), // 复位信号,高有效
.locked(locked), // 时钟锁定指示
.clk_in1(clk_480m_in) // 输入时钟 480MHz
);
端口名称 类型 说明
.clk_in1 input 主输入时钟,本例为 480MHz,来自单端时钟引脚
.reset input 复位信号,高电平有效,复位内部 MMCM
.clk_out1 output 输出时钟1,480MHz,相位偏移 90 度
.clk_out2 output 输出时钟2,120MHz,无相移
.clk_out3 output 输出时钟3,40MHz,无相移
.clk_out4 output 输出时钟4,80MHz,无相移
.clk_out5 output 输出时钟5,480MHz,无相移
.locked output 锁定指示信号,高电平表示所有输出时钟已稳定

使用注意事项:

  1. 在使用输出时钟之前,必须等待 locked 信号拉高,表示 MMCM 已完成锁定,输出时钟频率和相位稳定可用。
  2. reset 为高有效(默认,但是可配置),复位期间 locked 会拉低,所有输出时钟不可用。
  3. clk_out1 配置了 90 度相位偏移,常用于 DDR 接口等需要相位对齐的场景。