2017-03-07 5 views
0

정수에서 STD_LOGIC_VECTOR을 빼는 데 문제가 있습니다. 내가 정수의 이름 XAS에서 빼기를 넣어하려고정수에서 std_logic_vector를 뺍니다.

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

:

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; 

문제는 다음 코드 줄은 다음과 같습니다

내가 지금 가지고있는 코드입니다.

다음과 같은 오류가 그 라인에서 발생 :이 오류와 함께 나를 도울 수

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이 아닙니다. ocess이므로 사용 된 모든 입력 신호가 목록에 있어야합니다 (또는 예비 all 키워드를 사용하여 자동 목록을 생성 할 수 있습니다 (예 : process(all)).
  • 이 특별한 경우가 아니라면 동기식 프로세스를 작성하는 습관에 빠져있는 것이 좋습니다. 이는 다음과 같습니다 :

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

  • xas 당신이뿐만 아니라 다른 프로세스에 할당 될 수 있음을 의미 공유 변수입니다. 이것은 아마도 당신이 그것을 기대하는 방식으로 작동하지 않을 것입니다. 정확히 어떻게 작동하는지, 그리고 그 변수를 사용하는 것이 적절한지를 알기까지는 공유 변수를 모두 피해야합니다.
+1

마지막 항목은 매우 중요합니다. 자신이하는 일을 모르는 경우 공유 변수를 사용하지 마십시오. 프로세스 범위에서 변수를 사용하거나 아키텍처 범위에서 신호를 사용하십시오. 그것이 당신이 성취하려는 것을 위해 효과가 없다면, 나는 당신이 다른 프로그래밍 언어에서 왔음을 기대한다. VHDL은 하드웨어 디자인 언어입니다. 코드에서 많은 것이 가능하지만 결국에는 레지스터와 로직으로 생각해야합니다. 예를 들어 전파 지연이 0과 같이 모든 것이 가능한 것은 아닙니다. – JHBonarius