Kraklog
FSM - Moore, Mealy 본문
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 |