PYNQ 框架 - 时钟系统 + pl_clk 时钟输出不准确问题
目录
1. 简介
2. PS 时钟计算
2.1 计算框架
2.2 KV260 的参考时钟
2.3 PL_CLK 设置
3. 测试
3.1 Block design
3.2 引脚绑定
3.3 使用 AD2 测量
3.4 调整分频
4. PYNQ 时钟驱动
4.1 源码解析
4.2 查看 PL_CLK
4.3 配置 PL_CLK
5. 总结
1. 简介
ZYNQ MPSoC 具有比较复杂的时钟系统。
PS 的时钟系统为处理器、外设、互连以及其他系统元素生成时钟。有五个系统 PLL 用于生成高频信号,这些信号被用作 LPD 和 FPD 中几十个时钟发生器的时钟源。
LPD 中有两个系统 PLL 时钟单元,FPD 电源域中有三个。每个 PLL 单元在其输出上有两个时钟分频器;LPD 中一个,FPD 中一个。这些时钟分频器可以从一个 PLL 提供两种不同的时钟频率(在两个时钟域中)。对于跨电源域的时钟,最大时钟输出频率稍低。
每个系统 PLL 单元都有推荐用途,但各个时钟发生器可以从路由到它的三个 PLL 时钟中选择一个。
系统PLL单元位于LPD和FPD电源域:
- LPD PLLs:
- I/O PLL(IOPLL):为所有低速外设和部分互连提供时钟。
- RPU PLL(RPLL):为 RPU MP Core 和部分互连提供时钟。
- FPD PLLs:
- APU PLL(APLL):为APU MPCore时钟和部分互连提供时钟。
- Video PLL(VPLL):为视频I/O提供时钟。
- DDR PLL(DPLL):为DDR控制器和部分互连提供时钟。
PS:最近使用 KV260 生成一些时钟,发现使用 PS 输出的 pl_clk 时钟和预设的有较大差异,因此通过实现验证猜想。
2. PS 时钟计算
2.1 计算框架

非常重要,必须理解这五个 PLL 的计算过程,方可手动配置分频参数。
1)PS 输入参考时钟
在以下窗口输入,一般的值为 33.333 MHz。

2)PLL 乘数

PS 输入参考时钟 * PLL 乘数 = VCO 输出时钟。
3)DIV2 分频
该分频为默认的 2 分频,可以选择取消。(需要勾选 Enable Manual Mode)
4)Divisors 分频

一个 6-bit 的可编程分频器。
5)PLL 输出

2.2 KV260 的参考时钟
在《DS987 - Kria K26 SOM Data Sheet》中,可以查看 SOM 系统结构图,包含该系统使用的33.33 MHz 晶振。


2.3 PL_CLK 设置
有四个 PS 至 PL 的时钟输出可以设定,我们先设定两个,分别为 100MHz 和 50MHz。

系统默认使用 IOPLL 作为时钟来源,I/O PLL 常用于为所有低速外设和部分互连提供时钟。
系统将自动推断分频值,如上图所述。
3. 测试
3.1 Block design

其中,counter_flip 模块用于按照指定值对时钟进行分频。目的方便使用 IO 口对时钟信号进行测量。而 clk_wiz_0 对 pl_clk1 进行二倍频。
counter_flip 的分频倍数为 100,即 PL_CLK 频率 = 实测频率 × 100。

Verilog 代码如下:
module counter_flip(input clk, // 时钟信号input rst_n, // 复位信号output reg sig_out = 0 // 输出信号,初始为0
);parameter MAX_COUNT = 49; // 目标计数值reg [7:0] count = 8'd0; // 8位计数器,初始值为0always @(posedge clk or negedge rst_n) beginif (!rst_n) begincount <= 8'd0; // 复位时计数器清零sig_out <= 0; // 复位时输出也清零end else beginif (count == MAX_COUNT) begincount <= 8'd0; // 当计数达到最大值时,计数器清零sig_out <= ~sig_out; // 并翻转输出end else begincount <= count + 1; // 否则计数器递增endend
endendmodule
3.2 引脚绑定
sig_out_0 -> H12 -> J2.1 -> AD2.CH1
sig_out_1 -> E10 -> J2.3 -> AD2.CH3

3.3 使用 AD2 测量
使用 PYNQ 框架加载 bit 文件,然后使用 AD2 测量。

1)Channel 1,vivado IDE 显示输出的频率应为 50 MHz,实际测量如下:
测量的频率是:333.33 kHz。
分频倍频数是:100。
那么 pl_clk0 的实际输出是:333.33 kHz * 100 = 33.333 MHz。
2)Channel 2,vivado IDE 显示输出的频率应为 200 MHz,实际测量如下:
测量的频率是:1.3333 MHz。
分频倍频数是:100。
那么 pl_clk1*2 的实际输出是:1.3333 MHz * 100 = 133.33 MHz。
3.4 调整分频

