vivado 学习(0)--- clocking wizard 的使用
本文探讨了使用clk_wizard IP核生成精确时钟的方法,相比直接使用晶振更稳定且能实现分频/倍频。文章分三部分:1)目标与实现时钟相同时的配置方法,展示无误差情况;2)当目标时钟无法直接生成时,采用中间时钟(100MHz)辅助生成精确时钟(148MHz)的两级IP方案;3)通过Verilog代码和Modelsim仿真验证了40MHz和148MHz时钟输出的准确性,后者可精确到小数点后三位。结
·
前言
工程使用的所有时钟都应该尽量避免直接使用板子的晶振,
使用clk_wizard ip 核可以:1.使时钟更加稳定;2.可以分频、倍频以获得多种频率的时钟。
一、目标时钟与实际时钟相同
PLL有时在生成某些频率时并不能生成完全一致的时钟,存在误差。
下面先展示无误差,再展示有误差的情况怎么解决。

二、目标时钟与实际时钟近似

直接说结论,50Mhz时钟不能生成所有频率的时钟,有时你需要的时钟不能直接由原始晶振生成的时候,需要用中间时钟来辅助生成
148Mhz 由100Mhz生成时无误差,因此我们需要让clk_in1为100M。
具体操作是使用两个ip,第一个ip输出100M,把这个100M接到第二个ip的输入,第二个ip就可以完美输出148Mhz了。


三、代码实现
顶层文件
`timescale 1ns / 1ps
module clk_wiz(
input clk
);
wire clk_out1 ;
wire clk_out2 ;
wire clk_out3 ;
wire clk_out4 ;
wire clk_out5 ;
wire clk_out6 ;
wire clk_out7 ;
wire locked1 ;
wire locked2 ;
wire clk_out8 ;
clk_global u1_clk_global(
.clk_in1 (clk ),
.clk_out1 (clk_out1 ),
.clk_out2 (clk_out2 ),
.clk_out3 (clk_out3 ),
.clk_out4 (clk_out4 ),
.clk_out5 (clk_out5 ),
.clk_out6 (clk_out6 ),
.clk_out7 (clk_out7 ),
.locked (locked1 )
);
clk_global_1 u1_clk_global_1(
.clk_in1 (clk_out7) ,
.clk_out1 (clk_out8) ,
.locked (locked2)
);
endmodule
仿真文件
`timescale 1ns / 1ps
module tb_clk_wiz();
reg clk ;
initial begin
clk = 1'b0;
end
always #10 clk = ~clk;
clk_wiz u1_clk_wiz(
.clk (clk )
);
endmodule
四、仿真分析


先测试一个4号时钟,从第一节里可以看到我给4号设置了40M,这里看到波形下方的数据确实是40Mhz。

再来测我们的148M。
用modelsim抓出来的波形可以看到,频率显示的也不是绝对的148M,但是已经精确到小数点后三位。
火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。
更多推荐


所有评论(0)