verilog FSM为什么要使用one hot去编码状态
假设我们有四个状态A B C D:
编码规则1:
- A = 2’b00
- B = 2’b01
- C = 2’b10
- D = 2’b11
编码规则2:
- A = 4’b0001
- B = 4’b0010
- C = 4’b0100
- D = 4’b1000
假设存在如下状态转移关系
编码规则1
针对编码规则1,我们可以这样描述其状态转移关系:
module top_module(
input in,
input [1:0] state,
output [1:0] next_state,
output out);
parameter A = 2'b00;
parameter B = 2'b01;
parameter C = 2'b10;
parameter D = 2'b11;
assign next_state[A] = (~state[0] & ~state[1] & ~in) | ( ~state[0] & state[1] & ~in); //状态为A(~state[0] & ~state[1])且in为0 | 状态为C(~state[0] & state[1])且in为0
endmodule
编码规则2
module top_module(
input in,
input [3:0] state,
output [3:0] next_state,
output out);
parameter A = 4'b0001;
parameter B = 4'b0010;
parameter C = 4'b0100;
parameter D = 4'b1000;
assign next_state[A] = state[0]&(~in) | state[2]&(~in); // 状态为A(state[0])且in为0 | 状态为C(state[2])且in为0
endmodule
明显编码规则2的状态转移逻辑要比编码规则1的状态转移逻辑要简单的多。
总结
总结以下:使用one hot编码会增加会增加一小部分寄存器的位数,但是却大大简化了判断状态转移时候的逻辑。所以在写verilog FSM的时候尽量使用one hot去编码我们的状态。