从下面提到的方法中,在verilog中设计上行计数器的更好方法是什么?

从下面提到的方法中,在verilog中设计上行计数器的更好方法是什么?,verilog,synthesis,Verilog,Synthesis,我声明了一个8位寄存器变量count reg [7:0]count=0; 计数应从8'h00增加到8'hFF,并返回到8'h00,再次增加,依此类推。 下面我提供了两种方法 always @(posedge Clk) begin if(count==8'hFF) count<=8'h0; else count<=count+1; end 始终@(posedge Clk) 开始 如果(

我声明了一个8位寄存器变量count

reg [7:0]count=0;
计数应从8'h00增加到8'hFF,并返回到8'h00,再次增加,依此类推。
下面我提供了两种方法

always @(posedge Clk)  
   begin  
      if(count==8'hFF)  
         count<=8'h0;  
      else  
         count<=count+1;  
   end 
始终@(posedge Clk)
开始
如果(计数=8'hFF)

根据IEEE标准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

因此,希望它不会影响合成,并且比以前的方法更好。

两种方法都可以。最佳结果取决于合成工具的智能/转储程度。某些工具在发现可能出现溢出时发出警告。如果要解决警告,可以使用以下方法:

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]计数=0;
导线[8:0]下一个计数=计数+1'b1;//MSB是溢出位
始终@(posedge Clk)

我的猜测是,
count该代码是更大代码的一部分。我使用的是Dsp48&all。那么,计数进位溢出会影响代码的其他部分吗?我只是在这里猜测:不会。计数只有8位,而且您在代码中没有提到进位,因此它不会连接到任何东西。
count@Moberg,不同的工具或多或少都很挑剔。我使用过一些工具,当溢出没有被显式处理时,它们会给出警告,我更喜欢将警告列表尽可能短。是的,我理解工具不同,这就是为什么我提到这是XST的行为。但是,是的,我同意远离这些警告。因此,在切换工具或工具更改时,最好始终显式处理溢出。
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