> 技术文档 > 【FPGA】 数字锁相环verilog设计_verilog锁相环输出载波代码

【FPGA】 数字锁相环verilog设计_verilog锁相环输出载波代码

module adpll (
input clk, // 系统时钟(100MHz)
input reset, // 异步复位
input ref_clk, // 参考输入(50K-100KHz方波)
output pll_lock, // 输出lock
output dco_out // 输出方波(255倍频)
);

// 系统参数
parameter CLK_FREQ = 100_000_000; // 100MHz系统时钟
parameter PHASE_ACC_WIDTH = 32; // 相位累加器位数
parameter DIVIDER_RATIO = 255; // 分频
parameter ERROR_WIDTH = 24; // 相位误差位数

// 同步输入信号
reg ref_sync1, ref_sync2;
always @(posedge clk or posedge reset) begin
if (reset) begin
ref_sync1 <= 0;
ref_sync2 <= 0;
end else begin
ref_sync1 <= ref_clk;
ref_sync2 <= ref_sync1;
end
end

// 边沿检测
reg ref_edge_detect;
reg ref_edge_id;
reg ref_edge_first;
reg ref_edge_second;
wire ref_edge;
wire freq_lock;
wire freq_lock_edge;
reg freq_lock_id;

always @(posedge clk or posedge reset) begin
if(reset) begin
ref_edge_first <= 0;
ref_edge_second <= 0;
ref_edge_detect <= 0;
ref_edge_id <= 0;
freq_lock_id <= 0;
end else begin
if(ref_edge)
ref_edge_first <= 1\'b1;
if(ref_edge && ref_edge_first)
ref_edge_second <= 1\'b1;
ref_edge_detect <= ref_sync2;
ref_edge_id <= ref_edge;
freq_lock_id <= freq_lock;
end
end

assign ref_edge = ref_sync2 & ~ref_edge_detect;

//

// 反馈分频器(255分频)
reg [7:0] div_counter ;
reg fb_clk ;
always @(posedge dco_out or posedge reset) begin
if (reset) begin
div_counter <= 0;