【Vivado那些事儿】动态时钟的使用

时钟是每个 FPGA 设计的核心。如果我们正确地设计时钟架构、没有 CDC 问题并正确进行约束设计,就可以减少与工具斗争的时间。

b646ca422cfb4b174ff7fb0fc61ce79e.png

但对于某些应用,我们希望能够更改某些IP中的时钟频率。其中一个例子是在图像处理管道中,输出分辨率可以动态变化,从而需要改变像素时钟。

众所周知,我们可以在 Zynq SoC 和 Zynq MPSoC 中使用结构时钟并在运行时更改结构时钟的频率。但是,如果我们在 Zynq 或 ZYNQ MPSoC 中使用 FPGA 或 PL,我们仍然可以使用动态配置的时钟向导在运行时更改频率。

动态配置时钟允许我们使用 AXI 接口在运行时更改时钟频率。

6abf841aaee9dd74e90c246abd6bf3f8.png

为了创建一个简单的示例,我们将实例化PS并将动态配置时钟IP连接到主 AXI 接口。我们将输出时钟连接到 IO 引脚,以便我们可以对其进行观察并查看频率的变化。

24fcf6936adb1f199c2f3d7f626da15c.png

上面的时钟是我们打算使用的最大频率,这样可以确保时序约束和时序性能正确。下图是我们这次demo的最终设计。

e621f136876f01a8ea9f2be5418bb64e.png

接下来我们将在 Vitis 中开发软件,并且将在设计中的 IP 下看到相关驱动及文档。

开发这个IP的驱动和其他 AXI Lite 接口一样,需要对IP寄存器空间进行写入和读取。

要更改时钟频率输出,我们有两种选择。如果只生成一个时钟,我们可以使用名为 SetRate 的函数。该函数将通过AXI Lite总线传递到IP中,IP会给出我们所需的频率输出,并计算必要的分频器、乘法器和相位参数实现所需的输出频率。

然而,如果我们有多个时钟,那么我们需要分别计算这些寄存器的值并单独更新时钟寄存器(每个时钟有两个寄存器)。

这里有个注意点就是在进行时钟更改前最好等待IP锁定到之前的频率后再进行新操作。

更改频率的代码还是比较简单的,如下:

#include <stdio.h>
#include "platform.h"
#include "xil_printf.h"

#include "xclk_wiz.h"

XClk_Wiz ClkWiz_Dynamic;
XClk_Wiz_Config *CfgPtr_Dynamic;

#define XCLK_WIZARD_DEVICE_ID  XPAR_CLK_WIZ_0_DEVICE_ID
#define XCLK_US_WIZ_RECONFIG_OFFSET 0x0000025C
#define CLK_LOCK   1

int main()
{
    init_platform();
    int Status;
    print("Hello World\n\r");

    CfgPtr_Dynamic = XClk_Wiz_LookupConfig(XCLK_WIZARD_DEVICE_ID);
 XClk_Wiz_CfgInitialize(&ClkWiz_Dynamic, CfgPtr_Dynamic,     
                        CfgPtr_Dynamic->BaseAddr);

 while(1){
  XClk_Wiz_WriteReg(CfgPtr_Dynamic->BaseAddr, 
                    XCLK_WIZ_REG25_OFFSET, 0);
  XClk_Wiz_SetRate(&ClkWiz_Dynamic, 10);
  XClk_Wiz_WriteReg(CfgPtr_Dynamic->BaseAddr, 
                     XCLK_US_WIZ_RECONFIG_OFFSET,   
                    (XCLK_WIZ_RECONFIG_LOAD | 
                    XCLK_WIZ_RECONFIG_SADDR));
  Status = XClk_Wiz_WaitForLock(&ClkWiz_Dynamic);
  usleep(10000000);
  XClk_Wiz_WriteReg(CfgPtr_Dynamic->BaseAddr, 
                    XCLK_WIZ_REG25_OFFSET, 0);
  XClk_Wiz_SetRate(&ClkWiz_Dynamic, 14);
  XClk_Wiz_WriteReg(CfgPtr_Dynamic->BaseAddr, 
             XCLK_US_WIZ_RECONFIG_OFFSET, 
            (XCLK_WIZ_RECONFIG_LOAD |    
            XCLK_WIZ_RECONFIG_SADDR));
  Status = XClk_Wiz_WaitForLock(&ClkWiz_Dynamic);
  usleep(10000000);
 }
    cleanup_platform();
    return 0;
}

当然,我们也可以使用类似的方法,通过将时钟频率降低来实现不同功耗模式下 FPGA 的功耗,从而实现降低功耗的功能。

ca043de72b7959b9122aa1db93a51568.png 1afadd6e969c1b67308f6b00fe120d1e.png

参考文献

https://blog.csdn.net/qq_31799983/article/details/109407898

https://www.adiuvoengineering.com/post/microzed-chronicles-dynamic-clocking

https://docs.xilinx.com/r/en-US/pg065-clk-wiz

### 使用Vivado中的时钟IP核 #### 创建项目并配置环境 当使用 Vivado 设计工具进行 FPGA 开发时,创建新项目是第一步。确保选择了合适的版本,比如 Vivado 2020.2 版本,在启动界面点击“create Project”以建立新的工程[^2]。 #### 添加时钟IP核 为了利用内置的时钟IP核功能,可以在 IP Catalog 中找到 Clocking Wizard 或其他与时钟相关的 IP 核。通过搜索框定位所需的时钟组件,并将其加入到设计中。对于复杂的时序需求,Clocking Wizard 提供了灵活的参数设置选项来满足特定的应用场景[^1]。 ```tcl # 打开 IP catalog 并添加 clocking wizard IP 核 set clk_wiz [ create_ip -name clk_wiz -vendor xilinx.com -library ip -module_name my_clk_gen ] ``` #### 配置时钟属性 一旦添加了时钟IP核之后,就可以对其进行详细的配置。这包括但不限于输入频率、输出频率以及相位调整等重要参数。这些都可以在图形化界面上直观操作,也可以通过 Tcl 命令行脚本来自动化这一过程。 ```tcl # 设置时钟生成器的具体参数 set_property CONFIG.PRIM_IN_FREQ.VALUE_SRC USER \ [ get_ips my_clk_gen ] set_property CONFIG.CLKOUT1_REQUESTED_OUT_FREQ.Value 100 \ [ get_ips my_clk_gen ] ``` #### 实现主时钟约束 完成上述步骤后,还需要定义适当的时钟约束条件,以确保整个系统的同步性和稳定性。可以通过 XDC 文件指定具体的时钟信号及其特性,如周期时间和抖动范围等。这样做的目的是让综合工具能够理解设计意图,并据此优化布局布线策略。 ```xdc # 定义外部输入时钟 create_clock -period 10.000 -name sys_clk [get_ports sys_clk] # 对于由内部PLL产生的时钟,则需关联至相应端口 create_generated_clock -source [get_pins /my_clk_gen/inst/clk_out1] \ -divide_by 1 -multiply_by 1 -phase 0.0 \ -name pll_clk [get_nets {pll_clk}] ``` #### 编译与验证 最后一步是对整个设计进行全面编译和仿真测试,确认所有设定都按预期工作正常。如果一切顺利的话,便可以获得一个经过良好调校后的时钟网络结构,从而保障后续逻辑电路的设计质量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

OpenFPGA

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值