6

アルテラDE1ボードに実装している単純な16ビットプロセッサ用のVHDLコードで有限ステートマシンを作成しようとしています。有限状態マシンにはCASE、16ビットSTD_LOGIC_VECTORによってFSMに取り込まれるさまざまな16ビット命令を処理するステートメントがあります。ただし、有限ステートマシンが命令をデコードするデコード状態で少し問題が発生します。命令の1つは、2つのレジスタをオペランドとして、3つ目をデスティネーションレジスタとして受け取るADDです。ただし、オペランドとしてレジスタと5ビットの即値を取り、宛先の2番目のレジスタを受け取るADD命令もあります。私の問題はCASEステートメント、私は2つの異なるADD命令を区別できる必要があります。したがって、ステートメントで「-」や「X」などのワイルドカード値を使用するCASEと、可能なレジスタと即時値の組み合わせをすべてリストするのではなく、2つのケースで2つを区別できると思いました。例えば:

    CASE IR IS --(IR stands for "Instruction Register")
      WHEN "0001------0-----" => (Go to 3-register add);
      WHEN "0001------1-----" => (Go to 2-register/immediate value add);
      WHEN OTHERS => (Do whatever);
    END CASE;

私が持っている2つの指示はこれらだけではありません。この投稿を少し短くするために、これら2つを配置しました。このコードをコンパイルして実行すると、プロセッサは「デコード」状態になると実行を停止します。また、Quartusは、「LC3FSM.vhd(37)でのVHDL選択警告:メタ値を含む無視された選択 "" 0001 ----- 0-----""」などの警告を多数出します。これを達成する方法についての損失。私は実際にはすべての16ビットの組み合わせを定義する必要はなく、おそらくその必要もありません。STD_LOGIC_VECTORでワイルドカードを使用して、定義する必要のある組み合わせの数を最小限に抑える方法があることを願っています。

誰かがこれを達成する方法を知っていますか?

ありがとう

4

2 に答える 2

6

残念ながらそれはできません。ほとんどのユーザーにとって意外なことに、比較演算子=case比較はリテラル比較を実行します。これは、std_logic型が単なる文字のセットであり、他の関数(andおよびor)が定義されている方法により、論理値のように機能するためです。

VHDL-2008では、期待どおりに機能する新しいcaseステートメントcase?が導入されています。コンパイラにVHDL2008モードで動作するように指示する必要があります。さらに、?=VHDL 2008には、sを考慮して2つの値を比較する演算子があります-

まだVHDL2008をサポートしていないコンパイラに悩まされている場合は、サプライヤに苦情を言ってください。std_match古いVHDLリビジョンで比較を実行できる関数もありますが、caseステートメントをそのように機能させるために私が認識していることは何もありません。

于 2012-02-09T15:42:22.323 に答える
1

命令に他のビットが必要ないと仮定すると、事前チェックプロセスで他のビットをマスクすることで、これを回避する方法をハックできます。(または、命令を書き込むときに他のビットがリセットされていることを確認しますか?)

これは本当にちょっとしたハックです。

IRが変数として保存されていると仮定

if IR(15 downto 12) == "0001" then
    IR := IR_in(15 downto 12) & "0000000" & IR_in(5) & "00000";
else
    IR := IR_in
end if;

CASE IR IS --(IR stands for "Instruction Register")
  WHEN "0001000000000000" => (Go to 3-register add);
  WHEN "0001000000100000" => (Go to 2-register/immediate value add);
  WHEN OTHERS => (Do whatever);
END CASE;

あるいは、命令が巧妙に考えられていると仮定すると(最初の4ビットはコマンドワードか、それらの行に沿ったものですか?)、ネストされたcaseステートメントを実行し、必要に応じてこれらのサブブロックで区別を行うことができます。

于 2012-02-09T19:51:13.030 に答える