22

2つのstd_logic_vectorsを追加する単純なモジュールが必要です。ただし、以下のコードを+演算子で使用すると、合成されません。

library IEEE; 
use IEEE.std_logic_1164.all;
use IEEE.std_logic_arith.all;

entity add_module is
        port(
  pr_in1   : in std_logic_vector(31 downto 0);
  pr_in2   : in std_logic_vector(31 downto 0);
  pr_out   : out std_logic_vector(31 downto 0)  
        );
end add_module;

architecture Behavior of add_module is

begin

    pr_out <= pr_in1 + pr_in2;

end architecture Behavior;

XSTから受け取るエラーメッセージ

17行目+は、このコンテキストではそのようなオペランドを持つことはできません。

図書館が恋しいですか?可能であれば、入力を自然数に変換したくありません。

どうもありがとう

4

4 に答える 4

27

std_logic_vectors が signed か unsigned かをコンパイラにどのように認識させますか? Adder の実装はこれら 2 つのケースで同じではないため、コンパイラに何をしたいかを明示的に伝える必要があります ;-)

注: StackOverflow での VHDL 構文の強調表示は適切ではありません。このコードをお好みの VHDL エディターにコピー アンド ペーストすると、読みやすくなります。

library IEEE; 
use IEEE.std_logic_1164.all;
-- use IEEE.std_logic_arith.all; -- don't use this
use IEEE.numeric_std.all; -- use that, it's a better coding guideline

-- Also, never ever use IEEE.std_unsigned.all or IEEE.std_signed.all, these
-- are the worst libraries ever. They automatically cast all your vectors
-- to signed or unsigned. Talk about maintainability and strong typed language...

entity add_module is
  port(
    pr_in1   : in std_logic_vector(31 downto 0);
    pr_in2   : in std_logic_vector(31 downto 0);
    pr_out   : out std_logic_vector(31 downto 0)  
  );
end add_module;

architecture Behavior of add_module is
begin

  -- Here, you first need to cast your input vectors to signed or unsigned 
  -- (according to your needs). Then, you will be allowed to add them.
  -- The result will be a signed or unsigned vector, so you won't be able
  -- to assign it directly to your output vector. You first need to cast
  -- the result to std_logic_vector.

  -- This is the safest and best way to do a computation in VHDL.

  pr_out <= std_logic_vector(unsigned(pr_in1) + unsigned(pr_in2));

end architecture Behavior;
于 2010-10-28T12:30:20.620 に答える
5

使用しないでくださいstd_logic_arith-私はこれについて書いています(ある程度の長さです:)。

numeric_std を使用してください。また、エンティティ ポートで適切なタイプを使用してください算術演算を行う場合は、数値型 (必要に応じて整数または (符号なし) ベクトルのいずれか) を使用します。それらは完全にうまく合成されます。

std_logic_vectorは良いです

  • 数値を気にしない場合 (一連の制御ビット、いくつかのランダム データ ビット)
  • 入力のタイプがわからない場合(制御フラグに基づいて符号付き数値と符号なし数値の両方を操作できる加算器など)。
于 2010-11-02T14:08:33.317 に答える
0

numeric_std を使用するための @Aurelien からの良いアドバイス。

2 つの 32 ビット値を加算すると 33 ビット値になり、オーバーフローの処理方法を決定できることに注意してください。

于 2010-10-28T13:02:52.623 に答える
-2

このエラーを解決する簡単な方法は
、unsign のライブラリを追加
することです。その後、コードが機能し始めます。

使用する

ieee.std_logic_unsigned.all;
pr_out <= pr_in1 + pr_in2;
于 2016-09-21T07:13:25.750 に答える