Verilog基础之十七、锁相环PLL

news2024/11/26 13:39:59

目录

一、前言

1.1 背景

1.2 PLL结构

二、工程设计

2.1 PLL IP核配置

2.2 设计代码

2.3 测试代码

2.4 仿真结果

2.5 常见问题


一、前言

1.1 背景

    若将一个FPGA工程看做一个人体,时钟的重要性丝毫不亚于心脏对于人体的重要性,时钟的每一个周期对于工程都是一次全面的状态更新,因此,时钟的有效使用重要性不言而喻。

    以赛灵思7系列的器件为例,在之前的文章Xilinx之7系列时钟资源与时钟架构 中,第三节时钟管理单元 提到了7系列时钟管理单元CMT,CMT包含了MMCM和PLL,PLL的功能为MMCM功能的子集,可实现时钟网络去偏斜,频率合成,去抖动。

1.2 PLL结构

     根据赛灵思官网用户手册,PLL的结构如下图

    PLL主要的组成部分有图中3个红色框:鉴相器PFD,电荷泵CP和低通滤波器LF,压控振荡器VCO。实现的流程为VCO自身输出一个时钟CLKFBOUT反馈到PFD,PFD对输入时钟和反馈时钟的相位进行比较,将比较的相位差传输到CP和LF,LF主要用于滤除高频干扰信号。CP和LF会将结果转换成电压信号,电压信号控制VCO的输出频率。在PLL达到稳定状态后,输出频率FvcoH和输入频率Fclkin满足如下关系。

     对于例化PLL的原语有两种:PLLE2_BASE,PLLE2_ADV,PLLE2_ADV的端口更多,功能更丰富。

在Vivado的Language Templates中搜索PLL可查找到7系列的4个型号Atrix,都具有PLLE2_BASE,PLLE2_ADV两种类型,类似的MMCM也有两种BASE和ADV两种类型

以PLLE2_ADV为例,各端口说明如下,其中,CLKOUT0-CLKOUT3支持PLL/MMCM间的级联连接。

二、工程设计

   下面展示使用原语例化和IP核两种方式使用PLL,用CLKOUT0-CLKOUT3 4路输出示例,其中PLL IP核的配置与例化的PLL相同。

2.1 PLL IP核配置

2.2 设计代码

module PLL( CLKIN1,CLKIN2,CLKIN1_ip,CLKIN2_ip,RST,CLKINSEL,CLKOUT0,CLKOUT1,CLKOUT2,CLKOUT3,
CLKOUT0_ip,CLKOUT1_ip,CLKOUT2_ip,CLKOUT3_ip);
input CLKIN1,CLKIN2,CLKIN1_ip,CLKIN2_ip,RST,CLKINSEL;
output CLKOUT0,CLKOUT1,CLKOUT2,CLKOUT3;
output CLKOUT0_ip,CLKOUT1_ip,CLKOUT2_ip,CLKOUT3_ip;
wire n_clkfbout;

//使用PLLE2_ADV原语
   PLLE2_ADV #(
      .BANDWIDTH("OPTIMIZED"),  // OPTIMIZED, HIGH, LOW
      .CLKFBOUT_MULT(9),       //时钟输出乘该值
      .CLKFBOUT_PHASE(0.0),     // Phase offset in degrees of CLKFB, (-360.000-360.000).
      // CLKIN_PERIOD: Input clock period in nS to ps resolution (i.e. 33.333 is 30 MHz).
      .CLKIN1_PERIOD(10.0),    //参考时钟1周期为10ns
      .CLKIN2_PERIOD(8.333),    //参考时钟2周期为8.333ns
      // CLKOUT0_DIVIDE - CLKOUT5_DIVIDE: Divide amount for CLKOUT (1-128)
      .CLKOUT0_DIVIDE(1),       //第一路输出分频系数为1
      .CLKOUT1_DIVIDE(2),       //第一路输出分频系数为2
      .CLKOUT2_DIVIDE(10),      //第一路输出分频系数为10
      .CLKOUT3_DIVIDE(20),      //第一路输出分频系数为20
//      .CLKOUT4_DIVIDE(10),
//      .CLKOUT5_DIVIDE(20),
      // CLKOUT0_DUTY_CYCLE - CLKOUT5_DUTY_CYCLE: Duty cycle for CLKOUT outputs (0.001-0.999).
      .CLKOUT0_DUTY_CYCLE(0.5),  //第一路输出占空比为0.5
      .CLKOUT1_DUTY_CYCLE(0.1), //第一路输出占空比为0.1 
      .CLKOUT2_DUTY_CYCLE(0.3), //第一路输出占空比为0.3
      .CLKOUT3_DUTY_CYCLE(0.7), //第一路输出占空比为0.7
