Alex77 12 November 2, 2023 Posted November 2, 2023 (edited) · Report post Дано вивадо 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 удел тестбенчей ? Edited November 3, 2023 by Alex77 Quote Share this post Link to post Share on other sites More sharing options...
andrew_b 30 November 3, 2023 Posted November 3, 2023 · Report post 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] Похоже, это ограничение синтезатора. Ищите описание этой ошибки в документации на синтезатор или Гугле. Quote Share this post Link to post Share on other sites More sharing options...
Alex77 12 November 3, 2023 Posted November 3, 2023 · Report post 3 и 4. Почему не эвивалентно? Можно подробнее ? с моей точки зрения "от перемены мест слагаемых сумма не изменяется" В 3 явно указано промежуточное деяние, а 4 не явное. Всего то. 1 и 2 а здесь то что ? "гугл" весьма загадошные ответы предлагает и "не в тему". А собственно что возвращает функция ? ведь как бы тип явно указан STD_LOGIC. Разве существуют "нечто" отличное от сигналов с таким типом ? Quote Share this post Link to post Share on other sites More sharing options...
andrew_b 30 November 3, 2023 Posted November 3, 2023 · Report post 3 hours ago, Alex77 said: 3 и 4. Почему не эвивалентно? Можно подробнее ? Я же всё написал: функция не может возвратить сигнал, который нужен другой функции. И тип STD_LOGIC тут ни при чём. Quote Share this post Link to post Share on other sites More sharing options...
Alex77 12 November 3, 2023 Posted November 3, 2023 · Report post Это "проблема" конкретной реализации функции или это "общее свойство" самой идеи функции ? Что по вашему возвращается из функции ? И почему через промежуточное присвоение работает , а на прямую не работает ? ПС: сегодня я "тёмный человек" ищу путь к свету знаний... Quote Share this post Link to post Share on other sites More sharing options...
andrew_b 30 November 5, 2023 Posted November 5, 2023 · Report post 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? Зачем оно нужно? Quote Share this post Link to post Share on other sites More sharing options...
Alex77 12 November 6, 2023 Posted November 6, 2023 · Report post Про функции: В "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 Quote Share this post Link to post Share on other sites More sharing options...
yes 23 November 7, 2023 Posted November 7, 2023 · Report post On 11/3/2023 at 4:58 PM, andrew_b said: Я же всё написал: функция не может возвратить сигнал, который нужен другой функции. И тип STD_LOGIC тут ни при чём. а вообще для моделирования логики в VHDL применяются ли boolean, bit_vector, integer и т.д. (то есть отличное от std_logic / slv)? как это понимается синтезаторами? и вообще - существует ли такая практика в VHDL проектах? все, что мне встречалось в коммерческих и опенсорсных проектах всегда использовало std_logic* , поэтому я тоже всегда использовал только эти типы (с соответствующими преобразованиями для арифметики и т.п.) Quote Share this post Link to post Share on other sites More sharing options...
Alex77 12 November 7, 2023 Posted November 7, 2023 · Report post вот и я с аналогичным вопросом (в самом конце первого поста): Ну и на десерт: можно ли (разумно ли) использовать BOOLEAN сигналы для построения "схемы" или у сигналов с типом BOOLEAN удел тестбенчей ? Quote Share this post Link to post Share on other sites More sharing options...
andrew_b 30 November 7, 2023 Posted November 7, 2023 · Report post 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 этого нет. Quote Share this post Link to post Share on other sites More sharing options...