HDLBItsシリーズ(25)独熱コード有限状態機実現の簡単な方式

6351 ワード

目次
原題再現
一点の解釈
ファイナルインプリメンテーション
原題再現
The following is the state transition table for a Moore state machine with one input, one output, and four states. Use the following one-hot state encoding: A=4'b0001, B=4'b0010, C=4'b0100, D=4'b1000.
Derive state transition and output logic equations by inspection assuming a one-hot encoding. Implement only the state transition logic and output logic (the combinational logic portion) for this state machine. (The testbench will test with non-one hot inputs to make sure you're not trying to do something more complicated).
State
Next state
Output
in=0
in=1
A
A
B
0
B
C
B
0
C
A
D
0
D
C
B
1
What does "derive equations by inspection"mean?
One-hot state machine encoding guarantees that exactly one state bit is 1. This means that it is possible to determine whether the state machine is in a particular state by examining only one state bit, not all state bits. This leads to simple logic equations for the state transitions by examining the incoming edges for each state in the state transition diagram.
For example, in the above state machine, how can the state machine can reach state A? It must use one of the two incoming edges: "Currently in state A and in=0"or "Currently in state C and in = 0". Due to the one-hot encoding, the logic equation to test for "currently in state A"is simply the state bit for state A. This leads to the final logic equation for the next state of state bit A: next_state[0] = state[0]&(~in) | state[2]&(~in) . The one-hot encoding guarantees that at most one clause (product term) will be "active"at a time, so the clauses can just be ORed together.
When an exercise asks for state transition equations "by inspection", use this particular method. The judge will test with non-one-hot inputs to ensure your logic equations follow this method, rather that doing something else (such as resetting the FSM) for illegal (non-one-hot) combinations of the state bits.
Although knowing this algorithm isn't necessary for RTL-level design (the logic synthesizer handles this), it is illustrative of why one-hot FSMs often have simpler logic (at the expense of more state bit storage), and this topic frequently shows up on exams in digital logic courses.
Module Declaration
module top_module(
    input in,
    input [3:0] state,
    output [3:0] next_state,
    output out); 

一点の解釈
1つの回路を実現して、まず必要な入出力を確定して、原題は声明を出します:
Module Declaration
module top_module(
    input in,
    input [3:0] state,
    output [3:0] next_state,
    output out); 

現在の状態state、in、次の状態(next_state)が出力として入力され、最終的な出力値が入力されることがわかる.
これは完全なステータスマシンではありません.完全なステータスマシン、state、next_stateはモジュール内部で独自に定義されており、現在の状態に初期値、状態遷移の条件などを与える必要があります.
ここで、現在の状態は外部から与えられるので、現在の状態の変換に対するalwaysのタイミングロジックは自分で書く必要はありません.私たちがしなければならないのは、状態変換の組合せロジック部分と、出力の組合せロジック部分です.
次に、本題は状態符号化として独熱符号を用いることであり、いくつかの状態、状態変数は数ビットあり、ここでは明らかに4ビット、すなわち4つの状態があり、状態符号化は独熱符号の形式を採用するのは以下の通りである.
A=4'b0001, B=4'b0010, C=4'b0100, D=4'b1000.
ステータス遷移条件は、ステータス遷移図によって与えられてもよいし、ステータス遷移テーブルによって与えられてもよい.本題はステータス遷移テーブルである.
State
Next state
Output
in=0
in=1
A
A
B
0
B
C
B
0
C
A
D
0
D
C
B
1
これらがあれば、私たちは一般的に実現することができます.私たちの通常の実現方法は以下の通りです.
module top_module(
    input in,
    input [3:0] state,
    output [3:0] next_state,
    output out); 
    parameter A = 4'b0001, B = 4'b0010, C = 4'b0100, D = 4'b1000;
    reg [3:0] next_state;
    always@(*) begin
        case(state)
            A: begin
                if(in == 0) next_state = A;
                else next_state = B;
            end
            B: begin
                if(in == 0) next_state = C;
                else next_state = B;
            end
            C: begin
                if(in == 0) next_state = A;
                else next_state = D;
            end
            D: begin
                if(in == 0) next_state = C;
                else next_state = B;
            end

        endcase
    end

assign out = (state == D)?1:0;


endmodule

ファイナルインプリメンテーション
明らかに、上記の書き方は間違いなく正しいです.これは最も一般的な書き方で、どんな符号化のステータスマシンでもこのように書くことができます.私個人もこのように書くのが好きですが、今日お話しする実現方法はそうではありません.私たちは独熱コードの特徴を使って表達を簡略化します.以下のようにします.
module top_module(
    input in,
    input [3:0] state,
    output [3:0] next_state,
    output out); //

    parameter A=0, B=1, C=2, D=3;

    // State transition logic: Derive an equation for each state flip-flop.
    assign next_state[A] = state[A]&(in == 0) | state[C] & (in == 0);
    assign next_state[B] = state[A]&in | state[B]&in | state[D]∈
    assign next_state[C] = state[B]&(in == 0) | state[D]&(in == 0);
    assign next_state[D] = state[C] & in;

    // Output logic: 
    assign out = state[D]? 1:0;

endmodule

ユニホットコード符号化のステータスマシンであるため,デフォルトのステータス変数は1ビットのみが1であり,その他はゼロであるため,このような特徴を利用してステータスマシンを実現することができる.
伝統的な書き方とは違うところはステータスジャンプ部分で、テーマ紹介のように:
For example, in the above state machine, how can the state machine can reach state A? It must use one of the two incoming edges: "Currently in state A and in=0"or "Currently in state C and in = 0". Due to the one-hot encoding, the logic equation to test for "currently in state A"is simply the state bit for state A. This leads to the final logic equation for the next state of state bit A: next_state[0] = state[0]&(~in) | state[2]&(~in) . The one-hot encoding guarantees that at most one clause (product term) will be "active"at a time, so the clauses can just be ORed together.
どのようにして次の状態がAになるのでしょうか.次の2つのケースがあります.
現在の状態がAで入力が0の場合、次の状態はAである.
現在の状態はCで入力は0であり、次の状態もAである.
この2つのケースのいずれかが満たされると、次の状態はAにジャンプし、Aはユニヒートコードであり、最後のビットは1であるため、このように実現することができる.next_state[0] = state[0]&(~in) | state[2]&(~in)
最初に定義したのは
  parameter A=0, B=1, C=2, D=3;
したがって,コード中の0,1,2,3はいずれもA,B,C,Dで実現できる.
これにより,上記のように状態遷移が実現できる理由を説明した.