//      .CLKOUT4_DUTY_CYCLE(0.4),
//      .CLKOUT5_DUTY_CYCLE(0.6),
      // CLKOUT0_PHASE - CLKOUT5_PHASE: Phase offset for CLKOUT outputs (-360.000-360.000).
      .CLKOUT0_PHASE(0.0),
      .CLKOUT1_PHASE(0.0),
      .CLKOUT2_PHASE(0.0),
      .CLKOUT3_PHASE(0.0),
      .CLKOUT4_PHASE(0.0),
      .CLKOUT5_PHASE(0.0),
      .COMPENSATION("ZHOLD"),   // ZHOLD, BUF_IN, EXTERNAL, INTERNAL
      .DIVCLK_DIVIDE(1),        // Master division value (1-56)
      // REF_JITTER: Reference input jitter in UI (0.000-0.999).
      .REF_JITTER1(0.0),
      .REF_JITTER2(0.0),
      .STARTUP_WAIT("FALSE")    // Delay DONE until PLL Locks, ("TRUE"/"FALSE")
   )
   PLLE2_ADV_inst (
      // Clock Outputs: 1-bit (each) output: User configurable clock outputs
      .CLKOUT0(CLKOUT0),   // 1-bit output: CLKOUT0
      .CLKOUT1(CLKOUT1),   // 1-bit output: CLKOUT1
      .CLKOUT2(CLKOUT2),   // 1-bit output: CLKOUT2
      .CLKOUT3(CLKOUT3),   // 1-bit output: CLKOUT3
      .CLKOUT4(CLKOUT4),   // 1-bit output: CLKOUT4
      .CLKOUT5(CLKOUT5),   // 1-bit output: CLKOUT5
      // DRP Ports: 16-bit (each) output: Dynamic reconfiguration ports
      .DO(),             // 16-bit output: DRP data
      .DRDY(),         // 1-bit output: DRP ready
      // Feedback Clocks: 1-bit (each) output: Clock feedback ports
      .CLKFBOUT(n_clkfbout), // 1-bit output: Feedback clock
      .LOCKED(),     // 1-bit output: LOCK
      // Clock Inputs: 1-bit (each) input: Clock inputs
      .CLKIN1(CLKIN1),     // 1-bit input: Primary clock
      .CLKIN2(CLKIN2),     // 1-bit input: Secondary clock
      // Control Ports: 1-bit (each) input: PLL control ports
      .CLKINSEL(CLKINSEL), // 1-bit input: Clock select, High=CLKIN1 Low=CLKIN2
      .PWRDWN(PWRDWN),     // 1-bit input: Power-down
      .RST(RST),           // 1-bit input: Reset
      // 动态重配相关的不使用,悬空即可
      .DADDR(DADDR),       // 7-bit input: DRP address
      .DCLK(DCLK),         // 1-bit input: DRP clock
      .DEN(DEN),           // 1-bit input: DRP enable
      .DI(DI),             // 16-bit input: DRP data
      .DWE(DWE),           // 1-bit input: DRP write enable
      // Feedback Clocks: 1-bit (each) input: Clock feedback ports
      .CLKFBIN(n_clkfbout)    // 1-bit input: Feedback clock
   );

 //调用PLL的IP核
  clk_wiz_0 pll_ip
  (
   // Clock in ports
  .clk_in1(CLKIN1_ip),
  .clk_in2(CLKIN2_ip),
  .clk_in_sel(CLKINSEL),
  // Clock out ports  
  .clk_out1(CLKOUT0_ip),
  .clk_out2(CLKOUT1_ip),
  .clk_out3(CLKOUT2_ip),
  .clk_out4(CLKOUT3_ip),
  // Status and control signals               
  .reset(RST), 
  .locked()

  );

endmodule

2.3 测试代码

