Язык AHDL


Использование для переменных значений по умолчанию


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

Значение по умолчанию определяется  с помощью оператора Defaults для переменных, использующихся в операторах Truth Table, If Then, и Case.

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

Файл default1.tdf, приведенный ниже, оценивает входы и выбирает один из пяти ASCII кодов, основываясь на входах.

SUBDESIGN default1

(

   i[3..0]             : INPUT;

   ascii_code[7..0] : OUTPUT;

)

BEGIN

   DEFAULTS

ascii_code[] = B"00111111"; % ASCII  код "?" %

   END DEFAULTS;



   TABLE

      i[3..0]    => ascii_code[];

      B"1000" => B"01100001"; % "a" %

      B"0100" => B"01100010"; % "b" %

      B"0010" => B"01100011"; % "c" %

      B"0001" => B"01100100"; % "d" %

   END TABLE;

END;

Когда входной набор совпадает с одним из наборов, приведенным с левой стороны оператора Truth Table, выходы устанавливаются в соответствии с комбинацией справа. Если совпадения не происходит, выходы принимают значения по умолчанию B"00111111".

Файл default2.tdf, приведенный ниже, иллюстрирует как возникают конфликты, когда одному узлу присваивается более одного значения и как эти конфликты разрешаются языком AHDL.

SUBDESIGN default2

(

a, b, c                           : INPUT;

select_a, select_b, select_c : INPUT;

wire_or, wire_and            : OUTPUT;

)

BEGIN

   DEFAULTS




      wire_or = GND;

      wire_and = VCC;

   END DEFAULTS;

   IF select_a THEN

      wire_or = a;

      wire_and = a;

   END IF;

   IF select_b THEN

      wire_or = b;

      wire_and = b;

   END IF;

   IF select_c THEN

      wire_or = c;

      wire_and = c;

   END IF;

END;

В этом примере wire_or присваиваются значения a, b, или c, в зависимости от значений сигналов select_a, select_b, и select_c. Если ни один из этих сигналов не равен VCC, тогда wire_or принимает значение GND.

Если больше одного из сигналов select_a, select_b, или select_c принимают значение VCC, тогда сигнал wire_or является логическим ИЛИ соответствующих входных значений .

Сигнал wire_and работает таким же образом, за исключением того, что по умолчанию он устанавливается в VCC, когда ни один из "select" сигналов не равен VCC и равен логическому И соответствующих входов, когда более одно сигнала принимает значение VCC.


Содержание раздела