Какой конкретный сигнал в списке чувствительности запускает процесс в VHDL

Я делаю проект на VHDL и застрял на этом этапе. Любая помощь приветствуется. Проблема описывается следующим образом: у меня есть 2D-массив с N (числом) сигналов std_logic_vector. Число N определено в дженериках, поэтому мы не знаем конкретную длину массива (вместо этого мы используем N). Этот массив используется как список чувствительности процесса для его запуска. Вот так: process(arrayOfSignals)

Мой вопрос: есть ли способ узнать, какой конкретный сигнал массива запустил процесс? (Например, сигнал: arrayOfSignals(2))

Я видел этот пост: Какой сигнал в списке чувствительности запускает процесс, но здесь это не так. Это было бы так, если бы все сигналы их списка чувствительности находились внутри массива, и этот массив запускал процесс.

Чтобы стало ясно, ниже приведен код VHDL того, что я пытаюсь сделать.

process(arrayOfSignals)
    begin
    for i in 0 to N-1 loop
        if arrayOfSignals(i)'transaction'event then --I want to determine which signal of arrayOfSignals (position in the array) triggerd the process.
         case arrayOfSignals(i) is
             when "01" =>
                 AD(i)(30 downto 23) <= AD(i)(7 downto 0);
                 exit;
             when others => null; exit;
         end case;
         exit;
        end if;
    end loop;
    end process;

person spisams    schedule 10.07.2021    source источник
comment
Прежде всего, какова конечная цель здесь? ни один из кодов не синтезируется и не может быть преобразован в логику. Вы намерены, чтобы это был только код моделирования?   -  person Tricky    schedule 11.07.2021
comment
Учитывая ваше объяснение - 'transaction'event должен делать то, что вы ищете. Процесс запускается 'event для любого сигнала в списке чувствительности, поэтому любое изменение любого бита в сигнале arrayOfSignals запустит процесс, и вы можете использовать 'transaction'event, чтобы определить, в каких из них произошло событие.   -  person Tricky    schedule 11.07.2021
comment
-arrayOfSignals'transaction'event возвращает True, если какой-либо сигнал во всем массиве запускает процесс. В моем случае я хочу найти конкретный сигнал в массиве, который запускает процесс. arrayOfSignals(i)'transaction'event не работает, но я написал это выше, чтобы показать вам, что я хочу сделать.   -  person spisams    schedule 11.07.2021
comment
Вышеуказанное должно работать. Можете ли вы описать, как это не работает и какой инструмент и т. д.?   -  person Tricky    schedule 11.07.2021
comment
Я использую вивадо. arrayOfSignals(i)'transaction'event подчеркнуто как ошибка, поэтому не работает. Ошибка простыми словами говорит о том, что атрибут 'transaction'event должен использоваться только для статических значений, а не для индексированных значений.   -  person spisams    schedule 11.07.2021
comment
Да, вы правы (я забыл о правилах статического именования). Для этого вам, вероятно, понадобится цикл генерации, чтобы вы могли поместить каждый arrayOfSignals(i) в свой собственный процесс, чтобы вы могли обнаружить event. Но вы так и не объяснили контекст. То, что вы делаете, кажется гораздо более сложным, чем должно быть.   -  person Tricky    schedule 11.07.2021
comment
Что ж, это подпроект более крупного проекта, над которым мы работаем в моем университете. В этой части мне дали файл VHDL, в котором всего было 6 портов. Каждый порт имел тип std_logi_vector. Что я должен сделать, так это обобщить его, чтобы использовать с N портами (объявленными в дженериках). Теперь в исходном файле было 6 процессов (по одному на каждый порт), которые запускались при изменении порта, за который они отвечали. Чтобы стало ясно, у процесса 1 был только 1-й порт в качестве списка чувствительности, у процесса 2 был 2-й порт и т. д.   -  person spisams    schedule 11.07.2021
comment
Поскольку мне нужно было обобщить его, сначала я сделал массив std_logic_vectors в качестве порта (я не уверен, что это допустимо для синтеза). Во-вторых, я хотел преобразовать логику для каждого процесса. Итак, я сделал один процесс, который имел этот массив в качестве списка чувствительности, а затем мне нужно было найти, какой сигнал (порт) изменился, чтобы выполнить соответствующие строки кода. Я надеюсь, что это объясняет контекст.   -  person spisams    schedule 11.07.2021
comment
Но зачем вам знать, что изменилось? почему вы не можете просто применять все выходы на ВСЕХ портах каждый раз, когда что-то меняется? У вас есть принципиальная схема ожидаемой цепи? Ваш код выглядит как программа, но я подозреваю, что вы пытаетесь описать аппаратное обеспечение. Вы должны знать схему, прежде чем пытаться писать код.   -  person Tricky    schedule 11.07.2021
comment
Изменение следует применять только тогда, когда соответствующий сигнал изменил свое значение. Кроме того, изменения, которые необходимо выполнить, различны для каждого случая (приведенный выше код является образцом, а не всей программой). Итак, я не должен применять все изменения.   -  person spisams    schedule 11.07.2021
comment
Думаю, я нашел решение. Я использовал атрибут 'last_value, который возвращает предыдущее значение одного сигнала (до изменения). Таким образом, я сравниваю все текущие значения массива с предыдущими и должен получить требуемый результат. Проблема сейчас в том, можно ли все это синтезировать. Потому что я прочитал здесь: xilinx.com/support/ documentation/sw_manuals/xilinx2019_2/, что я не могу использовать массивы std_logic_vector в качестве портов. Хотя, в другом посте здесь говорят, что это можно сделать даже в VHDL93.   -  person spisams    schedule 11.07.2021
comment
Пожалуйста, извините меня, если я скажу что-то не так, это потому, что я делаю свои первые шаги в аппаратном обеспечении.   -  person spisams    schedule 11.07.2021
comment
Использование подобных атрибутов не может быть синтезировано и не будет производить аппаратное обеспечение. Кроме того, как правило, не рекомендуется использовать циклы и выход, пока вы не поймете последствия для аппаратного обеспечения. Вы создали принципиальную схему логической схемы, которую намеревались создать? Код, который вы разместили, подразумевает, что у вас есть знания в области программирования - HDL требуют, чтобы вы забыли, что вы знаете о программировании, и вместо этого изучили цифровую логику. HDL, написанные в программном стиле, приведут к тому, что код будет работать с плохим оборудованием или вообще не будет компилироваться.   -  person Tricky    schedule 11.07.2021
comment
Ну, я понимаю, что не имеет особого смысла иметь массив STD_LOGIC_VECTOR в качестве порта в чипе, и я бы не стал его использовать, если бы был какой-то альтернативный способ. Но так как мне нужно создать чип с неизвестным количеством портов (определено в дженериках), я создал массив, включающий их все. Это имеет смысл с точки зрения программного обеспечения, но, как вы подтвердили, это проблема аппаратного обеспечения. Теперь, когда я знаю, что его нельзя синтезировать, я точно застрял. Я попрошу более подробной информации, потому что мы работаем над этим как команда в моем университете и вернемся, чтобы обсудить на новой базе.   -  person spisams    schedule 11.07.2021
comment
Спасибо за информацию, вы очень помогли. Извините еще раз за мое плохое знание логики аппаратного программирования.   -  person spisams    schedule 11.07.2021
comment
Массивы std_logic_vector очень распространены. Как и неизвестное их количество. Но ваш код довольно уникален.   -  person Tricky    schedule 12.07.2021


Ответы (1)


Я не знаю, как сделать именно то, что вы просите. Но позвольте мне предложить способ сделать то, что, как я думаю, вы пытаетесь сделать. Как правило, если вы хотите обнаружить изменение в сигнале, вы должны иметь синхронизированный процесс и сделать зарегистрированную копию сигнала. Затем вы можете сравнить состояние вашего входного сигнала с вашей зарегистрированной копией (для каждого элемента), и если они не равны, вход изменился, и вы можете запустить свою логику.

person blueshift    schedule 13.07.2021