shiyinjita的个人空间 https://blog.eetop.cn/239461 [收藏] [复制] [分享] [RSS]

空间首页 动态 记录 日志 相册 主题 分享 留言板 个人资料

日志

2天的时序调试体验(计数器和比较器)

已有 1281 次阅读| 2011-11-16 17:59 |个人分类:quartus

最近在调试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方式,或者只比较一位的方式。

                                                                       2011-11-16  shiyinjita

点赞

发表评论 评论 (1 个评论)

回复 emlair 2011-11-20 15:34
大师傅,cool

facelist

您需要登录后才可以评论 登录 | 注册

  • 关注TA
  • 加好友
  • 联系TA
  • 0

    周排名
  • 0

    月排名
  • 0

    总排名
  • 0

    关注
  • 1

    粉丝
  • 2

    好友
  • 1

    获赞
  • 29

    评论
  • 2809

    访问数
关闭

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

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

GMT+8, 2024-4-26 06:39 , Processed in 0.016349 second(s), 8 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
返回顶部