Jump to content
    

Кто виноват и что делать или функции в 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 удел тестбенчей ?

Edited by Alex77

Share this post


Link to post
Share on other sites

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]

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

Share this post


Link to post
Share on other sites

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

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

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


 

Share this post


Link to post
Share on other sites

3 hours ago, Alex77 said:

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

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

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

Про функции:

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

Share this post


Link to post
Share on other sites

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

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

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

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


 

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...