Alex77 4 2 ноября, 2023 Опубликовано 2 ноября, 2023 (изменено) · Жалоба Дано вивадо 2023.2 library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.NUMERIC_STD.ALL; entity top is Port ( isReady : in boolean; iSig : in STD_LOGIC; oSig : out STD_LOGIC); end top; architecture Behavioral of top is signal fla : std_logic; function to_logic(x: in boolean) return std_logic is begin if x then return ('1'); else return ('0'); end if; end function to_logic; FUNCTION rising_bool (SIGNAL x : boolean) RETURN BOOLEAN IS BEGIN RETURN ((x'event AND x = true ) AND x'LAST_VALUE = false); END; begin process (isReady) begin --fla <= to_logic(isReady); -- 4 вариант --if rising_edge(fla) then -- 4 вариант --if rising_edge(to_logic(isReady)) then -- 3 вариант if rising_bool(isReady) then -- 1 вариант --if (isReady'event AND isReady = true ) AND isReady'LAST_VALUE = false then -- 2 вариант oSig <= iSig; end if; end process; end Behavioral; 1) линтер и elaborated отваливаются [Synth 8-26] attribute 'event not implemented ["C:/project_2/project_2.srcs/sources_1/new/top.vhd":26] синтез и имплемент НЕ проходят. 2) если if rising_bool(isReady) then заменит на if (isReady'event AND isReady = true ) AND isReady'LAST_VALUE = false then линтер и elaborated и синтез и имплемент проходят. Тут вопросов особо нет. 3) если применить if rising_edge(to_logic(isReady)) then то уже на уровне редактора сразу подчёркивает красным и говорит что error: signal formal 's' cannot be associated with type conversion of function call at actual синтез и имплемент НЕ проходят. Вопрос ЭТО глюк ? 4) если применить fla <= to_logic(isReady); if rising_edge(fla) then вообще никаких проблем Вопрос: Почему первый не работает, а второй работает ? Аналогично 3 не работает а 4 работает? Вроде всё эквивалентно, но результат "почему так" мне не понятно. Докучи: это поведение соответствует стандарту языка или это причуды вивадо ? ПС: альтера 22 в общем случае как минимум проглатывает 3 вариант пспс: в свойствах указал что VHDL2019. но это не влияет на результат. Надеюсь я нигде не ошибся в описании "проблемы"... Ну и на десерт: можно ли (разумно ли) использовать BOOLEAN сигналы для построения "схемы" или у сигналов с типом BOOLEAN удел тестбенчей ? Изменено 3 ноября, 2023 пользователем Alex77 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrew_b 17 3 ноября, 2023 Опубликовано 3 ноября, 2023 · Жалоба 9 hours ago, Alex77 said: Аналогично 3 не работает а 4 работает? Вроде всё эквивалентно, но результат "почему так" мне не понятно. 3 и 4 не эквивалентно. fla <= to_logic(isReady); if rising_edge(fla) then fla -- сигнал. rising_edge() принимает на вход сигнал. Всё корректно. if rising_edge(to_logic(isReady)) then rising_edge() принимает на вход сигнал. to_logic() не возвращает сигнал. Функция в VHDL в принципе не возвращает сигнал. Quote [Synth 8-26] attribute 'event not implemented ["C:/project_2/project_2.srcs/sources_1/new/top.vhd":26] Похоже, это ограничение синтезатора. Ищите описание этой ошибки в документации на синтезатор или Гугле. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Alex77 4 3 ноября, 2023 Опубликовано 3 ноября, 2023 · Жалоба 3 и 4. Почему не эвивалентно? Можно подробнее ? с моей точки зрения "от перемены мест слагаемых сумма не изменяется" В 3 явно указано промежуточное деяние, а 4 не явное. Всего то. 1 и 2 а здесь то что ? "гугл" весьма загадошные ответы предлагает и "не в тему". А собственно что возвращает функция ? ведь как бы тип явно указан STD_LOGIC. Разве существуют "нечто" отличное от сигналов с таким типом ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrew_b 17 3 ноября, 2023 Опубликовано 3 ноября, 2023 · Жалоба 3 hours ago, Alex77 said: 3 и 4. Почему не эвивалентно? Можно подробнее ? Я же всё написал: функция не может возвратить сигнал, который нужен другой функции. И тип STD_LOGIC тут ни при чём. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Alex77 4 3 ноября, 2023 Опубликовано 3 ноября, 2023 · Жалоба Это "проблема" конкретной реализации функции или это "общее свойство" самой идеи функции ? Что по вашему возвращается из функции ? И почему через промежуточное присвоение работает , а на прямую не работает ? ПС: сегодня я "тёмный человек" ищу путь к свету знаний... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrew_b 17 5 ноября, 2023 Опубликовано 5 ноября, 2023 · Жалоба On 11/3/2023 at 4:15 PM, Alex77 said: это "общее свойство" самой идеи функции Да. On 11/3/2023 at 4:15 PM, Alex77 said: Что по вашему возвращается из функции ? А что она возвращает, по-вашему, когда вы пишете return ('0'); Это что за объект и какие у него есть свойства? И почему тут FUNCTION rising_bool (SIGNAL x : boolean) RETURN BOOLEAN IS используется слово signal? Зачем оно нужно? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Alex77 4 6 ноября, 2023 Опубликовано 6 ноября, 2023 · Жалоба Про функции: В "IEEE Standard VHDL Language Reference Manual" IEEE Std 1076™-2008 мало что мне понятно. сложно написано. Посему и интересуюсь почему "так" работает а "эдак" нет. пока лично мне не понятно. Почему написано "вот так" FUNCTION rising_bool (SIGNAL x : boolean) RETURN BOOLEAN IS потому что написано/реализовано по аналогии с function rising_edge (signal s : std_ulogic) return boolean; из "стандартов библиотечных" std_logic_1164.vhdl Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
yes 8 7 ноября, 2023 Опубликовано 7 ноября, 2023 · Жалоба On 11/3/2023 at 4:58 PM, andrew_b said: Я же всё написал: функция не может возвратить сигнал, который нужен другой функции. И тип STD_LOGIC тут ни при чём. а вообще для моделирования логики в VHDL применяются ли boolean, bit_vector, integer и т.д. (то есть отличное от std_logic / slv)? как это понимается синтезаторами? и вообще - существует ли такая практика в VHDL проектах? все, что мне встречалось в коммерческих и опенсорсных проектах всегда использовало std_logic* , поэтому я тоже всегда использовал только эти типы (с соответствующими преобразованиями для арифметики и т.п.) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Alex77 4 7 ноября, 2023 Опубликовано 7 ноября, 2023 · Жалоба вот и я с аналогичным вопросом (в самом конце первого поста): Ну и на десерт: можно ли (разумно ли) использовать BOOLEAN сигналы для построения "схемы" или у сигналов с типом BOOLEAN удел тестбенчей ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrew_b 17 7 ноября, 2023 Опубликовано 7 ноября, 2023 · Жалоба 2 hours ago, yes said: а вообще для моделирования логики в VHDL применяются ли boolean, bit_vector, integer и т.д. (то есть отличное от std_logic / slv)? как это понимается синтезаторами? и вообще - существует ли такая практика в VHDL проектах? все, что мне встречалось в коммерческих и опенсорсных проектах всегда использовало std_logic* , поэтому я тоже всегда использовал только эти типы (с соответствующими преобразованиями для арифметики и т.п.) За всех не скажу. Я применяю только std_logic(_vector) (с желанием всё-таки перейти на std_ulogic(_vector)) и integer (а также natural и positive). Всё остальное только в тестбенчах. std_logic -- это 9-значная логика, где кроме 1 и 0 есть как мимнимум Z, а ещё удобны U, X и -. С ними некоторые ошибки видны сразу. В двузначных типах типа boolean этого нет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться