always @(state)
begin
case (state)
zero:
rowcounter = 1'b0;
one:
rowcounter = 1'b0;
two:
rowcounter = rowcounter + 1'b0;
three:
rowcounter = rowcounter + 1'b1;
default:
rowcounter = 1'b0;
endcase
end
基本上,当state = 2时,我想要' rowcounter'保持其当前值,而如果state = 3,我想要' rowcounter'增量。
我在合成所述代码时遇到问题,它说有推断的锁存器。我跟踪了闩锁,它们位于状态为2' 2时。或者' 3'。即使我已经设置了' rowcounter'的初始值。如下所示为零
initial
begin
rowcounter <= 1'b0;
end
它仍然推断锁存器。有哪些替代方案可以移除锁存器?
答案 0 :(得分:3)
组合块(always @*
)将在它们保持状态时推断锁存器。组合逻辑的输出通常由当前输入完全定义。
在数字逻辑中,只有锁存器和触发器可以保持状态。由于你没有定义一个触发器,你有一个锁存器。
使用always @(posedge clk)
推断触发器,您还应该使用非阻止分配<=
。
always @(posedge clk) begin
case (state)
zero: rowcounter <= 1'b0;
one: rowcounter <= 1'b0;
two: rowcounter <= rowcounter + 1'b0;
three: rowcounter <= rowcounter + 1'b1;
default: rowcounter <= 1'b0;
endcase
end