参考 2.1 计算框架 中的参数,IOPLL 输出时钟频率是 499.995 MHz,理论上:
- PL0 = 499.995 MHz / 30 = 16.6665 MHz
- PL1 = 499.995 MHz / 15 = 33.333 MHz
明显不对。说明 IOPLL 的输出频率并不是 499.995 MHz。
直接放弃在 Vivado IDE 中配置 PL_CLK 时钟,通过 PYNQ 框架中的时钟类来调整。
如下:
from pynq.ps import ClocksClocks.set_pl_clk(0, 20, 1)
Clocks.set_pl_clk(1, 10, 1)
再次通过 AD2 进行测量:

1)Channel 1,vivado IDE 显示输出的频率应为 50 MHz,实际测量如下:
测量的频率是:499.99 kHz。
分频倍频数是:100。
那么 pl_clk0 的实际输出是:499.99 kHz * 100 = 49.999 MHz。
2)Channel 2,vivado IDE 显示输出的频率应为 200 MHz,实际测量如下:
测量的频率是:1.3333 MHz。
分频倍频数是:100。
那么 pl_clk1*2 的实际输出是:2.0000 MHz * 100 = 200.00 MHz。
Channel 1 与 Channel 2 的时钟均符合预期。
4. PYNQ 时钟驱动
4.1 源码解析
源码地址:
/usr/local/share/pynq-venv/lib/python3.10/site-packages/pynq/ps.pyorhttps://pynq.readthedocs.io/en/v3.0.0/_modules/pynq/ps.html#Clocks
1) 全局变量
- ZYNQ_ARCH、ZU_ARCH,这些常量用于区分不同的硬件架构。
- CPU_ARCH_IS_SUPPORTED 和 CPU_ARCH_IS_x86 用于检测当前运行环境的 CPU 架构是否受支持。
2)时钟寄存器定义
- 定义了一系列字典,如 ZYNQ_PLL_FIELDS、ZU_CLK_FIELDS 等,这些字典包含了不同寄存器的配置信息(如位偏移、位宽、描述等)。
3)寄存器地址映射
- 定义了不同硬件架构下的寄存器地址映射,如 ZYNQ_SLCR_REGISTERS 和 ZU_CRL_REGISTERS。
4)_ClocksMeta 元类
- 这是一个元类,用于定义时钟类的一些属性和方法。它定义了一系列属性(如 cpu_mhz、fclk0_mhz 等),这些属性通过 _instance 属性动态获取其实例的相应方法。
5)_ClocksBase 基类
- 这是一个抽象基类,定义了 get_pl_clk 和 set_pl_clk 等方法,这些方法用于获取和设置 PL 时钟的频率。
- _get_src_clk_mhz 和 _get_2_divisors 是辅助方法,用于计算时钟频率和分频值。
6)特定架构的时钟类
- _ClocksUltrascale 和 _ClocksZynq 是两个具体实现类,分别适用于 Zynq Ultrascale 和 Zynq 7-Series 硬件架构。这些类实现了基类中定义的抽象方法,以及一些特定于硬件的功能,如处理PLL的配置。
7)Clocks 用户类
- Clocks 类是用户接口,允许用户获取和设置 CPU 和 PL 时钟。它使用 _ClocksMeta 作为其元类,从而继承了一系列动态属性和方法。
4.2 查看 PL_CLK
1)查看 clock_dict
ol.clock_dict
---
{0: {'enable': 1, 'divisor0': 15, 'divisor1': 1},1: {'enable': 1, 'divisor0': 30, 'divisor1': 1},2: {'enable': 0, 'divisor0': 4, 'divisor1': 1},3: {'enable': 0, 'divisor0': 4, 'divisor1': 1}}
2)查看 CPU 时钟频率
from pynq.ps import Clocksprint(f"CPU CLK: {Clocks.cpu_mhz}")---
CPU CLK: 1333.32
3)查看 PL_CLK 时钟
from pynq.ps import Clocksprint(f"FCLK0: {Clocks.fclk0_mhz}")
print(f"FCLK1: {Clocks.fclk1_mhz}")
print(f"FCLK2: {Clocks.fclk2_mhz}")
print(f"FCLK3: {Clocks.fclk3_mhz}")--
FCLK0: 66.666
FCLK1: 33.333
FCLK2: 99.999
FCLK3: 99.999
4.3 配置 PL_CLK
# 直接指定频率,PYNQ 自动计算分频系数
Clocks.set_pl_clk(0, None, None, 100) # 指定 PL0 输出 100 MHzprint(f"FCLK0: {Clocks.fclk0_mhz}")
---
FCLK0: 99.999
Or
# 指定分频系数
Clocks.set_pl_clk(0, 15, 1)# 可以先不分频,看看该 PLL 当前的输出
Clocks.set_pl_clk(0, 1, 1)
print(f"FCLK0: {Clocks.fclk0_mhz}")
---
FCLK0: 999.99# 再设定分频系数
Clocks.set_pl_clk(0, 10, 1)
print(f"FCLK0: {Clocks.fclk0_mhz}")
---
FCLK0: 99.999
5. 总结
- 使用 PYNQ 加载 bit 后,发现 PL_CLK 的输出值不准确。
- Vivado IDE 中,ZU 时钟输出 DIV2 似乎并未生效。
- 通过 PYNQ Clocks 类,可以动态调节 PL_CLK 输出。

