質問
アキュムレータを使用して4ビットのバイナリ加算器をコーディングしています:
library ieee;
use ieee.std_logic_1164.all;
entity binadder is
port(n,clk,sh:in bit;
x,y:inout std_logic_vector(3 downto 0);
co:inout bit;
done:out bit);
end binadder;
architecture binadder of binadder is
signal state: integer range 0 to 3;
signal sum,cin:bit;
begin
sum<= (x(0) xor y(0)) xor cin;
co<= (x(0) and y(0)) or (y(0) and cin) or (x(0) and cin);
process
begin
wait until clk='0';
case state is
when 0=>
if(n='1') then
state<=1;
end if;
when 1|2|3=>
if(sh='1') then
x<= sum & x(3 downto 1);
y<= y(0) & y(3 downto 1);
cin<=co;
end if;
if(state=3) then
state<=0;
end if;
end case;
end process;
done<='1' when state=3 else '0';
end binadder;
出力:
-binadderのアーキテクチャbinadderのコンパイル
**エラー:C:/Modeltech_pe_edu_6.5a/examples/binadder.vhdl(15):
中置演算子の実行可能なエントリがありません &quot; xor&quot;。
**エラー:C:/Modeltech_pe_edu_6.5a/examples/binadder.vhdl(15):
中置表現を解決するタイプエラー &quot; xor&quot;タイプstd.standard.bitとして。
**エラー:C:/Modeltech_pe_edu_6.5a/examples/binadder.vhdl(16):
中置演算子の実行可能なエントリがありません &quot; and&quot;。
**エラー:C:/Modeltech_pe_edu_6.5a/examples/binadder.vhdl(16):
の右オペランドの悪い式 中置式&quot;または&quot;。
**エラー:C:/Modeltech_pe_edu_6.5a/examples/binadder.vhdl(16):
中置演算子の実行可能なエントリがありません &quot; and&quot;。
**エラー:C:/Modeltech_pe_edu_6.5a/examples/binadder.vhdl(16):
の左オペランドの悪い式 中置式&quot;または&quot;。
**エラー:C:/Modeltech_pe_edu_6.5a/examples/binadder.vhdl(16):
の右オペランドの悪い式 中置式&quot;または&quot;。
**エラー:C:/Modeltech_pe_edu_6.5a/examples/binadder.vhdl(16):
中置表現を解決するタイプエラー &quot; or&quot;タイプstd.standard.bitとして。
**エラー:C:/Modeltech_pe_edu_6.5a/examples/binadder.vhdl(28):
中置演算子の実行可能なエントリがありません &quot;&amp;&quot;。
**エラー:C:/Modeltech_pe_edu_6.5a/examples/binadder.vhdl(28):
中置表現を解決するタイプエラー &quot;&amp;&quot;タイプとして ieee.std_logic_1164.std_logic_vector。
**エラー:C:/Modeltech_pe_edu_6.5a/examples/binadder.vhdl(39):
VHDLコンパイラの終了
私はstd_logic_vectorを正しく処理していないと思います。教えてください:(
解決
VHDLの機能の1つは、基本言語自体ではほとんど機能が提供されないことです。そのほとんどはパッケージを使用して提供されます。コードの2行目はこの例です(ieee.std_logic_1164.allを使用)。これは、std_logic_1164パッケージをすべて使用していることを意味します。このパッケージの定義については、こちらをご覧ください。
コードを記述するとき、通常はstd_logicまたはstd_logic_vectorのいずれかに信号を保存します。これには2つの理由があります。 1つ目は、std_logicは「0」または「1」以外の値も表すことができることです。たとえば、「Z」または「X」を表すこともできます。 2番目は、シミュレータ(使用しているmodelsimなど)がstd_logicで高速に実行されるように最適化されていることです。
一般的な慣例として、エンティティからの入力と出力を常にstd_logicまたはstd_logic_vectorにすることをお勧めします。
特定の問題は、xorでタイプビット(VHDL標準で定義されている数少ないタイプの1つ)を使用していることです。
最も簡単な解決策は、エンティティのco出力をstd_logic型に変更し、sumおよびcinの宣言をstd_logic型に変更することです。
entity binadder is
port(n,clk,sh:in bit;
x,y:inout std_logic_vector(3 downto 0);
co:inout std_logic;
done:out bit);
end binadder;
signal sum,cin:std_logic;
さらにコメントするのは、言語に組み込まれている厳密な型チェックの一部が削除されるため、特に理由がない限り、ポートをinoutにすることは一般に悪い習慣です。最善の解決策は、エンティティ自体に信号を作成し、その信号を出力に直接割り当てることです。
entity binadder is
port(n,clk,sh:in bit;
x,y:inout std_logic_vector(3 downto 0);
co:out std_logic;
done:out bit);
end binadder;
signal co_int:std_logic;
begin
co_int<= (x(0) and y(0)) or (y(0) and cin) or (x(0) and cin);
co <= co_int;
最後のコメントは、stateの値が1になった後、どのように2または3になりますか?
他のヒント
論理物理ライブラリのマッピングを見てください。
物理ライブラリに実際にパッケージがダンプされていることを確認します。
異なるバージョンのシミュレーターで異なるバージョンのプリコンパイル済みヘッダーを使用していないことを確認してください。
何も機能しない場合は、ieeeのローカルコピーを作成し、std_logic_1164パッケージをコンパイルして、作業ライブラリに移動してからデザインをコンパイルします。これは動作します 。