module PLL_TB(  );
reg CLKIN1,CLKIN2,CLKIN1_ip,CLKIN2_ip,RST,CLKINSEL;
wire CLKOUT0,CLKOUT1,CLKOUT2,CLKOUT3;
wire CLKOUT0_ip,CLKOUT1_ip,CLKOUT2_ip,CLKOUT3_ip;
initial
begin
CLKIN1=0;
CLKIN2=0;
CLKIN1_ip=0;
CLKIN2_ip=0;
RST=0;
CLKINSEL=0; 
#50 RST=1;   //复位信号切换为0,为CLKINSEL切换做准备,因为RST为0时,CLKINSEL不能进行切换
#100 CLKINSEL=1;  //切换参考信号为CLKIN2
#10 RST=0;   //取消复位 
#2000 RST=1;   //复位信号切换为0,为CLKINSEL切换做准备,因为RST为0时,CLKINSEL不能进行切换
#10 CLKINSEL=0;   //参考时钟选择信号初始化为1,即选择CLKIN1为参考信号
#10 RST=0;   //取消复位 
end
always#10 CLKIN1=~CLKIN1;     //CLKIN1输入周期为20ns
always#10 CLKIN1_ip=~CLKIN1_ip;  //CLKIN1_ip输入周期为20ns
always#4 CLKIN2=~CLKIN2;        //CLKIN2输入周期为8ns
always#4 CLKIN2_ip=~CLKIN2_ip;  //CLKIN2_ip输入周期为8ns
PLL PLL_test(.CLKIN1(CLKIN1),.CLKIN2(CLKIN2),.CLKIN1_ip(CLKIN1_ip),.CLKIN2_ip(CLKIN2_ip),
.RST(RST),.CLKINSEL(CLKINSEL),.CLKOUT0(CLKOUT0),.CLKOUT1(CLKOUT1),.CLKOUT2(CLKOUT2),.CLKOUT3(CLKOUT3),
.CLKOUT0_ip(CLKOUT0_ip),.CLKOUT1_ip(CLKOUT1_ip),.CLKOUT2_ip(CLKOUT2_ip),.CLKOUT3_ip(CLKOUT3_ip));
endmodule

2.4 仿真结果

分别对比CLKOUT0-CLKOUT3与CLKOUT0_ip-CLKOUT3_ip,两种情况下4个输出端口的波形相同,符合预期

输入参考信号切换,下图中CLKOUT1-CLKOUT3在左右两侧的频率不同,即进行了输入参考信号的切换,左侧波形松散,右侧密实,即切换后参考信号频率更高

2.5 常见问题

1)使用原语例化PLL时布线失败,报错如下图,

DRC error内容详细如下

[DRC PDRC-43] PLL_adv_ClkFrequency_div_no_dclk: The computed value 300.000 MHz (CLKIN1_PERIOD, net CLKIN1_IBUF) for the VCO operating frequency of the PLLE2_ADV site PLLE2_ADV_X0Y1 (cell PLLE2_ADV_inst) falls outside the operating range of the PLL VCO frequency for this device (800.000 - 1600.000 MHz). The computed value is (CLKFBOUT_MULT_F * 1000 / (CLKINx_PERIOD * DIVCLK_DIVIDE)). Please adjust either the input period CLKINx_PERIOD (10.000000), multiplication factor CLKFBOUT_MULT_F (3) or the division factor DIVCLK_DIVIDE (1), in order to achieve a VCO frequency within the rated operating range for this device.

通过该信息知设计的VCO的为300MHZ,不在允许的【800-1600MHZ】范围内,这是由于CLKIN1和CLKFBOUT_MULT设置不合理,CLKIN1为100MHZ,CLKFBOUT_MULT为3,因此VC0为300MHZ,将CLKFBOUT_MULT值改大即可

2)进行仿真,点击运行,弹出“Finish Vsim”窗口

内容如下,即仿真文件中在复位信号RST=1时进行了参考信号的切换,更改测试文件使CLKINSEL在RST为0时进行切换

Input Error : Input clock can only be switched when RST=1. CLKINSEL on PLLE2_ADV instance PLL_TB.PLL_test.PLLE2_ADV_inst at time              2190000 changed when RST low, which should change at RST high.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/760178.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

支付、购物车、搜索、文件上传、登录、还款、订单测试怎么做?

支付功能怎么测试:1、从功能方面考虑: 1)、正常完成支付的流程; 2)、支付中断后继续支付的流程; 3)、支付中断后结束支付的流程; 4)、单订单支付的流程; 5&am…

【无标题】(前沿)

Java编程语言 目前为止最流行的 是Java编程语言 但是编程与语言有很多中php。phyone。 c c. c# java html. css javascript vue() 说到计算机有很多同学会说,就有很多人会说35的节点,我问一下同学们现在哪一个行业,是没有35岁的节点&#x…

7.5 SpringBoot 拦截器Interceptor实战 统一角色权限校验

文章目录 前言一、定义注解annotation二、拦截角色注解1. 在拦截器哪里拦截?2. 如何拦截角色注解?3. 角色如何读取?4. 最后做角色校验 三、应用:给管理员操作接口加注解四、PostMan测试最后 前言 在【7.1】管理员图书录入和修改API&#xf…

c语言指针进阶(二)

目录 引言 函数指针数组 指向函数指针数组的指针 回调函数 引言 大家好,我是c语言boom成家宝,今天博主带来的依然是指针的进阶讲解。上一篇博客博主有介绍指针,数组指针,指针数组,以及函数指针的概念以及应用&…

【Azure】Azure成本管理:规划、监控、计算和优化成本 [文末送书]

