zxq6 发表于 2015-4-20 11:24:23

verilog 如何切割长计数器?

本帖最后由 zxq6 于 2015-4-20 11:33 编辑

有个设计,需要用到64bit的计数器,直接定义64bit长度,感觉Fmax达不到要求。
想切割为32+24+8,但是问题也来了。
当8bit计数超过255的时候,会翻转,这个时候如何触发24bit的计数器+1?
我定义了一个寄存器来进行“信号”通知,会出现警告,如:
Warning (332060): Node: sig_notice was determined to be a clock but was found without an associated clock assignment.
也就是说,这个“通知”的线,被认为是个时钟,但是没有发现相关的约束。
奇怪的是,timequest里面,貌似也找不到这条线。

而且最终发现,通过这种方式切割的计数器,跟直接定义64bit的差不了多少。(这个是重点)

也尝试过在8bit计数器的第7bit从1变为0的时候,触发24bit的计数器,结果也跟直接定义为64bit的差不多。

那么,请问下各位大虾,切割计数器的思路是怎么样的?谢谢!

y595906642 发表于 2015-4-20 11:36:50

为什么不能直接定义64bit counter?

chenchaoting 发表于 2015-4-20 11:45:06

用自带的IP核试试64bit看看Fmax能否达到要求

辰星和月 发表于 2015-4-20 11:50:10

如果担心Fmax的话,用Logic Lock约束一下试试。也可能是楼主的切割计数器被优化了,导致仍然好像直接定义64bit一样。

zxq6 发表于 2015-4-20 11:51:24

chenchaoting 发表于 2015-4-20 11:45
用自带的IP核试试64bit看看Fmax能否达到要求

方不方便告诉我一下ip名称?

zkf0100007 发表于 2015-4-20 12:19:46

分开的几个计数器都用同一个时钟,低位进位作为高位计数的使能,保持一个周期

agilityChen 发表于 2015-4-20 12:20:09

always @(posedge clk) cnt8 <= cnt8 - 1;
assign clk1 = (cnt8 == 0);

always @(posedge clk) if(clk1) cnt24 <= cnt24 - 1;
assign clk2 = clk1 & (cnt24 == 0);

always @(posedge clk) if(clk2) cnt32 <= cnt32 - 1;
assign cnt_ovf = clk2 & (cnt32 == 0);

dr2001 发表于 2015-4-20 12:28:24

对Fmax的要求有多高?用IP或者加约束试试看先。

拆的话,用低位计数器的进位信号做高位计数器的CLK EN即可。

chenchaoting 发表于 2015-4-20 12:36:14

Arithmetic 下面的LPM Counter

NJ8888 发表于 2015-4-20 19:39:55

不理解,同步计数器也能用64位啊,异步级联的确实输出各端翻转有滞后问题导致高速使用并行输出会错误

agilityChen 发表于 2015-4-20 21:03:22

NJ8888 发表于 2015-4-20 19:39
不理解,同步计数器也能用64位啊,异步级联的确实输出各端翻转有滞后问题导致高速使用并行输出会错误 ...

64位加法器时延导致fmax不够啊

NJ8888 发表于 2015-4-21 19:16:43

agilityChen 发表于 2015-4-20 21:03
64位加法器时延导致fmax不够啊

楼主说的计数器,不是加法器啊

agilityChen 发表于 2015-4-21 21:13:23

NJ8888 发表于 2015-4-21 19:16
楼主说的计数器,不是加法器啊

计数器不就是个加1的加法器么

NJ8888 发表于 2015-4-21 21:15:23

agilityChen 发表于 2015-4-21 21:13
计数器不就是个加1的加法器么

加法器--组合逻辑,计数器由触发器构成的时序逻辑,差别大的很
页: [1]
查看完整版本: verilog 如何切割长计数器?