我已宣布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;再次。
这会影响到什么吗?怎么样?哪种方法合成更好?
答案 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
所以,希望它不会影响合成,并且比之前的更好。