Verilog 如何在FSM状态下设置可合成延迟

Verilog 如何在FSM状态下设置可合成延迟,verilog,Verilog,在移动到另一个状态之前,涉及要执行的特定延迟的FSM代码如下所示: module INIT_FSM(sys_DLY_100US,sys_CLK,sys_INIT_DONE,iState,sys_RESET); input sys_DLY_100US; input sys_CLK; inout sys_INIT_DONE; output [4:0] iState; input sys_RESET; wire sys_DLY_100US,sys_CLK; reg [4:0] iState; wi

在移动到另一个状态之前,涉及要执行的特定延迟的FSM代码如下所示:

module INIT_FSM(sys_DLY_100US,sys_CLK,sys_INIT_DONE,iState,sys_RESET);

input sys_DLY_100US;
input sys_CLK;
inout sys_INIT_DONE;
output [4:0] iState;
input sys_RESET;

wire sys_DLY_100US,sys_CLK;
reg [4:0] iState;
wire sys_INIT_DONE; 
reg [4:0] NextState;

parameter i_NOP=5'b00000;
parameter i_PRE=5'b00001;
parameter i_tRP=5'b00010;
parameter i_AR1=5'b00011;
parameter i_tRFC1=5'b00100;
parameter i_AR2=5'b00101;
parameter i_tRFC2=5'b00110;
parameter i_MRS=5'b00111;
parameter i_tMRD=5'b01000;
parameter i_ready=5'b01001;


assign sys_INIT_DONE =(iState==5'b01001) ? 1'b1 : 1'bz;

always @(*)
begin
    NextState=iState;


    case (iState)

       5'b00000:
       begin
           if(sys_DLY_100US==1'b1)
           begin
               NextState=i_PRE;
           #10;
           end
       end

       5'b00001:
       begin
           NextState=i_AR1;
           #10;
       end

       5'b00011:
       begin
           NextState=i_AR2;
           #10;
       end

       5'b00101:
       begin
           NextState=i_MRS;
           #10;
       end

       5'b00111: NextState=i_ready;

       5'b01001:sys_INIT_DONE=1;
    endcase
end

always @(posedge sys_CLK or posedge sys_RESET)
    if(sys_RESET) iState <=i_NOP;
    else          iState <=NextState;
endmodule

这里不是代码中提到的每个状态下都有10个延迟,而是我如何通过另一种方法添加延迟以使其可合成?

延迟是不可合成的

如果你想在硬件中做一些与时间相关的事情,你必须使用计数器来计算你的时钟周期


比较您状态中的计数值,更改状态并在达到延迟时重置计数器。

您真的希望在移动到下一个状态后出现延迟,还是说延迟一段时间并跳到下一个状态?这里我希望fsm处于某个预定义延迟的特定状态,然后移动到下一个状态