基于ZYNQ-7000系列的FPGA学习笔记10——IP核之锁相环

上一期内容,我们学习了VAVADO软件在线逻辑分析仪的使用方法,这一期我们IP核中另一个常用的内容:锁相环

1. 实验要求

通过例化VAVADO软件中的锁相环模块,产生四路不同的时钟信号,具体要求如下:

  • 一路时钟信号,频率为10MHz
  • 二路时钟信号,频率为10MHz,但是相位和一路相差180度
  • 三路时钟信号,频率为5MHz
  • 四路时钟信号,频率为25MHz
    在这里插入图片描述

2. 功能分析

2.1 锁相环简介

要完成以上内容,我们需要先来了解一下锁相环。

锁相环(Phase-Locked Loop,简称PLL)作为一种反馈控制电路,其特点是利用外部输入的参考信号来控制环路内部震荡信号的频率和相位。因为锁相环可以实现输出信号频率对输入信号频率的自动跟踪,所以锁相环通常用于闭环跟踪电路。锁相环在工作的过程中,当输出信号的频率与输入信号的频率相等时,输出电压与输入电压保持固定的相位差值,即输出电压与输入电压的相位被锁住,这就是锁相环名称的由来。下面是一个最简单的锁相环模型:
在这里插入图片描述
锁相环通常由以下三个基本部分组成:

  1. 鉴频鉴相器(Phase Detector,PD):比较输入信号与压控振荡器(VCO)输出信号的相位差,并产生一个与相位差成正比的误差电压。
  2. 环路滤波器(Low-Pass Filter,LPF):对相位检测器输出的误差电压进行滤波,消除高频分量,得到一个平滑的控制信号。
  3. 压控振荡器(Voltage-Controlled Oscillator,VCO):其输出频率随输入控制电压的变化而变化,通过调整VCO的输入电压,可以改变其输出频率,从而使VCO的输出信号相位逐渐接近输入信号相位。

这种锁相环的特点和明显,输入和输出的频率是一样的,如果需要输入和输出之间的频率不同,则需要引入分频锁相环和倍频锁相环,通过不断的分频和倍频就可以满足输出各种不同频率的信号,这就是锁相环的基本工作原理。

在这里插入图片描述

【注】:一个 PLL IP 核输出的时钟路数是有限的,且输入/输出的时钟频率也是有限制的,我们不能无限制的输入无穷大/小的时钟频率,也不可能通过倍频或分频输出无穷大/小的时钟频率。这里我们总结了一下几款常用芯片的相关信息,如下表所示:

在这里插入图片描述

2.1 MMCM(混合模式时钟管理)

我们在使用VAVADO软件中的锁相环IP核时,也可能会遇到MMCM。这里我们简单的介绍一下:

MMCM(混合模式时钟管理):是基于 PLL 的新型混合模式时钟管理器,实现了最低的抖动和抖动滤波,为高性能的 FPGA 设计提供更高性能的时钟管理功能。

MMCM 是一个 PLL 上加入 DCM 的一部分以进行精细的相移,也就是说 MMCM 在 PLL 的基础上加上了相位动态调整功能,又因为 PLL 是模拟电路,而动态调相是数字电路,所以 MMCM 被称为混合模式,MMCM 相对 PLL 的优势就是相位可以动态调整,但 PLL 占用的面积更小,而在大部分的设计当中大家使用 MMCM 或者 PLL 来对系统时钟进行分频、倍频和相位偏移都是完全可以的。

2.3 功能分析

有了上面锁相环的相关知识,相信对于如何实现本次实验的内容,聪明的你一定想到了解决办法,和上期一样,创建对应的IP核,进行相关配置,然后例化就好啦。至于例化输出的端口,我们这里选择的是正点原子领航者底板上的J3扩展口
在这里插入图片描述

3. 模块设计

根据实验要求,我们设计了如下的模块
在这里插入图片描述

  • 输入分别是50MHz的系统时钟输入和复位信号
  • 输出是四路需要输出的信号,这里不做赘述

4. 波形图

接着我们根据功能框图和实验要求,设计了如下的波形图:
在这里插入图片描述
到这里我们就基本明了本次实验的具体内容,下一步与之前的实验步骤不太一样,需要我们创建锁相环对应的IP核,然后再例化对应的模块。

