Последовательный оператор присваивания

Cодержание Следующая

Изучение VHDL

Последовательный оператор присваивания

Последовательные операторы в VHDL вставляются в операторы процессов и исполняются последовательно в виртуальных процессорных элементах программистской модели.
Последовательный оператор присваивания выполняет присваивание переменной или сигналу результата выражения. Он выглядит следующим образом:

\приемник\:=\выражение\ — для присваивания переменной

\приемник\ <= \выражение\ - для присваивания сигнала. Здесь результат \приемник\ может быть
— имя (идентификатор), например, var,
— имя с индексом, как var(1),
— вырезка, как var (0 to 1),
— поле, как rec.var или агрегат, как (Re, Im).

Присваивание переменной отличается от присваивания сигналу.
Присваивание переменной выполняется немедленно.

Выполнение оператора присваивания сигналу
означает вычисление его выражения и лишь назначение сигналу. Само же присваивание сигналу фактически выполняется в момент остановки процесса по ожиданию события.

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

При присваивании части элементов сигнала составного типа или перечисляемого типа, ( например, имени с индексом, вырезке ) считается, что выполнено присваивание всем элементам сигнала.
Причем те элементы, которые не указаны в операции присваивания, принимают старое значение.
Например, по фрагменту программы

sіgnal d:bіt_vector(0 to 7);
...........
d <= (others => '0');
d(0 to 3) <= "0011";
d(4 to 5) <= "11";
waіt ....

сигналу d будет присвоено значение "00111100".

Всем операторам присваивания сигналу в одном процессе в модели виртуального процессорного элемента соответствует один источник сигнала. Если одному и тому же сигналу выполняется присваивание в различных процессах, то несколько источников сигналов соединяются своими выходами и в общем случае, результирующий сигнал может быть неопределенным. Поэтому над таким сигналом должна быть задана функция разрешения, которая разрешает конфликт присваивания одному сигналу значений из нескольких источников сигнала.

Если пользоваться пакетом IEEE.STD_LOGIC_1164, то сигнал, объявленный как std_logic, можно присваивать в разных процессах, так как в этом пакете есть функция разрешения для такого типа сигналов.

Присваивание сигналу при моделировании.

При моделировании дискретных систем важное место занимает моделирование распространения сигнала с учетом задержки в проводниках или задержки в вентилях. Для этого используют следующий расширенный синтаксис присваивания сигналу:

\присваивание сигналу\::=\приемник\ <= [\способ задержки\] \график\; \способ задержки\::= transport |[reject \выражение времени\] inertial

\график\::= \выражение\ [after \выражение времени\]

         {, \выражение\ [after \выражение времени\] }

Здесь график (waveform) представляет собой запись, состоящую из одной или нескольких пар: величина сигнала – задержка сигнала.
В первой паре задержка может не указываться, подразумевается, что она нулевая.

Cпособ задержки transport означает, что при присваивании сигналы, представленные в графике, будут задержаны подобно тому, как сигнал задерживается в линии задержки или проводниках. Величина задержки отсчитывается относительно момента остановки процесса и задается выражением \выражение времени\, имеющем тип time.

Способ задержки inertial реализует поведение задержки в источнике сигнала, который не реагируют на слишком короткие входные импульсы.
При этом фразой reject задается минимальная ширина импульса, которая выдается источником. Если этой фразы нет, то минимальная ширина импульса задается в фразе after. По умолчанию в операторе применяется способ задержки inertial. Действие оператора иллюстрируют следующий ряд примеров.

Y<= X after 10 ns;

- значение сигнала X на момент запуска процесса присвоится сигналу Y с задержкой 10 нс, при этом импульсы шириной менее 10 нс будут подавлены.

Y<= '0', '1' after 10 ns, '0' after 20 ns, '1' after 30 ns;

- сигналу Y сначала присвоится 0, через 10 нс – 1, через 20 нс – 0, и через 30 нс – 1, например, это задание тестовой последовательности сигнала.

Y<= А, А+В after delay_sum;

- сигналу Y сначала присвоится А, а через задержку, определяемую статическим выражением delay_sum – сумма сигналов А и В.

Y<= transport X after 1000 ns;
- модель линии задержки сигнала Х с задержкой 1 мкс.

Y<= reject t_rej inertial А and B after t_d;

- моделирует вентиль "И" с задержкой t_d , который не пропускает импульсы короче t_rej.

Анатолий Сергиенко
E-mail: aser@comsys.kpi.ua