目录
HDLBits 刷题来到了最为重要的一部分---有限状态机,都说 Verilog 设计的精髓就是状态机的设计,可见状态机设计的重要性,通过三十多道的状态机的练习,可以更加熟悉状态机设计的要点,通常都设计为三段式,这样设计的状态机层次清晰且易于设计,时序上更为易懂。以下的解题方法不一定为最佳解决方案,有更好的方法欢迎提出,共同学习,共同进步!
设计一个摩尔状态机,具有两种状态,一种输入和一种输出。实现此状态机。请注意,重置状态为 B。使用异步重置。

- module top_module(
- input clk,
- input areset, // Asynchronous reset to state B
- input in,
- output out
- );
- //状态申明
- parameter A = 0;
- parameter B = 1;
- reg state;
- reg next_state;
-
- //状态机第一段,起始状态
- always @(posedge clk or posedge areset) begin
- if (areset) begin
- state <= B;
- end
- else begin
- state <= next_state;
- end
- end
-
- //状态机第二段,状态的跳转
- always @(*) begin
- next_state = state;
- case(state)
- B:
- case(in)
- 0 : next_state = A;
- 1 : next_state = B;
- endcase
- A :
- case(in)
- 0 : next_state = B;
- 1 : next_state = A;
- endcase
- default:
- next_state = B;
- endcase
- end
- //状态机第三段,在每个状态的输出
- assign out = (state == B);
-
- endmodule
一个摩尔状态机,具有两种状态,一种输入和一种输出。实现此状态机。请注意,重置状态为 B。使用同步复位。

- module top_module(clk, reset, in, out);
- input clk;
- input reset; // Synchronous reset to state B
- input in;
- output out;
-
- parameter A = 0;
- parameter B = 1;
-
- reg out;
- reg present_state;
- reg next_state;
-
- //状态机第一段,初始状态,非阻塞逻辑
- always @(posedge clk) begin
- if (reset) begin
- present_state <= B;
- end
- else begin
- present_state <= next_state;
- end
- end
-
- //状态机第二段,状态转移,阻塞赋值
- always @(*) begin
- next_state = present_state;
- case(present_state)
- B:
- case(in)
- 1: next_state = B;
- 0: next_state = A;
- endcase
- A:
- case(in)
- 1: next_state = A;
- 0: next_state = B;
- endcase
- endcase
- end
-
- //状态机第三段,状态输出
- assign out = (present_state==B);
-
- endmodule
这是一个摩尔状态机,有两个状态,两个输入和一个输出。实现此状态机。使用异步重置。

- module top_module(
- input clk,
- input areset, // Asynchronous areset to OFF
- input j,
- input k,
- output out
- );
-
- parameter OFF = 0;
- parameter ON = 1;
-
- reg state;
- reg next_state;
-
- //状态机第一段,初始状态,非阻塞逻辑
- always @(posedge clk or posedge areset) begin
- if (areset) begin
- state <= OFF;
- end
- else begin
- state <= next_state;
- end
- end
-
- //状态机第二段,状态转移,阻塞赋值
- always @(*) begin
- next_state = state;
- case(state)
- OFF:
- case(j)
- 1: next_state = ON;
- 0: next_state = OFF;
- endcase
- ON:
- case(k)
- 1: next_state = OFF;
- 0: next_state = ON;
- endcase
- endcase
- end
-
- //状态机第三段,状态输出
- assign out = (state==ON);
-
- endmodule
这是一个摩尔状态机,有两个状态,两个输入和一个输出。实现此状态机。使用同步复位。

- //`timescale 100ps / 1ps
- //
- // Stage: Finite_State_Manchines
- // Engineer: LQC
- // Create Date: 2022/08/06
- // Design Name:
- // Module Name: top_module
- // Description:
- // 摩尔状态机,有两个状态,两个输入和一个输出。
- // 实现此状态机。使用同步重置。
- //
-
- module top_module(
- input clk,
- input reset, // Asynchronous reset to OFF
- input j,
- input k,
- output out
- );
-
- parameter OFF = 0;
- parameter ON = 1;
-
- reg state;
- reg next_state;
-
- //状态机第一段,初始状态,非阻塞逻辑
- always @(posedge clk) begin
- if (reset) begin
- state <= OFF;
- end
- else begin
- state <= next_state;
- end
- end
-
- //状态机第二段,状态转移,阻塞赋值
- always @(*) begin
- next_state = state;
- case(state)
- OFF:
- case(j)
- 1: next_state = ON;
- 0: next_state = OFF;
- endcase
- ON:
- case(k)
- 1: next_state = OFF;
- 0: next_state = ON;
- endcase
- endcase
- end
-
- //状态机第三段,状态输出
- assign out = (state==ON);
-
- endmodule
以下是摩尔状态机的状态转换表,该状态机具有一个输入、一个输出和四个状态。使用以下状态编码:A=2'b00、B=2'b01、C=2'b10、D=2'b11。
仅实现此状态机的状态转换逻辑和输出逻辑(组合逻辑部分)。给定当前状态,根据状态转换表计算和输出 。

- module top_module(
- input in,
- input [1:0] state,
- output [1:0] next_state,
- output out
- );
-
- parameter A=0, B=1, C=2, D=3;
- always @(*) begin
- case(state)
- A:
- case(in)
- 0: next_state = A;
- 1: next_state = B;
- endcase
- B:
- case(in)
- 0: next_state = C;
- 1: next_state = B;
- endcase
- C:
- case(in)
- 0: next_state = A;
- 1: next_state = D;
- endcase
- D:
- case(in)
- 0: next_state = C;
- 1: next_state = B;
- endcase
- default:
- next_state = A;
- endcase
- end
-
- assign out = (state==D);
-
-
- endmodule
以下是摩尔状态机的状态转换表,该状态机具有一个输入、一个输出和四个状态。使用以下单热状态编码:A=4'b0001、B=4'b0010、C=4'b0100、D=4'b1000。
通过检查(假设为单热编码)派生状态转换和输出逻辑方程。仅实现此状态机的状态转换逻辑和输出逻辑(组合逻辑部分)。(测试平台将使用非一个热输入进行测试,以确保您不会尝试执行更复杂的操作)。

