serjz 0 16 ноября, 2018 Опубликовано 16 ноября, 2018 (изменено) · Жалоба Доброго времени суток. Прошу помочь разобраться с непонятной для меня ошибкой, подозреваю, что как-то связана с преобразованиями типов, но победить не могу. Собственно: 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 перешерстил кучу зарубежных форумов, но разобраться не могу, понимаю, что проблема в том, что оператор определен для каких-то двух типов и квартус не может понять какой использовать, пробовал вручную делать разные преобразования типов - ничего не помогает. Изменено 16 ноября, 2018 пользователем serjz Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
wolfman 0 16 ноября, 2018 Опубликовано 16 ноября, 2018 · Жалоба "&" в VHDL это конкатенация, возможно вам нужно использовать "AND". Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Flip-fl0p 4 16 ноября, 2018 Опубликовано 16 ноября, 2018 · Жалоба 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. Где у Вас тут вообще преобразования типов ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
serjz 0 17 ноября, 2018 Опубликовано 17 ноября, 2018 · Жалоба Уважаемый FF, 1. Где можно про это почитать, потому как сочетание допустим логических/арифметических операций и конкатенации в операторе case работает.. 2. ок 3. Ну собственно я расценил выданную ошибку как невозможность анализатора определить тип операндов в операторе case для использования корректно операции конкатенации. Вот и назвал так тему.... ну и я в принципе не понимаю проблему с ипользованием конкатенации с операторе case с точки зрения синтеа - это должно превратится в мультиплексор, адресный вход которого просто присоединен к разным разрядам адресной шины Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
TRILLER 0 17 ноября, 2018 Опубликовано 17 ноября, 2018 · Жалоба 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; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Flip-fl0p 4 17 ноября, 2018 Опубликовано 17 ноября, 2018 · Жалоба 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 не относятся. Но тут пусть каждый решает сам. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iosifk 3 17 ноября, 2018 Опубликовано 17 ноября, 2018 · Жалоба 14 часов назад, serjz сказал: ....ничего не помогает. Есть радикальный вариант - перейти на верилог, там будет значительно проще с этими делами... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrew_b 14 17 ноября, 2018 Опубликовано 17 ноября, 2018 · Жалоба 4 часа назад, iosifk сказал: перейти на верилог, там будет значительно проще с этими делами... Там своих тараканов хватает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
TRILLER 0 17 ноября, 2018 Опубликовано 17 ноября, 2018 · Жалоба 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 не относятся. Но тут пусть каждый решает сам. Да, у меня симплифай - всё работает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Flip-fl0p 4 17 ноября, 2018 Опубликовано 17 ноября, 2018 · Жалоба 3 часа назад, TRILLER сказал: Да, у меня симплифай - всё работает. Интересно. А что говорит стандарт на язык ? Не должны разные среды разработки по-разному понимать один стандарт. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrew_b 14 18 ноября, 2018 Опубликовано 18 ноября, 2018 · Жалоба Результатом выражения 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
quato_a 3 18 ноября, 2018 Опубликовано 18 ноября, 2018 · Жалоба 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; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
TRILLER 0 18 ноября, 2018 Опубликовано 18 ноября, 2018 · Жалоба 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. Прошу прощения, что внёс смуту :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться