STD_LOGIC信号と共にSTD_LOGIC_VECTORを追加する方法をVHDL?

StackOverflow https://stackoverflow.com/questions/1592582

  •  22-09-2019
  •  | 
  •  

質問

私が持っている

douta   : in    std_logic_vector (3 downto 0);
doutb   : in    std_logic_vector (3 downto 0);
c0  : in    std_logic;
f1  : in    std_logic;
f0  : in    std_logic;
res : out   std_logic_vector (3 downto 0);
私は、単純なALUを構築しようとしているが、このALUが提供する機能の一つであります とき

f1 and f0 both = 1 
res = douta plus b plus c0

私が書いたように、

f1 = '1' and f0 = '1' then res <= douta + doutb + c0;

が、明らかにそのつもりはない仕事doutadoutb

ちょうどであるとしてstd_logic_vectorcoのデータ型はstd_logic場所であるため、 とき、コンパイル

この、私はこのエラーを得ました

' Error 603 line 34 : Incompatible types for arithmetic operator: LHS=std_logic_vector!18, RHS=std_logic

私はこの問題を解決することができますどのように任意のアイデア?

編集を また、試してみました。

f1 = '1' and f0 = '1' then res <= douta + doutb + ("000" & c0);

が、まだ運、この時間は、コンパイラは言う。

LHS=std_logic_vector!7, RHS=array_1_of_std_logic_3_d_0
役に立ちましたか?

解決 3

ああ、私は次のライブラリを追加する必要があり、修正を見つけたと思う。

use ieee.std_logic_arith.all;

と私たちは:) @jdehaan

のおかげで動作します試してみました

他のヒント

あなたがそれらに算術演算をやろうとしている場合std_logic_vectorを使用しないでください。使用ieee.numeric_std、およびsignedまたはunsigned型を使用します。次に、あなたはそれにあなたの「0」または「1」を追加することができます。

std_logic_arith.allを使用しての回避策は、ツールチェーンを変更すると、移植のトラブルにあなたを得ることができます非標準のライブラリを使用してファッジ、です。

私はこの上で、より詳細なページを書きました: http://parallelpoints.com/node/3する

comp.lang.vhdlでこの上でいくつかの議論がここにありました:<のhref = "http://groups.google.com/group/comp.lang.vhdl/browse_thread/thread/549e1bbffd35914d/83cc0f19350fc392?hl= EN&Q =グループ:comp.lang.vhdl + numeric_std#83cc0f19350fc392" のrel = "noreferrer"> http://groups.google.com/group/comp.lang.vhdl/browse_thread/thread/549e1bbffd35914d/83cc0f19350fc392?hl=en&q=グループ:comp.lang.vhdl + numeric_std#83cc0f19350fc392 ともcomp.lang.vhdlよくある質問で、

あなたはSTD_LOGIC_VECTORにC0変換することができます。私が作ったので、長い時間となっているVHDL ...

if f1 = '1' and f0 = '1' then
 if c0 = '1' then
   res <= douta + doutb + "0001";
 else
   res <= douta + doutb;
 end if;
end if;

これはおそらくないので、パフォーマンス、多分ケイ素コンパイラが何か良いので、それを合成し、多分それはC0がベクターに修正して、3つのすべてのDOUTA、DOUTBおよびコンバータC0を追加しているので、それを書くためのより良い考えです。別のオプションは、計算を行うことであろうビットのビットが、その後、あなたはコンパイラが何を持っているのですか?

これはばかげて聞こえるかもしれませんが、あなたが(ちょうどそれを試してみると、このような小さな例ではない大したことを出力し、検証する)それをこのようないくつかのヒントを与える場合は、時々コンパイラは、より良い結果を生成します:

if f1 = '1' and f0 = '1' then
 if c0 = '1' then
   res <= douta + doutb + "0001";
 else
   res <= douta + doutb + "0000";
 end if;
end if;

もう一つのアドバイスは、の場合は、書き込み、結果はやや奇妙であれば、未定の状態を(彼らはあまりにも多くの自由を持っている場合、一部のコンパイラはひどく振る舞う!)を固定するために他を紹介します。しかし、私の経験からのは、すでに今年に戻ってきているということを2004 !!!

あなたは追加を行うためにSTD_LOGIC_VECTORにSTD_LOGICを変換する必要はありません。ただ、あるとして追加を行うには、「RES」は最大の答えを保持するのに十分なビットを持っていることを確認してください。この場合の解像度のニーズそれに今オーバーフロー。

ために広い5ビットであることが

やスタイルNITとして、「DOUT」をご入力ポートに名前を付けないでください。それは悪い形です。それは彼らが何であるかだから、ここでの喧騒それらを呼び出します。そして、インスタンス化よりアーキテクチャにあなたが別のコンポーネントの出力ポートを接続し、これは、このコンポーネントの「DIN」に「DOUT」と名付けています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top