image.png

一、前置知识

PLL 的英文全称是 Phase Locked Loop,即锁相环,是一种反馈控制电路。PLL 对时钟网络进行系统级的时钟管理和偏移控制,具有时钟倍频、分频、相位偏移和可编程占空比的功能。
对于一个简单的设计来说,FPGA 整个系统使用一个时钟或者通过编写代码的方式对时钟进行分频是可以完成的,但对于稍微复杂一点的系统来说,系统中往往需要使用多个时钟和时钟相位的偏移,且通过编写代码输出的时钟无法实现时钟的倍频, 此时会用到 Altera PLL IP 核。
锁相环作为一种反馈控制电路,其特点是利用外部输入的参考信号控制环路内部震荡信号的频率和相位。
锁相环可以实现输出信号频率对输入信号频率的自动跟踪,所以锁相环通常用于闭环跟踪电路。当输出信号的频率与输入信号的频率相等时,输出电压与输入电压保持固定的相位差值,即输出电压与输入电压的相位被锁住,这就是锁相环名称的由来。
image.png
PLL 由以下几部分组成:前置分频计数器(N 计数器)、相位-频率检测器(PFD,Phase-Frequency Detector)电路,电荷泵(Charge Pump)、环路滤波器(Loop Filter)、压控振荡器(VCO, Voltage Controlled Oscillator)、反馈乘法器计数器(M 计数器)和后置分频计数器(K 和 V 计数器) 。
在工作时,PFD检测其参考频率(FREF)和反馈信号(Feedback)之间的相位差和频率差,控制电荷泵和环路滤波器将相位差转换为控制电压; VCO 根据不同的控制电压产生不同的震荡频率,从而影响 Feedback 信号的相位和频率。在 FREF 和 Feedback 信号具有相同的相位和频率之后, 就认为 PLL 处于锁相的状态。
在反馈路径中插入 M 计数器会使 VCO 的震荡频率是 FREF 信号频率的 M 倍,FREF信号等于输入时钟 FIN 除以预缩放计数器 N。参考频率用以下方程描述:FREF = FIN/N,VCO 输出频率为 FVCO = FIN*M/N,PLL的输出频率为 FOUT = (FIN*M)/(N*K)
开发板上主控芯片EP4CE10内部有2个PLL锁相环,外部时钟经过锁相环,产生不同频率不同相位的时钟信号供系统使用。需要用到 Altera PLL IP 核。

二、原理分析

将 ALTPLL IP 核产生的四个时钟输出到 FPGA 的扩展口 IO 上,也就是开发板 P6 扩展口的第5、6、7和第8脚。
image.png
引脚分配表如下。
image.png

三、程序设计

3.1 新建工程

image.png

3.2 创建和配置 IP 核

点击【Tools】→【IP Catalog】打开IP核侧边目录,查找ALTPLL,添加并设置。
image.png
创建路径为X:/FPGA/Projects/08_ip_pll/par/ipcore/pll_clk.v
image.png

  1. 正常模式,外部时钟50MHz

image.png

  1. 输入输出配置
  • 使用异步复位来复位锁相环
  • 输出 LOCK 信号 (LOCK信号拉高表示锁相环开始稳定输出时钟信号)

image.png

  1. 配置时钟输出 | 时钟名称 | 频率 | 偏移量 | 占空比 | | —- | —- | —- | —- | | C0 | 100.00MHz | 0.00deg | 50.00% | | C1 | 100.00MHz | 180.00deg | 50.00% | | C2 | 50.00MHz | 0.00deg | 50.00% | | C3 | 25.00MHz | 0.00deg | 50.00% |

image.png
image.png
image.png
image.png

  1. EDA设置界面

如果要将此 PLL IP 核用在其他的 EDA 工具上,可以通过选择 Generate netlist 选项来生成IP_syn.v文件,用于其他的 EDA 工具中。本次暂时用不到。
image.png

  1. 添加 IP 核文件

选择将 IP 核文件添加至工程。
image.png
image.png
ipcore/pll_clk.qip文件中可以看到将IP核的3个文件添加到了工程。
image.png

3.3 实例化 IP 核

创建名为ip_clk.v的文件,该文件用来实例化IP核模块(pll_clk.v),保存路径为X:\FPGA\Projects\08_ip_pll\rtl\ip_pll.v
image.png

  1. module ip_pll(
  2. input sys_clk,
  3. input sys_rst_n,
  4. output clk_100m,
  5. output clk_100m_180deg,
  6. output clk_50m,
  7. output clk_25m
  8. );
  9. wire rst_n; // 复位信号
  10. wire locked; // locked信号拉高,锁相环就开始稳定输出时钟
  11. // 系统复位与lockde相与,作为其他模块的复位信号
  12. assign rst_n = sys_rst_n & locked;
  13. // 锁相环例化
  14. pll_clk u_pll_clk(
  15. .areset(~sys_rst_n), // 锁相环高电平复位,此处取反
  16. .inclk0(sys_clk), // 系统时钟输入
  17. .c0(clk_100m),
  18. .c1(clk_100m_180deg),
  19. .c2(clk_50m),
  20. .c3(clk_25m),
  21. .locked(locked)
  22. );
  23. endmodule

3.4 配置引脚

image.png
配置完成后重新编译。
image.png
可以用示波器测量P6排针第5、6、7、8引脚输出的波形。

四、程序仿真

编写激励文件ip_pll_tb.v

  1. `timescale 1ns/1ns
  2. module ip_pll_tb ;
  3. parameter SYS_PERIOD = 20; //定义系统时钟周期
  4. reg clk ;
  5. reg rst_n ;
  6. wire clk_100m ;
  7. wire clk_100m_180deg ;
  8. wire clk_50m ;
  9. wire clk_25m ;
  10. always #(SYS_PERIOD/2) clk <= ~clk ;
  11. initial begin
  12. clk <= 1'b0;
  13. rst_n <= 1'b0;
  14. #(20*SYS_PERIOD)
  15. rst_n <= 1'b1;
  16. end
  17. //例化 ip_pll 模块
  18. ip_pll u_ip_pll(
  19. .sys_clk (clk),
  20. .sys_rst_n (rst_n),
  21. .clk_100m (clk_100m ),
  22. .clk_100m_180deg (clk_100m_180deg),
  23. .clk_50m (clk_50m ),
  24. .clk_25m (clk_25m )
  25. );
  26. endmodule

在Modelsim中新建一个工程,命名为ip_pll_tb,工程位置为X:\FPGA\Projects\08_ip_pll\sim\ip_pll_tb
image.png
altera_mf.vip_pll.vip_pll_tb.vpll_clk.v四个文件拷贝到08_ip_pll\sim\ip_pll_tb\tb文件夹中,打开这些已存在的文件并全部编译。
image.png
image.png
点击【Simulate】→【Start Simulation】开始仿真,选择【work】→【ip_pll_tb】仿真激励文件。
image.png
添加信号波形,设置仿真时长为1000ns并开始仿真。
image.png
image.png
仿真波形如下:
image.png
image.png
可以看到:

  1. 20个系统周期后,系统复位信号拉高,rst_n拉低,PLL开始工作。
  2. 在第490ns,locked信号拉高,PLL稳定工作,输出分频信号。