FSM 条件计数器

FSM Conditional counter

我想在 Verilog 中实现以下条件 fsm:

对于这个 fsm,我只为第一个状态编写了以下规范,但不知道如何移动到具有以下规范的下一个状态,其中下一个状态取决于 MOVE 输入:

 module Peer (CLK, RESET, MOVE, STATE);
input CLK, RESET, MOVE;
output [2:0] STATE; 
reg [2:0] STATE;

parameter  HoD's_Office = 3'b000, Lab_1 = 3'001, Lab_2 = 3'b010,
       Lab_3 = 3'b011, Main_Office = 3'b100, Dean's_Office = 3'b101,
       Registrar's_Office = 3'b110, VC's_Office = 3'b111;

 
 always @ (posedge CLK)
 begin 
    if(RESET)
    STATE = HoD's_Office;
    else if(~MOVE)
    STATE = HoD's_Office;
    else
    STATE = Lab_1;
 end    

将 FSM 分成 2 个 always 块是一种常见的良好做法:

  • 1 表示当前状态(时序逻辑)
  • 1 代表下一个状态(组合逻辑)

对于下一个状态逻辑,使用case语句。我按照您的要求展示了前 2 个状态,其余状态应该很简单。

module Peer (CLK, RESET, MOVE, STATE);
input CLK, RESET, MOVE;
output [2:0] STATE; 
reg    [2:0] STATE;
reg    [2:0] next_state;

parameter
    HoDs_Office         = 3'b000,
    Lab_1               = 3'b001,
    Lab_2               = 3'b010,
    Lab_3               = 3'b011,
    Main_Office         = 3'b100,
    Deans_Office        = 3'b101,
    Registrars_Office   = 3'b110,
    VCs_Office          = 3'b111
;

always @ (posedge CLK) begin 
    if (RESET) begin
        STATE <= HoDs_Office;
    end else begin
        STATE <= next_state;
    end
end    

always @* begin
    case (STATE)
        HoDs_Office : next_state = (MOVE) ? Lab_1       : HoDs_Office;
        Lab_1       : next_state = (MOVE) ? Main_Office : Lab_1;
        // etc.
    endcase
end    

endmodule

我更改了您的一些 parameter 名字;在 Verilog 标识符中使用单引号是非法的。