Xilinx 平台 drp 动态调节 mmcm

server/2024/12/28 20:27:13/

分享个人觉得有意思的知识:

  1. 什么样的时钟 会输入到 锁相环里
    在这里插入图片描述

  2. 锁相环框图 VCO 控制电压控制频率 DS182 可以查看 VCO 范围
    a. 先生成高频 的 VCO
    b. 再通过 倍频和分频 产生具体各路时钟
    c.在这里插入图片描述

  3. 怎么控制 输出频率?XAPP888
    a. high time 是VCO 高电平 持续周期
    b. low time 是 VCO 低电平持续周期
    c. no count 是 VCO时钟周期的计数
    d. edge 将high time 再扩展半个vco 周期 ,可以用来奇数分频 变成 50%占空比
    e. high time 和 low time的 和 是 分频值

  4. 控制相位
    b. 八个可变调节 以 45°为步长
    c. 如果需要 20°就需要使用delay time
    d. vco 频率越高,分频系数越高,相位越精细,如果是 10分频那么VCO输出一周期就是便宜360/10 = 36°

  5. 小数分频
    在这里插入图片描述

  6. 时序图:

在这里插入图片描述

  1. 代码:
    此代码 配置 其中的一个时钟输出,首先读出对于寄存器,然后设置,再读出对比寄存器值,观察是否设置成功,可以使用 LED 观察现象。

代码分享

