2016-08-09 14 views
0

は基本的には、文字通り私が今まで見てきたすべてのVHDLファイルのようなもののヘッダを持っていますVHDLに `using namespace std;` eqivalentをどうやって実行できませんか?

library ieee; 
use ieee.numeric_std.all; 
use ieee.std_logic_1164.all; 

これは、VHDLはそれを呼び出すものは何でも(現在の名前空間-アナログに関連したライブラリーの内容全体をスプラットているようですVHDLのマニュアルに明示的な名前が入っていないか、間違っていると読んでいます)。

にはありません現在の名前空間にすべてをスプラットしますか?

.allポストフィックスを削除すると部分的に動作するように見えますが(タイプはフルパスで指定する必要がありますが)、関連するタイプで行われるすべての演算子のオーバーロードを解消するようです。

+0

これらのuse節に 'all'がありますか?それを削除し、代わりに修飾名を使用してください。 (オーバーロードされた演算子に問題があるかもしれません。私が知る限り、 'use type std_logic;'に相当するものはありません) –

+0

@BrianDrummond - これは数学と論理をすべて破っているようです。例えば、 "not"はもはや動作しません。 –

+0

それでも動作しますが、明示的な構文でそれらを呼び出すか、明示的にインポートする必要があります: 'ieeeee.std_logic_1164.not'おそらく。 –

答えて

2

コメントを拡大するだけで、use句から.allを削除し、必要なものだけをインポートするだけで済みます。

ことが事業者やリテラルが含まれている場合、コンパイラが...欠けているものを教えてくれます

GHDL -a test_qualified.vhd
test_qualified.vhd:14:10:オペレータのための機能なしの宣言」ない」
test_qualified.vhd:15:10:型std_ulogicと文字リテラルを '0' と一致することができない
test_qualified.vhd:15:21:演算子のない関数宣言 "="
test_qualified.vhd:15: 30:文字リテラル '1'とタイプstd_ulogicを一致させることはできません
ghdl:コンパイルエラー

これらもインポートしてください。

library ieee; 
use ieee.std_logic_1164; 
use ieee.std_logic_1164."not"; 
use ieee.std_logic_1164."="; 
use ieee.std_logic_1164.'0'; 
-- use ieee.std_logic_1164.'1'; 

entity test_qualified is 
end test_qualified; 

architecture test of test_qualified is 

signal a,b,c : ieee.std_logic_1164.std_logic; 

begin 

    a <= not b; 
    c <= '0' when a = b else ieee.std_logic_1164.'1'; 

end test; 

明らかに、ネームスペースのこのレベルの制御が必要な人はほとんどいません。しかし、それは可能です。

このコンパイル単位を異なるコンパイル単位で繰り返すと、VHDL-2008のcontextキーワードを知り、アプリケーションに固有のcontextと宣言します。

+0

Urgh。どのようにひどく醜い。 VHDLは70年代に詰まっているようだ。 –

+0

私は答えを終える前にあなたがコメントしたと思います。それはあなたがそれを伝えなくても、あなたがネームスペースに持ち込むか、または放棄したいかを推測したいと思うようです。どの言語が実際にそれをやり直していますか? –

+0

C++(および他のすべての現代的なOOP言語)では、型演算子を型に結びつけることができるので、参照には追加の使用型の文がゼロになります。 「推測」する必要はなく、型が明示的に定義されている必要があります。また、現在の名前空間に何も付けないで演算子をオーバーロードする方法がない場合、設計が貧弱です。 –

関連する問題