Кой конкретен сигнал в списъка с чувствителност задейства процес във 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