赞
踩
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_aclk | AXI4-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 核寄存器
地址 | 寄存器默认值 | 寄存器说明 |
0X00 | N/A | 软复位寄存器,写0x0000_000A激活软复位 |
0X200 | 0X01010A00 | Bit[7:0] = DIVCLK_DIVIDE Bit[15:8] = CLKFBOUT_MULT Bit[25:16] = CLKFBOUT_FRAC Multiply Fractional Bit[26] = CLKFBOUT_FRAC_EN |
0X208 | 0X00010A00 | Bit[7:0] = CLKOUT0_DIVIDE Bit[17:8] = CLKOUT0_FRAC Divide Fractional Bit[18] = CLKOUT0_FRAC_EN |
0X214 | 0X00000001 | Bit[7:0] = CLKOUT1_DIVIDE |
0X220 | 0X00000001 | Bit[7:0] = CLKOUT2_DIVIDE |
0X22C | 0X00000001 | Bit[7:0] = CLKOUT3_DIVIDE |
0X25C | 0X00000000 | 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、功能源码
请关注获取:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。