blogernice

导航

计数器极限高速问题

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

posted on 2018-10-26 15:51  blogernice  阅读(150)  评论(0)    收藏  举报