1

アルテラ FPGA に配置する QuartusII (14.1) ツールを使用して合成するため、SystemVerilog で FSM を設計しています。コードをより合理的にするために列挙型宣言を使用しています。

typedef enum logic [7:0] { CMD_INIT,
                           CMD_WAIT,
                           CMD_DECODE,
                           CMD_ILLEGAL,
                           CMD_CMD0,
                           ... } cmd_st;
...
cmd_st cs, ncs;
...

logic [7:0]Quartus がこのステート マシンを合成するたびに、タイプの一部にもかかわらずワンホット エンコーディングが作成されるようです。状態を SignalTap に追加する必要がある場合と同様に、すべての状態をシグナル 1 ビット変数 ( cs.CMD_INITcs.CMD_WAITなど) として取得します。これは通常非常に便利ですが、これらの状態の束といくつかのオーバー値を一度に確認する必要があるため、これらの状態をすべて含めるにはオンチップ メモリが不足しています (8 つをはるかに超えています。50 のように)。 +))。したがって、それらすべてを SignalTap に追加すると、このメモリが大量に消費されます。しかし、 の 8 ビット値を書き留めることができればcs、他のもののために十分なスペースを確保できます。

Quartus が FSM に 1-hot エンコーディングを使用しないようにする方法がわかりません。設定 (設定 -> コンパイラ設定 -> 詳細設定 (合成...) -> ステート マシン処理) を最小ビット、ユーザー エンコーディング、およびシーケンシャルに変更し、いくつかの状態の値を追加しようとしました。

typedef enum logic [7:0] { CMD_INIT           = 8'd0,
                           CMD_WAIT           = 8'd1,
                           CMD_DECODE         = 8'd2,
                           CMD_ILLEGAL        = 8'd3,
                           CMD_CMD0,

(途中でさらに追加する可能性があるため、すべてではないことに注意してください)

SignalTap が状態の 8 ビットのみを認識するようにするには、他に何をすべきかわかりません (これはおそらく、Quartus にこの FSM を 1hot エンコーディングではなくシーケンシャルとして合成させることに戻ります)

4

1 に答える 1