2012-02-09 14 views
5

私は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にワイルドカードを使用して定義しなければならない組み合わせの数を最小限に抑える方法があることを願っています。

誰でもこの方法を知っていますか?

ありがとうございました

答えて

1

命令の他のビットを必要としないと仮定すると、事前チェックプロセスで他のビットをマスキングすることで、この問題を回避することができます。 (または、命令を書くときに他のビットがリセットされていることを確認してください)

これは実際にはちょっとしたハックです。 IRは、(これらの線に沿って第1の4ビットのコマンド・ワードか何かある?)また、あなたの命令を巧みに考え抜かれていると仮定すると、変数

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; 

として保存されますが、入れ子になったcase文を実行すると何ができると仮定し

それらのサブブロックで必要に応じて微分する。

+0

Aha、ありがとう、Paul Seebにあなたの提案をお願いします。私は昨日質問した後、それぞれのオペレーションコードに対して 'CASE'ステートメントを使用し、次に' IF'ステートメントを使用して他の必要な比較を行うことを考えました。あなたの最初の方法は、コードを少し短くするので、私はそれを使いました。 Mark Thompsonもあなたの提案に感謝します。 –

5

これは残念なことにできません。ほとんどのユーザーにとって予期せず、比較演算子=caseの比較ではリテラル比較が実行されます。これは、std_logicタイプが単なる文字セットであり、他の機能(たとえばandおよびor)が定義されているために論理値のように機能するためです。

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

まだがVHDL 2008をサポートしていないコンパイラに悩まされている場合は、サプライヤに文句を言います。また、std_match関数を使用すると、古いVHDLリビジョンで比較を実行できるようになりますが、caseステートメントをそのように動作させることに気付いているものは何もありません。

+1

+1は「サプライヤーに文句を言ってください! – Philippe

+0

ザイリンクスISEと同じ問題に遭遇した後、私のように、新しい「ケース?ステートメント(ほとんどのVHDL-2008の機能と同様)はv14.4(この執筆時点では現在のリリース)には存在しません。 – MartyMacGyver

+0

VHDL2008の 'case? 'に対するベータサポートは、Vivado2014.3にあります。[AR#62005](http://www.xilinx.com/support/answers/62005.html)を参照してください。あなたは間違いなく、それが動作すると仮定したくない(ベータ版のように)。 –