Перейти к содержанию
    

Ошибка с преобразованиями типов

Доброго времени суток.

Прошу помочь разобраться с непонятной для меня ошибкой, подозреваю, что как-то связана с преобразованиями типов, но победить не могу. Собственно:

library IEEE; use IEEE.STD_LOGIC_1164.ALL;

use IEEE.STD_LOGIC_UNSIGNED.ALL;

.........

signal vADDR, tADDR: std_logic_vector (14 downto 0); --VRAM addresses

.........

case (vADDR(6) & vADDR(1)) is                         

when "00" =>                           

att_latch<=VDin(1 downto 0);

when "01" =>                     

att_latch<=VDin(3 downto 2);                         

when "10" =>                     

att_latch<=VDin(5 downto 4);                         

when others =>

att_latch<=VDin(7 downto 6);                     

end case;

..........

получаю ошибку (на операторе case)

Error (10327): VHDL error at ppuv2.vhd(290): can't determine definition of operator ""&"" -- found 2 possible definitions

перешерстил кучу зарубежных форумов, но разобраться не могу, понимаю, что проблема в том, что оператор определен для каких-то двух типов и квартус не может понять какой использовать, пробовал вручную делать разные преобразования типов - ничего не помогает.

 

 

 

 

Изменено пользователем serjz

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 часа назад, serjz сказал:

 

 

 

 

1. В VHDL нельзя делать конкатенацию в условии выбора case. Вводите переменную для промежуточной операции объединения:

variable my_signal : bit_vector(....);
...
my_signal := (vADDR(6) & vADDR(1));
...                     
case my_signal is 

2. Не советую применять IEEE.STD_LOGIC_UNSIGNED.ALL это не соответствует стандарту на VHDL.

3. Где у Вас тут вообще преобразования типов ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Уважаемый FF,

1. Где можно про это почитать, потому как сочетание допустим логических/арифметических операций и конкатенации в операторе case работает.. 

2. ок

3. Ну собственно я расценил выданную ошибку как невозможность анализатора определить тип операндов в операторе case для использования корректно операции конкатенации. Вот и назвал так тему....

ну и я в принципе не понимаю проблему с ипользованием конкатенации с операторе case с точки зрения синтеа - это должно превратится в мультиплексор, адресный вход которого просто присоединен к разным разрядам адресной шины

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

11 hours ago, Flip-fl0p said:

1. В VHDL нельзя делать конкатенацию в условии выбора case. Вводите переменную для промежуточной операции объединения:

Не правда, можно.

ТС:

2. Если Вы видите преимущество в их применении, то можно. Я лично предпочитаю следующую связку, нежели стандартную.

use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

3. Преобразования типов там действительно нету. 

4. Поднесите case либо под process со списком чувствительности, либо под generate. Например так:

process (vADDR, VDin)
begin
	case (vADDR(6)&vADDR(1)) is                         
	when "00" => att_latch<=VDin(1 downto 0);
	when "01" => att_latch<=VDin(3 downto 2);                         
	when "10" => att_latch<=VDin(5 downto 4);                         
	when others => att_latch<=VDin(7 downto 6);                     
	end case;
end process;

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, TRILLER сказал:

Не правда, можно.

ТС:

2. Если Вы видите преимущество в их применении, то можно. Я лично предпочитаю следующую связку, нежели стандартную.

use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

3. Преобразования типов там действительно нету. 

4. Поднесите case либо под process со списком чувствительности, либо под generate. Например так:


process (vADDR, VDin)
begin
	case (vADDR(6)&vADDR(1)) is                         
	when "00" => att_latch<=VDin(1 downto 0);
	when "01" => att_latch<=VDin(3 downto 2);                         
	when "10" => att_latch<=VDin(5 downto 4);                         
	when others => att_latch<=VDin(7 downto 6);                     
	end case;
end process;

1. Не буду спорить с Вами. Но только-что лично проверял в Quartus 13.1 VHDL2008:

Error (10327): VHDL error at  can't determine definition of operator ""&"" -- found 4 possible definitions

Но для bit_vector данная операция разрешена.

Может у Вас какой-то другой софт ?

2. Лично я за то, чтобы применять только стандартные VHDL библиотеки. К ним IEEE.STD_LOGIC_ARITH.ALL,  IEEE.STD_LOGIC_UNSIGNED.ALL не относятся. Но тут пусть каждый решает сам.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

14 часов назад, serjz сказал:

....ничего не помогает.

Есть радикальный вариант - перейти на верилог, там будет значительно проще с этими делами...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 часа назад, iosifk сказал:

перейти на верилог, там будет значительно проще с этими делами...

Там своих тараканов хватает.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

9 hours ago, Flip-fl0p said:

1. Не буду спорить с Вами. Но только-что лично проверял в Quartus 13.1 VHDL2008:


Error (10327): VHDL error at  can't determine definition of operator ""&"" -- found 4 possible definitions

Но для bit_vector данная операция разрешена.

Может у Вас какой-то другой софт ?

2. Лично я за то, чтобы применять только стандартные VHDL библиотеки. К ним IEEE.STD_LOGIC_ARITH.ALL,  IEEE.STD_LOGIC_UNSIGNED.ALL не относятся. Но тут пусть каждый решает сам.

Да, у меня симплифай - всё работает.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 часа назад, TRILLER сказал:

Да, у меня симплифай - всё работает.

Интересно. А что говорит стандарт на язык ? Не должны разные среды разработки по-разному понимать один стандарт.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Результатом выражения

19 часов назад, Flip-fl0p сказал:

vADDR(6)&vADDR(1)

является вектор, состоящий из двух элементов типа std_logic. Существует несколько типов, определённых как массив элементов типа std_logic (std_logic_vector, signed, unsigned), и синтезатор не может определить, какой тип вам нужен, так как варианты в case такой информации не дают. "00" тоже может быть любым из типов "массив элементов типа std_logic". В таких случая помогает явная квалификация типа:

std_logic_vector'(vADDR(6) & vADDR(1))

Но тут может возникнуть другая проблема: Case expression must be of a locally static subtype.

Case Expression Subtype

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 11/16/2018 at 9:45 PM, serjz said:

Доброго времени суток.

Прошу помочь разобраться с непонятной для меня ошибкой, подозреваю, что как-то связана с преобразованиями типов, но победить не могу. 

...

process(...)

variable sel_v : std_logic_vector(1 downto 0);

...

begin

sel_v := vADDR(6) & vADDR(1);

...

case sel_v is

when ...

...

end case;

...

end process;

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 hours ago, andrew_b said:

Результатом выражения

является вектор, состоящий из двух элементов типа std_logic. Существует несколько типов, определённых как массив элементов типа std_logic (std_logic_vector, signed, unsigned), и синтезатор не может определить, какой тип вам нужен, так как варианты в case такой информации не дают. "00" тоже может быть любым из типов "массив элементов типа std_logic". В таких случая помогает явная квалификация типа:


std_logic_vector'(vADDR(6) & vADDR(1))

Но тут может возникнуть другая проблема: Case expression must be of a locally static subtype.

Case Expression Subtype

Вы правы.

Я не посмотрел внимательно, а у меня в рабочем варианте как раз была конкатенация std_logic и std_logic_vector.

Прошу прощения, что внёс смуту :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...