开篇先来一个不是总结的总结:平衡成本与性能始终是一个重大挑战。(此处省略各种场景的解释) 文章目录 前言一、Azure 成本管理工具1.1 什么是成本管理1.2 成本管理的主要功能 二、Azure 中可能影响成本的因素2.1 影响成本的因素2.1.1 资源类型…

leetcode|math|9.172.69.50.

9. Palindrome Number to_string 就行 172. Factorial Trailing Zeroes 不能直接乘起来,会overflow!! 166! 就是要找166乘到1一共有几个5。5,10,15,25...都算。166/5就是算一共有几个5。但是25其实贡献了…

【周末闲谈】感受AI时代魅力,创意无界限

i 个人主页:【😊个人主页】 系列专栏:【❤️周末闲谈】 文章目录 前言人工智能的应用领域问题求解逻辑推理与定理证明自然语言处理智能信息检索技术专家系统 人工智能的三大短板展望未来从专用智能向通用智能发展从人工智能向人机混合智能发展…

Jdk 版本升级

Jdk 版本升级(多版本配置) 一、配置多版本 首先如果系统第一次安装JDK 1.登录oracle官网Java Downloads | Oracle下载,此教程以Jdk1.8为例,一键下一步即可安装成功。 2.配置环境变量 然后在系统path路径中添加: %JAVA_HOME%…

单片机第一季:零基础10——串口通信和RS485

目录 1,串口通讯基础 1.1,同步和异步 1.2,并行和串行 1.3,单工、半双工与全双工通信 1.4,通信速率 2,单片机串口通讯 2.1,接口标准 2.2,通讯协议 2.3,串口…

834. 树中距离之和

给定一个无向、连通的树。树中有 n 个标记为 0…n-1 的节点以及 n-1 条边 。 给定整数 n 和数组 edges , edges[i] [ai, bi]表示树中的节点 ai 和 bi 之间有一条边。 返回长度为 n 的数组 answer ,其中 answer[i] 是树中第 i 个节点与所有其他节点之间…

opencv环境搭建

1. 上网(你懂的,没有网装不了) 2. 参考视频:https://www.bilibili.com/video/BV1R44y157hW/?spm_id_from333.880.my_history.page.click&vd_source377867a48dd3d812b9d6521c8fc76de2 3. 这里我选择的是4.8的版本。 4. cmak…

charles中下载web证书

1.点击help,选中ssl Proxying ,点击Install Charles Root Certificate 2:点击”安装证书”按钮 3:点击”下一步”按钮 4:选中”将所有的证书都放入下列存储”,点击”游览”按钮 5:选中”受新任的根证书颁发机构”&…

day37-框架

0目录 框架 1.框架介绍 2. SSM三大框架简介 3.Mybatis 4.拓展 1.框架介绍 1.1 为什么使用框架? (1)框架效率高,成本低 (2)框架是别人写好的构建,我们只需学会如何使用它(可维护性…

C++(12):动态内存

除了自动和static对象外,C还支持动态分配对象。动态分配的对象的生存期与它们在哪里创建是无关的,只有当显式地被释放时,这些对象才会销毁。 静态内存 用来保存局部static对象、类static数据成员以及定义在任何函数之外的变量。 栈内存 用来…

mysql_to_clickhouse同步方案调研

调研时间:2021年08月,之后是否出现优化方案未知 方式1:网上开源python脚本-----mysql-clickhouse-replication 安装参考:https://www.cnblogs.com/gomysql/p/11199856.html 软件路径:https://github.com/yymysql/my…

【C++STL】模拟实现vector容器

文章目录 前言一、vector的成员函数二、增删查改工作说明size()和capapcity()2.1reserve()2.2 resize()2.3 insert()2.4 erase()2.5 push_back()和pop_back() 三、[]重载和迭代器3.1…

ahut 周赛3

A.gzm判试卷 AhutOj 线段树(注意,一定要开到4*N,不然会RE) 单点更新(求区间最值) 单点更新不需要懒标记,区间修改是大量的点,需要懒标记 AC代码: #include<iostream> #include<algorithm> #include<cstring> #include<cmath> using namespace st…

Jmeter接口测试从0到1打通,从安装到接口测试实例(超细整理)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、Jmeter简介 J…

安装adobe系列产品,提示错误代码81解决办法

安装adobe系列软件&#xff0c;如Photoshop、Premiere Pro、Illustrator等时&#xff0c;出现如下图提示错误代码81&#xff0c;如何解决呢&#xff1f;一起来看看。 解决方法一 (重启电脑等待5分钟再安装&#xff01;) 解决方法二 应用程序中打开Adobe Creative Cloud 点击…

分布式文件系统与HDFS的shell操作及查看元数据

启动hadoop和hive的metastore查看sbin的目录下的文件 执行./start-all.sh 查看相关的进程