ZYNQ笔记(二十):Clocking Wizard 动态配置

版本:Vivado2020.2(Vitis)

任务:ZYNQ PS端 通过 AXI4Lite 接口配置 Clocking Wizard IP核输出时钟频率

目录

一、介绍

二、寄存器定义

三、配置

四、PS端代码


一、介绍

        Xilinx 的 Clock Wizard IP核 用于在 FPGA 中生成和管理时钟信号。它支持 动态重配置(Dynamic Reconfiguration),允许在运行时通过 AXI4-Lite 接口 或 DRP 接口(这两个接口都是在配置IP核时的可选接口) 修改时钟参数(如频率、相位等),而无需重新编程 FPGA。

  • AXI4-Lite 接口:用于软件(如 MicroBlaze/Zynq PS)动态修改时钟参数

  • DRP(Dynamic Reconfiguration Port):硬件接口,直接访问 Clock Wizard 配置寄存器

二、寄存器定义

参考文章:

AMD Technical Information Portal

[小梅哥FPGA] 如何通过动态重配置实现FPGA时钟的实时频率/相位/占空比调整?

如何使用AXI4接口对PLL/MMCM输出时钟的频率和相位进行动态重配置 - Xilinx Vivado 开发板 - 芯路恒电子技术论坛 - Powered by Discuz!

    每个寄存器数据为32位4字节,大部分寄存器地址间隔0x04。

    寄存器名寄存器地址功能
    Software Reset Register (SRR)C_BASEADDR+0X00写入0x0000_000A可复位PLL/MMCM
    Status Register (SR)C_BASEADDR+0X04Locked信号,Bit[0] = locked,值为1时代表输出时钟稳定
    Clock Configuration Register 0C_BASEADDR+0X200反馈时钟分、倍频控制,value = 系数*1000
    Bit[25:16] = CLKFBOUT_FRAC Multiply(仅MMCM才有,VCO的1/8小数倍频系数)
    Bit[15:8] = CLKFBOUT_MULT(VCO整数倍频系数)
    Bit[7:0] = DIVCLK_DIVIDE(VCO分频系数)
    Clock Configuration Register 1C_BASEADDR+0X204反馈时钟相位控制,value = 相位*1000
    Bit[31:0] = CLKFBOUT_PHASE
    Clock Configuration Register 2C_BASEADDR+0X208CLKOUT0分频系数,value = 分频系数*1000
    Bit[7:0] = CLKOUT0_DIVIDE
    Bit[17:8] = CLKOUT0_FRAC Divide(仅MMCM才有,CLKOUT0的1/8小数倍频系数)
    Clock Configuration Register 3C_BASEADDR+0X20CCLKOUT0相位配置,value = 相位*1000
    Bit[31:0] = CLKOUT0_PHASE
    Clock Configuration Register 4C_BASEADDR+0X210CLKOUT0占空比配置,value = 占空比*1000
    Bit[31:0] = CLKOUT0_DUTY
    Clock Configuration Register 5C_BASEADDR+0X214CLKOUT1分频系数,不支持小数分频,value = 分频系数*1000
    Bit[7:0] = CLKOUT1_DIVIDE

    ......

    ......

    ......

    Clock Configuration Register 23C_BASEADDR+0X25CBit[0] = LOAD, 置 1 加载配置寄存器的值到内部寄存器,并在下一周期置0
    Bit[1] = SADDR, 写 0 将默认 GUI 中的参数加载到动态配置中;
                            写 1 将配置寄存器参数加载到动态配置中

    三、配置

            本次通过 ZYNQ PS 端进行配置, Clocking Wizard 配置如下:MMCM、勾选动态配置(频率配置)、AXI4Lite 接口(PS 通过该接口配置)、输入频率100MHz(根据实际频率设置)

    四、PS端代码

            参考的正点原子的代码,并他的基础上进行修改,因为源码实现只有一个输出时钟端口的 clk_wiz 的频率配置,修改为有两个时钟输出端口的 clk_wiz 频率配置,(但是我发现正点原子的小数部分设置没有除以8,我测试输出时钟输入给 DVI 转化模块驱动 HDMI 时,除以8后才对上时序频率,显示屏才出现图像,但是正点原子的驱动 LCD 的例程都没有除以8,可能存在精度问题,希望有搞清楚的可以在评论区补充一下)

    clk_wiz.h:

    #ifndef CLK_WIZ_H_
    #define CLK_WIZ_H_#include "xil_types.h"#define CLK_SR_OFFSET    0x04    //Status Register//clk_out0
    #define CLK_CFG0_OFFSET  0x200   //Clock Configuration Register 0
    #define CLK_CFG2_OFFSET  0x208   //Clock Configuration Register 2//clk_out1
    #define CLK_CFG5_OFFSET  0x214   //Clock Configuration Register 5
    #define CLK_CFG7_OFFSET  0x222   //Clock Configuration Register 7#define CLK_CFG23_OFFSET 0x25C   //Clock Configuration Register 23void clk_wiz_cfg(u32 clk_device_id, double freq0, double freq1);#endif /* CLK_WIZ_H_ */

    clk_wiz.c

    #include "xclk_wiz.h"
    #include "clk_wiz.h"
    #include "xparameters.h"#define CLK_WIZ_IN_FREQ 100  //时钟IP核输入100MhzXClk_Wiz clk_wiz_inst;       //时钟IP核驱动实例//时钟IP核动态重配置
    //参数1:时钟IP核的器件ID
    //参数2:时钟IP核输出的时钟0频率 单位:MHz
    //参数3:时钟IP核输出的时钟1频率 单位:MHz
    void clk_wiz_cfg(u32 clk_device_id, double freq0, double freq1)
    {double div_factor = 0;u32 div_factor_int = 0;u32 dviv_factor_frac = 0;u32 clk_divide = 0;u32 status = 0;//初始化XCLK_WizXClk_Wiz_Config *clk_cfg_ptr;clk_cfg_ptr = XClk_Wiz_LookupConfig(clk_device_id);XClk_Wiz_CfgInitialize(&clk_wiz_inst,clk_cfg_ptr,clk_cfg_ptr->BaseAddr);//配置输入时钟倍频/分频系数(多个时钟输出就只用配置一次,后面都用这一个标准进行分配输出)XClk_Wiz_WriteReg(clk_cfg_ptr->BaseAddr,CLK_CFG0_OFFSET,0x00000a01);  //10倍频,1分频(输出频率不能超过(CLK_WIZ_IN_FREQ*10/1)MHz)//配置输出时钟0频率if(freq0 <= 0){//计算分频系数div_factor 			= CLK_WIZ_IN_FREQ * 10 / freq0;div_factor_int 		= (u32)div_factor;								  //(取整)分频系数整数部分dviv_factor_frac 	= (u32)((div_factor - div_factor_int) * 1000 /8); //(取整)分频系数小数部分的8分之一(针对mmcm)clk_divide 			= div_factor_int | (dviv_factor_frac<<8);xil_printf("div_factor_0: %d.%d\n", div_factor_int,dviv_factor_frac*8); // 打印设置的分频系数//配置分频系数XClk_Wiz_WriteReg(clk_cfg_ptr->BaseAddr,CLK_CFG2_OFFSET,clk_divide);}//配置输出时钟0频率if(freq1 <= 0){//计算分频系数div_factor 			= CLK_WIZ_IN_FREQ * 10 / freq1;div_factor_int 		= (u32)div_factor;dviv_factor_frac	= (u32)((div_factor - div_factor_int) * 1000 /8);clk_divide 			= div_factor_int | (dviv_factor_frac<<8);xil_printf("div_factor_1: %d.%d\n", div_factor_int,dviv_factor_frac*8); // 打印设置的分频系数//配置分频系数XClk_Wiz_WriteReg(clk_cfg_ptr->BaseAddr,CLK_CFG7_OFFSET,clk_divide);}// 调试(可选):打印当前寄存器值/*xil_printf("After config:\n");xil_printf("CLK_CFG0: 0x%08X\n", XClk_Wiz_ReadReg(clk_cfg_ptr->BaseAddr, CLK_CFG0_OFFSET));xil_printf("CLK_CFG2: 0x%08X\n", XClk_Wiz_ReadReg(clk_cfg_ptr->BaseAddr, CLK_CFG2_OFFSET));xil_printf("CLK_CFG5: 0x%08X\n", XClk_Wiz_ReadReg(clk_cfg_ptr->BaseAddr, CLK_CFG5_OFFSET));xil_printf("CLK_CFG7: 0x%08X\n", XClk_Wiz_ReadReg(clk_cfg_ptr->BaseAddr, CLK_CFG7_OFFSET));*///加载重配置的参数XClk_Wiz_WriteReg(clk_cfg_ptr->BaseAddr,CLK_CFG23_OFFSET,0x00000003);//获取时钟IP核的状态,判断是否重配置完成while(1){status = XClk_Wiz_ReadReg(clk_cfg_ptr->BaseAddr,CLK_SR_OFFSET);if(status&0x00000001)    //Bit0 Locked信号return ;}
    }

    函数调用

    #include "xclk_wiz.h"
    #include "clk_wiz.h"#define CLK_WIZ_ID      XPAR_CLK_WIZ_0_DEVICE_ID    //时钟IP核器件IDint main()
    {double freq0 = 74.25;double freq1 = 371.25;//配置时钟IP输出频率(单位MHz)clk_wiz_cfg(CLK_WIZ_ID, freq0 , freq1);...return 0;
    }

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

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

    相关文章

    服务器带宽基础知识

    服务器带宽基础知识详解 一、带宽的定义与基本概念 服务器带宽&#xff08;Bandwidth&#xff09;是指服务器与互联网之间在单位时间内传输数据的能力&#xff0c;通常以 Mbps&#xff08;兆比特每秒&#xff09; 或 Gbps&#xff08;吉比特每秒&#xff09; 为单位衡量。它决…

    OpenCV CUDA 模块中在 GPU 上对图像或矩阵进行 翻转(镜像)操作的一个函数 flip()

    操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 cv::cuda::flip 是 OpenCV 的 CUDA 模块中的一个函数&#xff0c;用于在 GPU 上对图像或矩阵进行 翻转&#xff08;镜像&#xff09;操作。它类似…

    shell脚本实现docker运行镜像挂载

    根据本文脚本展示内容可以实现多种容器挂载 演示nginx挂载 创建挂载目录 mkdir -p /data/nginx/{conf,html,logs} 参数含义&#xff1a; docker run -d --name 给运行的镜像取名 -v /宿主机/目录:/容器内/目录 镜像名 示例&#xff1a; docker启动nginx&#xff08;当…

    WiseAD:基于视觉-语言模型的知识增强型端到端自动驾驶——论文阅读

    《WiseAD: Knowledge Augmented End-to-End Autonomous Driving with Vision-Language Model》2024年12月发表&#xff0c;来自新加坡国立和浙大的论文。 在快速发展的视觉语言模型&#xff08;VLM&#xff09;中&#xff0c;一般人类知识和令人印象深刻的逻辑推理能力的出现&a…

    NestJS 知识框架

    一、核心概念 1. 架构基础 基于 Express/Fastify 的 Node.js 框架 采用模块化设计 使用 TypeScript 构建&#xff08;也支持 JavaScript&#xff09; 借鉴 Angular 的设计理念 2. 主要组件 模块 (Module): 应用的基本组织单元 控制器 (Controller): 处理 HTTP 请求 服务…

    深入理解 Istio v1.25.2

    要深入理解 Istio 的最新版本&#xff08;截至 2025 年 5 月&#xff0c;最新版本为 1.25.2&#xff0c;发布Iweb:1⁊&#xff09;源码&#xff0c;我们可以通过分析其核心组件和代码结构来加深对 Istio 的理解。以下是对 Istio 源码的解读&#xff0c;结合其架构和功能&#x…

    星际篮球争霸赛/MVP争夺战 - 华为OD机试真题(A卷、Java题解)

    华为OD机试题库《C》限时优惠 9.9 华为OD机试题库《Python》限时优惠 9.9 华为OD机试题库《JavaScript》限时优惠 9.9 针对刷题难&#xff0c;效率慢&#xff0c;我们提供一对一算法辅导&#xff0c; 针对个人情况定制化的提高计划&#xff08;全称1V1效率更高&#xff09;。 看…

    Kubernetes etcd 故障恢复(1)

    1.查看集群状态 获取主节点和故障节点id ETCDCTL_API3 ./etcdctl --cacert/etc/kubernetes/ssl/new-ca.pem --cert/etc/kubernetes/ssl/etcd.pem --key/etc/kubernetes/ssl/etcd-key.pem --endpoints"https://192.168.7.132:2379,https://192.168.7.134:2379,https://19…

    在UI原型设计中,低、高保真原型图有什么区别?

    在数字产品开发中&#xff0c;原型&#xff08;Prototype&#xff09; 是连接创意与落地的桥梁。它通过可视化的方式验证功能、交互与用户体验&#xff0c;避免开发资源浪费。而低保真&#xff08;Lo-Fi&#xff09;与高保真&#xff08;Hi-Fi&#xff09;原型&#xff0c;则是…

    使用FastAPI和React以及MongoDB构建全栈Web应用02 前言

    Who this book is for 本书适合哪些人阅读 This book is designed for web developers who aspire to build robust, scalable, and efficient web applications. It caters to a broad spectrum of developers, from those with foundational knowledge to experienced prof…

    linux下minio的进程管理脚本

    准备工作&#xff1a; 参考链接&#xff1a; Deploy MinIO: Single-Node Single-Drive — MinIO Object Storage for Linux 下载&#xff1a; wget https://dl.min.io/server/minio/release/linux-amd64/minio kill-app.sh #!/bin/bash # 文件名&#xff1a; kill-app.sh…

    【Linux】编译安装 opencv 并链接到 VSCode

    一、背景 最近打算把现有的一个 python 程序用 c 重写&#xff0c;进一步提升性能。编辑器使用 VSCode&#xff0c;三方库需要用到 opencv&#xff0c;要进行编译安装。 二、编译安装 opencv 1. 更新源 sudo apt update && sudo apt upgrade 2. 安装依赖库 安装编…

    Ubuntu 安装 HAProxy

    HAProxy 是什么 HAProxy&#xff08;High Availability Proxy&#xff09; 是一个 高性能、高可用的 TCP 和 HTTP 负载均衡器与代理服务器。 HAProxy 的特点 特性说明支持协议HTTP、HTTPS、TCP高性能使用 C 语言编写&#xff0c;性能极高高可用与 Keepalived 配合可实现主备健…

    Mysql--基础知识点--91.2--processlist

    在 MySQL 中&#xff0c;SHOW PROCESSLIST 是一个常用命令&#xff0c;用于查看当前数据库服务器上所有正在运行的线程&#xff08;进程&#xff09;信息。以下是关键点说明&#xff1a; 1. 命令用法 SHOW FULL PROCESSLIST;输出字段&#xff1a; 列名含义Id线程唯一标识符&am…

    Git标签删除脚本解析与实践:轻松管理本地与远程标签

    Git 标签删除脚本解析与实践:轻松管理本地与远程标签 在 Git 版本控制系统中,标签常用于标记重要的版本节点,方便追溯和管理项目的不同阶段。随着项目的推进,一些旧标签可能不再需要,此时就需要对它们进行清理。本文将通过一个完整的脚本,详细介绍如何删除本地和远程的 …

    K8S - Harbor 镜像仓库部署与 GitLab CI 集成实战

    引言 在 Kubernetes 环境中&#xff0c;容器镜像的存储与管理至关重要。企业级镜像仓库&#xff08;如 Harbor&#xff09;为团队提供了安全、稳定、可扩展的镜像管理解决方案。 一、Harbor 安装与配置 Harbor 是由 VMware 开源的企业级云原生镜像仓库&#xff0c;它不仅支持…

    2025年best好用的3dsmax插件和脚本

    copitor 可以从一个3dsmax场景里将物体直接复制到另一个场景中 Move to surface 这个插件可以将一些物体放到一个平面上 instancer 实体器&#xff0c;举例&#xff1a;场景中有若干独立的光源&#xff0c;不是实体对象&#xff0c;我们可以使用instancer将他变成实体。 paste …

    Python爬虫实战:研究nodejs aes加密

    1. 引言 1.1 研究背景与意义 在当今数字化时代,Web 数据的价值日益凸显。通过爬虫技术获取公开数据并进行分析,能够为企业决策、学术研究等提供有力支持。然而,为了保护数据安全和隐私,许多网站采用了加密技术对数据进行保护,其中 AES 加密是一种常见且安全的加密算法。…

    LGDRL:基于大型语言模型的深度强化学习在自动驾驶决策中的应用

    《Large Language Model guided Deep Reinforcement Learning for Decision Making in Autonomous Driving》2024年12月发表&#xff0c;来自北理工的论文。 深度强化学习&#xff08;DRL&#xff09;在自动驾驶决策方面显示出巨大的潜力。然而&#xff0c;由于DRL的学习效率低…

    TDEngine 与 Grafana

    目录 实践目录 Grafana 参考文档 实践目录 10.60.100.194&#xff1a;/home/dualven/tdengine Grafana systemctl status grafana-server http://10.60.100.194:3000/ 这个端口与mydoor的new server服务冲突 &#xff08;同时只开一个&#xff09; 参考文档 运行监…