微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > 关于 250M 比较器,计数器一个问题

关于 250M 比较器,计数器一个问题

时间:10-02 整理:3721RD 点击:
一下是看了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方式,或者只比较一位的方式。







Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top