verilog FSM為什麼要使用one hot去編碼狀態
阿新 • • 發佈:2020-12-28
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去編碼我們的狀態。