Verilog中的FSM状态发生了变化

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)

too*_*lic 7

always像您这样的顺序逻辑块中,最好使用非阻塞赋值(<=)而不是阻塞赋值(=).模拟将更好地代表实际产生的逻辑.

在纯RTL Verilog代码中,如果对所有顺序逻辑使用非阻塞分配,则没有理由使用#1延迟.

我也看到其他人使用#像这样的延迟.有时,这是由于在同一模拟中混合RTL和门网表.其他时候,它是为了弥补不良的建模.如果可以,您应该避免使用RTL代码中的延迟.

另请参阅: Verilog综合中的非阻塞分配,杀死的编码样式!

此外,最好使用a parameter来命名每个州.如果命名一个州IDLE而不是命名,则更有意义2'b10.