2017-03-07 47 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 "-"

有人可以幫助我這個錯誤? (我在VHDL初學者)

回答

3

您沒有在文件的頂部包含您的use條款,但這個錯誤是什麼的意思是,從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,但該進程實際上並不是同步進程ocess,並且因此所有的使用應該是在列表中(或者可以使用保留的all關鍵字來生成自動列表,即process(all))的輸入信號。
  • 除非這是一些特殊的情況下,你最好進入編寫同步過程的習慣。這些看起來是這樣的:

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

  • xas是一個共享變量,這意味着你可能在其他進程進行分配的。這可能不會如你所期望的那樣工作。你應該避免共享變量完全,直到你有他們究竟是如何工作的一個很好的瞭解,當它可能是適當的使用它們。
+1

最後一項非常重要。儘量不要使用共享變量,除非你知道你在做什麼。在流程範圍中使用變量,或者在體系結構範圍內使用信號。如果這不符合你想要達到的目標,那麼我希望你來自不同的編程語言。 VHDL是一種硬件設計語言:代碼中可能存在很多,但最終還是需要將其視爲寄存器和邏輯。並非一切都可能存在,例如零傳播延遲。 – JHBonarius