当前位置:   article > 正文

Xilinx Clocking Wizard IP核的动态配置_.clock_re_cfg_en ( clock_re_cfg_en ),

.clock_re_cfg_en ( clock_re_cfg_en ),

 

1、概述

VIVADO 工具提供了关于时钟的 IP 核,其内部调用了 PLL 或 MMCM 原语,通过设置 IP 核配置界面的参数可以获得想要的频率时钟。本文以此展开,对如何根据输入时钟的改变动态配置输出时钟作出讲解,并举例进行详细阐述。

2、使用场景说明

例,一个频率为 450MHz 的差分时钟进入 FPGA 内部,经过 Clocking Wizard IP 核后,分别输出了 180MHz、50MHz、450MHz、90MHz 四个时钟。在此基础上,该输入时钟会在上位机的控制下变为 600MHz,同时需要经过 IP 核后输出 200MHz、50MHz、600MHz、200MHz 四个时钟。

当输入时钟为 450MHz 时设置的输入分频比、VCO 分频比、各输出时钟分频比等参数与输入时钟为 600MHz 时有所改变,这就需要上位机告知我们当前输入的时钟频率,并以此进行相关参数的重配置。

3、IP 核设置

打开 IP 核,在第一页勾选 AXI4Lite,并设置输入差分时钟频率 450MHz。

在第二页中设置如下频率:

在第四页中可以看到分频及倍频参数如下:

其它保持默认设置即可。

4、AXI4-Lite 接口

在上一节的 IP 核设置中勾选了  AXI4Lite,该总线用于配置 IP 核的内部寄存器,包括 CLKFBOUT_MULT_F、DIVCLK_DIVIDE、clkout1~clkout4 对应的 Divide 参数。因此先了解 AXI4-Lite 接口,才能实现动态配置时钟的功能。

信号接口如下:

写地址总线
s_axi_aclkAXI4-lite 时钟
s_axi_aresetn异步复位,低有效
s_axi_awaddr[10:0]写地址
s_axi_awvalid写有效
s_axi_awready写地址 ready
写数据总线
s_axi_wdata[31:0]写数据
s_axi_wstb[3:0]写数据字节有效标志
s_axi_wvalid写有效
s_axi_wready写 ready
写响应总线
s_axi_bresp[1:0]写响应
s_axi_bvalid写响应有效
s_axi_bready响应 ready
读地址总线
s_axi_araddr[10:0]读地址
s_axi_arvalid读地址有效
s_axi_arready读地址 ready
读数据总线
s_axi_rdata[31:0]读数据
s_axi_rresp[1:0]读响应
s_axi_rvalid读有效
s_axi_rready读 ready

接口时序如下:

5、IP 核寄存器

地址寄存器默认值寄存器说明
0X00N/A软复位寄存器,写0x0000_000A激活软复位
0X2000X01010A00

Bit[7:0] = DIVCLK_DIVIDE

Bit[15:8] = CLKFBOUT_MULT

Bit[25:16] = CLKFBOUT_FRAC Multiply Fractional

Bit[26] = CLKFBOUT_FRAC_EN

0X2080X00010A00

Bit[7:0] = CLKOUT0_DIVIDE

Bit[17:8] = CLKOUT0_FRAC Divide Fractional

Bit[18] = CLKOUT0_FRAC_EN
0X2140X00000001Bit[7:0] = CLKOUT1_DIVIDE
0X2200X00000001Bit[7:0] = CLKOUT2_DIVIDE
0X22C0X00000001Bit[7:0] = CLKOUT3_DIVIDE
0X25C0X00000000

Bit[0] = LOAD, 置 1 加载配置寄存器的值到内部寄存器,并在下一周期置0;

Bit[1] = SADDR, 写 0 将默认 GUI 中的参数加载到动态配置中;写 1 将配置寄存器参数加载到动态配置中;

Bit[2] = SEN, 写 1 启动动态配置状态机,在下一次写时置 0 

6、功能仿真

仿真方法如下,在前 20000ns 的时间内,输入时钟为 450MHz,输出了 180MHz、50MHz、450MHz、90MHz 四个时钟;输出在后面的 20000ns 的时间内,输入时钟为 600MHz,输出 200MHz、50MHz、600MHz、200MHz 四个时钟。

下图为 450MHz 输入时钟对应输出,clkout1 的周期为 5.555ns,对应 180MHz 频率,clkout2~4 均为对应的频率:

下图为更改为 600MHz 输出后,动态配置寄存器后,可以看出 clkout1 的周期为 5ns,频率变为了 200MHz,clkout2~4 均变为设置的值:

7、仿真代码

module clk_dynamic_reconfig_tb;  reg                clk_in1_p    ;  wire              clk_in1_n    ;    reg                clk_in2_p    ;  wire              clk_in2_n    ;    wire              clk_in_p    ;  wire              clk_in_n    ;    reg                s_axi_aclk    ;  reg                s_axi_aresetn  ;    reg                clock_re_cfg_en  ;    reg                clock_fre_flag  ;    initial begin    clk_in1_p = 1'b1;    clk_in2_p = 1'b1;    s_axi_aclk = 1'b1;    s_axi_aresetn = 1'b0;    clock_re_cfg_en = 1'b0;    clock_fre_flag = 1'b0;    #201    s_axi_aresetn = 1'b1;    #20000    @(posedge s_axi_aclk)    #1 clock_fre_flag = 1'b1;    #20000    @(posedge s_axi_aclk)    #1 clock_re_cfg_en = 1'b1;    @(posedge s_axi_aclk)    #1 clock_re_cfg_en = 1'b0;    #20000    $stop;  end    assign  clk_in1_n = ~clk_in1_p;  always #1.111 clk_in1_p = ~clk_in1_p;  assign  clk_in2_n = ~clk_in2_p;  always #0.833 clk_in2_p = ~clk_in2_p;    always #10 s_axi_aclk = ~s_axi_aclk;    assign  clk_in_p = clock_fre_flag ? clk_in2_p : clk_in1_p;  assign  clk_in_n = clock_fre_flag ? clk_in2_n : clk_in1_n;  clk_dynamic_reconfig clk_dynamic_reconfig(    .clk_in1_p          ( clk_in_p ),    .clk_in1_n          ( clk_in_n ),      .s_axi_aclk          ( s_axi_aclk ),    .s_axi_aresetn        ( s_axi_aresetn ),        .clock_re_cfg_en       ( clock_re_cfg_en ),        .DIVCLK_DIVIDE        ( 2 ),    .CLKBFOUT_MULT        ( 4 ),    .CLKFBOUT_FRAC        ( 0 ),    .CLKFBOUT_FRAC_EN      ( 0 ),        .CLKOUT0_DIVIDE        ( 6 ),    .CLKOUT0_FRAC        ( 0 ),    .CLKOUT0_FRAC_EN      ( 0 ),        .CLKOUT1_DIVIDE        ( 24 ),    .CLKOUT2_DIVIDE        ( 2 ),    .CLKOUT3_DIVIDE        ( 6 )  );endmodule

8、功能源码

请关注获取:

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/454177
推荐阅读
  

闽ICP备14008679号