基于actel fpga的周期反馈式纯数字锁相环
[复制链接]
本帖最后由 teleagle 于 2018-10-8 22:19 编辑
基于actel fpga的周期反馈式纯数字锁相环:
简单的说就是建立一个状态机,对输入周期参数在产生时钟的每个周期的第一时间更新值,然后进入下一个状态计数,计数到和输入周期一致的时候又回到初始状态。代码综合仿真正确, 过程比较简单, 就不班门弄斧了. 不妥之处, 共同学习交流 ,一起改进, 代码如下:
//顶层模块:
module TE_DPLL_B(
sys_clk,
sys_rst,
clk_in,
clk_out
);
//---全局参数---
parameter DATA_W = 16; // 周期计数器及数据位宽,根据系统时钟与输入时钟的差值调整
parameter PN_EDGE = 2'b01; // 沿检测参数(01=上升沿,10=下降沿)
parameter DPLL_M = 2; // M 参数
parameter DPLL_N = 10; // N 参数
//---输入输出接口---
input sys_clk; // 系统时钟
input sys_rst; // 系统重置
input clk_in; // 输入时钟
output clk_out; // 输出时钟
//---内部信号---
wire [DATA_W-1:0] n_ti; // 输入时钟周期值
//---------------------------------------------------------
// 输入时钟周期测量模块,对输入时钟采样,测量输出时钟周期Ti
//---------------------------------------------------------
TE_DPLL_Figure TE_DPLL_Figure_0(
.sys_clk(sys_clk), // 系统时钟
.sys_rst(sys_rst), // 系统重置
.clk_i(clk_in), // 输入时钟
.t_o(n_ti) // 输入时钟周期值
);
defparam TE_DPLL_Figure_0.CNT_W = DATA_W; // 周期计数器位宽
defparam TE_DPLL_Figure_0.PN_EDGE = PN_EDGE; // 沿检测参数(01=上升沿,10=下降沿)
//---------------------------------------------------------
// 例化反馈模块
//---------------------------------------------------------
TE_DPLL_Feed TE_DPLL_Feed_0(
.sys_clk(sys_clk), // 系统时钟
.sys_rst(sys_rst), // 系统重置
.ti_i(n_ti), // 输入时期周期值
.clk_o(clk_out) // 输出时钟
);
defparam TE_DPLL_Feed_0.DATA_W = DATA_W; // 数据位宽
defparam TE_DPLL_Feed_0.PN_EDGE = PN_EDGE; // 沿检测参数(01=上升沿,10=下降沿)
defparam TE_DPLL_Feed_0.DPLL_M = DPLL_M; // M 参数
defparam TE_DPLL_Feed_0.DPLL_N = DPLL_N; // N 参数
endmodule
|