PLL、RAM、FIFO三大IP核入门

Sep 19 2025 每日笔记

1、PLL定义

PLL是锁相环

Xilinx7 系列器件中的时钟资源包含了时钟管理单元 CMT(全称 Clock Management Tile,即时钟管理单元),每个 CMT 由一个 MMCM(全称 Mixed-Mode Clock Manager,即混合模式时钟管理)和一个 PLL(全称 Phase Locked Loop,即锁相环)组成。接下来我们讲解一下 MMCM 和 PLL 各自的含义以及两者的区别。

MMCM 支持动态相位调整,而 PLL 通常只支持静态相位配置。
静态相位调整​​:在芯片​​配置时(烧录前)​​ 一次性设定相位,运行时​​无法改变​​。

​​动态相位调整​​:在芯片​​运行过程中​​,可以通过逻辑实时、精细地调整相位。

2、PLL使用源码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
module ip_clk_wiz( 
input sys_clk , //系统时钟
input sys_rst_n , //系统复位,低电平有效

output clk_100m , //100Mhz 时钟频率
output clk_100m_180deg, //100Mhz 时钟频率,相位偏移 180 度
output clk_50m , //50Mhz 时钟频率
output clk_25m //25Mhz 时钟频率
);

wire locked;
wire other_rst;

assign other_rst=locked & sys_rst_n; //用于系统其他外设的复位,等PLL稳定后和系统时钟复后,才对外设启动复位

clk_wiz_0 instance_name
(
.clk_out1(clk_100m),
.clk_out2(clk_100m_180deg),
.clk_out3(clk_50m),
.clk_out4(clk_25m),
.reset(~sys_rst_n), //IP核默高电平复位,所以将系统复位取反
.locked(locked),
.clk_in1(sys_clk)
);
endmodule

3、PLL测试源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
`timescale 1ns/1ns
`define CLOCK_PERIOD 20

module ip_clk_wiz_tb;

reg sys_clk ; //系统时钟
reg sys_rst_n ; //系统复位,低电平有效

wire clk_100m ; //100Mhz 时钟频率
wire clk_100m_180deg ; //100Mhz 时钟频率,相位偏移 180 度
wire clk_50m ; //50Mhz 时钟频率
wire clk_25m ; //25Mhz 时钟频率



ip_clk_wiz ip_clk_wiz_inst(
.clk_100m(clk_100m),
.clk_100m_180deg(clk_100m_180deg),
.clk_50m(clk_50m),
.clk_25m(clk_25m),
.sys_rst_n(sys_rst_n),
.sys_clk(sys_clk)
);

initial sys_clk=1'b1;
always #(`CLOCK_PERIOD/2) sys_clk=~sys_clk;


initial begin
sys_rst_n=0;
#201
sys_rst_n=1;
#100000
$stop;
end

endmodule

4、IP核实例化模板怎么查看

首先打开IP核的例化模板,在“Source”窗口中的“IP Sources”选项卡中,依次用鼠标单击展开“IP”-“clk_wiz_0”-“Instantitation Template”,我们可以看到“clk_wiz.veo”文件,它是由 IP 核自动生成的只读的 verilog 例化模板文件,双击就可以打开它,在例化时钟 IP 核模块的时钟,可以直接从这里拷贝,如下图所示

5、RAM的IP核的相关知识

RAM定义:随机存取存储器(Random Access Memory),可以随时往任意指定地址单元写入数据,也能随时从任意指定地址读出数据,读写速度由时钟频率决定,主要用于存放程序及执行过程中产生的数据运算结果。

生动类比:把RAM比作家里的“纳物盒”,被分成一个个小空间(类似围棋棋盘的小格子),每个小格子有编号(地址),可以存放不同大小的数据(如16位、32位的“石头”),小格子空间大小要和存放的数据匹配,比如32位空间最多能装32比特数据,也能装两个16比特数据(2×16拼包)。

RAM端口类型详解

RAM与ROM的关键区别
RAM可以一边写数据一边读数据(双端口情况下),但要注意不能对同一个小格子同时读写,会造成混乱;而ROM是只读存储器,数据事先存好,工作时不能修改,只能读取,这是两者最大的区别。

三、FIFO

3.1 FIFO内部结构简介

FIFO 的英文全称是 First In First Out,即先进先出。FPGA 使用的 FIFO 一般指的是对数据的存储具有先进先出特性的一个缓存器,常被用于数据的缓存,或者高速异步数据的交互也即所谓的跨时钟域信号传递。
跨时钟域信号传递可以简单理解为在两个不同的时钟下还可以进行传输的意思,具体示意图如下所示:
FIFO跨时钟传输数据的概念:

IP核与FPGA 内部的 RAM 和 ROM 的区别是没有外部读写地址线,采取顺序写入数据,顺序读出数据的方式,使用起来简单方便,由此带来的缺点就是不能像 RAM 和 ROM 那样可以由地址线决定读取或写入某个指定的地址。

根据 FIFO 工作的时钟域,可以将 FIFO 分为同步 FIFO 和异步 FIFO。同步 FIFO 是指读时钟和写时钟为同一个时钟,在时钟沿来临时同时发生读写操作。异步 FIFO 是指读写时钟不一致,读写时钟是互相独立的。

可能有人会好奇为什么会有同步 FIFO 和异步 FIFO,它们各自的用途是什么。之所以有同步 FIFO 和异步 FIFO 是因为各自的作用不同。同步 FIFO 常用于同步时钟的数据缓存,异步 FIFO 常用于跨时钟域的数据信号的传递,例如时钟域 A 下的数据 data1 传递给异步时钟域 B,当 data1 为连续变化信号时,如果直接传递给时钟域 B 则可能会导致收非所送的情况,即在采集过程中会出现包括亚稳态问题在内的一系列问题,使用异步 FIFO 能够将不同时钟域中的数据同步到所需的时钟域中。

Xilinx 的 FIFO IP 核可以被配置为同步 FIFO 或异步 FIFO,其信号框图如下图所示。从图中可以了解到,当被配置为同步 FIFO 时,只使用 wr_clk,所有的输入输出信号都同步于 wr_clk 信号。而当被配置为异步FIFO 时,写端口和读端口分别有独立的时钟,所有与写相关的信号都是同步于写时钟 wr_clk,所有与读相关的信号都是同步于读时钟 rd_clk。

对于 FIFO 需要了解一些常见参数:

3.2 配置FIFO的相关参数设置

“Data Counts”选项卡用于设置 FIFO 内数据计数的输出信号,此信号表示当前在 FIFO 内存在多少个有效数据。为了更加方便地观察读/写过程,这里我们把读/写端口的数据计数都打开,且计数值总线的位宽设置为满位宽,即 8 位。这里还要注意“Write Data Counts”和“Read Data Counts”分别同步到写侧时钟和读侧时钟,他们的值是不同时钟域下的值。如下图所示:

“Write Data Count”统计的是累计写入总量(只增不减),而“Read Data Count”统计的是当前FIFO内有效数据量(可增可减)。

配置到最后生成的模板: