数字锁相环 DPLL 设计 Verilog Quartus

名称:数字锁相环 DPLL 设计 Verilog Quartus

软件:Quartus

语言:Verilog

功能介绍

这是一个适合 FPGA 课程设计和数字锁相环原理学习的基础 DPLL 工程。系统以参考方波 ref_sig 为输入,通过鉴频鉴相器比较参考边沿与反馈边沿的先后关系,再由数字环路滤波器调节 NCO 的频率控制字,使 dpll_out 的频率逐步逼近参考信号。顶层同时引出 up、down、freq_word、phase_acc 和 phase_error,便于在仿真中观察闭环调节细节。 工程采用 Verilog 模块化实现,核心由 PFD、loop_filter 和 nco 组成,顶层 dpll_top 负责信号连接,tb_dpll 用于测试激励和结果观察。环路滤波器使用可配置的初始控制字、调节步长和上下限,NCO 使用相位累加器生成本地方波,适合分析频率控制字变化与输出频率之间的关系。 仿真重点体现了基础 bang-bang DPLL 的渐进锁定特性,并针对一次比较期间重复调节导致的输出占空比不均问题进行了调节策略改进。该工程适合用于理解数字锁相环的信号流向、闭环反馈、频率跟踪和参数权衡。

运行环境

开发语言为 Verilog,工程使用 Quartus 项目文件组织,顶层模块为 dpll_top。仿真测试平台为 tb_dpll.v,工程同时提供 ModelSim RTL 仿真目录和运行脚本;设计说明中给出了在 iverilog 环境下进行编译与功能仿真的使用方式。主要源码文件包括 dpll_top.v、pfd.v、loop_filter.v、nco.v 和 tb_dpll.v。

设计思路

本设计在 FPGA 数字域中复现锁相环的基本闭环结构。参考方波 ref_sig 与数控振荡器 NCO 产生的反馈方波 fb_sig 同时送入鉴频鉴相器 PFD,PFD 根据两路上升沿的先后关系输出 up 或 down 方向信号。环路滤波器依据方向信息对频率控制字 freq_word 进行步进调整,NCO 再使用新的控制字推进相位累加器并产生本地输出,最终形成 ref_sig → PFD → Loop Filter → NCO → 反馈的闭环通路。 环路滤波器采用固定步长的数字调节方式。参考信号先到时增加控制字,反馈信号先到时减小控制字,并通过 MIN_WORD 与 MAX_WORD 进行边界限制。为改善输出方波的稳定性,每次有效比较只执行一次频率修正,避免 up 或 down 持续为高电平时连续多拍调节造成输出频率瞬时变化和占空比失衡。NCO 以相位累加器最高位生成方波,控制字越大,相位推进越快,输出频率越高;PHASE_W、BASE_WORD 和 STEP 可用于调整分辨率、初始频率及收敛速度。

模块结构

顶层模块 dpll_top 接收 clk、rst_n 和 ref_sig,输出 dpll_out 以及用于观察的控制和状态信号。pfd 模块比较参考信号与 NCO 反馈信号的边沿先后,产生 up/down 方向控制;loop_filter 模块根据方向信号更新 freq_word,并执行 MIN_WORD、MAX_WORD 限幅;nco 模块通过 PHASE_W 位相位累加器产生反馈方波和 phase_acc。dpll_out 直接连接 NCO 输出。 测试文件 tb_dpll.v 提供系统时钟、复位和参考方波激励,并可统计参考信号与输出信号的上升沿数量,观察频率逼近过程。工程文件包含 Quartus 项目配置以及 ModelSim 仿真脚本,便于查看 RTL 结构和运行测试平台。

演示视频

配套演示视频展示基础数字锁相环的闭环运行过程,可结合参考信号、反馈信号、频率控制字和输出波形观察系统从初始状态逐步逼近目标频率的过程。

仿真图/仿真说明/设计文档图片

工程配套设计文档覆盖程序结构、编译流程、RTL 结构、Testbench、整体仿真图以及 PFD、数字环路滤波器和 NCO 的模块说明。仿真条件包括 50 MHz 系统时钟、约 14.9 kHz 参考信号、24 位相位累加器和 50 ms 仿真时长,可通过 up、down、freq_word、phase_acc 观察闭环收敛过程。仿真分析显示,输出频率能够逐步逼近参考频率;采用单次有效比较调节后,输出方波的高低电平宽度更加均衡。

数字锁相环 DPLL 设计 Verilog Quartus 设计文档图片 image1.png

数字锁相环 DPLL 设计 Verilog Quartus 设计文档图片 image10.png

数字锁相环 DPLL 设计 Verilog Quartus 设计文档图片 image11.png

数字锁相环 DPLL 设计 Verilog Quartus 设计文档图片 image12.png

数字锁相环 DPLL 设计 Verilog Quartus 设计文档图片 image13.png

数字锁相环 DPLL 设计 Verilog Quartus 设计文档图片 image14.png

数字锁相环 DPLL 设计 Verilog Quartus 设计文档图片 image2.png

数字锁相环 DPLL 设计 Verilog Quartus 设计文档图片 image3.png

数字锁相环 DPLL 设计 Verilog Quartus 设计文档图片 image4.png

数字锁相环 DPLL 设计 Verilog Quartus 设计文档图片 image5.png

数字锁相环 DPLL 设计 Verilog Quartus 设计文档图片 image6.png

数字锁相环 DPLL 设计 Verilog Quartus 设计文档图片 image7.png

数字锁相环 DPLL 设计 Verilog Quartus 设计文档图片 image8.png

数字锁相环 DPLL 设计 Verilog Quartus 设计文档图片 image9.png

部分代码

以下展示顶层模块 dpll_top 的部分代码,完整源码请下载压缩包查看。

module dpll_top #(
    parameter integer CTRL_W    = 24,
    parameter integer PHASE_W   = 24,
    parameter integer BASE_WORD = 24'd5000,
    parameter integer STEP      = 24'd4,
    parameter integer MIN_WORD  = 24'd100,
    parameter integer MAX_WORD  = 24'd20000
) (
    input  wire                      clk,
    input  wire                      rst_n,
    input  wire                      ref_sig,
    output wire                      dpll_out,
    output wire                      up,
    output wire                      down,
    output wire [CTRL_W-1:0]         freq_word,
    output wire [PHASE_W-1:0]        phase_acc,
    output wire signed [2:0]         phase_error
);

    // NCO 输出作为反馈信号送回鉴相器
    wire fb_sig;

    // 鉴频鉴相器
    pfd u_pfd (
        .clk    (clk),
        .rst_n  (rst_n),
        .ref_sig(ref_sig),
        .fb_sig (fb_sig),
        .up     (up),
        .down   (down)
    );

    // 环路滤波器
    loop_filter #(
        .CTRL_W   (CTRL_W),
        .BASE_WORD(BASE_WORD),
        .STEP     (STEP),
        .MIN_WORD (MIN_WORD),
        .MAX_WORD (MAX_WORD)
    ) u_loop_filter (
        .clk        (clk),
        .rst_n      (rst_n),
        .up         (up),
        .down       (down),
        .freq_word  (freq_word),
        .phase_error(phase_error)
    );

    // 数控振荡器
    nco #(
        .PHASE_W(PHASE_W)
    ) u_nco (
        .clk      (clk),
        .rst_n    (rst_n),
        .freq_word(freq_word),
        .nco_out  (fb_sig),
        .phase_acc(phase_acc)
    );

    // 对外输出就是 NCO 当前输出
    assign dpll_out = fb_sig;

endmodule

代码文件(付费下载)

📥 付费后此处显示完整工程压缩包下载链接。
1、代码文件需要付费后才可见。
2、支付问题请联系微信公众号客服。
3、优质Verilog/VHDL代码资源,所见即所得。
Verilog/VHDL资源下载 » 数字锁相环 DPLL 设计 Verilog Quartus

注册为本站会员,充值100得150,详情咨询客服

目前为止共有 *** 位优秀的会员加入! 立刻加入会员