2

アキュムレータを使用して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):

中置演算子「xor」の実行可能なエントリはありません。

**エラー:C:/Modeltech_pe_edu_6.5a/examples/binadder.vhdl(15):

中置式「xor」をstd.standard.bit型として解決するエラーを入力します。

**エラー:C:/Modeltech_pe_edu_6.5a/examples/binadder.vhdl(16):

中置演算子「and」の実行可能なエントリはありません。

**エラー:C:/Modeltech_pe_edu_6.5a/examples/binadder.vhdl(16):

中置式「または」の右オペランドの式が正しくありません。

**エラー:C:/Modeltech_pe_edu_6.5a/examples/binadder.vhdl(16):

中置演算子「and」の実行可能なエントリはありません。

**エラー:C:/Modeltech_pe_edu_6.5a/examples/binadder.vhdl(16):

中置式「または」の左オペランドの式が正しくありません。

**エラー:C:/Modeltech_pe_edu_6.5a/examples/binadder.vhdl(16):

中置式「または」の右オペランドの式が正しくありません。

**エラー:C:/Modeltech_pe_edu_6.5a/examples/binadder.vhdl(16):

中置式「または」をタイプstd.standard.bitとして解決するタイプエラー。

**エラー:C:/Modeltech_pe_edu_6.5a/examples/binadder.vhdl(28):

中置演算子「&」の実行可能なエントリはありません。

**エラー:C:/Modeltech_pe_edu_6.5a/examples/binadder.vhdl(28):

タイプieee.std_logic_1164.std_logic_vectorとして、中置式「&」を解決するエラーを入力します。

**エラー:C:/Modeltech_pe_edu_6.5a/examples/binadder.vhdl(39):

VHDLコンパイラが終了します

std_logic_vectorを正しく処理していないと思います。方法を教えてください。:(

4

2 に答える 2

8

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;

さらにコメントすると、言語に組み込まれている厳密な型チェックの一部が削除されるため、非常に正当な理由がない限り、ポートをアウトにすることは一般的に悪い習慣です。最善の解決策は、エンティティ自体の中に信号を作成し、その信号を出力に直接割り当てることです。

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;

最後のコメントの1つは、状態の値が1になると、どのようにして2または3になるのでしょうか。

于 2009-12-01T15:02:22.113 に答える
0

論理物理ライブラリのマッピングを調べてください。

物理ライブラリに実際にパッケージがダンプされていることを確認してください。

別のバージョンのシミュレーターで別のバージョンのプリコンパイル済みヘッダーを使用していないことを確認してください。

何も機能しない場合は、ieeeのローカルコピーを作成し、std_logic_1164パッケージをコンパイルして、作業ライブラリに移動してから、デザインをコンパイルします。これ機能する必要があります。

于 2010-06-05T13:59:45.460 に答える