5. 创建锁相环的IP核

创建锁相环IP核的步骤如下:

  1. 进入PLL创建向导
    在这里插入图片描述
  2. 配置时钟选项
    在这里插入图片描述
  3. 配置输出选项
    在这里插入图片描述
    完成上述步骤,就可以创建一个简单的锁相环IP核,下一步可以编写代码。

6.代码编写

  1. 编写rtl代码:
`timescale 1ns / 1ns
//////////////////////////////////////////////////////////////////////////////////
// Company: 
// Engineer: 
// 
// Create Date: 2024/12/08 16:54:27
// Design Name: 
// Module Name: ip_clk_wiz
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//////////////////////////////////////////////////////////////////////////////////
//顶层模块的端口定义
module ip_clk_wiz(
    input sys_clk,              //系统时钟
    input sys_rst_n,            //复位信号,低电平有效
    
    output clk_10m,            //输出10MHz
    output clk_10m_180deg,     //输出10Mhz,反向的信号
    output clk_5m,             //输出5MHz的信号
    output clk_25m             //输出25MHz的信号
    );
    
wire locked;

//PLL模块的例化
clk_wiz_0 u_clk_wiz_0(
    .clk_in1     (sys_clk),
    .reset       (~sys_rst_n),
    .clk_out1    (clk_10m),
    .clk_out2    (clk_10m_180deg),
    .clk_out3    (clk_5m),
    .clk_out4    (clk_25m),
    .locked      (locked)
);
endmodule
  1. 编写tb代码:
`timescale 1ns / 1ns  //仿真单位/精度

module tb_ip_clk_wiz();

parameter CLK_PERIOD = 20;  //时钟周期

reg sys_clk;
reg sys_rst_n;

wire clk_10m;
wire clk_10m_180deg;
wire clk_5m;
wire clk_25m;

initial begin
    sys_clk <= 1'b0;
    sys_rst_n <= 1'b0;
    #200
    sys_rst_n <=1'b1;
end

always #(CLK_PERIOD / 2) sys_clk <= ~sys_clk;

ip_clk_wiz u_ip_clk_wiz(
    .sys_clk           (sys_clk),            //系统时钟
    .sys_rst_n         (sys_rst_n),          //复位信号,低电平有效

    .clk_10m           (clk_10m),            //输出10MHz
    .clk_10m_180deg    (clk_10m_180deg),     //输出10Mhz,反向的信号
    .clk_5m            (clk_5m),             //输出5MHz的信号
    .clk_25m           (clk_25m)             //输出25MHz的信号
);

endmodule

7. 代码仿真

如果按照之前的步骤,对我们编写的代码进行仿真,会发现Modelsim仿真报错了,这是因为我们调用了VIVADO自带的IP模块,在仿真的过程中缺少了需要的仿真库文件,解决的方式有两个,第一个是使用VIVADO自带的仿真,第二个是使用VIVADO和Modelsim进行联合仿真,下面我将介绍这两种方式:

7.1 使用VAVADO自带的仿真

Vivado 设计套件内部集成了仿真器 Vivado Simulator,能够在设计流程的不同阶段运行设计的功能仿真和时序仿真,结果可以在 Vivado IDE 集成的波形查看器中显示。使用的方法也很简单,步骤如下:

  1. 添加激励文件
    在这里插入图片描述
  2. 保存之后按照如下方式开启仿真

在这里插入图片描述
【注】:这里仿真的使用方法不做介绍,和Modelsim很类似,感兴趣的也可以去找找教程,或者自行探索。

7.2 使用VIVADO和Modelsim进行联合仿真

除了使用VAVADO自带的仿真,Vivado 还支持与诸如 ModelSim、Verilog Compiler Simulator (VCS)、Questa Advanced Simulator 等第三方仿真器的联合仿真。

  1. 首先我们需要再Modelsim的安装目录下创建一个存放vivado仿真库文件的目录:
    在这里插入图片描述
  2. 然后需要生成对应的仿真库文件,需要我们打开VAVADO软件

