从下面提到的那个中,哪个是更好的设计verilog中的计数器的方法?

时间:2014-04-29 06:10:59

标签: verilog synthesis

我已宣布8位寄存器变量 count

reg [7:0]count=0;

计数应该从 8'h00 增加到 8'hFF &回到8'h00&再增加等。
下面我提供了2种方法

always @(posedge Clk)  
   begin  
      if(count==8'hFF)  
         count<=8'h0;  
      else  
         count<=count+1;  
   end 

OR

always @(posedge Clk)  
   begin  
     count<=count+1;  
   end

在第一种情况下,计数将从00变为FF&amp; 00到FF再次&amp;再次,
在第二种情况下,计数将从00变为FF然后溢出到00并带有进位和放大器。再次增加到FF&amp;再次。

这会影响到什么吗?怎么样?哪种方法合成更好?

2 个答案:

答案 0 :(得分:2)

任何一种方法都可行。最好的结果取决于您的合成工具的智能/转储方式。有些工具在发现溢出时会发出警告。如果要解决警告,可以使用以下方法:

reg [7:0] count = 0;
wire [8:0] next_count = count + 1'b1; // MSB is overflow bit
always @(posedge Clk)
  count <= next_count[7:0]; // overflow bit not used in assignment

溢出位可以在同步块中完成。除非你打算使用溢出位,否则我不会推荐这些,因为它会浪费一个翻牌(哑合成器)或发出翻牌已经优化的警告(智能合成器)。

reg [7:0] count = 0;
reg overflow;
always @(posedge Clk)
  {overflow,count} <= count + 1'b1; // optimization warning OR wasted flop

答案 1 :(得分:1)

根据IEEE Std 1364™-2005

  

两个16位值的算术加法是否应使用16位执行评估,或者评估是否应使用17位以允许可能的进位溢出?答案取决于被建模的设备类型以及该设备是否处理溢出。 Verilog HDL使用操作数的位长来确定在计算表达式时要使用的位数。比特长度规则在5.4.1中给出。在加法运算符的情况下,应使用最大操作数的位长度,包括赋值的左侧。

他们给出了一个我认为适用于这种情况的例子:

reg[15:0] a, b; // 16-bit regs
reg[15:0] sumA; // 16-bit reg
reg[16:0] sumB; // 17-bit reg
sumA = a + b; // expression evaluates using 16 bits
sumB = a + b; // expression evaluates using 17 bits

所以,希望它不会影响合成,并且比之前的更好。