fpga外部输入一组lvds时钟,然后使用pll_adv分频,实现设计时报错
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了fpga外部输入一组lvds时钟,然后使用pll_adv分频,实现设计时报错相关的知识,希望对你有一定的参考价值。
fpga外部输入一组lvds时钟,我使用的IBUFGDS,输出一路时钟信号clk。然后使用IP核调用pll_adv。clk送给pll_adv进行分频。实现的时候会报错:bufg不能串联。我应该怎么解决这个问题啊?能不能让pll的输入不带bufg?外部进来的是差分形式的时钟,这个没法改动。
查了一些资料说用IP核,会自动加上bufg。使用原语是不是没有这个问题?
我初学者,谢谢指点!
system_clk --> pll_fb_in
这个是最简单的方法, IBUFGDS的输入接到PLL输入, PLL的输出通过BUFG接到CLOCK NETWORK. 然后得到的system_clk 接到PLL的feedback输入
如果这个时钟是驱动I/O模块的话,例如是ADC信号的时钟,还要加上BUFPLL BUFIO这些。具体的可以看看你用的片子的对应的datasheet,上面写的都很清楚的
如果你会直接用xilinx的primitive的话,直接用,不要通过CORE GEN追问
先谢谢您。我详细给您说一下吧。
fpga外部进来一对lvds时钟频率122.88M,这个时钟要驱动FPGA内部一些模块,还要输出一对D/A的信号时钟。
122.88M要分频得到它的7/9,7/18,4/9,1/2,分别驱动几个模块。我用了3个pll_adv来分别得到这几个频率。最后还要向d/a板输出一对lvds的数据时钟,频率是61.44M。您觉得我应该怎么管理这些时钟的产生?我初学者,发现pll能分频得到想要的时钟,就用的pll,也不知道是不是应该用。谢谢您了!
你用哪个片子?
有的片子可以用一个PLL_ADV (OR DCM) 直接产生你要的3个输出, 如果不行就用三个
clk_in -->ibufg --> pll_clk_in ---> bufg --> clk_out
clk_out --> pll_fb_in
向d/a板输出一对lvds的数据时钟, 不能直接输出, 因为通过PLL产生的时钟信号已经进入了时钟网络,直接输出没法布线。xilinx推荐的方法是通过一个ODDR模块接一个OBUFDS
PLL --> BUFG --->CLK_0 -----> ODDR_C0 ----> OBUFDS --> P & N
ODDR_C1 = NOT CLK_0
ODDR_D0 = '1'
ODDR_D1 = '0'
用的vertex 5 。
您说的PLL进入时钟网络直接输出不能布线,今天map的时候确实是报错了。原来是这个原因,谢谢了。
您说的ODDR_C0 这个东西是什么? 原语是什么?怎么用呢?
ODDR_inst : ODDR
generic map(
DDR_CLK_EDGE => "OPPOSITE_EDGE", -- "OPPOSITE_EDGE" or "SAME_EDGE"
INIT => ’0’, -- Initial value for Q port (’1’ or ’0’)
SRTYPE => "SYNC") -- Reset Type ("ASYNC" or "SYNC")
port map (
Q => Q, -- 1-bit DDR output 这个接到OBUFDS输入口
C => C, -- 1-bit clock input 这个接你要输出的时钟
CE => CE, -- 1-bit clock enable input = ‘1’
D1 => D1, -- 1-bit data input (positive edge) = ‘1’
D2 => D2, -- 1-bit data input (negative edge) = ‘0’
R => R, -- 1-bit reset input =‘0’
S => S -- 1-bit set input =‘0’
);
这个是VIRTEX 5的
我上面描述的是用SPARTAN-6的,有点不一样
原理就是通过这个ODDR, 把时钟信号转换成数据信号,这样就能通过OBUFDS输出为差分信号了。
(我后天开始休假2周,你要是有追问就不能回答了)
时钟复位篇
外部时钟
时钟信号的来源在FPGA芯片外部,通常的,外部时钟对于FPGA来说是必需的,因为FPGA内部没有供内部逻辑使用的时钟和激励电路。
2内部时钟
再生时钟
再生时钟是以一个输入时钟作为参考,在此基础上通过调整其频率和相位产生的新时钟,FPGA中产生再生时钟信号的模块只有PLL和DCM(注意,两者都能产生时钟信号)
时钟域
引入时钟域在于通常一个FPGA设计中会用到多个时钟信号。因此必然涉及到这样一个问题:时钟信号的管理范围时多大?这就是时钟域的问题
时钟树
通常描述的一个电路中,微观来看,由许多触发器构成,那么,问题在于这些触发器所共用的时钟信号能否同时到达每个寄存器的输入端,时钟树的存在就是为了保证信号到达时钟域内不同触发器的时间差最小。
现在注意到这样一个事情:时钟信号由FPGA的外部引脚产生,硬件连接时,需要将外部的时钟电路专门的连接道特定的全局时钟设计管脚,以及FPGA芯片外围引脚也有专门为区域时钟和IO时钟设计的专有引脚。
为什么需要这些专有引脚呢,因为这些引脚具有时钟树管理资源,进而确保时钟能够有正确的时序约束!!!
但是仅仅约束到正确的管脚,未必一定完成了正确的时钟树!!通常还需要进行使用原语这一编程行为来保证时钟信号的正确约束(关于具体的请参考FPGA之道这本书籍)。
跨时钟域问题:
FPGA设计中不可能所有的模块设计都采用一个时钟,因此必然存在跨时钟域问题。
现在思考这样一个问题:
当两个不同时钟域之间进行信息交互的时候,会存在什么问题???
如果两个时钟域的时钟信号从时间上讲,永远对不准,会发生什么???
例子:
“一发一收”穿墙雷达的PLL输出,设置为120MHz,30MHz,20MHz,12MHz。这些频率之间都是有最小公倍数的,即意味着在某一时刻,他们能够满足相位对准。通常我们在进行时钟设计的时候,PLL的输出频率不要完全互质,导致时钟需要很长的周期才能对准。
思考时钟设计背后的意义。
关于时钟树的应用:
上图是穿墙雷达,AD时钟输入的前端子的原语描述时钟的RTL级网表。网表结构显示,锁相环产生的时钟,如果直接通过IO端连接到AD芯片的时钟输入端,需要引入一个ODDR模块,而这个模块的作用即保证了建立IO时钟的时钟树,这与上文中的描述是一致的。
以上是关于fpga外部输入一组lvds时钟,然后使用pll_adv分频,实现设计时报错的主要内容,如果未能解决你的问题,请参考以下文章