相关文章:
PYNQ 框架 - 时钟系统 + pl_clk 时钟输出不准确问题
目录 1. 简介 2. PS 时钟计算 2.1 计算框架 2.2 KV260 的参考时钟 2.3 PL_CLK 设置 3. 测试 3.1 Block design 3.2 引脚绑定 3.3 使用 AD2 测量 3.4 调整分频 4. PYNQ 时钟驱动 4.1 源码解析 4.2 查看 PL_CLK 4.3 配置 PL_CLK 5. 总结 1. 简介 ZYNQ MPSoC 具有…...
CDAF / PDAF 原理 | PDAF、CDAF 和 LAAF 对比 | 图像清晰度评价指标
注:本文为 “CDAF / PDAF 原理 | PDAF、CDAF 和 LAAF 对比 | 图像清晰度评价指标” 几篇相关文章合辑。 文章中部分超链接、图片异常受引用之前的原文所限。 相机自动对焦原理 TriumphRay 于 2020-01-16 18:59:41 发布 凸透镜成像原理 这一部分大家中学应该就学过…...
类和对象--中--初始化列表(重要)、隐式类型转化(理解)、最后两个默认成员函数
1.初始化列表 1.1作用: 通过特定的值,来初始化对象。 1.2定义: 初始化列表,就相当于定义对象(开空间)。不管写不写初始化列表,每个成员变量都会走一遍初始化列表(开出对应的空间…...
uni-app运行 安卓模拟器 MuMu模拟器
最近公司开发移动端系统,使用真机时每次调试的时候换来换去的麻烦,所以使用模拟器来调试方便。记录一下安装和连接的过程 一、安装MuMu模拟器 百度搜索MuMu模拟器并打开官网或者点这里MuMu模拟器官网 点击下载模拟器 安装模拟器,如果系统…...
java 打印对象所有属性的值 循环
在Java中,如果你想要打印一个对象的所有属性值,可以使用反射(Reflection)来获取对象的所有字段,并循环遍历这些字段以打印它们的值。以下是一个示例代码,展示了如何实现这一点: 示例类 假设我…...
k8s认证、授权
在 Kubernetes 中,kubectl auth can-i 命令用于检查当前用户或指定的 ServiceAccount 是否有权限执行特定的操作: kubectl auth can-i create deployment --as system:serviceaccount:default:dev-sa这个命令的作用是检查名为 dev-sa 的 ServiceAccount…...
基于spring boot的纺织品企业财务管理系统论文
摘 要 在如今社会上,关于信息上面的处理,没有任何一个企业或者个人会忽视,如何让信息急速传递,并且归档储存查询,采用之前的纸张记录模式已经不符合当前使用要求了。所以,对纺织品企业财务信息管理的提升&…...
@RequestBody和前端的关系以及,如何在前后端之间传递数据?
RequestBody 注解在 Spring MVC 中用于将 HTTP 请求体中的数据绑定到控制器方法的参数上。为了更好地理解 RequestBody 和前端之间的关系,我们可以从以下几个方面进行探讨: 1. 请求体的格式 前端发送的请求体通常是一个 JSON 字符串,也可以…...
详解登录MySQL时出现SSL connection error: unknown error number错误
目录 登录MySQL时出错SSL connection error: unknown error number 出错原因 使用MySQL自带的工具登录MySQL 登陆之后,使用如下命令进行查看 解决方法 找到MySQL8安装目录下的my.ini配置文件 记事本打开my.ini文件,然后按下图所示添加配置 此时再…...
【大数据学习 | Spark-Core】Spark的改变分区的算子
当分区由多变少时,不需要shuffle,也就是父RDD与子RDD之间是窄依赖。 当分区由少变多时,是需要shuffle的。 但极端情况下(1000个分区变成1个分区),这时如果将shuffle设置为false,父子RDD是窄依赖关系&…...
Spring Boot Web应用开发:测试
在Spring Boot中,测试是开发过程的一个重要部分,它确保你的应用按预期工作,并且可以帮助你在早期发现和修复问题。Spring Boot提供了多种便捷的测试工具,使得编写和运行测试案例变得简单。 Spring Boot测试简介 Spring Boot支持…...
服务器数据恢复—光纤存储FC硬盘数据恢复案例
服务器存储数据恢复环境: 某品牌光纤存储上共有16块FC硬盘。存储上的卷映射到Linux操作系统上。Linux操作系统上运行Oracle数据库。 服务器存储故障&检测: 存储上2块硬盘故障灯亮起,存储映射到linux操作系统上的卷挂载不上,业…...
Android Binder技术概览
Android中的Binder是一种基于远程过程调用(Remote Procedure Call, RPC)的轻量级通信机制,核心用于 Android 系统中的进程间通信(Inter-Process Communication, IPC)。Binder 是 Android 系统中不可或缺的一部分&#…...
09 —— Webpack搭建开发环境
搭建开发环境 —— 使用webpack-dev-server 启动Web服务,自动检测代码变化,有变化后会自动重新打包,热更新到网页(代码变化后,直接替换变化的代码,自动更新网页,不用手动刷新网页) …...
深度学习模型:卷积神经网络(CNN)
一、前言 CNN 的发展历程可以追溯到 20 世纪 80 年代和 90 年代。受生物视觉系统的启发,研究人员开始探索如何构建专门用于处理图像数据的神经网络。早期的一些研究奠定了基础,例如 Fukushima 提出的 Neocognitron 模型。 随着时间的推移,到…...
Flask 自定义路由转换器
步骤 创建自定义转换器类 继承 werkzeug.routing.BaseConverter。实现 to_python 和(可选)to_url 方法。 将转换器注册到 Flask 应用 在路由中使用转换器 示例 创建转换器 假设需要自定义一个转换器 FourDigitYearConverter,用于匹配四位年…...
【淘汰9成NLP面试者的高频面题】LSTM中的tanh和sigmoid分别用在什么地方?为什么?
博客主页: [青松] 本文专栏: NLP 大模型百面百过 【淘汰9成NLP面试者的高频面题】LSTM中的tanh和sigmoid分别用在什么地方?为什么? 重要性:★★★ 💯 本题主要考察面试者对以下问题的理解: ① 数据特征和模…...
gocv调用opencv添加中文乱码的解决方案
前言 相信很多做视觉的同学在使用opencv给图片添加中文文字的时候会出现这样的乱码显示: 而实际上你期望的是“告警时间:2011-11-11 11:11:11 告警类型:脱岗检测告警 Area:XXXXX Camera:Camera001-001”这样的显示内容,那么这篇文章我将用很简单的方法来解决乱码问题,只需…...
org.apache.log4j的日志记录级别和基础使用Demo
org.apache.log4j的日志记录级别和基础使用Demo,本次案例展示,使用是的maven项目,搭建的一个简单的爬虫案例。里面采用了大家熟悉的日志记录插件,log4j。来自apache公司的开源插件。 package com.qian.test;import org.apache.log…...
IC数字后端实现之大厂IC笔试真题(经典时序计算和时序分析题)
今天小编给大家分享下每年IC秋招春招必考题目——静态时序分析时序分析题。 数字IC后端笔试面试题库 | 经典时序Timing计算题 时序分析题1: 给定如下图所示的timing report,请回答一下几个问题。 1)这是一条setup还是hold的timing report?…...
XCTF-web-easyupload
试了试php,php7,pht,phtml等,都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接,得到flag...
OpenLayers 可视化之热力图
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 热力图(Heatmap)又叫热点图,是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...
P3 QT项目----记事本(3.8)
3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...
AI编程--插件对比分析:CodeRider、GitHub Copilot及其他
AI编程插件对比分析:CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展,AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者,分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...
IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)
文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...
用docker来安装部署freeswitch记录
今天刚才测试一个callcenter的项目,所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...
【论文阅读28】-CNN-BiLSTM-Attention-(2024)
本文把滑坡位移序列拆开、筛优质因子,再用 CNN-BiLSTM-Attention 来动态预测每个子序列,最后重构出总位移,预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵(S…...
tree 树组件大数据卡顿问题优化
问题背景 项目中有用到树组件用来做文件目录,但是由于这个树组件的节点越来越多,导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多,导致的浏览器卡顿,这里很明显就需要用到虚拟列表的技术&…...
React---day11
14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store: 我们在使用异步的时候理应是要使用中间件的,但是configureStore 已经自动集成了 redux-thunk,注意action里面要返回函数 import { configureS…...
让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比
在机器学习的回归分析中,损失函数的选择对模型性能具有决定性影响。均方误差(MSE)作为经典的损失函数,在处理干净数据时表现优异,但在面对包含异常值的噪声数据时,其对大误差的二次惩罚机制往往导致模型参数…...
