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?…...

Chapter03-Authentication vulnerabilities
文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...
基于大模型的 UI 自动化系统
基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...
三维GIS开发cesium智慧地铁教程(5)Cesium相机控制
一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点: 路径验证:确保相对路径.…...

边缘计算医疗风险自查APP开发方案
核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...

【JVM】- 内存结构
引言 JVM:Java Virtual Machine 定义:Java虚拟机,Java二进制字节码的运行环境好处: 一次编写,到处运行自动内存管理,垃圾回收的功能数组下标越界检查(会抛异常,不会覆盖到其他代码…...

SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题
分区配置 (ptab.json) img 属性介绍: img 属性指定分区存放的 image 名称,指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件,则以 proj_name:binary_name 格式指定文件名, proj_name 为工程 名&…...
在Ubuntu24上采用Wine打开SourceInsight
1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...

[免费]微信小程序问卷调查系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】
大家好,我是java1234_小锋老师,看到一个不错的微信小程序问卷调查系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】,分享下哈。 项目视频演示 【免费】微信小程序问卷调查系统(SpringBoot后端Vue管理端) Java毕业设计_哔哩哔哩_bilibili 项…...

uniapp 小程序 学习(一)
利用Hbuilder 创建项目 运行到内置浏览器看效果 下载微信小程序 安装到Hbuilder 下载地址 :开发者工具默认安装 设置服务端口号 在Hbuilder中设置微信小程序 配置 找到运行设置,将微信开发者工具放入到Hbuilder中, 打开后出现 如下 bug 解…...

9-Oracle 23 ai Vector Search 特性 知识准备
很多小伙伴是不是参加了 免费认证课程(限时至2025/5/15) Oracle AI Vector Search 1Z0-184-25考试,都顺利拿到certified了没。 各行各业的AI 大模型的到来,传统的数据库中的SQL还能不能打,结构化和非结构的话数据如何和…...