分频的时钟信号能否作为always的时钟?
本帖最后由 atom100 于 2015-9-3 06:57 编辑请教,使用xilinx 的xc6slx ,输入了一个10mhz的时钟,通过pll得到了一个100mhz的时钟,此时想再得到一个25mhz的时钟,但因为参数的关系,不能通过fpga的pll获得,而是只能通过
reg cnt;
reg clk_25m;
always@(posedge clk100mhz or negedge rst_n)
if(!rst_n)
cnt <= 2'd0;
else
cnt <= cnt+ 2'd1;
always@(posedge clk100mhz or negedge rst_n)
if(!rst_n)
clk_25m <= 1'b0;
elseif(cnt == 2'd0)
clk_25m <= ~clk_25m ;
下面通过分频获得的 clk_25m是否 可以作为另外一个always@(posedge clk_25m or negedge rst_n)模块的 驱动时钟 ?
或者是否有其他好的解决办法 ? 我在别人写的代码里面见过这样用的 pl的倍频分频不合适,能这样用吗 ?感觉 有点问题 性能不如pll好吧
pll走的是全局时钟网络没有延时,用计数器分出来的时钟会有延时 不建议,这种类型的计数器类似于行波计数器,属异步时序设计范畴。 简单的应用也行,但在稍复杂的工程中,就会出现问题。一般不建议这样用。 可以的,但是不建议你这么做因为你这样做你的工程会是在多个时钟域下面,形成成跨时钟域 完了,我这么做了好多个工程啊。。需要100k的时钟,难道也必须要pll吗? 在ASIC设计里面可以这样做,只要在约束时表明generated clock;在FPGA里面应该也是没问题,在clock约束部分要说明;另外,这种四分频的话,是属于同步时钟,但是如果有数据要跨时钟域,就要用FIFO之类的做隔离,或者做延时等等 既然你上来问了,就不建议你这样用。见过很多大厂家的asic这样用的。要约束好,不然会出问题。 可以把分频获得的 clk_25m用作使能信号,时钟还是用100m 可以用的,已经在项目中验证,的确可能存在跨时钟域问题 本帖最后由 dr2001 于 2015-9-7 10:23 编辑
具体看所实现逻辑的需求。
在FPGA内,最常见的方法是CKE做Gating。即低速逻辑依然用100M CLK驱动,但是用低占空比的CKE把实际工作频率拉下来。
这么干的缺点是默认情况下,布局布线还是按照100M来的;REG-REG延迟大的话(比如用到复杂组合逻辑),又没有正确给出时序约束,静态时序检查可能不过。
好处就是没跨时钟域的问题。
如果能正确加约束,这个对于新的FPGA来说,似乎是首选。(新的FPGA一般CKE可以上全局线;老版本的FPGA不一定支持这个功能。)
分频获得的时钟是组合逻辑时钟,可以用于驱动REG,这点没问题。如果需要把这个时钟馈给全局时钟线,可能需要例化全局时钟的Buffer或者给出相关的约束。
这个的好处是实打实的时钟频率低了,容易给约束;而且布局布线都按照低频时钟来的,容易过。
缺点是时钟的Jitter会比较大,不一定满足设计的要求;此外就是时钟网络中的时钟和原始时钟没有非常严格的相位关系,一般来说要多CDC的处理。
(其实相位关系是相对稳定的,但是FF和布线延迟带来的Jitter大,不一定需要CDC。) 本帖最后由 jm2011 于 2015-9-7 14:54 编辑
kongethan 发表于 2015-9-7 09:51
可以用的,已经在项目中验证,的确可能存在跨时钟域问题
点击错了,看下一个回复; lanliang714 发表于 2015-9-4 12:07
可以把分频获得的 clk_25m用作使能信号,时钟还是用100m
基本原理,标准做法,赞一个;
否则就用PLL吧; xiaocat85 发表于 2015-9-3 22:52
在ASIC设计里面可以这样做,只要在约束时表明generated clock;在FPGA里面应该也是没问题,在clock约束部分 ...
“在FPGA里面应该也是没问题,在clock约束部分要说明;”
请教:使用generate clock来表明这是个 时钟就可以了吧 ? 绝大多数应用都是没问题的,但是必须做好声明和约束,另外要注意跨时钟域处理
把分频获得的 clk_25m用作使能信号,时钟还是用100m 是更标准的做法 不建议使用,因为分频时钟的延迟会产生奇奇怪怪的问题。越复杂的设计,出问题的概率越大。我认为加时钟约束不是最好的办法,因为这样加大了工作量,同时也引入了问题点。最好的办法还是pll,如果情况特殊可以另当别论 atom100 发表于 2015-9-8 00:16
“在FPGA里面应该也是没问题,在clock约束部分要说明;”
请教:使用generate clock来表明这是个 时钟 ...
是的,在Quartus里面可以直接用SDC约束 dykwai1 发表于 2015-9-8 08:41
绝大多数应用都是没问题的,但是必须做好声明和约束,另外要注意跨时钟域处理
把分频获得的 clk_25m用作使 ...
请教,clk_25m做使能信号?是做一个寄存器的使能信号?没理解 以100m为时钟,每一个上升沿,判断clk25信号的状态高低,找到clk25的边沿 always@(posedge system_clk)
begin
clk_buf <= divider_clk;
end
always@(posedge system_clk)
begin
if(!clk_buf && divider_clk)//detected the rise edge of divider clk
begin
****
end
else
begin
****
end
end 当然是可以的啊 可以的,但尽量少用敏感信号 这种信号少的话,也是可以使用的,综合的时候也会到时钟网络上去,不用担心
页:
[1]