FPGA中的IP核
FPGA中的IP核
一、IP核
1.1 IP核是什么
1.2 为什么要用IP核
1.3 IP核和原语的实质性区别是什么
一句话区别:原语是硬件底层资源的最小封装;IP 核是基于原语或行为描述封装的高层可配置逻辑模块。
原语(Primitive)的特点:小 & 底层 & 用户不可配置
- 底层、固定、不可配置:通常由 FPGA 厂商提供,和芯片架构直接对应。
- 编译器内置支持,如 Xilinx 的
IBUFDS、BUFG,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核两种使用方式
在verilog代码中直接写IP核语句:
例如:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17module 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核呢(怎么用,代码怎么写都不知道)。
先点击IP Catalog打开IP核库,然后搜索需要的IP,双击编辑IP核
然后点击OK,并generate,这个IP核就添加到工程中了。但此时还是游离在外的状态,下面还需要将其添加到工程中接线:
点击箭头,Show IP Hierarchy,查看这个ip的.v头文件。
此时就可以直接用其头文件,在自己的文件中例化这个IP核,然后正常使用了,添加成功后,ip将不再游离在外,会被添加到工程之中。
在Block Design中,使用 Vivado 的 IP Integrator图形化添加IP核:
- 打开 Block Design,点击 “Add IP”,搜索并添加
ILA。 - 自动配置探针宽度、数量,并连接到需要监控的信号。
- 启用 Debug Bridge(如有 JTAG 接入需求)。
- 打开 Block Design,点击 “Add IP”,搜索并添加
三、常见的IP公版IP核
3.1 ila_0
功能:ILA(Integrated Logic Analyzer)是 Vivado 提供的一个调试 IP 核,能够:
- 实时采集并缓存 FPGA 内部信号
- 通过 JTAG 与 Vivado Hardware Manager 建立通信
- 显示波形、设置触发条件,进行逻辑行为分析
它相当于FPGA 内嵌的逻辑分析仪。
例化示例:
1 | ila_0 ila_0_0 ( |
| 端口名称 | 类型 | 说明 |
|---|---|---|
.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
功能:clk_wiz(Clocking Wizard)是 Vivado 提供的时钟管理 IP 核,能够:
- 对输入时钟进行频率综合,生成多路不同频率的输出时钟
- 支持相位偏移、占空比调整
- 基于 MMCM 或 PLL 原语实现,提供 locked 信号指示时钟锁定状态
它相当于 FPGA 内部的时钟管理单元(CMT)的封装。
1 | clk_wiz_0 clk_wiz_0_inst ( |
| 端口名称 | 类型 | 说明 |
|---|---|---|
| .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 | 锁定指示信号,高电平表示所有输出时钟已稳定 |
使用注意事项:
- 在使用输出时钟之前,必须等待 locked 信号拉高,表示 MMCM 已完成锁定,输出时钟频率和相位稳定可用。
- reset 为高有效(默认,但是可配置),复位期间 locked 会拉低,所有输出时钟不可用。
- clk_out1 配置了 90 度相位偏移,常用于 DDR 接口等需要相位对齐的场景。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 JERRY'S BLOG!
