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

Кто виноват и что делать или функции в VHDL

Дано вивадо 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 удел тестбенчей ?

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

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


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

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]

Похоже, это ограничение синтезатора. Ищите описание этой ошибки в документации на синтезатор или Гугле.

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


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

3 и 4. Почему не эвивалентно? Можно подробнее ? с моей точки зрения "от перемены мест слагаемых сумма не изменяется" В 3 явно указано промежуточное деяние, а 4 не явное. Всего то.

1 и 2  а здесь то что ? "гугл" весьма загадошные ответы предлагает и "не в тему".

А собственно что возвращает функция ? ведь как бы тип явно указан STD_LOGIC. Разве существуют "нечто" отличное от сигналов с таким типом ?


 

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


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

3 hours ago, Alex77 said:

3 и 4. Почему не эвивалентно? Можно подробнее ?

Я же всё написал: функция не может возвратить сигнал, который нужен другой функции. И тип STD_LOGIC тут ни при чём.

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


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

Это "проблема" конкретной реализации функции или это "общее свойство" самой идеи функции ? Что по вашему возвращается из функции ? И почему через промежуточное присвоение работает , а на прямую не работает ?

ПС: сегодня я "тёмный человек" ищу путь к свету знаний...

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


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

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? Зачем оно нужно?

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


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

Про функции:

В "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

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


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

On 11/3/2023 at 4:58 PM, andrew_b said:

Я же всё написал: функция не может возвратить сигнал, который нужен другой функции. И тип STD_LOGIC тут ни при чём.

а вообще для моделирования логики в VHDL применяются ли boolean, bit_vector, integer и т.д. (то есть отличное от std_logic / slv)? как это понимается синтезаторами? и вообще - существует ли такая практика в VHDL проектах? 

все, что мне встречалось в коммерческих и опенсорсных проектах всегда использовало std_logic* , поэтому я тоже всегда использовал только эти типы (с соответствующими преобразованиями для арифметики и т.п.)


 

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


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

вот и я с аналогичным вопросом (в самом конце первого поста):

Ну и на десерт: можно ли (разумно ли) использовать BOOLEAN сигналы для построения "схемы" или у сигналов с типом BOOLEAN удел тестбенчей ?

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


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

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 этого нет.

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


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

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

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

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

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

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

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

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

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

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