STD_LOGIC信号と共にSTD_LOGIC_VECTORを追加する方法をVHDL?
-
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;
が、明らかにそのつもりはない仕事douta
がdoutb
std_logic_vector
とco
のデータ型は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」と名付けています。