Kraklog

FSM - Moore, Mealy 본문

Study/VerilogHDL

FSM - Moore, Mealy

Krakens 2023. 11. 16. 14:05
728x90
// Moore State Machine Module
module MooreStateMachine(
  input clk,        // Clock
  input reset,      // Reset signal
  output reg moore_output  // Output signal for Moore machine
);

// Define states
parameter S0 = 2'b00;
parameter S1 = 2'b01;

// State register
reg [1:0] state;

// Output assignment (Moore machine)
always @(posedge clk or posedge reset) begin
  if (reset) begin
    state <= S0;  // Initialize to the first state on reset
  end else begin
    // State transitions
    case (state)
      S0: state <= S1;  // Transition from S0 to S1
      S1: state <= S0;  // Transition from S1 to S0
      default: state <= S0;  // Default to S0
    endcase
  end
end

// Output assignment (Moore machine)
always @(posedge clk or posedge reset) begin
  case (state)
    S0: moore_output <= 1'b0;  // Output 0 in state S0
    S1: moore_output <= 1'b1;  // Output 1 in state S1
    default: moore_output <= 1'b0;  // Default to 0
  endcase
end

endmodule​

위의 코드에서는 S0 S1이라는 두 가지 상태를 갖는 간단한 스테이트머신을 정의하였습니다. state 레지스터는 현재의 상태를 나타내며, clk 신호의 상승 에지에서 상태가 변경됩니다. reset 신호가 활성화되면 초기 상태로 돌아갑니다


무어(Moore) 머신과 밀리(Mealy) 머신은 스테이트머신의 상태 전이와 출력 동작 방식에 차이가 있습니다. 무어 머신은 각 상태에서의 출력만 고려하며, 밀리 머신은 현재 상태와 입력을 고려하여 출력을 생성합니다. 아래에 각각의 예제를 제시하겠습니다.

// State Machine Module
module StateMachine(
  input clk,        // Clock
  input reset,      // Reset signal
  output reg [1:0] state  // 2-bit state register
);

// Define states
parameter S0 = 2'b00;
parameter S1 = 2'b01;

// State register
always @(posedge clk or posedge reset) begin
  if (reset) begin
    state <= S0;  // Initialize to the first state on reset
  end else begin
    // State transitions
    case (state)
      S0: state <= S1;  // Transition from S0 to S1
      S1: state <= S0;  // Transition from S1 to S0
      default: state <= S0;  // Default to S0
    endcase
  end
end

endmodule

 

// Mealy State Machine Module
module MealyStateMachine(
  input clk,        // Clock
  input reset,      // Reset signal
  input x,          // Input signal for Mealy machine
  output reg mealy_output  // Output signal for Mealy machine
);

// Define states
parameter S0 = 2'b00;
parameter S1 = 2'b01;

// State register
reg [1:0] state;

// Output assignment (Mealy machine)
always @(posedge clk or posedge reset) begin
  if (reset) begin
    state <= S0;  // Initialize to the first state on reset
  end else begin
    // State transitions
    case (state)
      S0: state <= S1;  // Transition from S0 to S1
      S1: state <= S0;  // Transition from S1 to S0
      default: state <= S0;  // Default to S0
    endcase
  end
end

// Output assignment (Mealy machine)
always @(posedge clk or posedge reset) begin
  case (state)
    S0: mealy_output <= x;  // Output is equal to input in state S0
    S1: mealy_output <= ~x; // Output is complement of input in state S1
    default: mealy_output <= 1'b0;  // Default to 0
  endcase
end

endmodule

두 코드에서 주목해야 할 점은 Mealy 머신에서 출력이 입력 x에 따라 변하는 것입니다. 이에 반해 Moore 머신은 현재 상태만을 기반으로 출력을 생성합니다.

 
 
 
728x90

'Study > VerilogHDL' 카테고리의 다른 글

[Verilog] LED shift  (0) 2023.12.16
[Study] 디지털 시계 설계  (0) 2023.12.09
[Study] 기타회로 설계 [진행중]  (0) 2023.09.02
[Study] 순차논리회로 설계 [진행중]  (0) 2023.09.02
[Study] 디지털 논리 회로 설계  (2) 2023.09.02