HDLParsers:800 Тип ** несовместим с типом **

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 несовместим с типом «0». ОШИБКА: HDLParsers: 800 Тип decoded_address несовместим с типом «1». ОШИБКА: HDLParsers: 800 Тип decoded_address несовместим с типом «2». ОШИБКА: HDLParsers: 800 Тип decoded_address несовместим с типом «3». ОШИБКА: HDLParsers: 800 Тип decoded_address несовместим с типом «4».

Это потому, что адрес и decoded_address являются двумя разными типами данных? Любая идея о том, как избавиться от этой ошибки?


person vineel13    schedule 31.12.2014    source источник
comment
Это не потому, что address и decoded_address — разные типы, а потому, что decoded_address и «1», «2», «3» и «4» — разные типы: вы пытаетесь присвоить символ целочисленному сигналу.   -  person mfro    schedule 31.12.2014
comment
удалите одинарные кавычки из «0», «1», «2», «3» и «4». Тип decoded_address — это целое число, которому вы пытаетесь присвоить символьные литералы. Вместо этого назначьте числовые литералы, совместимые с ограничением диапазона decoded_address. В общем, хорошей рабочей практикой является анализ спецификации проекта в ISIM или Modelsim перед XST, где сообщения об ошибках иногда могут быть не такими ясными, как это.   -  person    schedule 31.12.2014
comment
@DavidKoontz: Ваш комментарий касается точной проблемы в вопросе, поэтому не лучше ли опубликовать это как ответ, а не комментарий, чтобы другие могли видеть, что на вопрос есть ответ, и тогда он может быть правильно закрыт?   -  person Morten Zilmer    schedule 31.12.2014
comment
Ваш компонент выполняет простое преобразование типов для двоично-кодированных чисел. Это можно переписать одной строкой: decoded_address <= to_integer(unsigned(address)); Так что, если ваш компонент теперь имеет только одну строку кода, вы должны сэкономить ее.   -  person Paebbels    schedule 31.12.2014
comment
удаление одинарных кавычек действительно помогло. Спасибо   -  person vineel13    schedule 31.12.2014


Ответы (2)


Этот ответ предоставляется, потому что другие 7 вхождений ERROR:HDLParsers:800 в Stackoverflow не включают литералы, назначенные целочисленным типам, и Мортен считает, что фактический ответ на вопрос может быть ценным. Ближайший соответствующий вопрос с ответом (см. переменная» несовместима с типом ‹=) включает целочисленную цель присваивания с литеральным значением битовой строки).

В этом операторе 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';

Показанная часть инструкции 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 назначает числовые литералы (совместимые с типом integer) для decoded_address. Обратите внимание, что все пять значений попадают в ограничение диапазона decode_address.

person Community    schedule 31.12.2014

Кроме того, кроме ответа @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;

и никогда не забывал охватить все условия.


Кстати, я не знаю, является ли это лекционным заданием или нет, но вы можете использовать

decoded_address <= to_integer(unsigned(address));

конечно нужно добавить use ieee.numeric_std.all

person ytukel    schedule 31.12.2014