[an error occurred while processing this directive]
|
1. Blocking Assignment выполняется как бы последовательно как программа, т.е. пока не закончено выполнение одной строчки кода (грубо говоря) следующая не выполнится (отсюда и название, выполнени как бы блокируется). Если в присвоении стоит задержка, то следующее присвоение выполнится только после этой задержки. Например,
начальная инициализация:
initial begin
a = #10 1; // a станет 1 в момент времени 10
b = #2 0; // b станет 0 в момент времени 12
c = #4 1; // c станет 1 в момент времени 16
end
Если же имеется такая конструкция
always (@ posedge CLOCK)
b = a;
c = b;
d = c;
end
после выполнения все сигналы будут иметь одно значение, равное а на момент входа в процесс. Как так на каждом следующем присвоении используется результат предыдущего. Т.е это не синтезуруемая (или неправильно работающая после синтеза) конструкция, подходящая только для моделирования.
2. Non-blocking Assignment осуществляет так сказать парралельность выполнения операций. Блокирования не происходит. На тех же примерах:
initial begin
a <= #10 1; // a станет 1 в момент времени 10
b <= #2 0; // b станет 0 в момент времени 2 !!!!
c <= #4 1; // c станет 1 в момент времени 4 !!!!
end
И процесс:
always (@ posedge CLOCK)
b <= a;
c <= b;
d <= c;
end
В этом случае сигналам присвоятся старые сначения. Т.е. в b будет a, в c - b,в d - c. Получаем нормальные триггера и сдвиговые регисты. Все синтезируется и работает.
E-mail: info@telesys.ru