如何实现Verilog FSM的时延

时间:2016-05-06 16:53:11

标签: time verilog delay fsm state-machine

always @(posedge clock)
    case(state)
        `STATE0: begin
            state <= `STATE1;
            // Code here
            // Wait 5ms before advancing 
        end
        `STATE1: begin 
            state <= `STATE2;
            // Code here
            // Wait 5ns before advancing 
        end
        `STATE2: begin 
            state <= `STATE0;
            // Code here
            // Wait 5s before advancing 
        end
        default:begin
            state <= `STATE0;
            // Code here
        end
    endcase
end

是否可以将等待语句添加到设计中,它必须等待x个时间单位才能进入下一个状态? 我知道它可以使用#在我的测试平台中手动完成,但我的设计要求在我继续之前需要一定的等待时间。

1 个答案:

答案 0 :(得分:2)

对于短暂的延迟(几个时钟周期),最简单的方法是将几个“虚拟”状态作为预期状态之间的中介来实现。

对于更长的延迟,使用计数器作为启用信号在状态之间传输:

reg [31:0] count;
always@(posedge clock)
    if (SOME RESET) count <=0;
    else count <= count + 1;

always @(posedge clock)
//...
   STATE_N: if (count == SOME_NUMBER_OF_CYCLES) state <= STATE_NPLUSONE;
            else state <= STATE_N;