Как работи присвояването на сигнали в процес?

Научих, че сигналът не се променя веднага, когато срещне израз, а когато процесът приключи. В този пример тук:

...
signal x,y,z : bit;
...
process (y)
begin
  x<=y;
  z<=not x;
end process;

Примерът казва следното:

Ако сигналът y се промени, тогава ще бъде планирано събитие на x, за да стане същият като y. Също така, събитие е планирано на z, за да го направи обратното на x. Въпросът е дали стойността на z ще бъде противоположна на y? Разбира се, отговорът е не, защото когато се изпълни вторият оператор, събитието на x все още не е обработено и събитието, планирано на z, ще бъде обратното на стойността на x преди началото на процеса.

Е, трябва да разбера някои неща:

  1. От това, което научих, стойностите на сигналите се актуализират само в края на процеса. Дали това е правилно?
  2. Сигналът x се актуализира като първия израз. Това все още не променя стойността на x, тази промяна се поставя в опашка, за да се изпълни след приключване на процеса. Така че всичко след този оператор x <= y няма да види промяната и ще види x със старата си стойност. Дали това е правилно?
  3. Второто изявление е опит за промяна на стойността на сигнала z. Същото тук, z няма да промени стойността си, но зависи от стойността на друг процес. Промяната на z ще бъде поставена на опашка, за да бъде изпълнена в края на процеса. Дали това е правилно?

Какво се случва в края на процеса?

Възможност номер 1) Стойността в x се променя, така че x има своята нова стойност. Вторият сигнал z е актуализиран, първият сигнал x е актуализиран и като се има предвид, че z зависи от x, стойността му се променя въз основа на НОВОТО АКТУАЛИЗИРАНА стойност на x. И примерът трябва да работи добре.

Възможност номер 2) Стойността в x се променя, така че x има своята нова стойност. Вторият сигнал z се актуализира. Като се има предвид, че на z беше присвоена стара стойност от x, това е стойността, която z ще съдържа, старата стойност от x, която беше актуализирана, но тази актуализация не се взема предвид.

Бихте ли ми казали кой е правилният начин?


person Andry    schedule 20.02.2011    source източник


Отговори (3)


Променливите се актуализират, докато ги задавате. Сигналите се актуализират в следващия делта цикъл (най-рано).

a := '1'; -- variable
assert a = 1;
b <= '1'; -- signal
computationUsing(b); --reads old value of b
-- new value will be visible after this process ends or some time passes

Jan Decaluwe обяснява тези неща по-подробно тук: http://www.sigasi.com/content/vhdls-crown-jewel

person Philippe    schedule 21.02.2011
comment
Благодаря, Филип, сега е малко по-добре, но все още не разбирам защо примерът не работи. Искам да кажа, първият израз се опитва да присвои на x te стойност на y. Добре, това присвояване се прави в края на процеса, така че когато използвам сигнала x отново за актуализиране на друг сигнал, нямам стойността на този сигнал. Предполагам, че всички изрази за обработка на сигнали се съхраняват в опашка, така че да се обработват в края на процеса. В края на процеса се разглежда опашката за присвояване на сигнали и се актуализира x, а след него се актуализира и z.... какво бъркам? - person Andry; 21.02.2011
comment
@Andry Планираната стойност на сигнал може да бъде презаписана чрез последователно присвояване на сигнал по-късно в процеса. - person Jan Decaluwe; 21.02.2011
comment
@Jan, много съжалявам, Jan, но продължавам да не разбирам. Може би този аргумент ми е труден за разбиране или... не знам. Просто бих искал да разбера защо този пример не работи, моля, вижте моите редакции. - person Andry; 21.02.2011
comment
@Andry: какво не получаваш? Това е това, което сте очертали във вашата Възможност (2) по-горе. z получава стойността си въз основа на старата стойност на x, защото не вижда новата стойност - person N.S.; 06.12.2018

Начинът, по който работи:

Y се променя и процесът започва.

X ще бъде присвоено на това, което Y's value е в момента, но не до края на процеса

Z ще бъде присвоено на not X's old value, но не до края на процеса

Процесът приключва, така че сега X и Z ще бъдат актуализирани

person WuHoUnited    schedule 20.02.2011
comment
Но... не е ли това в последователни изрази вътре след клаузата за начало на архитектурата????? Вместо това процесът е просто начинът, по който използваме за създаване на последователни изрази... прав ли съм??? - person Andry; 21.02.2011
comment
Самият процес може да бъде 1 последователен израз в списък с други последователни изрази. Нещата вътре в процеса не са. - person WuHoUnited; 21.02.2011
comment
Неправилно. Самото изявление за процес е едновременно изявление. Това, което съдържа, са последователни изрази, като присвояване на променливи и последователни присвоявания на сигнали. - person Jan Decaluwe; 21.02.2011
comment
Моля, вземете решение, защото не го разбирам много добре. От самото начало знаех, че ВСИЧКО в даден процес се изпълнява последователно и това ми беше демонстрирано много пъти, затова смятам това за един от стълбовете на моите знания. Моля, не разрушавайте този мой стълб :) - person Andry; 21.02.2011
comment
@Andry Предлагам сами да решите кой има смисъл тук. Вземете добър урок или LRM. Съвет: има разлика между последователна и променлива семантика. - person Jan Decaluwe; 21.02.2011

Не съм съгласен с поста на Ашраф. Сам съм направил vhdl код, където променливите са жици, а сигналите са ключалки. Примери:

сигнал x,y,clk; процес(clk) начало x ‹= y край процес

Това създава синхронно резе, тригер.

Всяка променлива, която не присвоява стойността си на сигнал, а само на други променливи, е напълно приемлива "жица".

Моето разбиране за цялата тема е следното:

Присвояването на сигнал вътре в процес ще пренебрегне други присвоявания на сигнали, направени в същия процес "инстанция". Освен това за един и същ сигнал ще се вземе предвид само последното присвояване.

Относно "ОК КРАЙ НА ПРОЦЕСА: Какво се случва???":

Мисля, че присвояването на сигнал ще се осъществи във възможно най-бързия момент, който хардуерното използване на процеса позволява. ИЗКЛЮЧЕНИЕ: Промените в рамките на if(rising_edge(clk)) ще се извършват в началото на следващия тактов цикъл.

person user1058795    schedule 29.09.2013
comment
ИЗКЛЮЧЕНИЕ: е неправилно. Промените в рамките на if rising_edge(clk) се извършват във времето за СЛЕДВАЩИЯ ДЕЛТА ЦИКЪЛ след края на clk. Те обаче се ВИЖДАТ само от тактовия процес на следващия тактов цикъл. - person user_1818839; 29.09.2013