- module top_module(
- input in,
- input [3:0] state,
- output [3:0] next_state,
- output out
- );
- //状态申明
- parameter A = 0;
- parameter B = 1;
- parameter C = 2;
- parameter D = 3;
-
- //只需要判断next_state在哪个状态变成此状态即可
- assign next_state[A] = (state[A] && ~in) | (state[C] && ~in);
- assign next_state[B] = (state[B] && in) | (state[D] && in) | (state[A] && in);
- assign next_state[C] = (state[B] && ~in) | (state[D] && ~in);
- assign next_state[D] = (state[C] && in);
-
- //只有当状态为D时输出才为1
- assign out = (state[D]);
-
- endmodule
以下是摩尔状态机的状态转换表,该状态机具有一个输入、一个输出和四个状态。实现此状态机。包括将 FSM 重置为状态 A 的异步重置。

- module top_module(
- input clk,
- input in,
- input areset,
- output out
- );
- //状态申明
- parameter A = 4'b0001;
- parameter B = 4'b0010;
- parameter C = 4'b0100;
- parameter D = 4'b1000;
-
- parameter ON = 1;
- parameter OFF = 0;
-
- reg [3:0] state;
- reg [3:0] next_state;
-
- //状态机第一段,初始状态,时序逻辑、非阻塞赋值
- always @(posedge clk or posedge areset) begin
- if (areset) begin
- state <= A;
- end
- else begin
- state <= next_state;
- end
- end
-
- //状态机第二段,状态转移,时序逻辑、阻塞赋值
- always @(*) begin
- next_state = state;
- case(state)
- A:
- case(in)
- ON: next_state = B;
- OFF: next_state = A;
- endcase
- B:
- case(in)
- ON: next_state = B;
- OFF: next_state = C;
- endcase
- C:
- case(in)
- ON: next_state = D;
- OFF: next_state = A;
- endcase
- D:
- case(in)
- ON: next_state = B;
- OFF: next_state = C;
- endcase
- endcase
- end
-
- //状态机第三段,结果输出,组合逻辑
- assign out = (state==D);
-
- endmodule
以下是摩尔状态机的状态转换表,该状态机具有一个输入、一个输出和四个状态。实现此状态机。包括将 FSM 重置为状态 A 的同步复位,这与 Fsm3 存在相同的问题,但具有同步复位。

- module top_module(
- input clk,
- input in,
- input reset,
- output out
- );
- //状态申明
- parameter A = 4'b0001;
- parameter B = 4'b0010;
- parameter C = 4'b0100;
- parameter D = 4'b1000;
-
- parameter ON = 1;
- parameter OFF = 0;
-
- reg [3:0] state;
- reg [3:0] next_state;
-
- //状态机第一段,初始状态,时序逻辑、非阻塞赋值
- always @(posedge clk) begin
- if (reset) begin
- state <= A;
- end
- else begin
- state <= next_state;
- end
- end
-
- //状态机第二段,状态转移,时序逻辑、阻塞赋值
- always @(*) begin
- next_state = state;
- case(state)
- A:
- case(in)
- ON: next_state = B;
- OFF: next_state = A;
- endcase
- B:
- case(in)
- ON: next_state = B;
- OFF: next_state = C;
- endcase
- C:
- case(in)
- ON: next_state = D;
- OFF: next_state = A;
- endcase
- D:
- case(in)
- ON: next_state = B;
- OFF: next_state = C;
- endcase
- endcase
- end
-
- //状态机第三段,结果输出,组合逻辑
- assign out = (state==D);
-
- endmodule
- module top_module (
- input clk,
- input reset,
- input [3:1] s,
- output fr3,
- output fr2,
- output fr1,
- output dfr
- );
-
- parameter A = 3'b000;
- parameter B = 3'b001;
- parameter C = 3'b010;
- parameter D = 3'b011;
- parameter E = 3'b100;
- parameter F = 3'b101;
-
- wire [2:0] state;
- wire [2:0] next_state;
-
- //状态机第一段,初始状态,时序逻辑非阻塞赋值
- always@(posedge clk)begin
- if(reset)
- state <= A;
- else
- state <= next_state;
- end
-
- //状态机第二段,状态跳转,阻塞赋值
- always@(*)begin
- case(state)
- A: next_state = s[1]? B:A;
- B: next_state = s[2]? D:(s[1]? B:A);
- C: next_state = s[2]? D:(s[1]? C:A);
- D: next_state = s[3]? F:(s[2]? D:C);
- E: next_state = s[3]? F:(s[2]? E:C);
- F: next_state = s[3]? F:E;
- endcase
- end
-
- //状态机第三段,结果输出
- always@(*)begin
- case(state)
- A: {fr3,fr2,fr1,dfr} = 4'b1111;
- B: {fr3,fr2,fr1,dfr} = 4'b0110;
- C: {fr3,fr2,fr1,dfr} = 4'b0111;
- D: {fr3,fr2,fr1,dfr} = 4'b0010;
- E: {fr3,fr2,fr1,dfr} = 4'b0011;
- F: {fr3,fr2,fr1,dfr} = 4'b0000;
- endcase
- end
-
- endmodule