2014-12-31 2 views
0
entity address_decoder is 
PORT(address : in STD_LOGIC_VECTOR (0 to 3); 
    decoded_address : out integer range 0 to 15); 
end address_decoder; 

architecture dataflow of address_decoder is 
begin 
PROCESS(address) 
begin 
    if address = "0000" then decoded_address <= '0'; 
    elsif address = "0001" then decoded_address <= '1'; 
    elsif address = "0010" then decoded_address <= '2'; 
    elsif address = "0011" then decoded_address <= '3'; 
    elsif address = "0100" then decoded_address <= '4'; 

의 유형과 호환되지 않습니다 '. 오류 : HDLParsers : 800 decoded_address 유형이 '1'유형과 호환되지 않습니다. 오류 : HDLParsers : 800 decoded_address 유형이 '2'유형과 호환되지 않습니다. 오류 : HDLParsers : 800 decoded_address 유형이 '3'유형과 호환되지 않습니다. 오류 : HDLParsers : 800 decoded_address 유형이 '4'유형과 호환되지 않습니다.HDLParsers : HDLParsers : decoded_address 800 유형 0 '의 형식과 호환되지 않는 "**"800 유형 "**"이</p> <p>오류를 오는 오류가

주소와 디코딩 된 주소가 서로 다른 두 가지 데이터 유형입니까? 이 오류를 제거하는 방법에 대한 아이디어가 있습니까?

+1

이없는 주소 때문에입니다 및 decoded_address는 다른 유형입니다. 왜냐하면 decoding_address와 '1', '2', '3'및 '4'가 서로 다른 유형이기 때문입니다. 문자를 정수 신호에 할당하려고합니다. – mfro

+2

'0', '1', '2', '3'및 '4'에서 작은 따옴표를 제거하십시오. decoded_address 유형은 문자 리터럴을 할당하려고하는 정수입니다. 대신 numerated_address의 범위 제약 조건과 호환되는 숫자 리터럴을 할당하십시오. 일반적으로 XST 이전의 ISIM 또는 Modelsim에서 설계 사양을 분석하는 것이 좋으며, 오류 메시지가이 경우 명확하지 않을 수 있습니다. – user1155120

+0

@DavidKoontz : 귀하의 의견은 질문에서 정확한 문제를 다루기 때문에 의견 대신 답변으로 게시하는 것이 좋지 않으므로 다른 사람들이 질문에 답변이 있음을 알게되고 제대로 닫힐 수 있습니다. ? –

답변

1

Stackoverflow에서 ERROR:HDLParsers:800의 다른 7 번 발생에는 정수 유형에 할당 된 리터럴이 포함되지 않으므로 Muten은 질문에 대한 실제 답변이 가치 있다고 생각하므로이 대답이 제공됩니다. 가장 가까운 일치하는 질문과 대답 (VHDL: Type of “variable” is incompatible with type of <= 참조)에는 비트 문자열 리터럴 값이있는 정수 할당 대상이 포함됩니다. 이것으로

는 문 (누락 경우 단) 경우 :

if address = "0000" then decoded_address <= '0'; 
elsif address = "0001" then decoded_address <= '1'; 
elsif address = "0010" then decoded_address <= '2'; 
elsif address = "0011" then decoded_address <= '3'; 
elsif address = "0100" then decoded_address <= '4'; 

는 IF 같아야 도시 문 부 :

if address = "0000" then decoded_address <= 0; 
elsif address = "0001" then decoded_address <= 1; 
elsif address = "0010" then decoded_address <= 2; 
elsif address = "0011" then decoded_address <= 3; 
elsif address = "0100" then decoded_address <= 4; 

제약으로 선언 decode_address 사이 형식 불일치 거기 0 ~ 15 범위의 정수 및 '0', '1', '2', '3'및 '4'문자 리터럴을 사용합니다.

수정 된 if 문은 숫자 리터럴 (정수 유형과 호환 가능)을 decoded_address에 할당합니다. 5 개의 값은 모두 decode_address의 범위 제약에 해당합니다.

0

또한 @David Koontz 대답을 제외하고는 case 문을 대신 사용할 수 있습니다.

case address is when "0000" => decoded_address <= 0; when "0001" => decoded_address <= 1; when "0010" => decoded_address <= 2; when "0011" => decoded_address <= 3; when others => decoded_address <= 4; end case;

결코 모든 조건을 포함하는 것을 잊었다.


BTW, 나는 그것이 강의 할당인지 모르거나하지하지만 당신은 추가 할 필요가

물론 decoded_address <= to_integer(unsigned(address));

사용할 수 없습니다 use ieee.numeric_std.all