メインコンテンツ

HDL コード生成および高位合成コード生成のステート マシンのモデル化

次の設計パターンは、MATLAB® において HDL コード生成および高位合成 (HLS) コード生成に適した Mealy および Moore ステート マシンの例を示しています。

これらのモデルの MATLAB コードは、HDL コード生成および HLS コード生成用の MATLAB モデルの作成に関するベスト プラクティスを説明しています。

  • switch ブロックを使用し、otherwise ステートメントにより、モデルがすべての条件に対応することを確認します。モデルがすべての条件に対応していない場合、生成された HDL コードでエラーが発生することがあります。

  • ステート マシンでステートを指定するには、数値が格納される変数を使用します。

Mealy ステート マシン用の MATLAB コード

Mealy ステート マシンでは、出力はステートと入力によって異なります。Moore ステート マシンでは、出力はステートによってのみ決定します。

次の MATLAB コードは関数 mlhdlc_fsm_mealy を定義します。現在のステートは永続変数により表されます。switch ブロックは現在のステートと入力を使用して出力と新しいステートを決定します。switch ブロックのそれぞれの case で、if-else ステートメントにより新しいステートと出力が計算されます。

Mealy ステート マシン

MATLAB 関数 mlhdlc_fsm_mealy およびテスト ベンチ mlhdlc_fsm_mealy_tb は Mealy ステート マシンを実装します。このステート マシンでは、出力 Z は現在のステートと入力 A の両方によって決定されます。入力 A に基づいて 4 つのステート (S1 から S4) 間を遷移し、それに応じてステートと出力が更新されます。

MATLAB 関数

%#codegen
% Mealy State Machine
function Z = mlhdlc_fsm_mealy(A)

% define states
S1 = 0;
S2 = 1;
S3 = 2;
S4 = 3;

persistent current_state;
if isempty(current_state)
    current_state = S1;   
end

% switch to new state based on the value state register
switch (current_state)
    case S1,
        % value of output 'Z' depends both on state and inputs
        if (A)
            Z = true;
            current_state = S1;
        else
            Z = false;            
            current_state = S2;
        end
    case S2,
        if (A)
            Z = false;
            current_state = S3;
        else
            Z = true;
            current_state = S2;
        end
    case S3,
        if (A)
            Z = false;            
            current_state = S4;
        else
            Z = true;            
            current_state = S1;
        end
    case S4,
        if (A)
            Z = true;
            current_state = S1;
        else
            Z = false;            
            current_state = S3;
        end         
    otherwise,
        Z = false;
end

MATLAB テスト ベンチ

for i = 1:100
    if mod(i,2) == 0
        val = mlhdlc_fsm_mealy(true);
    else
        val = mlhdlc_fsm_mealy(false);
    end
end

次のコマンドを使用して、MATLAB 関数 mlhdlc_fsm_mealy の HLS コードを生成します。

cfg = coder.config("hdl");
cfg.Workflow = "High Level Synthesis"; % To generate HDL code, set Workflow to "Generic ASIC/FPGA"
cfg.TestBenchName = "mlhdlc_fsm_mealy_tb";
codegen -config cfg mlhdlc_fsm_mealy -report

Moore ステート マシン用の MATLAB コード

次の MATLAB コードは関数 mlhdlc_fsm_moore を定義します。現在のステートは永続変数により表され、switch ブロックは現在のステートを使用して出力と新しいステートを決定します。switch ブロックのそれぞれの case で、if-else ステートメントにより新しいステートと出力が計算されます。ステートの値は数値変数により表されます。

MATLAB コード

MATLAB 関数 mlhdlc_fsm_moore およびテスト ベンチ mlhdlc_fsm_moore_tb は、Moore ステート マシンを実装します。このステート マシンでは、出力 Z が現在のステートにのみ依存し、入力 A に基づいて 4 つのステート (S1 から S4) 間を遷移します。永続的な curr_state 変数は、ハードウェア合成用のステート レジスタをモデル化します。

MATLAB 関数

%#codegen
function Z = mlhdlc_fsm_moore(A)
% Moore State Machine

% all actions are state actions and 
% outputs are pure functions of state only 

% define states
S1 = 0;
S2 = 1;
S3 = 2;
S4 = 3;

% using persistent keyword to model state registers in hardware
persistent curr_state;
if isempty(curr_state)
    curr_state = S1;   
end

% switch to new state based on the value state register
switch (curr_state)
    case S1,
        % value of output 'Z' depends only on state and not on inputs
        Z = true;
        
        % decide next state value based on inputs
        if (~A)
            curr_state = S1;
        else
            curr_state = S2;
        end
    case S2,
        Z = false;
        if (~A)
            curr_state = S1;
        else
            curr_state = S3;
        end
    case S3,
        Z = false;
        if (~A)
            curr_state = S2;
        else
            curr_state = S4;
        end
    case S4,
        Z = true;
        if (~A)
            curr_state = S3;
        else
            curr_state = S1;
        end
    otherwise,
        Z = false;
end

MATLAB テスト ベンチ

for i = 1:100
    if mod(i,2) == 0
        val = mlhdlc_fsm_moore(true);
    else
        val = mlhdlc_fsm_moore(false);
    end
end

次のコマンドを使用して、MATLAB 関数 mlhdlc_fsm_moore の HLS コードを生成します。

cfg = coder.config("hdl");
cfg.Workflow = "High Level Synthesis"; % To generate HDL code, set Workflow to "Generic ASIC/FPGA"
cfg.TestBenchName = "mlhdlc_fsm_moore_tb";
codegen -config cfg mlhdlc_fsm_moore -report

参考

|

トピック