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

news2025/5/17 1:54:58

版本: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 23
    
    void 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核输入100Mhz
    
    XClk_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_Wiz
    	XClk_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核器件ID
    
    int main()
    {
    	double freq0 = 74.25;
        double freq1 = 371.25;
    
    	//配置时钟IP输出频率(单位MHz)
    	clk_wiz_cfg(CLK_WIZ_ID, freq0 , freq1);
    
    	...
    
    	return 0;
    }

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

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

    相关文章

    探秘高可用负载均衡集群:企业网络架构的稳固基石

    目录 高可用负载均衡集群 一、集群的本质与核心价值​ 二、高可用集群与负载均衡集群的定义​ 高可用集群&#xff08;HA Cluster&#xff09;​ 负载均衡集群&#xff08;Load Balance Cluster&#xff09;​ 三&#xff0e;高可用与负载均衡的完美融合 四&#xff0e;…

    JAVA:ResponseBodyEmitter 实现异步流式推送的技术指南

    1、简述 在许多场景下,我们希望后端能够以流式、实时的方式推送数据给前端,比如消息通知、日志实时展示、进度条更新等。Spring Boot 提供了 ResponseBodyEmitter 机制,可以让我们在 Controller 中异步地推送数据,从而实现实时流式输出。 样例代码:https://gitee.com/lh…

    CSS- 1.1 css选择器

    本系列可作为前端学习系列的笔记&#xff0c;代码的运行环境是在HBuilder中&#xff0c;小编会将代码复制下来&#xff0c;大家复制下来就可以练习了&#xff0c;方便大家学习。 HTML系列文章 已经收录在前端专栏&#xff0c;有需要的宝宝们可以点击前端专栏查看&#xff01; 系…

    ABP-Book Store Application中文讲解 - Part 2: The Book List Page

    本章用于介绍如何创建Book List Page。 TBD 1. 汇总 ABP-Book Store Application中文讲解-汇总-CSDN博客 2. 前一章 ABP-Book Store Application中文讲解 - Part 1: Creating the Server Side 项目之间的引用关系。 目录 1. 多语言配置 1.1 zh-Hans.json 1.2 en.jso…

    08 web 自动化之 PO 设计模式详解

    文章目录 一、什么是 POM二、如何基于 POM 进行自动化框架架构&#xff1f;1、base 层封装2、pageobjects 层封装3、TestCases 层封装 三、元素和方法分离&数据分离1、哪些部分可以进行分离2、示例代码 四、总结 一、什么是 POM POM page object model 页面对象模型 WEB 自…

    langchain4j集成QWen、Redis聊天记忆持久化

    langchain4j实现聊天记忆默认是基于进程内存的方式&#xff0c;InMemoryChatMemoryStore是具体的实现了&#xff0c;是将聊天记录到一个map中&#xff0c;如果用户大的话&#xff0c;会造成内存溢出以及数据安全问题。位了解决这个问题 langchain4提供了ChatMemoryStore接口&am…

    WebGL图形编程实战【7】:变换流水线 × 坐标系与矩阵精讲

    变换流水线 #mermaid-svg-Omabd9LSNCdIvWqB {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-Omabd9LSNCdIvWqB .error-icon{fill:#552222;}#mermaid-svg-Omabd9LSNCdIvWqB .error-text{fill:#552222;stroke:#552222;…

    DVWA靶场通关笔记-SQL注入(SQL Injection Medium级别)

    目录 一、SQL Injection 二、代码审计&#xff08;Medium级别&#xff09; 1、源码分析 &#xff08;1&#xff09;index.php &#xff08;2&#xff09;Medium.php 2、渗透思路 &#xff08;1&#xff09;SQL安全问题分析 &#xff08;2&#xff09;SQL渗透思路 三、…

    vue异步导入

    vue的异步导入 大家开发vue的时候或多或少路由的异步导入 component: () >import(“/views/A_centerControl/intelligent-control/access-user-group”),当然这是路由页面&#xff0c;那么组件也是可以异步导入的 使用方式 组件的异步导入非常简单&#xff0c;主要是一个…

    2025年,如何制作并部署一个完整的个人博客网站

    欢迎访问我的个人博客网站&#xff1a;欢迎来到Turnin的个人博客 github开源地址&#xff1a;https://github.com/Re-restart/my_website 前言 2024年年初&#xff0c;从dji实习回来之后&#xff0c;我一直想着拓宽自己的知识边界。在那里我发现虽然大家不用java&#xff0c;…

    腾讯云运营开发 golang一面

    redis为什么单线程会快 每秒10w吞吐量 io多路复用 一个文件描述符整体拷贝&#xff1b;调用epoll_ctl 单个传递 内核遍历文件描述符判断是否有事件发送&#xff1b;回调函数列表维护 修改有事件发送的socket为可读或可写&#xff0c;返回整个文件描述符&#xff1b;返回链…

    一个简单的静态页面

    这个页面采用了现代化的 UI 设计&#xff0c;包括卡片式布局、微交互动画、分层设计和响应式结构。页面结构清晰&#xff0c;包含导航栏、英雄区域、功能介绍、产品特性、用户评价和联系表单等完整组件&#xff0c;可作为企业官网或产品介绍页面的基础模板。 登录后复制 <!D…

    使用 163 邮箱实现 Spring Boot 邮箱验证码登录

    使用 163 邮箱实现 Spring Boot 邮箱验证码登录 本文将详细介绍如何使用网易 163 邮箱作为 SMTP 邮件服务器&#xff0c;实现 Spring Boot 项目中的邮件验证码发送功能&#xff0c;并解决常见配置报错问题。 一、为什么需要邮箱授权码&#xff1f; 出于安全考虑&#xff0c;大…

    多模态大语言模型arxiv论文略读(六十八)

    Image-of-Thought Prompting for Visual Reasoning Refinement in Multimodal Large Language Models ➡️ 论文标题&#xff1a;Image-of-Thought Prompting for Visual Reasoning Refinement in Multimodal Large Language Models ➡️ 论文作者&#xff1a;Qiji Zhou, Ruoc…

    APS「多目标平衡算法」如何破解效率与弹性的永恒博弈

    APS&#xff08;高级计划与排程&#xff09;系统作为企业智能制造的核心引擎&#xff0c;通过整合需求预测、产能规划、生产调度、物料管理及数据分析等模块&#xff0c;构建了覆盖产品全生产流程的“感知-决策-执行-优化”闭环体系。 精准需求预测 APS系统通过构建需求特征数…

    网张实验操作-防火墙+NAT

    实验目的 了解防火墙&#xff08;ENSP中的USG5500&#xff09;域间转发策略配置、NAT&#xff08;与路由器NAT配置命令不同&#xff09;配置。 网络拓扑 两个防火墙连接分别连接一个内网&#xff0c;中间通过路由器连接。配置NAT之后&#xff0c;内网PC可以ping公网&#xf…

    05 web 自动化之 selenium 下拉鼠标键盘文件上传

    文章目录 一、下拉框操作二、键盘操作三、鼠标操作四、日期控件五、滚动条操作六、文件上传七、定位windows窗口及窗口的元素总结&#xff1a;页面及元素常用操作 一、下拉框操作 from selenium.webdriver.support.select import Select import time from selenium.webdriver.…

    Spring Cloud探索之旅:从零搭建微服务雏形 (Eureka, LoadBalancer 与 OpenFeign实战)

    引言 大家好&#xff01;近期&#xff0c;我踏上了一段深入学习Spring Cloud构建微服务应用的旅程。我从项目初始化开始&#xff0c;逐步搭建了一个具备服务注册与发现、客户端负载均衡以及声明式服务调用功能的基础微服务系统。本文旨在记录这一阶段的核心学习内容与实践成果…

    当 AI 邂逅丝路:揭秘「丝路智旅」,用 RAG 重塑中阿文化旅游体验

    目录 系统命名:丝路智旅 (Silk Road Intelligent Travel)系统概述系统架构设计系统功能模块技术选型:为何是它们?系统优势与特点未来展望与扩展总结在数字浪潮席卷全球的今天,古老的丝绸之路正在以一种全新的方式焕发生机。当深厚的文化底蕴遇上尖端的人工智能技术,会碰撞…

    18.Excel数据透视表:第1部分创建数据透视表

    一 什么是数据透视表 通过万花筒可以用不同的方式査看里面画面图像&#xff0c;在excel中可以将数据透视表看作是对准数据的万花筒&#xff0c;用不同角度去观察数据&#xff0c;也可以旋转数据&#xff0c;对数据进行重新排列&#xff0c;对大量的数据可以快速的汇总和建立交叉…