私はAltera DE1ボードで実装している単純な16ビット・プロセッサ用のVHDLコードでFinite State Machineを作成しようとしていました。有限状態マシンでは、16ビットのSTD_LOGIC_VECTORによってFSMに取り込まれる異なる16ビット命令を処理するCASE
ステートメントがあります。しかし、私は有限状態マシンが命令を解読するデコード状態で少し問題があります。命令の1つは、2つのレジスタをオペランドとして、3つをデスティネーションレジスタとして使用するADDです。しかし、私はまた、レジスタと5ビットの即値をオペランドとし、デスティネーションの2番目のレジスタをとるADD命令を持っています。私の問題は、CASE
ステートメントでは、私は2つの異なるADD命令を区別できる必要があるということです。だから、CASE
ステートメントで " - "や "X"のようなワイルドカード値を使用すると、可能なすべてのレジスタ/即値の組み合わせをリストするのではなく、2つのケースで区別することができます。例:VHDL STD_LOGIC_VECTORワイルドカード値
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にワイルドカードを使用して定義しなければならない組み合わせの数を最小限に抑える方法があることを願っています。
誰でもこの方法を知っていますか?
ありがとうございました
Aha、ありがとう、Paul Seebにあなたの提案をお願いします。私は昨日質問した後、それぞれのオペレーションコードに対して 'CASE'ステートメントを使用し、次に' IF'ステートメントを使用して他の必要な比較を行うことを考えました。あなたの最初の方法は、コードを少し短くするので、私はそれを使いました。 Mark Thompsonもあなたの提案に感謝します。 –