在这里插入图片描述

  1. 进入VAVADO软件进行仿真设置
    在这里插入图片描述
    在这里插入图片描述

  2. 完成上述步骤之后,就可以直接开启仿真,然后VIVADO会自动开启Modelsim,进入仿真页面。

在这里插入图片描述
可以看到仿真结果和我们绘制的波形图是一样的,频率符合预期,至此代码仿真完成,下一步添加约束文件,并综合分析

8. 添加约束文件并分析综合

  1. 添加如下的我约束文件
create_clock -period 20.000 -name sys_clk [get_ports sys_clk]
set_property -dict {PACKAGE_PIN U18 IOSTANDARD LVCMOS33} [get_ports sys_clk]
set_property -dict {PACKAGE_PIN N16 IOSTANDARD LVCMOS33} [get_ports sys_rst_n]
set_property -dict {PACKAGE_PIN U20 IOSTANDARD LVCMOS33} [get_ports clk_10m]
set_property -dict {PACKAGE_PIN T20 IOSTANDARD LVCMOS33} [get_ports clk_10m_180deg]
set_property -dict {PACKAGE_PIN N18 IOSTANDARD LVCMOS33} [get_ports clk_5m]
set_property -dict {PACKAGE_PIN P19 IOSTANDARD LVCMOS33} [get_ports clk_25m]
  1. 然后分析综合,得到如下结果
    在这里插入图片描述
    可以看到顶层模块中是例化了锁相环模块的,锁相环这里就相当于一个黑匣子,点进去只能看到如下内容:
    在这里插入图片描述
    无法看到锁相环的内部结构,只能看到对应接口的连接方式。

至此,本次实验内容到此结束,下一步就是生成比特流文件,然后观察实验结果。

9. 实验结果

由于我这里的条件有限,只有双通道的示波器,所以四路的输出信号这里分开展示。

  1. 一二路的输出信号

在这里插入图片描述

  1. 三四路的输出信号

在这里插入图片描述

10. 补充:不同仿真方式的区别

在这里插入图片描述

我们在使用仿真的时候,是可以看到有很多个仿真选项,但是我们使用的是第一个选项:行为仿真。实际上这里一共有五种仿真方式,分别如下:

  • run behavioral simulation :行为级仿真,也是通常说的功能仿真。
  • post-synthesis function simulation : 综合后的功能仿真。
  • post-synthesis timing simulation : 综合后的时序仿真,和真实运行的时序就相差不远了。
  • post-implementation function simulation : 实现后的功能仿真。
  • post-implementation timing simulation : 实现后的时序仿真,最接近真实的时序波形。

根据数字电路设计的不同阶段,产生了三个阶段的仿真,分别是RTL行为级仿真,综合后门级功能仿真和时序仿真。

  1. RTL 行为级仿真

在大部分设计中执行的第一个仿真都是 RTL 行为级仿真。这个阶段的仿真可以用来检查代码中的语法错误以及代码行为的正确性,需要注意是该阶段的仿真是不包含延时信息的。如果没有实例化一些与器件相关的特殊底层元件的话,这个阶段的仿真也可以做到与器件无关。因此在设计的初期阶段不使用特殊底层元件即可以提高代码的可读性、可维护性,又可以提高仿真效率,且容易被重用。(绝大部分设计人员
将这个阶段的仿真叫做功能仿真!)

  1. 综合后门级功能仿真 (前仿真)

一般在设计流程中的第二个仿真是综合后门级功能仿真。绝大多数的综合工具除了可以输出一个标准网表文件以外,还可以输出 Verilog 或者 VHDL 网表,其中标准网表文件是用来在各个工具之间传递设计数据的,并不能用来做仿真使用,而输出的 Verilog 或者 VHDL 网表是可以用来仿真的。之所以叫门级仿真是因为综合工具给出的仿真网表已经是与生产厂家的器件的底层元件模型对应起来了,所以为了进行综合后仿真必须在仿真过程中加入厂家的器件库,并对仿真器进行一些必要的配置,不然仿真器并不认识其中的底层元件,也就无法进行仿真了。

  1. 时序仿真 (后仿真)

