Различие между сигналами и переменными языка VHDL.

Любой проект является описанием явлений в дискретных системах. Эти явления могут представляться тремя различными категориями данных: константы, переменные и сигналы. signal — это информация, передаваемая между модулями проекта или представляющая входные и выходные данные проектируемого устройства. Сигналу присваиваются свойства изменения во времени. variable — это вспомогательная информационная единица, используемая для описания внутренних операций в программных блоках. Присвоение значения сигналу отображается знаком <=, а переменной – знаком :=.

В языке VHDL введены два типа операторов — последовательные и параллельные. Последовательные операторы выполняются последовательно друг за другом в порядке записи (оператор присваивания переменной, оператор присваивания сигналу, условные операторы, оператор выбора и ряд других).

Исполнение параллельных операторов инициируется по событийному принципу, т. е. они исполняются тогда, когда реализация других операторов программы создала условия для их исполнения. Параллельные операторы представляют части алгоритма, которые в реальной системе могут исполняться одновременно.

Присвоения сигналу существенно отличается от присвоения переменной. Присвоение сигналу не приводит непосредственно к изменению его значения. Новое значение сначала заносится в буфер, называемый драйвером сигнала, и следующие операторы в теле процесса оперируют со старыми значениями. Фактическое изменение значения сигнала выполняется только после исполнения до конца процессов и других параллельных операторов, инициированных общим событием, или после исполнения оператора останова wait.

Наиболее существенные различия сигналов и переменных.

1. Переменные меняют значения сразу после присвоения, и новые значения непосредственно учитываются во всех преобразованиях, записанных в теле процесса после такого присвоения.

2. Значение сигнала меняется не сразу после выполнения присвоения. Передача значения сигналу может быть еще более задержана, если оператор присваивания содержит выражение задержки after.

3. Переменная определена только внутри тела процесса, сигнал — во всем архитектурном теле.

4. Переменной можно переприсваивать значение в теле процесса. Сигнал внутри одного процесса может иметь только один драйвер. То есть присвоение значения сигналу может быть выполнено только один раз в теле.

56. Оператор условного присваивания значения сигналу на языке VHDL.

Присвоения сигналу существенно отличается от присвоения переменной. Присвоение сигналу не приводит непосредственно к изменению его значения. Новое значение сначала заносится в буфер, называемый драйвером сигнала, и следующие операторы в теле процесса оперируют со старыми значениями. Фактическое изменение значения сигнала выполняется только после исполнения до конца процессов и других параллельных операторов, инициированных общим событием, или после исполнения оператора останова wait. Присвоение значения сигналу отображается знаком <=.

Синтаксис:

имя_сигнала <= [механизм задержки] {значение when условие else}

значение [when условие];

Пример:

Zmux<=d0 when S1=’0’ and S2=’0’

else d1 when S1=’0’ and S2=’1’

else d2 when S1=’1’ and S2=’0’

else d3 when S1=’1’ and S2=’1’

Разрешение неоднозначности установления сигнала на языке VHDL.

В результате в программе на VHDL может создаваться неоднозначная ситуация, когда на каком-то интервале модельного времени значения, устанавливаемые разными операторами присваивания, входят в противоречие друг с другом.

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

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

process (a)

constant T_01: time: =800 ns;

constant T_10:time:=500 ns;

begin

if a=’1’ then

z<=transport a after T_01;

else

z<=transport a after T_10;

end if;

end process;

Наши рекомендации