`timescale 1ns / 1ps
module drp(input               i_clk           ,input               i_rst           ,output [6 :0]       o_daddr         ,   output              o_dclk          ,   output              o_den           ,     output [15:0]       o_din           ,output              o_dwe           ,     input  [15:0]       i_dout          ,  input               i_drdy          ,output              o_mmcm_rst      );localparam              P_CLKOUT0_REG1_ADDR = 16'h08    ;
localparam [5 :0]       P_HIGN_TIME         = 6'd10     ;
localparam [5 :0]       P_LOW_TIME          = 6'd10     ;localparam              P_ST_IDLE     = 0   ,P_ST_RST      = 1   ,P_ST_RREG     = 2   ,P_ST_WRDY     = 3   ,P_ST_SET      = 4   ,P_ST_WAIT_RDY = 5   ,P_ST_2RREG    = 6   ,P_ST_2WRDY    = 7   ,P_ST_END      = 8   ;reg  [7 :0]             r_st_current    ;
reg  [7 :0]             r_st_next       ;
reg  [15:0]             r_st_cnt        ;reg  [6 :0]             ro_daddr        ;
reg                     ro_dclk         ;
reg                     ro_den          ;
reg  [15:0]             ro_din          ;
reg                     ro_dwe          ;
reg                     ro_mmcm_rst     ;
(* MARK_DEBUG = "TRUE" *)reg  [15:0]             r_clkout0_reg1  ;
(* MARK_DEBUG = "TRUE" *)reg  [15:0]             r_clkout0_2reg1 ;
reg  [1 :0]             r_rdy           ;assign o_daddr      = ro_daddr          ;
assign o_dclk       = ro_dclk           ;
assign o_den        = ro_den            ;
assign o_din        = ro_din            ;
assign o_dwe        = ro_dwe            ;
assign o_mmcm_rst   = ro_mmcm_rst       ;always@(posedge i_clk,posedge i_rst)
beginif(i_rst)r_st_current <= P_ST_IDLE;else r_st_current <= r_st_next;
endalways@(*)
begincase(r_st_current)P_ST_IDLE       : r_st_next = r_st_cnt == 20000 ? P_ST_RST  : P_ST_IDLE ;P_ST_RST        : r_st_next = r_st_cnt == 20    ? P_ST_RREG : P_ST_RST  ;P_ST_RREG       : r_st_next = P_ST_WRDY;P_ST_WRDY       : r_st_next = r_rdy[1]          ? P_ST_SET  : P_ST_WRDY ;P_ST_SET        : r_st_next = P_ST_WAIT_RDY;P_ST_WAIT_RDY   : r_st_next = r_rdy[1]          ? P_ST_2RREG  : P_ST_WAIT_RDY;P_ST_2RREG      : r_st_next = P_ST_2WRDY;P_ST_2WRDY      : r_st_next = r_rdy[1]          ? P_ST_END    : P_ST_2WRDY;P_ST_END        : r_st_next = P_ST_END;default         : r_st_next = P_ST_IDLE;endcase
endalways@(posedge i_clk,posedge i_rst)
beginif(i_rst)r_st_cnt <= 'd0;else if(r_st_current != r_st_next)r_st_cnt <= 'd0;else r_st_cnt <= r_st_cnt + 1;
endalways@(posedge i_clk,posedge i_rst)
beginif(i_rst)ro_mmcm_rst <= 'd0;else if(r_st_current == P_ST_END)ro_mmcm_rst <= 'd0;else if(r_st_current == P_ST_RST)ro_mmcm_rst <= 'd1;else ro_mmcm_rst <= ro_mmcm_rst;
endalways@(posedge i_clk,posedge i_rst)
beginif(i_rst) beginro_daddr <= 'd0;ro_den   <= 'd0;ro_din   <= 'd0;ro_dwe   <= 'd0;end else if(r_st_current == P_ST_RREG || r_st_current == P_ST_2RREG) begin ro_daddr <= P_CLKOUT0_REG1_ADDR;ro_den   <= 'd1;ro_din   <= 'd0;ro_dwe   <= 'd0;end else if(r_st_current == P_ST_SET) begin ro_daddr <= P_CLKOUT0_REG1_ADDR;ro_den   <= 'd1;ro_din   <= (r_clkout0_reg1 | 16'b0000_1111_1111_1111) & {4'b1111,P_HIGN_TIME,P_LOW_TIME};ro_dwe   <= 'd1;end else beginro_daddr <= 'd0;ro_den   <= 'd0;ro_din   <= 'd0;ro_dwe   <= 'd0;end
endalways@(posedge i_clk,posedge i_rst)
beginif(i_rst)r_rdy <= 'd0;else r_rdy <= {r_rdy[0],i_drdy};
endalways@(posedge i_clk,posedge i_rst)
beginif(i_rst)r_clkout0_reg1 <= 'd0;else if(r_st_current == P_ST_WRDY && i_drdy)r_clkout0_reg1 <= i_dout;else r_clkout0_reg1 <= r_clkout0_reg1;
endalways@(posedge i_clk,posedge i_rst)
beginif(i_rst)r_clkout0_2reg1 <= 'd0;else if(r_st_current == P_ST_2WRDY && i_drdy)r_clkout0_2reg1 <= i_dout;else r_clkout0_2reg1 <= r_clkout0_2reg1;
end
endmodule

http://www.ppmy.cn/server/154015.html

相关文章

嵌入式硬件杂谈(七)IGBT MOS管 三极管应用场景与区别

引言&#xff1a;在现代嵌入式硬件设计中&#xff0c;开关元件作为电路中的重要组成部分&#xff0c;起着至关重要的作用。三种主要的开关元件——IGBT&#xff08;绝缘栅双极型晶体管&#xff09;、MOSFET&#xff08;金属氧化物半导体场效应晶体管&#xff09;和三极管&#…

MetaRename for Mac,适用于 Mac 的文件批量重命名工具

在处理大量文件时&#xff0c;为每个文件手动重命名既耗时又容易出错。对于摄影师、设计师、开发人员等需要频繁处理和整理文件的专业人士来说&#xff0c;找到一款能够简化这一过程的工具是至关重要的。MetaRename for Mac 就是这样一款旨在提高工作效率的应用程序&#xff0c…

WebP Vs. PNG:哪种图像格式适合您的网站?

图像对任何网站都至关重要,可以增强视觉吸引力和用户体验。但是,图像也会显着影响网站的加载时间,因此必须针对 Web 使用对其进行优化。一种方法是使用正确的图像格式。

【MFC】多工具栏如何保存状态(续)

之前我写过一篇&#xff1a; 【MFC】多工具栏如何保存状态 其中的方法有点无奈&#xff0c;经过我最新的研究&#xff0c;有了更好的方法。现在分享给大家。 系统中保存状态是通过&#xff1a; pToolBar->LoadState(strSection);来实现 我原来的方法是绕过&#xff0c;现在考…

go下载依赖提示连接失败

1、现象 Go下载模块提示连接失败 dial tcp 142.251.42.241:443: connectex: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond.…

Large Language Model based Multi-Agents: A Survey of Progress and Challenges

一、摘要 背景&#xff1a; 大型语言模型&#xff08;LLMs&#xff09;在多种任务中取得了显著的成功&#xff0c;展现出与人类相媲美的规划和推理能力。LLMs被用作自主智能体&#xff0c;自动执行任务&#xff0c;尤其在基于单个LLM的规划或决策智能体的基础上&#xff0c;基于…

Educational Codeforces Round 173 (Rated for Div. 2) - Codeforces

Educational Codeforces Round 173 (Rated for Div. 2) - Codeforces Problem - A - Codeforces 签到题目 Problem - B - Codeforces 数学 被小学奥数薄纱力… 给出一个由 n ! n! n!个 d d d组成的整数&#xff0c;看他能否被十以内的奇数整除 1 1 1肯定是答案 一个数能…

论文解读 | EMNLP2024 一种用于大语言模型版本更新的学习率路径切换训练范式

点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入&#xff01; 点击 阅读原文 观看作者讲解回放&#xff01; 作者简介 王志豪&#xff0c;厦门大学博士生 刘诗雨&#xff0c;厦门大学硕士生 内容简介 新数据的不断涌现使版本更新成为大型语言模型&#xff08;LLMs&#xff…