小梅哥Xilinx FPGA学习笔记18——专用时钟电路 PLL与时钟向导 IP

目录

一:IP核简介(具体可参考野火FPGA文档)

二: 章节导读

三:PLL电路原理

3.1 PLL基本实现框图

3.2 PLL倍频实现

3.3 PLL分频实现

四: 基于 PLL 的多时钟 LED 驱动设计

4.1 配置 Clocking Wizard 核

4.2 led 闪烁控制

4.2.1 LED闪烁代码设计

4.3 顶层模块代码设计

4.4 仿真测试文件

4.5 仿真结果

4.6 管脚约束文件

4.7 上板验证结果


一:IP核简介(具体可参考野火FPGA文档)

IP Intellectual Property)即知识产权, 简言而之,IP 即电 路功能模块。 IP 核在数字电路中常用于比较复杂的功能模块(如 FIFO RAM FIR 滤波 器、 SDRAM 控制器、 PCIE 接口等)设计成参数可修改的模块,让其他用户可以直接调用 这些模块。
IP 核有三种不同的存在形式:

HDL 语言形式---(软核)
        硬件描述语言;可进行参数调整、复用性强;布局、布线灵活;设计周期短、设计投入少
网表形式---(固核)
        完成了综合的功能块;可预布线特定信号或分配特定的布线资源。
版图形式---(硬核)
        硬核是完成提供设计的最终阶段产品-掩膜(Mask);缺乏灵活性、可移植性差;更易于实现IP核的保护。

IP核缺点:

  • IP核往往不能跨平台使用
  • IP核不透明,看不到内部核心代码
  • 定制IP需额外收费

二: 章节导读

       在 verilog 设计中,程序的运行往往都是围绕着时钟展开,越是复杂的设计往往会涉及越多不同的时钟。 而对于开发板来说,通常都只设计有一个晶振, 以 ACZ702 开发板的 PL 端为例,就板载了一个 50MHz 的有源晶振。通过开发板 内部逻辑,虽然能够基于该时钟分频倍频,产生不同频率的时钟,但是这些时 钟往往质量较差,并不适合应用。
       FPGA 厂商为了解决这个问题,会在器件内部加入专用的时钟电路,也就是 我们常说的锁相环(PLL)。通过该专用时钟电路分频倍频产生的时钟,不仅质 量好,精度也会更高。本章我们将带大家学习锁相环的工作机理,并结合 xilinx 提供的 clocking wizard 软核,通过一个简单的应用来带领大家熟悉锁 相环的基础使用方法。   

三:PLL电路原理

       锁相环(PLL Phase-Locked Loop ),是一种反馈控制电路,常常用于利用 外部输入的参考信号控制环路内部振荡信号的频率和相位。锁相环在工作时, 当输出信号的频率与输入信号的频率相等时,输出电压与输入电压保持固定的相位差值,即输出电压与输入电压的相位被锁住,因此得名锁相环。 PLL是最常用的IP核之一,其性能强大,可以对输入到FPGA的时钟信号进行 任意分频、倍频、相位调整、占空比调整,从而输出一个期望时钟。
锁相环通常由 下图 所示的架构组成:

其中,输入分频、输出分频、反馈分频为三个分频计数器,对时钟分频以满足需求。其余四个模块的功能分别如下:
  • 鉴相鉴频器 PFD(Phase Frequency Detector):对输入的基准信号(通常是来自频率稳定的晶振)和反馈回路的信号进行频率的比较,输出一个代表两者相位差异的信号。若相同则输出0 。参考时钟大于对比时钟频率会输出变大的成正比的值,小于就变小的成正比的值。
  • 电荷泵(CP): 根据 PFD 输出的信号,产生对应电压。
  • 环路滤波器 LF(Loop Filter): 用于控制噪声的带宽,滤掉高频噪声, 保留直流部分。
  • 压控振荡器 VCO(Voltage Controlled Oscillator): 根据滤波器输入的电压,输出对应频率的周期信号。环路滤波器输入的电压越大 VCO 输出 的频率越高,进而产生 N 倍于输入时钟的新时钟。
       其中,VCO 输出的时钟经过反馈分频后传回 PFD 这一电路我们称之为 反馈回路 PLL 在工作时,压控振荡器输出的时钟信号在经过反馈回路后输入到 PFD 中, PFD 会将其与输入的基准时钟比较,从而得到二者间的频率和相位差。 频率和相位差会以信号的方式输出,驱动 CP 产生电压,经过低通滤波后转换为 直流脉冲电压,作为 VCO 的控制电压,驱动 VCO 改变输出时钟。输出时钟又 会经由反馈回路,输入到 PFD 与基准时钟对比,如此往复,最终输出稳定的满足需求的时钟。
       因此,PLL 输出的时钟并不是由输入的基准时钟直接分频倍频得来,而是 基于基准时钟,通过内部的震荡电路生成新的时钟,再经由反馈电路将时钟环 回给 PFD ,通过不断将新产生的时钟与基准时钟作比较,最终输出频率和相位 稳定的时钟。 也正是因为如此,在使用 PLL 时,当基准时钟输入进 PLL 之后,我们并不 能立马得到输出时钟,即使得到也不能立马使用。因为此时的时钟还并不稳定, 需要等待一段时间之后,才能得到精确且稳定的时钟。

3.1 PLL基本实现框图

下图中鉴相鉴频器 PFD(Phase Frequency Detector)是用来比较输入参考信号与反馈信号的频率与相位的。最终它们会趋近于相同,及输出为0。

3.2 PLL倍频实现

       从下图可以看出倍频多出了一个DIV倍频环节,如果输入信号是50MHz的频率,因为鉴相鉴频器 PFD的两端最终归趋近于相等,则经过DIV之后的频率会变成50MHz。即如果是2倍频,则pll_out会变成100MHz输出。实现倍频输出。

3.3 PLL分频实现

       从下图可以看出分频多出了一个DIV分频环节放在输入信号那里,如果输入信号是50MHz的频率,如果分频器DIV是5倍分频,则输入PFD的频率是10M,因为鉴相鉴频器 PFD的两端最终归趋近于相等,则经过反馈回路输出的频率也为10MHz。则pll_out会变成10MHz输出。实现5分频输出。

四: 基于 PLL 的多时钟 LED 驱动设计

       本次设计我们将通过 PLL 产生 4 个不同的时钟,这四个时钟分为两个频率,同一频率之间的时钟在相位或占空比上存在差异。通过仿真,对比输出时钟波 形间的关系,验证 PLL 的基础功能。同时,为了验证 PLL 输出的时钟能否稳定 用于其他模块, PLL 输出的时钟还将被用于驱动 LED

4.1 配置 Clocking Wizard

       首先,通过 IP Catalog 为设计添加 clocking wizard 核。为了与大多数使用情况一致,本次设计使用的 PLL 结构,输入时钟使用的 50M 板载晶振,输出时钟 频率为常见的 100MHz 200MHz ,复位类型为低电平复位。因此, IP 核的时钟 配置界面如下图 所示:

为了观察输出时钟相位和占空比的变化,我们分别对 clk_out2 的相位和clk_out4 的占空比进行了修改,以方便仿真时对照波形。

4.2 led 闪烁控制

        基于“视觉暂留”现象,当人眼被中等强度的光刺激以后,人眼看到的图像会短暂停留 0.1~0.4 秒。而如果我们直接使用生成的时钟驱动 led 闪烁,其变 化速率便会远远超过人眼的识别速度,因此,我们需要设计一个分频计数模块, 对输入的时钟分频,控制 LED 的闪烁频率。

4.2.1 LED闪烁代码设计

module led_ctrl(input clk,input reset_n,output reg led);parameter MCNT = 1000_0000;reg [29:0]cnt;//led翻转计数逻辑always@(posedge clk or negedge reset_n)if(!reset_n)cnt <= 0;else if(cnt >= MCNT-1)    cnt <= 0;else cnt <= cnt + 1;always@(posedge clk or negedge reset_n)if(!reset_n)led <= 0;else if(cnt >= MCNT-1)    led <= ~led;else led <= led;       endmodule

4.3 顶层模块代码设计

module pll_led(input sys_clk,input reset_n,  output [3:0]led
);wire locked            ;wire clk_100m          ;wire clk_100m_s90      ;wire clk_200m          ;wire clk_200m_d20      ;led_ctrl #(.MCNT (5000_0000))led_ctrl_inst0(.clk        (clk_100m),.reset_n    (locked),//当locked信号为高电平时方可使用,其输出的才是稳定的时钟信号。.led        (led[0]));led_ctrl #(.MCNT (5000_0000))led_ctrl_inst1(.clk        (clk_100m_s90),.reset_n    (locked),.led        (led[1]));led_ctrl #(.MCNT (5000_0000))led_ctrl_inst2(.clk        (clk_200m),.reset_n    (locked),.led        (led[2]));led_ctrl #(.MCNT (5000_0000))led_ctrl_inst3(.clk         (clk_200m_d20),.reset_n     (locked),.led         (led[3]));clk_wiz_0 clk_wiz_0_inst(// Clock out ports.clk_100m(clk_100m),     // output clk_100m.clk_100m_s90(clk_100m_s90),     // output clk_100m_s90.clk_200m(clk_200m),     // output clk_200m.clk_200m_d20(clk_200m_d20),     // output clk_200m_d20// Status and control signals.resetn(reset_n), // input resetn.locked(locked),       // output locked// Clock in ports.sys_clk(sys_clk));      // input sys_clk
endmodule

4.4 仿真测试文件

`timescale 1ns / 1ps
module pll_led_tb();reg     sys_clk       ;
reg     reset_n       ;
wire    clk_100m      ;
wire    clk_100m_s90  ;
wire    clk_200m      ;
wire    clk_200m_d20  ;
wire    [3:0]led      ;pll_led pll_led(.sys_clk     (sys_clk)  ,.reset_n     (reset_n)  ,.clk_100m    (clk_100m)  ,.clk_100m_s90(clk_100m_s90)  ,.clk_200m    (clk_200m)  ,.clk_200m_d20(clk_200m_d20)  ,.led         (led)
);//重定义,缩短仿真时间defparam pll_led.led_ctrl_inst0.MCNT = 26'd500;defparam pll_led.led_ctrl_inst1.MCNT = 26'd500;defparam pll_led.led_ctrl_inst2.MCNT = 26'd500; defparam pll_led.led_ctrl_inst3.MCNT = 26'd500;initial sys_clk = 1'b1;always #10 sys_clk = ~sys_clk;initialbeginreset_n = 0;#201;reset_n = 1;#20000; $stop;endendmodule

4.5 仿真结果

4.6 管脚约束文件

set_property IOSTANDARD LVCMOS33 [get_ports reset_n]
set_property IOSTANDARD LVCMOS33 [get_ports sys_clk]
set_property IOSTANDARD LVCMOS33 [get_ports {led[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports {led[2]}]
set_property IOSTANDARD LVCMOS33 [get_ports {led[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {led[0]}]
set_property PACKAGE_PIN U18 [get_ports sys_clk]
set_property PACKAGE_PIN F20 [get_ports reset_n]
set_property PACKAGE_PIN G17 [get_ports {led[0]}]
set_property PACKAGE_PIN G19 [get_ports {led[1]}]
set_property PACKAGE_PIN G18 [get_ports {led[3]}]
set_property PACKAGE_PIN G20 [get_ports {led[2]}]

4.7 上板验证结果

至此PLL的IP核调用实验完美成功。

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

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

相关文章

useReducer 的奇妙世界:探索 React 状态管理的新境界(上)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

首发卡密引流系统 支持短视频点赞/关注获取卡密

搭建教程&#xff1a; 环境要求&#xff1a;Nginx、MySQL 5.6、PHP 5.6 步骤&#xff1a; 将压缩包解压至网站根目录。 打开域名/install&#xff0c;按照提示填写数据库信息进行安装。 管理后台&#xff1a; URL&#xff1a;域名/admin 账号密码&#xff1a;admin/123456 …

人机协同编程pyqt/pyside界面开发——第一章pyqt/pyside编程基础

环境安装:https://www.bilibili.com/video/BV1wc411D7WF/ 特别说明本文章适用于出于科研需要,用到这部分技术的,对其中的技术细节并未作过多的探究。而把侧重点放在科研工作者,如何通过这项技术的使用来达到自己的目的。尽可能的做到需要什么讲什么,用到什么学什么。这可以…

关于“Python”的核心知识点整理大全48

目录 world_population.py 16.2.5 制作世界地图 americas.py 16.2.6 在世界地图上呈现数字数据 na_populations.py 16.2.7 绘制完整的世界人口地图 world_population.py 16.2.8 根据人口数量将国家分组 world_population.py 16.2.9 使用 Pygal 设置世界地图的样式 w…

腾讯云轻量服务器和云服务器区别对比(超详细)

腾讯云轻量服务器和云服务器CVM该怎么选&#xff1f;不差钱选云服务器CVM&#xff0c;追求性价比选择轻量应用服务器&#xff0c;轻量真优惠呀&#xff0c;活动 https://curl.qcloud.com/oRMoSucP 轻量应用服务器2核2G3M价格62元一年、2核2G4M价格118元一年&#xff0c;540元三…

elasticsearch系列四:集群常规运维

概述 在使用es中如果遇到了集群不可写入或者部分索引状态unassigned&#xff0c;明明写入了很多数据但是查不到等等系列问题该怎么办呢&#xff1f;咱们今天一起看下常用运维命令。 案例 起初我们es性能还跟得上&#xff0c;随着业务发展壮大&#xff0c;发现查询性能越来越不…

YOLOv5改进 | 2023Neck篇 | CCFM轻量级跨尺度特征融合模块(RT-DETR结构改进v5)

一、本文介绍 本文给大家带来的改进机制是轻量级跨尺度特征融合模块CCFM&#xff08;Cross-Scale Feature Fusion Module&#xff09;其主要原理是&#xff1a;将不同尺度的特征通过融合操作整合起来&#xff0c;以增强模型对于尺度变化的适应性和对小尺度对象的检测能力。我将…

Python - 深夜数据结构与算法之 Binary Search

目录 一.引言 二.二分查找的简介 1.查找条件 2.代码模版 3.查找示例 三.经典算法实战 1.Search-Rotated-List [33] 2.Sqrt-X [69] 3.Search-2D-Matrix [74] 4.Find-Rotated-Min [153] 5.Valid-Perfect-Square [367] 四.总结 一.引言 前面介绍了二叉树和堆&#xf…

【Vue2+3入门到实战】(12)自定义指令的基本语法(全局、局部注册)、 指令的值、v-loading的指令封装 详细示例

目录 一、学习目标1.自定义指令 二、自定义指令1.指令介绍2.自定义指令3.自定义指令语法4.指令中的配置项介绍5.代码示例6.总结 三、自定义指令-指令的值1.需求2.语法3.代码示例 四、自定义指令-v-loading指令的封装1.场景2.需求3.分析4.实现5.准备代码 六、自定义指令总结 一、…

修改jenkins的目录(JENKINS_HOME)

默认JENKINS_HOME是/var/lib/jenkins/ 现要修改为/home/jenkins_data/jenkins 最开始 sudo cp -a /var/lib/jenkins/ /home/jenkins_data/ 然后如下操作&#xff1a; 1、首先 /etc/sysconfig/jenkins&#xff1a;jenkins配置文件&#xff0c;“端口”&#xff0c;“JENKIN…

【占用网络】OccNet: Scene as Occupancy 适用于检测、分割和规划任务 ICCV2023

前言 本文分享“占用网络”方案中&#xff0c;具有代表性的方法&#xff1a;OccNet。 它以多视角相机为核心&#xff0c;首先生成BEV特征&#xff0c;然后通过级联结构和时间体素解码器重建生成3D占用特征。 构建一个通用的“3D占用编码特征”&#xff0c;用以表示3D物理世界…

2023-12-29 服务器开发-centos-安装php8

摘要: 2023-12-29 服务器开发-centos-安装php8 centos-安装php8 必备条件 Minimal CentOS 8 / RHEL 8User with sudo rightsInternet Connection (1) 更新系统 更新系统 $ sudo dnf update $ sudo dnf upgrade 重启系统 $ sudo reboot (2) 启用 EPEL & Remi 软件库…

Starling-LM-7B与GPT-4:开源AI的新纪录

引言 在人工智能的前沿领域&#xff0c;Starling-LM-7B的出现标志着开源大型语言模型&#xff08;LLM&#xff09;的一大突破。与GPT-4的近距离竞争不仅展示了Starling-LM-7B的技术实力&#xff0c;也突显了开源社区在推动AI发展方面的重要作用。 模型特点 Starling-LM-7B&a…

HTML使用JavaScript的三种方式

要使用 JavaScript&#xff0c;你可以在 HTML 文件中的 <script> 标签中编写代码&#xff0c;或者将代码保存到一个单独的 .js 文件中并在 HTML 文件中引入。以下是一些常用的 JavaScript 使用方式&#xff1a; 内联 JavaScript&#xff1a;在 HTML 文件的 <script&g…

【电子通识】开关的种类

开关在我们日常生活与工作中使用较多。开关有无数种形式&#xff0c;种类繁多。从微小的按钮到巨大的控制器&#xff0c;功能多种多样。这种多样性受到机械或电气操作、手动或电子控制等因素的影响&#xff0c;并且与个人在设计美学和用户界面方面的偏好也有关。 电子开关采用 …

mysql查询出json格式字段中的值

一、使用场景 由于一些特殊数据使用json格式保存到表数据种中了&#xff0c;在查询的时候需要查询出这条数据中json格式中的某个字段 比如&#xff1a;需要将下列字符串中的“nationality”字段单独查询出来 json格式是一个对象 结果&#xff1a; json格式是一个集合 查询结…

第三章 Zookeeper服务注册与发现

Zookeeper服务注册与发现 gitee&#xff1a;springcloud_study: springcloud&#xff1a;服务集群、注册中心、配置中心&#xff08;热更新&#xff09;、服务网关&#xff08;校验、路由、负载均衡&#xff09;、分布式缓存、分布式搜索、消息队列&#xff08;异步通信&#…

泛目录是干什么用的蚂蚁seo泛程序

泛目录是干什么用的蚂蚁seo泛程序目录 泛目录是一种常见的网站优化方法&#xff0c;属于黑帽技术的一种。它的核心原理是利用高权重的网站继承目录&#xff0c;然后快速获得收录与排名。这种方法可以帮助网站在搜索引擎中获得更好的排名&#xff0c;从而吸引更多的流量。 泛目…

C++面试宝典第11题:两数之和

题目 给定一个整数数组和一个目标值,请在该数组中找出和为目标值的那两个整数,并返回他们的数组下标,要求时间复杂度为O(n)。可以假设每种输入只会对应一个答案,注意:不能重复利用这个数组中同样的元素。 解析 这道题主要考察应聘者对算法时间复杂度和空间复杂度的理解,时…

“踩坑”经验分享:Swift语言落地实践

作者 | 路涛、艳红 导读 Swift 是一种适用于iOS/macOS应用开发、服务器端的编程语言。自2014年苹果发布 Swift 语言以来&#xff0c;Swift5 实现了 ABI 稳定性、Module 稳定性和Library Evolution&#xff0c;与Objective-C&#xff08;下文简称“OC”&#xff09;相比&#xf…