在设计流程中的最后一个仿真是时序仿真。在设计布局布线完成以后可以提供一个时序仿真模型,这种模型中也包括了器件的一些信息,同时还会提供一个 SDF 时序标注文件(Standard Delay format Timing Anotation)。SDF 时序标注最初使用在 Verilog 语言的设计中,现在 VHDL 语言的设计中也引用了这个概念。对于一般的设计者来说并不需知道 SDF。

以上就是本期的所有内容,创造不易,点个关注再走呗。

在这里插入图片描述

<think>好的,我现在需要回答用户关于FPGA锁相环设计与实现的提问。首先,用户提供的参考引用提到了基于FPGA的全数字锁相环设计,包括模块划分、仿真测试等。我应该围绕这些内容展开,确保结构清晰,分步骤说明。 首先,锁相环(PLL)的基本原理和状态需要解释清楚。用户提到的全数字锁相环(ADPLL)可能由鉴相器、环路滤波器、数控振荡器等模块组成,这些模块的功能和实现方式需要详细说明。然后,设计步骤方面,用户参考中的章节安排提到了使用HDL语言在EDA平台上进行开发,因此需要分模块设计、仿真验证、系统调试等步骤。 接下来,FPGA实现的具体问题,如时钟资源管理、环路延时补偿、噪声抑制,这些都是实际设计中可能遇到的挑战,需要结合参考中的系统调试部分,说明如何通过仿真和测试来解决这些问题。此外,用户可能还关心应用场景,比如通信系统或时钟恢复,需要简要提及。 在格式上,要遵循用户的要求:行内公式用$...$,独立公式用$$...$$,并且生成相关问题。需要检查LaTeX语法是否正确,比如积分符号、上下标等。引用标识要自然地添加在相关段落末尾,比如在提到系统调试时引用[^1]。 最后,确保回答用中文,结构分步骤,语言自然,避免使用Markdown格式。同时,生成的相关问题要围绕设计方法、优化、应用等方面,帮助用户进一步探索。</think>### FPGA中全数字锁相环(ADPLL)设计与实现 #### 1. **设计原理与模块划分** 全数字锁相环(ADPLL)的心是通过数字信号处理实现相位同步,通常包含以下模块: - **鉴相器(Phase Detector, PD)**:检测输入信号与本地振荡器信号的相位差,输出误差信号。例如,异或门鉴相器可表示为$e(t) = \text{XOR}(V_{in}, V_{out})$[^1]。 - **数字环路滤波器(Loop Filter, LF)**:滤除高频噪声并调整环路动态特性,常用一阶或二阶滤波器,传递函数为$H(z) = K_p + K_i \cdot \frac{z}{z-1}$。 - **数控振荡器(Numerically Controlled Oscillator, NCO)**:根据滤波后的误差信号调整输出频率,其频率控制字公式为$f_{out} = f_{clk} \cdot \frac{N}{2^M}$,其中$N$为控制字,$M$为累加器位数。 #### 2. **实现步骤** - **硬件描述语言编码**:使用Verilog或VHDL编写模块代码。例如,NCO的心代码可能包含相位累加器和正弦查找表: ```verilog module nco (input clk, input [31:0] freq_word, output reg [7:0] sine_out); reg [31:0] phase_acc; always @(posedge clk) begin phase_acc <= phase_acc + freq_word; sine_out <= sine_table[phase_acc[31:24]]; end endmodule ``` - **时序仿真与优化**:在Quartus/Vivado中进行功能仿真,验证环路锁定时间、稳态误差等指标。例如,通过调整滤波器系数$K_p$和$K_i$优化响应速度。 - **资源优化**:利用FPGA的DSP模块实现乘法运算,或使用流水线结构降低逻辑延时。 #### 3. **关键问题与解决** - **时钟抖动抑制**:通过优化电源去耦电路与时钟树布局,减少高频噪声对NCO的影响。 - **环路稳定性分析**:需满足奈奎斯特准则,确保开环增益$|H(z)G(z)| < 1$在截止频率外衰减。 - **量化误差补偿**:增加累加器位数(如32位→48位)或采用Σ-Δ调制技术,降低频率分辨率误差。 #### 4. **应用场景** - **通信系统**:用于载波同步,如QPSK解调中的时钟恢复。 - **片上时钟管理**:为FPGA内部不同模块提供多相位时钟,如DDR接口的90°相位偏移时钟。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不想写代码的我

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值