たとえばこんなコードを書いたとします。
library IEEE; use IEEE.STD_LOGIC_1164.ALL; entity hoge is Port ( A : in STD_LOGIC; B : in STD_LOGIC; F : out STD_LOGIC ); end hoge; architecture Behavioral of hoge is begin F <= A; F <= B; end Behavioral;
すると、こんなエラーが…(汗
ERROR:Xst:528 - Multi-source in Uniton signal ; this signal is connected to multiple drivers.
複数のドライバーはだめですよ(1 つの出力 F に 2 つの入力 A,B は繋げられません)と言われているわけです。しかし VHDL はマルチドライバー(=複数の信号入力)を許容しているはずですし、std_logic 型というのは複数の信号が競合した時のための解決関数も用意されています。なのに、なぜこんなエラーが…
結論からいえば、ターゲットである spartan 3e がマルチドライバーに対応していないからでした(汗
それでは、論理的には OK なのか?ということで、テストベンチなコードでシミュレートしてみました。以下はその手順。
- 新しいプロジェクトを作成します。
- ここは適当に。ターゲットは Spartan3E で問題ないです。Language は VHDL で。
- プロジェクトのディレクトリとか OK だったら "Finish" で。
- 右クリックで "New-Source" を選択。
- 右ペインの "VHDL Test Bench" を選択して、ソースコードの FileName を入力して "Next >"。
- "Next >"。
- "Finish"。
- そうすると、テストペンチのテンプレートコードが現れます。
- テンプレートコードは全て削除して、以下の検証用コードに差し替えます。
library IEEE; use IEEE.STD_LOGIC_1164.ALL; entity testbench is end testbench; architecture behavior of testbench is signal A: std_logic := 'Z'; signal B: std_logic := 'Z'; signal F: std_logic := 'Z'; begin F <= A; F <= B; process begin wait for 1 ps ; A <= 'L'; wait for 1 ps ; B <= 'H'; wait for 1 ps ; A <= '0'; wait for 1 ps ; B <= '1'; end process; end;
検証様の記述についての詳細は割愛しますが、signal 文のところが初期値、architecture の begin 直下の F への代入が回路本体、その下の process の中身がテスト用に与える信号の記述です。
- 保存します。(保存すると右ペインに保存したファイルが表示)
- テストベンチのソースコードを選択し、その下ペインの "ISim Simulator" の "Simulate Behavioral Model" を選択/右リリックし、"Run"。
- "Yes"。
- 実行中。
- 結果が表示されます。
- 今回の検証用コードでは、たとえば 3ps の時点で a に 0(=強い0), b に H(=弱い1)が与えられていますが、出力は 0(=強い0)と期待通りになっています。