2017-03-07 20 views
0

整数からSTD_LOGIC_VECTORを減算する際に問題があります。問題は、次のコード行である整数からstd_logic_vectorを減算する

entity ROM is 
    Port ( hcount: in STD_LOGIC_VECTOR(9 downto 0); 
      vcount: in STD_LOGIC_VECTOR(9 downto 0); 
      hpos: in integer; 
      vpos: in integer; 
      clk25: in STD_LOGIC; 
      Pixeldata: out std_logic); 
end ROM; 

architecture Behavioral of ROM is 

signal romtemp : std_logic_vector(9 downto 0); 
shared variable yas : integer range 0 to 9 := 0; 
shared variable xas : integer range 0 to 9 := 0; 

Type RomType is array (9 downto 0) of std_logic_vector(9 downto 0); 
    Constant Rom: RomType := 
    ("0001111000", "0111111110", "0111111110", "1111111111", "1111111111" 
    , "1111111111", "1111111111", "0111111110", "0111111110", "0001111000"); 

begin 
process(clk25) 
begin 
    if(hpos > hcount - 10) and (hpos <= hcount) and (vpos > vcount - 10) and (vpos <= vcount) then 
    xas := hpos - to_integer(unsigned(hcount)); 

    end if; 

end process; 
end Behavioral; 

xas := hpos - to_integer(unsigned(hcount)); 

私はXASという名前の整数で減算を入れしようとしています

これは私が今持っているコードです。

次のエラーがその行に発生します。このエラーで私を助けることができる

Error: Multiple declarations of unsigned included via multiple use clauses; none are made directly visible

Error: Expecting type unsigned for < unsigned(hcount) >.

Error: Formal < arg > has no actual or default value.

Error: Type integer is not an array type and cannot be indexed

Error: found '0' definitions of operator "=", cannot determine exact overload matching definition for "-"

誰か?あなたは、ファイルの先頭にあなたのuse条項が含まれていない

答えて

3

(私はVHDLで初心者です)が、何このエラーが言っていることはuse句から、それはunsignedの二つの異なる定義を見つけたことです。このため、このツールでは両方の定義が無視され、エラーが発生し、問題に対処する必要があります。

最も可能性のある説明は、あなたが持っているということです。

use ieee.numeric_std.all; 
use ieee.std_logic_arith.all; 

std_logic_arithは標準では、そしてあなただけnumeric_stdで利用可能なタイプと関数を使用してデザインを実装する必要があります。 std_logic_arith行を削除します。

一般に、何かが数字の場合は、それを表す数値型を使用します。たとえば、hcountvcountの入力は明らかにカウンタであり、タイプunsignedを使用できます。

xas := hpos - to_integer(unsigned(hcount)); 

は、あなたのコード内の

xas := hpos - hcount; 

追加の問題になるだろう:あなたが最初の場所で、より適切な型を使用する場合は、例えば、ぎこちない探しの型変換の必要性を回避

  • プロセス感度リストにはclk25しか含まれていませんが、プロセスは実際には同期prしたがって、使用されるすべての入力信号がリストに含まれている必要があります(または予約済みのallキーワードを使用して自動リストを生成することができます。つまり、process(all))。
  • これが特別なケースでない限り、同期プロセスを作成する方がよいです。これらは、次のようになります。

process(clk) 
begin 
    if (rising_edge(clk)) then 
    -- Do things 
    end if; 
end process; 

  • xasは、あなたが同様に他のプロセスでそれを割り当てる可能性があることを意味し、共有変数、です。これはおそらくそれが期待どおりに動作しません。正確にどのように動作しているか、それらを使用するのが適切かどうかをよく理解するまで、共用変数は完全に避けてください。
+1

最後の項目は非常に重要です。あなたが何をしているのか分からない限り、共有変数を使わないでください。プロセススコープ内で変数を使用するか、アーキテクチャスコープ内のシグナルを使用します。それがあなたが達成しようとしているもののためにうまくいかなければ、あなたは別のプログラミング言語から来ていると思います。 VHDLはハードウェア設計言語です。コードでは多くのことが可能ですが、結局はレジスタやロジックとして考える必要があります。たとえば伝搬遅延ゼロのように、すべてが可能ではありません。 – JHBonarius

関連する問題