在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 2205|回复: 0

[求助] 关于 250M 比较器,计数器一个问题

[复制链接]
发表于 2012-7-5 09:28:28 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
一下是看了shiyinjita 的博客,提出自己的小疑问
关于这个程序计数器的分段,是不是因为片上资源不够,所以要手动修改.v 文件,
倘若片上的逻辑资源充足,编写适当的.sdc 文件,系统应该可以自动适配,自动切割组合逻辑。
我经常用32位计数器,跑100M,没问题
250M,很少,所以借此机会,大胆发问,望指点,交流






最近在调试250M的时序的时候,发现有段关键路径怎么调试也调试不成功,其中关键路径
中有比较器和计数器,
  以前采用如下方式写的
  
     module counter(
              input clk ,clr ,
            input [31:0] cin ,
           output  wire cout
      ) ;
reg [31:0]cnt ;
always @(posedge clk or posedge clr)
   begin
   if (clr)
    cnt <= 32'b0 ;
else if (cnt == cin )
   cnt <= 32'b0 ;
else
  cnt <= cnt + 1'b1  ;
  end
后来调试时候发现是比较器占用的时间很长,也就是DFF中的置位端很长,导致了DFF产生
了亚域态,因此采用一下方式来写 ;
      module counter(
              input clk ,clr ,
            input [31:0] cin ,
           output  wire cout
      ) ;
reg [31:0]cnt ;
reg com_cnt ;
always @(posedge clk)
  if (cnt == cin )
   com_cnt <= 1'b1 ;
else
com_cnt <= 1'b0 ;
   
always @(posedge clk or posedge clr)
   begin
   if (clr)
    cnt [7:0]<= 8'b0 ;
else if (com_cnt )
   cnt [7:0]<= 8'b0 ;
else
  cnt [7:0]<= cnt [7:0]+ 1'b1  ;
  end
always @(posedge clk or posedge clr)
   begin
   if (clr)
    cnt [31:8]<= 24'b0 ;
else if (com_cnt )
   cnt [31:8]<= 24'b0 ;
else if (cnt[7:0] == 8'b1111_1111)
  cnt [31:8]<= cnt [31:8]+ 1'b1  ;
  end
endmodule
此时问题解决
因此总结如下 :
在写计数器的时候,当频率比较高的时候,可采用
小 + 大的方式
比较器可采用单独比较,然后加一个DFF方式,或者只比较一位的方式。















您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /1 下一条

×

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-3-29 03:04 , Processed in 0.027292 second(s), 10 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表