【前言】 在verilog设计中,我们常常会面临需要修改PLL输出时钟的情况,一旦进行修改,便需要重新编译等待较长时间。而clock wizard核是支持动态重配置的,因此,只需结合xilinx提供的JTAG to AXI Master核,便能够使用JTAG,通过AXI4接口去动态重配置clock wizard,进而实现无需编译,就能修改PLL输出时钟。
【设计实现】
设计的实现十分简单,只需将clock wizard设置为动态重配置,并添加JTAG to AXI Master核。为了方便使用,建议使用BD来实现。
【配置方法】
JTAG to AXI Master核的控制需要通过TCL指令实现,为了方便大家操作,这里已经提前为大家写好了TCL脚本。
[C#] 纯文本查看 复制代码 proc ReadReg { Addr } {
set address [format "0x%08X" $Addr]
create_hw_axi_txn read_txn [get_hw_axis hw_axi_1] -address $address -type read
run_hw_axi read_txn
set read_value [lindex [report_hw_axi_txn read_txn] 1];
delete_hw_axi_txn read_txn
set tmp addr=0x
append tmp $address
append tmp , data=0x
append tmp $read_value
return $tmp
}
proc WriteReg { Addr data } {
set address [format "0x%08X" $Addr]
set data [format "0x%08X" $data]
create_hw_axi_txn write_txn [get_hw_axis hw_axi_1] -address $address -data $data -type write
run_hw_axi write_txn
set write_value [lindex [report_hw_axi_txn write_txn] 1];
delete_hw_axi_txn write_txn
}
# 请根据硬件设置PLL基地址
set baseaddr 0x44A00000
# ------------------------------------------------------
# PLL寄存器配置表请参考下帖
# 如何使用AXI4接口对PLL/MMCM输出时钟的频率和相位进行动态重配置
# [url=https://www.corecourse.cn/forum.php?mod=viewthread&tid=29747]https://www.corecourse.cn/forum.php?mod=viewthread&tid=29747[/url]
# (出处: 芯路恒电子技术论坛)
# ------------------------------------------------------
# 以下为示例,配置CLK0为20分频
# 配置完成后续要向0x25c偏移地址写入0X03配置才会生效
WriteReg [expr {$baseaddr + 0x00000208}] 0x14
WriteReg [expr {$baseaddr + 0x0000025c}] 0x03
使用时,只需要根据系统修改clock wizard的基地址,然后按照格式修改对应寄存器即可。PLL的寄存器说明可以参考下帖:
根据clock wizard的要求,配置完成后,还需向偏移地址为0x25c的寄存器写入0x3,配置才会生效。编写完TCL脚本后,只需在Tools中,运行脚本即可。
运行过脚本后,用户也可以在TCL中使用封装好的WriteReg指令和WriteReg指令读写寄存器,指令格式参考如下:
[C#] 纯文本查看 复制代码 WriteReg 0x44A00208 0x14
ReadReg 0x44A00208
【效果演示】
PLL 50M输入时钟;VCO20倍频,1分频;clk_out1 10分频,输出100M时钟
运行脚本后,修改clk_out1 为20分频,输出50M时钟
【附件】
clock_recofig.rar
(479.57 KB, 下载次数: 55)
PLL_RD_WR.tcl
(1.26 KB, 下载次数: 54)
|