atom100 发表于 2015-9-3 06:53:42

分频的时钟信号能否作为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)模块的 驱动时钟 ?
或者是否有其他好的解决办法 ?

596142041 发表于 2015-9-3 07:32:19

我在别人写的代码里面见过这样用的

atom100 发表于 2015-9-3 08:17:20

pl的倍频分频不合适,能这样用吗 ?感觉 有点问题

prow 发表于 2015-9-3 08:42:34

性能不如pll好吧
pll走的是全局时钟网络没有延时,用计数器分出来的时钟会有延时

FPGA_WALKER 发表于 2015-9-3 09:06:03

不建议,这种类型的计数器类似于行波计数器,属异步时序设计范畴。

lqluocn 发表于 2015-9-3 09:55:24

简单的应用也行,但在稍复杂的工程中,就会出现问题。一般不建议这样用。

735953120@qq.co 发表于 2015-9-3 19:17:48

可以的,但是不建议你这么做因为你这样做你的工程会是在多个时钟域下面,形成成跨时钟域

wwuchang 发表于 2015-9-3 22:12:27

完了,我这么做了好多个工程啊。。需要100k的时钟,难道也必须要pll吗?

xiaocat85 发表于 2015-9-3 22:52:03

在ASIC设计里面可以这样做,只要在约束时表明generated clock;在FPGA里面应该也是没问题,在clock约束部分要说明;另外,这种四分频的话,是属于同步时钟,但是如果有数据要跨时钟域,就要用FIFO之类的做隔离,或者做延时等等

zhangyidao 发表于 2015-9-3 22:57:45

既然你上来问了,就不建议你这样用。见过很多大厂家的asic这样用的。要约束好,不然会出问题。

lanliang714 发表于 2015-9-4 12:07:17

可以把分频获得的 clk_25m用作使能信号,时钟还是用100m

kongethan 发表于 2015-9-7 09:51:57

可以用的,已经在项目中验证,的确可能存在跨时钟域问题

dr2001 发表于 2015-9-7 10:06:46

本帖最后由 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:53:46

本帖最后由 jm2011 于 2015-9-7 14:54 编辑

kongethan 发表于 2015-9-7 09:51
可以用的,已经在项目中验证,的确可能存在跨时钟域问题

点击错了,看下一个回复;

jm2011 发表于 2015-9-7 14:54:32

lanliang714 发表于 2015-9-4 12:07
可以把分频获得的 clk_25m用作使能信号,时钟还是用100m

基本原理,标准做法,赞一个;

否则就用PLL吧;

atom100 发表于 2015-9-8 00:16:34

xiaocat85 发表于 2015-9-3 22:52
在ASIC设计里面可以这样做,只要在约束时表明generated clock;在FPGA里面应该也是没问题,在clock约束部分 ...

“在FPGA里面应该也是没问题,在clock约束部分要说明;”
请教:使用generate clock来表明这是个 时钟就可以了吧 ?

dykwai1 发表于 2015-9-8 08:41:03

绝大多数应用都是没问题的,但是必须做好声明和约束,另外要注意跨时钟域处理

把分频获得的 clk_25m用作使能信号,时钟还是用100m      是更标准的做法

tjuspring001 发表于 2015-9-8 13:22:57

不建议使用,因为分频时钟的延迟会产生奇奇怪怪的问题。越复杂的设计,出问题的概率越大。我认为加时钟约束不是最好的办法,因为这样加大了工作量,同时也引入了问题点。最好的办法还是pll,如果情况特殊可以另当别论

xiaocat85 发表于 2015-9-8 23:31:24

atom100 发表于 2015-9-8 00:16
“在FPGA里面应该也是没问题,在clock约束部分要说明;”
请教:使用generate clock来表明这是个 时钟   ...

是的,在Quartus里面可以直接用SDC约束

atom100 发表于 2015-9-9 04:48:18

dykwai1 发表于 2015-9-8 08:41
绝大多数应用都是没问题的,但是必须做好声明和约束,另外要注意跨时钟域处理

把分频获得的 clk_25m用作使 ...

请教,clk_25m做使能信号?是做一个寄存器的使能信号?没理解

dykwai1 发表于 2015-9-9 10:01:22

以100m为时钟,每一个上升沿,判断clk25信号的状态高低,找到clk25的边沿

yngufeng 发表于 2015-9-9 10:15:54

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

wenhao0217 发表于 2015-9-9 16:03:39

当然是可以的啊

gxh470873852 发表于 2015-9-15 15:45:24

可以的,但尽量少用敏感信号

aegean2000 发表于 2015-9-15 17:15:43

这种信号少的话,也是可以使用的,综合的时候也会到时钟网络上去,不用担心
页: [1]
查看完整版本: 分频的时钟信号能否作为always的时钟?