Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Основи мови AHDL_частина1.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
669.7 Кб
Скачать

3.9. Константи

Використання в текстовому описі символічних імен замість фіксованих числових значень (тобто використання констант) дозволяє:

  • зробити текстовий опис більше наочним;

  • спростити внесення змін, пов'язаних зі зміною фіксованих числових значень.

Нижче представлений опис адресного декодера, у якому базові значення адрес задаються константами.

CONSTANT ADR_WIDTH =8;

CONSTANT NUMBER_IO =16;

CONSTANT IO_ADR =2^ADR_WIDTH-NUMBER_IO;

CONSTANT COMMAND =IO_ADR;

CONSTANT DAC =IO_ADR+1;

CONSTANT ADC =IO_ADR+2;

SUBDESIGN CONSTANT_

(

ADR[ADR_WIDTH..0], READ, WRITE : INPUT;

WR_COMMAND, RD_COMMAND, RD_ADC, WR_DAC : OUTPUT;

)

BEGIN

IF ADR[]==COMMAND

THEN

IF READ==1

THEN RD_COMMAND=VCC;

ELSIF WRITE==1

THEN WR_COMMAND=VCC;

END IF;

ELSIF ADR[]==ADC

THEN

IF READ==1

THEN RD_ADC=VCC;

END IF;

ELSIF ADR[]==DAC

THEN

IF WRITE==1

THEN WR_DAC=VCC;

END IF;

END IF;

END;

У наведеному прикладі базове значення адреси вводу/виводу (IO_ADR) визначено через розрядність шини адреси (ADR_WIDTH) і число адрес, зарезервованих під ввід/вивід (Number_IO). Адреси регістрів: команд (Command), АЦП (ADC), ЦАП (DAC) задані зсувами від базової адреси (IO_ADR).

Результати моделювання адресного декодера наведені на рис. 14.

Рис. 14.

Відмітимо, що для адаптації адресного декодера під іншу ширину адресної шини в текстовому описі досить змінити значення тільки однієї константи - ADR_WIDTH.

3.10. Оператор for generate

Оператор FOR GENERATE (оператор циклу) дозволяє спростити запис послідовності подібних логічних рівнянь і операторів, мови AHDL.

Оператор циклу має вигляд:

FOR __index_variable IN __range GENERATE

__statement;

__statement;

END GENERATE;.

Оператор задається в такий спосіб:

  • За ключовим словом FOR вказується символічне ім'я внутрішньої змінної оператора. Це ім'я не може збігатися з ім'ям констант, параметрів або змінних, використовуваних у текстовому описі.

  • Ключові слова IN ... ТО ... визначають границі зміни значень внутрішньої змінної оператора.

  • Границі задаються арифметичними виразами.

  • За ключовим словом GENERATE слідують логічні рівняння й оператори мови AHDL.

  • Оператор кінчається ключовими словами END GENERATE, за яким слідує крапка з комою (;).

Проілюструємо використання оператора FOR GENERATE для опису на вентильному рівні N-розрядного суматора, що має вхід і вихід переносу.

CONSTANT NUM_OF_ADDERS=8;

SUBDESIGN FOR_GEN

(

a[NUM_OF_ADDERS..1], b[NUM_OF_ADDERS..1], cin : INPUT;

c[NUM_OF_ADDERS..1], cout : OUTPUT;

)

VARIABLE

carry_out [(NUM_OF_ADDERS+1)..1] : NODE;

BEGIN

carry_out[1]=cin;

FOR i IN 1 TO NUM_OF_ADDERS GENERATE

c[i]=(a[i] $ b[i]) $ carry_out[i];

carry_out[i+1] = a[i] & b[i] # carry_out[i] & (a[i] $ b[i]);

END GENERATE;

cout = carry_out[NUM_OF_ADDERS+1];

END;

Опис, заданий оператором FOR GENERATE при NUM_OF_ADDERS = 4 відповідає наступним рівнянням:

c[1] = a[1] $ b[1] $ carry_out[1];

carry_out[2] = a[1] & b[1] # carry_out[1] & (a[1] $ b[1]);

с[2] = a[2] $ b[2] $ carry_out[2];

carry _out[3] = a[2] & b[2] # carry_out[2] & (a[2] $ b[2]);

с[3] = a[3] $ b[3] $ carry_out[3];

carry _out[4] = a[3] & b[3] # carry_out[3] & (a[3] $ b[3]);

c[4] = a[4] $ b[4] $ carry_out[4];

carry_out[5] = a[4] & b[4] # carry_out[4] & (a[4] $ b[4]);

Результати моделювання описаного суматора при NUM_0F_ADDERS=8 наведені на рис. 15

Рис. 15.

Відмітимо, що для зміни розрядності суматора досить у текстовому описі змінити значення константи NUM_OF_ADDERS.