nod*_*nja 0 verilog state-machine fsm
我已经看到以下用于在Verilog模块中进行状态更改:
state <= 2'b10;
state <= #1 IDLE;
为什么<=使用而不仅仅是=?使用#1的目的是什么?这有什么不同吗?
以下是FSM的一些Verilog代码,显示了第一个正在使用的代码.如果用第二个替换它会不会一样?
module fsm( clk, rst, inp, outp);
input clk, rst, inp;
output outp;
reg [1:0] state;
reg outp;
always @( posedge clk, posedge rst )
begin
if( rst )
state <= 2'b00;
else
begin
case( state )
2'b00:
begin
if( inp ) state <= 2'b01;
else state <= 2'b10;
end
2'b01:
begin
if( inp ) state <= 2'b11;
else state <= 2'b10;
end
2'b10:
begin
if( inp ) state <= 2'b01;
else state <= 2'b11;
end
2'b11:
begin
if( inp ) state <= 2'b01;
else state <= 2'b10;
end
endcase
end
end
Run Code Online (Sandbox Code Playgroud)
在always像您这样的顺序逻辑块中,最好使用非阻塞赋值(<=)而不是阻塞赋值(=).模拟将更好地代表实际产生的逻辑.
在纯RTL Verilog代码中,如果对所有顺序逻辑使用非阻塞分配,则没有理由使用#1延迟.
我也看到其他人使用#像这样的延迟.有时,这是由于在同一模拟中混合RTL和门网表.其他时候,它是为了弥补不良的建模.如果可以,您应该避免使用RTL代码中的延迟.
另请参阅: Verilog综合中的非阻塞分配,杀死的编码样式!
此外,最好使用a parameter来命名每个州.如果命名一个州IDLE而不是命名,则更有意义2'b10.