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 标识符中使用单引号是非法的。
我想在 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 标识符中使用单引号是非法的。